Neo4j/Graph(一般)枚举器建模最佳实践

Neo4j/Graph (in general) Enumerator Modeling Best Practice

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

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

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

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

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

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

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

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

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

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

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

然而,从 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)
...

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