Neo4j 复制关系与执行更多查询

Neo4j 复制关系与执行更多查询,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,我有以下架构 您将在的关系中找到重复项。主要是介于徽章和技能之间,因为我希望能够从同一用户的不同徽章中聚合/计算相同的技能 因此,重复关系存在于用户和技能之间。这是因为,例如,如果一个组织想要了解单个或多个接收者的所有技能,我将遵循以下路径: Org -OWNS-> Badges -IS_AWARDED_To-> User -HAS-> Skill //Skill nodes for a specific or multiple user represent each sk

我有以下架构

您将在
的关系中找到重复项。主要是介于
徽章
技能
之间,因为我希望能够从同一
用户的不同
徽章
中聚合/计算相同的
技能

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

 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
,我将改为遵循以下路径:

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的灵活性对于图形重构非常好!)

在它里面,没有什么是免费的:如果您复制一些数据以在读取中获得更好的性能,那么您将对写入产生影响

编写
(徽章)-[:HAS]->(技能)
关系时,还需要创建
(用户)-[:HAS]->(技能)
rel(更新或删除时相同)


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

当您说
less
more
查询时,您谈到的是查询的复杂性以及执行时间,对吗?是的,我一般是说逻辑选择。根据我的理解,以较少的查询获得结果是更好的选择。