Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 返回路径中的所有节点和节点之间的关系_Neo4j_Cypher - Fatal编程技术网

Neo4j 返回路径中的所有节点和节点之间的关系

Neo4j 返回路径中的所有节点和节点之间的关系,neo4j,cypher,Neo4j,Cypher,第一次问关于SO和cypher和neo4j的新手 我需要得到所有节点,以及它们之间的所有关系,它们构成了一个特定节点的血统;要在有向图中显示它们,我需要一个节点列表和一个关系列表(链接)。 这是我的虚拟对象,这是我想要得到的(节点加链接): 这是我经过数小时的研究和尝试后得出的结论: MATCH lineage = (n:Sample {name:"P"})-[:CHILD_OF*]->(parent:Sample) MATCH (parent)-[r_out]->(child)-[

第一次问关于SO和cypher和neo4j的新手

我需要得到所有节点,以及它们之间的所有关系,它们构成了一个特定节点的血统;要在有向图中显示它们,我需要一个
节点列表
和一个关系列表(
链接
)。 这是我的虚拟对象,这是我想要得到的(节点加链接):

这是我经过数小时的研究和尝试后得出的结论:

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