Java 如何在图形数据库neo4j中表示时间段(时间)关系

Java 如何在图形数据库neo4j中表示时间段(时间)关系,java,graph,neo4j,data-modeling,graph-databases,Java,Graph,Neo4j,Data Modeling,Graph Databases,您好,我有以下关系,我想用neo4j表达,我想找到最佳方式,或者可能不是最佳方式,但不同的方式我可以很好地做到这一点。情况如下: 我有一只动物 动物可以放在笼子里或野外 动物和笼子之间的关系在一段时间内有效 时间段是一个非常重要的质量,因此在某种程度上,它是模型的一级公民。我想知道的是,如果我将其表示为Neo4J模型,有几种方法可以做到这一点: Aproach 1. 动物是一个节点 框架/开放空间是一个节点 时间段成为“已分配”关系下的属性 Aproach 2. 动物是一个节点 时间段

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

  • 我有一只动物
  • 动物可以放在笼子里或野外
  • 动物和笼子之间的关系在一段时间内有效
时间段是一个非常重要的质量,因此在某种程度上,它是模型的一级公民。我想知道的是,如果我将其表示为Neo4J模型,有几种方法可以做到这一点:

Aproach 1.

  • 动物是一个节点
  • 框架/开放空间是一个节点
  • 时间段成为“已分配”关系下的属性
Aproach 2.

  • 动物是一个节点
  • 时间段是一个节点
  • 框架/开放空间是一个节点
那么这段关系就会是这样*动物-->时段-->分配-->笼

模型应该能够回答哪些问题。


如果每只动物都在同一个笼子里以相同的时间间隔放在一起,我们应该能够收集信息。问题是,一个开放空间可能包含多个笼子,因此我们想了解两个动物是否曾在同一开放空间内共同居住。

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

在方法1中,我们假设此数据模型(其中
A
表示:“将动物分配到位于空间中的笼子中,
B
表示:“将动物直接分配到空间,而不是笼子中”):

要获取同时占用同一笼子的所有动物的信息,请执行以下操作:

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
匹配
(a1:动物)-[r1:分配]->(c:笼子),
(a2:动物)-[r2:分配]->(c)
其中ID(a1)
要获取同时占用同一空间的所有动物的信息,请执行以下操作:

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
匹配
(a1:动物)-[r1:分配的]->()-[:位于*0..1]->(s:空间),
(a2:动物)-[r2:分配的]->()-[:位于*0..1]->(s)
其中ID(a1)
注:

  • ID(a1)
    试验是为了避免重复结果(动物1和2,然后再次作为2和1)
  • r1.start
    测试用于检测重叠占用时间
  • (x)-[:LOCATED_IN*0..1]->(y)
    语法匹配长度为0(在这种情况下,
关系中没有
LOCATED_,并且
x
y
相同)或长度为1的可变长度路径
啊,这是一个非常好的答案:)我明白你的观点。我想知道你有没有看到其他的方法,有没有我没有看到的方法3?还有一个问题,如果可以的话。我使用笼子和动物来混淆我的真实用例,它有点复杂,周期非常个人化和中心化。如果我用一个实体来表示一段时间,并称之为PersonPeriod,或者我们用一个项目工作周期中的某个人的类比来表示,这可以吗。