我正在尝试使用 Neo4j 对项目、员工和项目角色之间的关系进行建模。每个项目都有一个称为“项目经理”的角色和一个称为“总监”的角色。我试图在数据模型中实现的是能够说“对于项目 A,主管是员工 X”。就我的目的而言,重要的是“项目”、“员工”和“角色”都是实体(而不是属性)。这在 Neo4j 中可能吗?简单来说,Neo4j 中可以使用关联实体吗?在 MySQL 中,这将用一个带有唯一 id 列和三个外键列的联结表来表示,一个外键列分别代表项目、人员和角色,这将允许我将这些实体之间的关系识别为实体本身。想法?
最佳答案
@wassgren 的答案很可靠,值得考虑。
我将提供一个额外的选择。也就是说,你可以通过“Reify”表示关系。具体化就是当你把一种关系变成一个节点时。您正在获取一个抽象关联(员工和项目之间的关系),并将其转变为一个具体实体(角色)。所有其他答案选项基本上都涉及两个节点 Project
和 员工
,他们之间的关系有所不同。这些方法并不具体化角色,而是将其存储为关系的属性或标签。
(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;
因此,我认为从长远来看,我的建议更加灵活,但对您来说也可能有点过分了。
考虑一个假设的 future 需求:我们希望将角色与技术级别或工作类别相关联。 IE。项目经理应该始终是副总裁或更高级别(愚蠢的例子)。如果你的角色是一段关系,你就不能这样做。如果您的角色是合适的节点,则可以。
关于neo4j - 在 Neo4j 中将实体与适当的关系相关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27972121/