Получить отношения между дочерними узлами с помощью neo4j cypher - PullRequest
0 голосов
/ 09 октября 2019

enter image description here

У меня появляется следующий сетевой результат при выполнении этого запроса в браузере neo4j:

MATCH (n1:Item {name: 'A'})-[r]-(n2:Item) Return n1,r,n2

В нижней части графика этоговорит: Displaying 6 nodes, 7 relationships. Но когда я смотрю на таблицу в браузере neo4j, у меня есть только 5 записей

n1,r,n2
A,A->B,B
A,A->C,C
A,A->D,D
A,A->E,E
A,A->F,F

Так что в коде Java, когда я получаю список записей, используя код ниже:

List<Record> records = session.run(query).list();

Я получаю только 5 записей, поэтому я получаю только 5 отношений. Но я хочу получить все 7 отношений, включая 2 ниже:

B->C
C->F

Как я могу добиться этого с помощью запроса шифра?

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Это должно работать:

MATCH (n:Item {name: 'A'})-[r1]-(n2:Item)
WITH n, COLLECT(r1) AS rs, COLLECT(n2) as others
UNWIND others AS n2
OPTIONAL MATCH (n2)-[r2]-(x)
WHERE x IN others
RETURN n, others, rs + COLLECT(r2) AS rs

В отличие от первого подхода @ FrantišekHartman, этот запрос использует UNWIND для привязки n2 (который не указан в предложении WITH и поэтому становится несвязанным) сте же самые узлы n2, что и в предложении MATCH. Этот запрос также объединяет все отношения в один список rs.

1 голос
/ 11 октября 2019

Есть много способов достичь этого. Одним из способов является переход на 2-й уровень и проверка того, что узел 2-го уровня также находится на первом уровне

MATCH (n1:Item {name: 'A'})-[r]-(n2:Item)
WITH n1,collect(r) AS firstRels,collect(n2) AS firstNodes
OPTIONAL MATCH (n2)-[r2]-(n3:Item)
WHERE n3 IN firstNodes
RETURN n1,firstRels,firstNodes,collect(r2) as secondRels

Или вы можете сделать декартово произведение между узлами первого уровня и сопоставить:

MATCH (n1:Item {name: 'A'})-[r]-(n2:Item)
WITH n1,collect(r) AS firstRels,collect(n2) as firstNodes
UNWIND firstNodes AS x
UNWIND firstNodes AS y
OPTIONAL MATCH (x)-[r2]-(y)
RETURN n1,firstRels,firstNodes,collect(r2) as secondRels

В зависимости от количества элементов firstNodes и secondRels и других существующих отношений одно может быть быстрее другого.

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