复制关系与执行更多查询

时间:2018-06-25 08:47:34

标签: neo4j cypher graph-databases

我有以下架构。

enter image description here

您会发现const corner = offsetBy( +1, container.coords, rotateCCWBy(container.angle, offsetBy( +1, image.coords, rotateCCWBy(image.angle, {x: image.width, y: image.height} ) ) ) ); function rotateCCWBy(angle, {x, y}) { const angle_rad = angle * Math.PI / 180; const cos_a = Math.cos(angle_rad), sin_a = Math.sin(angle_rad); return { x: cos_a * x - sin_a * y, y: sin_a * x + cos_a * y }; } 关系中存在重复项。主要的是在HASBadge之间,因为我希望能够从同一Skill的不同Skill聚合/计算同一Badge

因此,重复关系在UserUser之间。这是因为,例如,如果Skill想了解单个或多个接收者的所有技能,我将遵循以下路径:

Organization

但是,如果我没有在 Org -OWNS-> Badges -IS_AWARDED_To-> User -HAS-> Skill //Skill nodes for a specific or multiple user represent each skill contained in every Badge the user was awarded. HAS之间添加重复的关系User,我将遵循以下路径:

Skill

两条路径之间的区别很明显。第一个查询将导致较少的查询,但是关系的重复是一个问题。第二个将消除重复问题(这是一个问题吗?),但会有更多查询。我仍然是neo4j的新手,请随时告诉我,我的两种方法似乎都是令人费解的,并且有一种更优化的方法可以实现我想做的事情。

1 个答案:

答案 0 :(得分:2)

您的两个模型均有效,您可以同时使用它们。

但是,就像您说的那样,在第一个数据上,您复制了一些数据。通常,当我们遇到一些性能问题时,我们会这样做。现在是你的情况吗?

作为起点,我建议您从模型2开始(即不重复),如果该模型有问题,可以轻松地将其更改为模型1 (Neo4j的灵活性对于图形重构来说确实很棒!)。

在IT中,没有什么是免费的:如果复制某些数据以提高读取性能,则会对写入产生影响。

编写(badge)-[:HAS]->(skill)关系时,还需要创建一个(user)-[:HAS]->(skill) rel(与更新或删除相同)。

因此,在更新图形时,需要保持此数据的一致性。实际上,这就像您正在创建SQL存储视图一样。