Моя графовая модель должна позволять наследовать атрибуты от родителя к дочернему элементу и переопределять такие унаследованные атрибуты на дочернем элементе. Атрибуты - это узлы, связанные с отношением 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. Атрибут "other" не следует рассматривать для C1 и C2, поскольку он не наследуется.
Чтобы получить все прямые и унаследованные атрибуты, я могу использовать этот запрос:
MATCH (c {id: "C1"})-[:HAS]->(directAttribute:Attribute), (c)-[]->(:Node)-[:HAS{inherited: true}]->(inheritedAttribute:Attribute) RETURN directAttribute, inheritedAttribute
Но это, очевидно, будет вернуть оба Name
атрибута, один из C1
и наследуемый от P
. Как мы можем «предпочесть» атрибуты, которые непосредственно привязаны к узлу, по сравнению с унаследованным, чтобы в этом случае только «прямой» атрибут имени возвращался запросом?