Neo4j 返回路径中的所有节点和节点之间的关系
第一次问关于SO和cypher和neo4j的新手 我需要得到所有节点,以及它们之间的所有关系,它们构成了一个特定节点的血统;要在有向图中显示它们,我需要一个Neo4j 返回路径中的所有节点和节点之间的关系,neo4j,cypher,Neo4j,Cypher,第一次问关于SO和cypher和neo4j的新手 我需要得到所有节点,以及它们之间的所有关系,它们构成了一个特定节点的血统;要在有向图中显示它们,我需要一个节点列表和一个关系列表(链接)。 这是我的虚拟对象,这是我想要得到的(节点加链接): 这是我经过数小时的研究和尝试后得出的结论: MATCH lineage = (n:Sample {name:"P"})-[:CHILD_OF*]->(parent:Sample) MATCH (parent)-[r_out]->(child)-[
节点列表
和一个关系列表(链接
)。
这是我的虚拟对象,这是我想要得到的(节点加链接):
这是我经过数小时的研究和尝试后得出的结论:
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
和所有其他节点之间的所有可能路径
我想不出一个解决方案,我也相信这应该是一个更优雅的查询
有什么帮助吗?
谢谢我想我明白你的问题了,如果我明白的话。。。(否则,我道歉)
获取节点和返回的所有节点之间的唯一关系是一个两步过程。你可以看到我的答案
基本上,第一个请求获取节点,然后查询所有关系,其中关系的任何一方都是具有第一个查询中返回的节点ID之一的节点
match a-[r]-b where id(a) in [1,2...] and id(b) in [1,2,3...] return r
请注意,整数数组与第一个查询中的唯一节点ID列表相同。这就是我要找的
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
加号将结果合并到一个数组中,因此现在我在一个查询中得到了两个
节点数组
和链接数组
!:) 虽然我不明白的是,如果我的目标节点没有父节点(因此没有关系的子节点),为什么我不能将该节点作为节点
数组中的唯一元素?即使它不是沿袭
路径的一部分(本例中的路径实际上不存在),节点子节点
是否定义了属性name=P
?