嗨,我有以下我想在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
关系,x
与y
相同)或长度1。