【发布时间】:2020-03-26 16:50:48
【问题描述】:
我的图模型应该允许从父级继承属性到子级,并覆盖子级继承的这些属性。属性是通过HAS 关系附加的节点。
CREATE (parent:Node {id: "P"})-[:HAS {inherited: true}]->(:Attribute:Name {value: "Indirect Name"})
CREATE (parent)-[:HAS]->(:Attribute:Other {value: "Other Attribute"})
CREATE (c1:Node {id: "C1"})-[:HAS]->(:Attribute:Name {value: "Direct Name"})
CREATE (c1)-[:BELONGS_TO]->(parent)
CREATE (c2:Node {id: "C2"})-[:BELONGS_TO]->(parent)
在这个例子中,我们有C1-[:BELONGS_TO]->P 和C2-[:BELONGS_TO]->P。 P 定义了一个被继承的属性Name 和一个不被继承的属性Other。 C1 覆盖了Name 属性,而C2 继承了该属性。
我现在想查找属于某个节点的所有相关属性:C1 的直接附加名称属性和 C2 的间接名称属性。不应为 C1 和 C2 考虑“其他”属性,因为它不是继承的。
要获取所有直接和继承的属性,我可以使用以下查询:
MATCH (c {id: "C1"})-[:HAS]->(directAttribute:Attribute), (c)-[]->(:Node)-[:HAS{inherited: true}]->(inheritedAttribute:Attribute) RETURN directAttribute, inheritedAttribute
但这显然会返回Name 属性,一个来自C1 和继承自P。我们如何“更喜欢”直接附加到节点的属性而不是继承的属性,以便在这种情况下查询只返回“直接”名称属性?
【问题讨论】:
标签: neo4j cypher graph-databases