复制关系与执行更多查询

Duplicating relations vs executing more queries

我有以下架构。

您会发现 HAS 关系中存在重复。主要的是在 BadgeSkill 之间,因为我希望能够从相同 User 的不同 Badge 中 aggregate/count 相同 Skill

因此,UserSkill 之间存在重复关系。这是因为,例如,如果 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.

但是,如果我不添加 UserSkill 之间的重复关系 HAS,我将改为遵循以下路径:

Org -OWNS-> Badges -IS_AWARDED_TO-> User -IS_AWARDED-> Badges -HAS-> Skill
//Now I have all skills for a specific or multiple User for every badge awarded

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

你的两个模型都是有效的,你可以同时使用它们。

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

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

在 IT 领域,没有什么是免费的:如果复制一些数据以获得更好的读取性能,则会对写入产生影响。

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

所以更新图表的时候需要保持这个数据的一致性。事实上,这就像您正在创建一个 SQL 存储视图。