【问题标题】:Neo4j/Graph (in general) Enumerator Modeling Best PracticeNeo4j/Graph(一般)枚举器建模最佳实践
【发布时间】:2018-09-10 00:00:57
【问题描述】:

我很好奇在 Neo4j 中建模枚举器的最佳方法是什么。它们应该是节点、关系、属性等吗?

enum Activity {
    BASKETBALL,  // ID: 1
    HOCKEY // ID: 2
}

例如,在 SQL 中,我可以只创建一个枚举表并让外键关系 (ID: 1, 2) 指向该查找表。我应该只为该 SQL 枚举表中的每个条目 (BASKETBALL, HOCKEY) 设置一个节点,还是应该在标签或属性中?例如,数千或数百万个节点指向一个枚举节点是否会对性能产生影响,还是或多或少不是一个真正的问题?

我知道每种情况都可能存在,如果是,请说明何时使用哪种情况。

【问题讨论】:

    标签: neo4j graph-databases


    【解决方案1】:

    对于这种建模,节点是最好的近似,标签是类型,每个属性的值。

    要为您的枚举示例建模,您可能有:

    (:Activity{name:'BASKETBALL'})
    (:Activity{name:'HOCKEY'})
    

    然后您可以根据需要与这些节点建立关系:

    (:Person{name:'Matt'})-[:INTERESTED_IN]->(:Activity{name:'HOCKEY'})
    

    这使它适用于大多数类型的查询(给我关于 Matt 的信息,包括他感兴趣的活动;Matt 对曲棍球感兴趣吗?哪些人对曲棍球感兴趣?)

    在您可能有数千或数百万个节点连接到枚举的情况下,性能影响实际上取决于您遍历的方向。如果一个人与 :Activity 节点只有一个(或几个)关系,那么从人员到活动的查询会很便宜。

    但是,从活动到人员的查询可能会更昂贵。例如,如果您的 hockey 节点有数百万个连接,那么这种查询可能会出现问题

    ...
    // previously matched (p:Person) to all students at a school
    // per student, find who else has a common interest in an activity
    MATCH (p)-[:INTERESTED_IN]->()<-[:INTERESTED_IN]-(personWithCommmonInterest)
    ...
    

    匹配中的第一次遍历很便宜,因为人们几乎没有他们感兴趣的东西......但第二次可能更昂贵,因为很多人都对同一件事感兴趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      相关资源
      最近更新 更多