如何在图数据库neo4j中表达时间段(temporal)关系
How to express a time period (temporal) relationship in a graph database neo4j
嗨,我有以下关系,我想在 neo4j 中表达,我想找到最佳方式,或者可能不是最佳方式,但我可以用不同的方式很好地做到这一点。案例如下:
- 我有一只动物
- 动物可以放在笼子里或空旷的地方。
- Animal与Cage的关系在一段时间内有效
时间段是一个非常重要的品质,因此在某种程度上它是模型的第一个 class 公民。我想知道的是,如果我将其表示为 Neo4J 模型,则有几种方法可以做到这一点:
方法一.
- 动物是一个节点。
- Cage/Open Space是一个节点。
- 时间段在"ASSIGNED"关系下变成属性
方法 2.
- 动物是一个节点。
- 时间段是一个节点。
- Cage/Open Space是一个节点。
那么关系就变成这样了。 *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
关系,并且 x
与 y
) 或长度 1.
嗨,我有以下关系,我想在 neo4j 中表达,我想找到最佳方式,或者可能不是最佳方式,但我可以用不同的方式很好地做到这一点。案例如下:
- 我有一只动物
- 动物可以放在笼子里或空旷的地方。
- Animal与Cage的关系在一段时间内有效
时间段是一个非常重要的品质,因此在某种程度上它是模型的第一个 class 公民。我想知道的是,如果我将其表示为 Neo4J 模型,则有几种方法可以做到这一点:
方法一.
- 动物是一个节点。
- Cage/Open Space是一个节点。
- 时间段在"ASSIGNED"关系下变成属性
方法 2.
- 动物是一个节点。
- 时间段是一个节点。
- Cage/Open Space是一个节点。
那么关系就变成这样了。 *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
关系,并且x
与y
) 或长度 1.