嗨,我想在neo4j中表达以下关系,我想找到一种最佳方式,或者不是最佳方式,而是我可以很好地做到的不同方式。情况如下:
时间段是非常重要的品质,因此在某种程度上它是模型的头等公民。我想知道的是,如果我将其表示为Neo4J模型,则有几种方法可以做到这一点:
方法1。
方法2。
然后,关系将看起来像。 *动物--FOR->时期-分配-> CAGE
模型应该回答什么问题。
如果将动物以相同的时间间隔放置在同一笼子中,我们应该能够收集信息。事实是,一个开放空间可能包含许多笼子,所以我们想知道是否有两只动物同时位于同一开放空间内。
答案 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
关系,并且x
与y
相同)或长度1。