【问题标题】:How to express a time period (temporal) relationship in a graph database neo4j如何在图数据库neo4j中表达时间段(时间)关系
【发布时间】:2023-03-05 19:40:05
【问题描述】:

您好,我想在 neo4j 中表达以下关系,我想找到最佳方式,或者可能不是最佳方式,但我可以通过不同的方式以一种好的方式做到这一点。案例如下:

  • 我有一只动物
  • 动物可以放在笼子里或空旷的田野里。
  • Animal 和 Cage 之间的关系在一段时间内有效。

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

方法 1。

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

方法 2。

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

那么关系会是这样的。 *动物 --FOR--> 时期 --Assigned-->CAGE

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

如果动物都以相同的时间间隔放在同一个笼子里,我们应该能够收集信息。问题是一个开放空间可能包含许多笼子,所以我们想知道两只动物是否曾经在同一个开放空间内共存。

【问题讨论】:

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


    【解决方案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) &lt; ID(a2) 测试用于避免重复结果(动物 1 和 2,然后再次作为 2 和 1)。
    • r1.start &lt; r2.end AND r2.start &lt; r1.end 测试用于检测重叠的占用时间。
    • (x)-[:LOCATED_IN*0..1]-&gt;(y) 语法匹配长度为 0(在这种情况下不存在 LOCATED_IN 关系,xy 相同)或长度为 1 的可变长度路径。

    【讨论】:

    • 啊,这是一个很好的答案:) 我明白你的观点与方法二。我想知道您是否看到任何替代方法,是否有我没有看到的方法 3?
    • 还有一个问题,如果可以的话。我使用笼子和动物来混淆我的真实用例,这有点复杂,而且时期非常个性化和中心化。如果我将实体用于一个 Period 并称之为 PersonPeriod,或者我们使用从事项目 WorkPeriod 的人的类比,这将被拟人化,是否可以。
    猜你喜欢
    • 1970-01-01
    • 2021-11-21
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    相关资源
    最近更新 更多