我有以下架构。
您会发现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
};
}
关系中存在重复项。主要的是在HAS
和Badge
之间,因为我希望能够从同一Skill
的不同Skill
聚合/计算同一Badge
。>
因此,重复关系在User
和User
之间。这是因为,例如,如果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的新手,请随时告诉我,我的两种方法似乎都是令人费解的,并且有一种更优化的方法可以实现我想做的事情。
答案 0 :(得分:2)
您的两个模型均有效,您可以同时使用它们。
但是,就像您说的那样,在第一个数据上,您复制了一些数据。通常,当我们遇到一些性能问题时,我们会这样做。现在是你的情况吗?
作为起点,我建议您从模型2开始(即不重复),如果该模型有问题,可以轻松地将其更改为模型1 (Neo4j的灵活性对于图形重构来说确实很棒!)。
在IT中,没有什么是免费的:如果复制某些数据以提高读取性能,则会对写入产生影响。
编写(badge)-[:HAS]->(skill)
关系时,还需要创建一个(user)-[:HAS]->(skill)
rel(与更新或删除相同)。
因此,在更新图形时,需要保持此数据的一致性。实际上,这就像您正在创建SQL存储视图一样。