Фильтр Cypher Query для связанных узлов - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь применить фильтр к моей базе данных Neo4j Graph, которая имеет 733922 узла и 303378 связей, размер базы данных составляет 913,56 МБ.Я хочу получить все узлы, у которых есть связанные метки, из определенного набора, это работает, если я отдам до трех связанных узлов, но у меня уйдет неопределенное время для обработки запросов, выходящих за рамки этого.Если я удаляю заказ к тому времени, он работает до пяти связанных ярлыков.Это самый оптимизированный запрос или я что-то здесь не так делаю?Я прикрепил выход PROFILE для одной связанной метки.

Query Plan

MATCH p=(node1:label1{value:'a2cb2c487d9da6941f0f9c1692ed1a5a', source: 'a0b116e2-d9f5-40d4-97ff-6ca6f2ec6c9b'})-[r]-> (:a),(:b),(:c),(:d),(:e),(:f),(:g),(:h),(:i),(:j) 
RETURN node1,r 
ORDER BY node1.created DESC 
LIMIT 25

1 Ответ

1 голос
/ 20 сентября 2019

Следующая

(:b),(:c),(:d),(:e),(:f),(:g),(:h),(:i),(:j)

создает декартово произведение между всеми узлами с метками b, c, d и т. Д., Которое будет быстро расти.

Если вам нужна любая из меток a..b используйте следующее:

MATCH p=(node1:label1{value:'a2cb2c487d9da6941f0f9c1692ed1a5a', source: 'a0b116e2-d9f5-40d4-97ff-6ca6f2ec6c9b'})-[r]-> (related)
WHERE related:a OR related:b OR ....

Если вы хотите передать метки в качестве параметра labels, вы можете использовать следующее в WHERE предложении

WHERE any(x in labels(n) WHERE x in $labels)
...