Как сопоставить правый и левый узлы с cypher и neo4j

Я пытаюсь использовать графическую базу данных Neo4J в своем проекте, и я постараюсь объяснить вам мою проблему.

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

Следующая диаграмма является базовым примером. Мой график построен как цепочка, вот так:

Моя БД - диаграмма Neo4j

Моя проблема - найти левый и правый узлы. С этим фиктивным запросом у меня есть повторяющиеся результаты

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;
Другие вопросы по тегам