如何在图数据库NEO4J中表达时间段(时间)关系



嗨,我有以下我想在neo4j中表达的关系,我想找到最佳的方式,或者不是最佳的方式,但我可以在某种程度上做到这一点的不同方式好办法。情况如下:

  • 我有动物
  • 动物可以放在笼子或空旷的地方。
  • 动物与笼子之间的关系在一个时期内有效。

时间段是一个非常重要的质量,因此在某种程度上是该模型的一流公民。我想知道的是,如果我将其表示为neo4j模型,我可以做几种方法:

abreach 1。

  • 动物是一个节点。
  • 笼子/开放空间是一个节点。
  • 时间段成为"分配"关系下的财产。

abreach 2。

  • 动物是一个节点。
  • 时间段是一个节点。
  • 笼子/开放空间是一个节点。

然后这种关系看起来像。*动物 - for->时期 - 分配 -> Cage

模型应该能够回答哪些问题。

如果在同一笼子上以同一时间间隔将动物放在一起,我们应该能够收集信息。问题是一个开放空间可能包含许多笼子,因此我们想找出是否曾在同一开放空间中合作两只动物。

方法2如果您在每个特定时间段内都有唯一(并因此共享)Period节点,则该节点的ASSIGNED节点是不切实际的无法分辨这些关系中的哪个属于哪种动物(在每种关系中不冗余地存储动物ID)。

使用方法1,让我们假设此数据模型(其中A代表:"将动物分配给位于空间中的笼子",而B表示:"将动物直接分配给空间 - 而不是一个笼"):

A. (:Animal)-[:ASSIGNED {start: 123, end: 789}]->(:Cage)-[:LOCATED_IN]->(:Space)
B. (:Animal)-[:ASSIGNED {start: 234, end: 777}]->(:Space)

获取有关所有动物同时占据相同笼子的信息:

MATCH
   (a1:Animal)-[r1:ASSIGNED]->(c:Cage),
   (a2:Animal)-[r2:ASSIGNED]->(c)
WHERE ID(a1) < ID(a2) AND r1.start < r2.end AND r2.start < r1.end
RETURN c, a1, r1, a2, r2

获取有关所有动物同时占据相同空间的信息:

MATCH
  (a1:Animal)-[r1:ASSIGNED]->()-[:LOCATED_IN*0..1]->(s:Space),
  (a2:Animal)-[r2:ASSIGNED]->()-[:LOCATED_IN*0..1]->(s)
WHERE ID(a1) < ID(a2) AND r1.start < r2.end AND r2.start < r1.end
RETURN s, a1, r1, a2, r2

注意:

  • ID(a1) < ID(a2)测试用于避免重复的结果(动物1和2,然后再次为2和1)。
  • r1.start < r2.end AND r2.start < r1.end测试用于检测重叠的占用时间。
  • (x)-[:LOCATED_IN*0..1]->(y)语法匹配长度为0的可变长度路径(在这种情况下没有LOCATED_IN关系,xy相同)或长度1。

最新更新