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

How to express a time period (temporal) relationship in a graph database neo4j

嗨,我有以下关系,我想在 neo4j 中表达,我想找到最佳方式,或者可能不是最佳方式,但我可以用不同的方式很好地做到这一点。案例如下:

时间段是一个非常重要的品质,因此在某种程度上它是模型的第一个 class 公民。我想知道的是,如果我将其表示为 Neo4J 模型,则有几种方法可以做到这一点:

方法一.

方法 2.

那么关系就变成这样了。 *Animal --FOR--> Period --Assigned-->CAGE

模型应该能够回答什么问题。

如果每只动物都以相同的时间间隔放在同一个笼子里,我们应该能够收集信息。问题是一个开放 space 可能包含许多笼子,所以我们想知道是否有两只动物曾被放在同一个开放 Space.

如果每个特定时间段都有一个唯一(因此共享)Period 节点,则方法 2 不实用,因为该节点可能有任意数量的 ASSIGNED 关系,并且您将无法分辨这些关系中的哪些属于哪种动物(如果不在每个关系中冗余存储动物 ID)。

对于方法 1,我们假设此数据模型(其中 A 表示:"an animal is assigned to a cage that is located in a space",B 表示:"an animal is assigned directly to a space -- not a cage"):

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

要获取同时占据相同 space 的所有动物的信息:

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.