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

时间:2019-02-27 11:50:46

标签: java graph neo4j data-modeling graph-databases

嗨,我想在neo4j中表达以下关系,我想找到一种最佳方式,或者不是最佳方式,而是我可以很好地做到的不同方式。情况如下:

  • 我有一只动物
  • 动物可以放在笼子里或露天场所。
  • 动物与笼子之间的关系在一定时间内有效。

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

方法1。

  • 动物是一个节点。
  • 笼子/开放空间是一个节点。
  • 时间段成为“已分配”关系下的属性。

方法2。

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

然后,关系将看起来像。 *动物--FOR->时期-分配-> CAGE

模型应该回答什么问题。

如果将动物以相同的时间间隔放置在同一笼子中,我们应该能够收集信息。事实是,一个开放空间可能包含许多笼子,所以我们想知道是否有两只动物同时位于同一开放空间内。

1 个答案:

答案 0 :(得分:1)

如果在每个特定时间段都有一个唯一的Period节点(因此是共享的),则方法2不切实际,因为该节点可能有任意数量的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。