Neo4j Cypher:路径中的相互依存关系值

Neo4j Cypher:路径中的相互依存关系值,neo4j,cypher,Neo4j,Cypher,我在Neo4j中加载了一个图形数据集,其中节点是不同的人,关系是他们之间的一些“真实”关系。复杂的是,每种关系都有一个有效的时间段。例如: (p1:PERSON {name: "Andy"}) -[r1:HAS_RELATIONSHIP {from: "20190201", to: "20190215"}]-> (p2:PERSON {name: "Betty"}) -[r2:HAS_RELATIONSHIP {from: "20190301", to: "20190331"}]->

我在Neo4j中加载了一个图形数据集,其中节点是不同的人,关系是他们之间的一些“真实”关系。复杂的是,每种关系都有一个有效的时间段。例如:

(p1:PERSON {name: "Andy"})
-[r1:HAS_RELATIONSHIP {from: "20190201", to: "20190215"}]->
(p2:PERSON {name: "Betty"})
-[r2:HAS_RELATIONSHIP {from: "20190301", to: "20190331"}]->
(p3:PERSON {name: "Cecil"})
我想以一个具体的人p为例,列出p通过其他人与之有间接关系的所有人的名单。它必须认为任何关系链中日期的交集都是非空的

从上一个例子来看,如果我们把Andy作为p,结果应该是Andy,Betty,因为与Cecil的关系在完全不同的时间段有效。但在以下情况下:

(p1:PERSON {name: "Andy"})
-[r1:HAS_RELATIONSHIP {from: "20190201", to: "20190215"}]->
(p2:PERSON {name: "Betty"})
-[r2:HAS_RELATIONSHIP {from: "20190210", to: "20190301"}]->
(p3:PERSON {name: "Cecil"})
结果应该是安迪、贝蒂、塞西尔


有没有办法在Cypher中指定此条件?我正在寻找一种有效的解决方案,它可以修剪已经找到的路径。

基本上,您有一个路径上所有关系的间隔列表。对于此间隔列表,您需要检查它们是否全部重叠。这可以通过检查max(from)到您希望这些间接关系达到的级别(到任意级别)(没有限制)来实现。
MATCH path=(p:PERSON {name:'Andy'})-[*..10]-(other) // Doesn't matter how you get the paths
UNWIND relationships(path) as r
WITH path,max(r.from) AS maxFrom,min(r.to) AS minTo
WHERE maxFrom <= minTo
RETURN extract(x in nodes(path) | x.name)