Как сопоставить правый и левый узлы с cypher и neo4j
Я пытаюсь использовать графическую базу данных Neo4J в своем проекте, и я постараюсь объяснить вам мою проблему.
Я хотел бы иметь самый длинный путь, в пределах 8 узлов, справа и слева от каждого результата. Но я не знаю последний узел каждого конца моего графика
Следующая диаграмма является базовым примером. Мой график построен как цепочка, вот так:
Моя проблема - найти левый и правый узлы. С этим фиктивным запросом у меня есть повторяющиеся результаты
MATCH p=((nl)<-[:PREV*0..8]-(i)-[:NEXT*0..8]->(nr)) RETURN nodes(p);
Это возвращает слишком много повторяющихся результатов. Вот несколько примеров результатов:
i
h | i
g | h | i
...
i | j
i | j | k
...
h | i | j
h | i | j | k
...
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q
Последний результат - единственный, который меня интересует.
Похоже, что Neo4j возвращает все возможные комбинации узлов слева и справа в пределах 8.
Дополнительная информация:
- Может быть несколько "средних узлов" (в данном примере "i")
- Я хочу 8 узлов слева, 8 справа или меньше, но всегда максимальное количество узлов с обеих сторон
Возможно ли это сделать с помощью Cypher?
1 ответ
Если вам нужен только один, то упорядочите по длине пути и ограничьте одним результатом:
MATCH p=((nl)<-[:PREV*0..8]-(i)-[:NEXT*0..8]->(nr))
WITH p
ORDER BY length(p) DESC
LIMIT 1
RETURN nodes(p);
Поочередно вы можете сопоставить и собрать на каждой стороне:
MATCH p=(nl)<-[:PREV*0..8]-(i)
WITH i, nl
ORDER BY length(p) DESC
WITH i, collect(nl) as nodes
MATCH p = (i)-[:NEXT*1..8]->(nr)
WITH nodes, i, nr
ORDER BY length(p) ASC
WITH i, nodes + collect(nr) as nodes
RETURN nodes;