我很好奇在Neo4j中模拟枚举器的最佳方法是什么。它们应该是节点,关系,属性等吗?
enum Activity {
BASKETBALL, // ID: 1
HOCKEY // ID: 2
}
例如,在SQL中,我可以创建一个枚举表,并具有指向该查找表的外键关系(ID: 1, 2
)。我应该只为每个条目(BASKETBALL, HOCKEY
)创建一个节点,该节点可能位于该SQL枚举表中,还是应该位于标签或属性中?比如,数千或数百万个节点因此指向那个枚举节点,或者它或多或少不是真正的问题,是否会对性能产生影响?
据我所知,每种情况都有可能存在,若有,请说明何时使用。
答案 0 :(得分:1)
对于这种建模,节点是最佳近似值,标签是类型,每个值都有一个属性。
为你的枚举示例建模你可能有:
(:Activity{name:'BASKETBALL'})
(:Activity{name:'HOCKEY'})
然后,您可以根据需要与这些节点建立关系:
(:Person{name:'Matt'})-[:INTERESTED_IN]->(:Activity{name:'HOCKEY'})
这使得它适用于大多数类型的查询(向我提供有关Matt的信息,包括他感兴趣的活动; Matt是否对曲棍球感兴趣?哪些人对曲棍球感兴趣?)
如果您可能有数千或数百万个节点连接到枚举,性能影响实际上取决于您正在遍历的方向。如果一个人只有一个(或几个)关系:Activity节点,那么从人到活动的查询将是便宜的。
然而,从活动到人的查询可能更昂贵。例如,如果您的曲棍球节点有数百万个连接,这种查询可能是个问题
...
// 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)
...
比赛中的第一次遍历是便宜的,因为人们对他们感兴趣的东西很少......但是第二次可能更贵,因为很多人对同样的事情感兴趣。