我尝试使用 Neo4j 对项目、员工和项目角色之间的关系进行建模。每个项目都有一个称为“项目经理”的角色和一个称为“总监”的角色。我试图在数据模型中实现的是能够说“对于项目 A,主管是员工 X”。就我的目的而言,重要的是“项目”、“员工”和“角色”都是实体(而不是属性)。这在 Neo4j 中可能吗?简单来说,Neo4j 中可以使用关联实体吗?在 MySQL 中,这将用一个带有唯一 id 列和三个外键列的联结表来表示,一个外键列分别代表项目、人员和角色,这将允许我将这些实体之间的关系识别为实体本身。想法?
@wassgren 的答案很可靠,值得考虑。
我将提供一种额外的选择。也就是说,您可以“Reify“这种关系。具体化就是当你将一种关系转变为一个节点时。你将一种抽象的关联(员工和项目之间的关系)转变为一个具体的实体(角色)。其他答案选项基本上涉及两个节点Project
and Staff
,它们之间的关系存在变化。这些方法并不具体化角色,而是将其存储为关系的属性或标签。
(director:Staff {name: "Joe"})-[:plays]->(r:Role {label:"Director"})-[:member_of]->(p:Project { name: "Project X"});
所以......人们不会直接为项目做出贡献,而是角色。人们扮演角色。这是一种直观的感觉。
这种方法的优点是,您可以将“角色”视为一等公民,并断言它的关系和属性。如果您不将“角色”拆分为单独的节点,您将无法将关系挂在该节点之外。此外,如果您向伪装成角色的关系添加额外的属性,您最终可能会对属性何时适用于角色以及何时适用于工作人员与项目之间的关联感到困惑。
想知道谁在参与一个项目吗?那只是:
MATCH (p:Project {label: "Project X"})<-[:member_of]-(r:Role)<-[:plays]-(s:Staff)
RETURN s;
所以我认为我的建议从长远来看更加灵活,但对你来说也可能有点过分了。
考虑一个假设的未来需求:我们希望将角色与技术级别或工作类别相关联。 IE。项目经理应该始终是副总裁或更高级别(愚蠢的例子)。如果你的角色是一段关系,你就不能这样做。如果您的角色是合适的节点,则可以。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)