Получите пути, упорядочив и ограничив число промежуточных узлов в Cypher Neo4J - PullRequest
0 голосов
/ 27 февраля 2020

У меня большой плотный граф с миллионами отношений. Я хочу получить все возможные пути длины 3, начиная с указанного узла c. Однако это приводит к тысячам возможных путей, и это занимает много времени. Поэтому я хочу отфильтровать промежуточные узлы, которые я хочу расширить, основываясь на весе узла.

В начале запроса:

MATCH p=(e1:LabeledExperience { name: 'software developer'})-[n:NextExp *1..3]->(e2:LabeledExperience) 

И затем UNWIND узлы n и применяются условия. Проблема в том, что он сначала сопоставляет все возможные пути, раскручивает их и после этого применяет условие. Есть ли способ сделать это на каждом этапе?

1 Ответ

1 голос
/ 28 февраля 2020

Просто выполняйте один шаг (взаимосвязь) за раз с предложением WHERE на шаг для фильтрации нежелательных узлов.

Примерно так:

MATCH (e1:LabeledExperience {name: 'software developer'})-[:NextExp]->(e2:LabeledExperience)
WHERE e2.weight > 10
OPTIONAL MATCH (e2)-[:NextExp]->(e3:LabeledExperience)
WHERE e3.weight > 10
OPTIONAL MATCH (e3)-[:NextExp]->(e4:LabeledExperience)
WHERE e4.weight > 10
RETURN e1, e2, e3, e4

Шаги после первое использование OPTIONAL MATCH, чтобы запрос мог вернуть результат, даже если e2 или e3 является листовым узлом. Из-за этого возвращаемые значения e3 и / или e4 могут быть null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...