2016-01-26 4 views
3

У меня есть узел, и мне нужно найти все отношения с родителями до него.Neo4j parent-child отношения

Таким образом, если у меня есть: A-> B-> C-> D (корень) А-> Е-> Р-> Д (корень)

А представляет собой узел, у меня и я нужны все предки этого.

Я попробовал Cypher запрос:

MATCH (n:yo {name:"foo"})-[:HELLO*1..]->(p:yo) RETURN p 

Но он показывает мне список, как это: B, C, D, E, F. Таким образом, связь между ними теряется. Возможно ли иметь такой список, как [[B-> C-> D], [E-> F-> D]]

Я видел этот запрос на веб-сайте, и он работает. Но он возвращает [[A, B], [A, B, C], [A, B, C, D]]. Мне не нужны субпаты.

start c = node:node_auto_index (object_id = ‘10179’ ) 
MATCH path = c <- [ : PARENT_OF* ] – p 
return distinct 
length (path) AS PATH_LENGTH 
, extract (n in nodes (path) : n.object_id) as the_path 
order by length (path) 

ответ

4

Вы ищете что-то вроде этого. Пути совпадений, которые начинаются с узла A и заканчиваются узлом, который не является :CHILD_OF другим узлом. Это будет возвращать два ряда коллекций узлов в ваших данных выборки:

MATCH p=(a:Node {name: 'A'})-[:CHILD_OF*]->(end:Node) 
WHERE NOT (end)-[:CHILD_OF]->() 
RETURN tail(nodes(p)) 

Вы можете также collect() результат, если вы хотите одну строку возвращенную.

MATCH p=(a:Node {name: 'A'})-[:CHILD_OF*]->(end:Node) 
WHERE NOT (end)-[:CHILD_OF]->() 
RETURN collect(tail(nodes(p))) 
+0

Работы как шарм. Спасибо Dave: D – blackmamba

+0

Еще одна вещь: Что делать, если я хочу узел в коллекции тоже? – blackmamba

+1

просто удалите функцию 'tail()' из оператора return и вы получите полный список узлов в пути. –

Смежные вопросы