Самый быстрый способ получить все узлы под указанным начальным узлом - PullRequest
0 голосов
/ 13 июня 2018

У меня есть запрос, который работал некоторое время, но по мере роста моего графика серьезно замедлился:

MATCH p1=(n2)-[*0..]->(n3)-[r4]->(n5)
WHERE (id(n2) = 123456 // Fill in starting node ID
  AND all(r6 in relationships(p1) WHERE (NOT exists(r6.value1) OR r6.value1 = r6.value2) // Add some constraints on the path
  ))

RETURN id(n3),n3.constr,r4.constr,type(r4),id(n5),n5.constr,n5.value // Things about n3,r4,n5, n3 may be the starting node

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

Этот вопрос задает то же самое, но без какого-либо реального ответа, кроме как добавить ограничения на метки, которые я не могу сделать.Поскольку я знаю, что у меня есть древовидная структура (и я хочу, чтобы все узлы находились под начальным узлом), есть ли более быстрый способ выполнить этот запрос?Это то, что я должен написать в Traversal API (если так, как это будет выглядеть)?

1 Ответ

0 голосов
/ 13 июня 2018

Есть одна вещь, которую я не понимаю в вашем запросе.Почему вы сделали это (n2)-[*0..]->(n3)-[r4]->(n5), а не только (n2)-[*0..]->(n5)?

Более того, я не вижу каких-либо ограничений на последний узел вашего пути.Обычно этот узел является листом, поэтому лучше выразить его следующим образом:

MATCH p=(root)-[*]->(leaf)
WHERE NOT (leaf)-->()
RETURN p

При таком запросе вы ищете только весь путь между корнем и листьями.Это гораздо быстрее, чем поискать все пути в вашем дереве.

И пойти на один уровень глубже. Если вы хотите наилучших результатов, вы должны использовать обход графика.Взгляните на APOC с помощью процедуры apoc.path.expand: https://neo4j -contrib.github.io / neo4j-apoc-процедуры / # _ expand_paths

...