Степень центральности на проектируемом графике neo4j. Оптимальный способ создания прогнозируемого графика - PullRequest
0 голосов
/ 10 июня 2019

Я пробую алгоритм графа Степень .

В моей модели есть несколько меток узлов и отношений, одна из которых "Entity", и позволяет называть другие метки "Random".

Я хочу создать проекцию графа, который в основном удаляет все другие узлы, кроме «сущности», но сохраняет ребра / отношения, которые были бы возможны с узлами.

например, еслиу нас есть (e1:Entity) -> (:Random) -> (:Random) -> (e2:Entity), тогда результат будет (e1) -> (e2)

или

(e1:Entity)-[*..5]-(e1:Entity) дает нам (e1)--(e2)

Где путь между двумя объектами не имеетСущность между ними.

Проблема, с которой я столкнулся в своем нынешнем заявлении о шифровании, заключается в том, что оно кажется медленным или не возвращает то, что я ожидаю.Поэтому мне интересно, пропустил ли я что-то.

Это то, что я сейчас использую для создания проекции:

MATCH p = (start:Entity)-[*..5]-(end:Entity)
WHERE start.id <> end.id
WITH start, end, [n IN nodes(p) WHERE 'Entity' in labels(n) | n] as entities
WHERE size(entities) = 2
RETURN id(start) as source, id(end) as target

1 Ответ

1 голос
/ 10 июня 2019

Ваш вариант использования (поиск и тестирование всех путей длиной до 5, заканчивающихся Entity узлами) по своей природе дорого.

При этом следующий запрос должен быть несколько быстрее.

  • Этот запрос проверяет только метки внутренних узлов пути.
  • Поскольку ваш запрос ненаправленный, этот запрос избегает двойного тестирования меток по одному и тому же пути (с помощью теста start.id > end.id).
  • Это позволяет избежать создания временных наборов узлов и оценки их размера.

    MATCH p = (start:Entity)-[*..5]-(end:Entity)
    WHERE start.id > end.id AND NONE(n IN NODES(p)[1..-1] WHERE 'Entity' in LABELS(n))
    RETURN ID(start) as source, ID(end) as target
    
...