【问题标题】:Neo4j Cypher: interdependent relationship values in a pathNeo4j Cypher:路径中相互依赖的关系值
【发布时间】:2020-01-13 23:51:38
【问题描述】:

我在 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"})

结果应该是Andy, Betty, Cecil

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

【问题讨论】:

  • 您希望这些间接关系达到什么级别?
  • 任意级别(没有限制)。

标签: neo4j cypher


【解决方案1】:

你基本上有一个路径上所有关系的间隔列表。对于这个间隔列表,您需要检查它们是否都重叠。这可以通过在密码中检查 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多