返回路径

时间:2017-01-17 09:55:43

标签: neo4j cypher

第一次询问SO和新的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与所有其他节点之间的所有可能路径。

我无法找到解决方案,我也相信它应该是一个更优雅的查询......

有任何帮助吗? 感谢

2 个答案:

答案 0 :(得分:1)

这就是我要找的东西!

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

加号将结果合并到一个数组中,所以现在我在一个查询中有两个nodeslinks数组! :)

答案 1 :(得分:0)

我认为我得到了你的问题,以防万一...(否则我的道歉)

获取节点并获得返回的所有节点之间的唯一关系是一个两步过程。你可以看到我的回答here

基本上,第一个请求会获取节点,然后查询所有关系,其中关系的任一侧是一个节点,其中包含您在第一个查询中返回的节点ID之一

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

请注意,整数数组是第一个查询中唯一的节点ID列表。

相关问题