2017-01-17 2 views
0

Первый раз спрашиваем о SO и newby cypher и neo4j.Возврат всех узлов и связей между узлами по пути

Мне нужно получить все узлы и все их отношения, которые составляют линию определенного узла; для отображения их в ориентированном графе мне нужен список nodes и список отношений (links). Это мой манекен set of nodes, и это то, что я хочу, чтобы получить (узлы плюс ссылки): result

Это то, что я пришел после нескольких часов исследований и попыток:

MATCH lineage = (n:Sample {name:"P"})-[:CHILD_OF*]->(parent:Sample) 
MATCH (parent)-[r_out]->(child)-[r_in]->(parent) 
WHERE parent IN nodes(lineage) OR child IN nodes(lineage) 
RETURN 
collect(DISTINCT parent) AS nodes, 
collect({ source: parent.name, rel: type(r_out), target: child.name }) AS links_out, 
collect({ source: child.name, rel: type(r_in), target: parent.name }) AS links_in; 

(я создал два другой список отношений, поэтому я могу отличить источник и цель.)

Однако это не возвращает n в списке узлов и фактически умножает ссылки, так как я думаю, возвращает все возможные пути между n и всеми другими узлами ,

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

Любая помощь? Благодаря

ответ

0

Я думаю, я получаю свой вопрос и в случае, если я ... (в противном случае мои извинения)

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

В принципе первый запрос получает вас узлы, а затем вы запрашиваете для всех отношений, где обе стороны отношений является узлом с одним из узлов идентификаторов вы вернулись в первом запросе

match a-[r]-b where id(a) in [1,2...] and id(b) in [1,2,3...] return r 

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

0

Это то, что я искал!

MATCH lineage = (child:Sample {name:"P"})-[:CHILD_OF*]->(parent:Sample) 
MATCH (n:Sample)-[r_out]->(m:Sample)-[r_in]->(n:Sample) 
    WHERE n IN nodes(lineage) AND m IN nodes(lineage) 
RETURN 
    child + collect(DISTINCT parent) AS nodes, 
    collect(DISTINCT {source: n.name, rel: type(r_out), target: m.name}) + 
    collect(DISTINCT {source: m.name, rel: type(r_in), target: n.name}) AS links 

Знак плюс объединяет результаты в одном массиве, и теперь у меня есть в одном запросе мои два массива nodes и links! :)

+0

Хотя я не понимаю, почему, если я нацелен на узел, у которого нет родительского элемента (поэтому нет исходящих отношений «CHILD_OF»), я не получаю этот узел как единственный элемент в «узлах» 'array? Даже если он не является частью пути 'lineage' (поскольку путь в этом случае фактически не существовал), не определяется ли дочерний элемент' child' каким-либо образом, обладающим свойством 'name = P'? – Stefano

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