【问题标题】:How to model relationships on relationships?如何在关系上建模关系?
【发布时间】:2014-06-20 17:54:35
【问题描述】:

我要解决下一个问题:

我有 3 个节点:

(n:Node)-[r:HAS_ATTRIBUTE]->(a:Attr {name ="xxxx"}) ->(t:Type)

所有a:Attr 节点都有:翻译关联:

(a) -> [:_HAS_TRANSLATION] -> (tr1:Translation {name : "yyyy", lang ="fr"})

(a) -> [:_HAS_TRANSLATION] -> (tr2:Translation {name : "kkkk", lang ="de"})

现在,我想使用关系来建模相同的事物:

(n:Node)-[r:HAS_ATTRIBUTE {name ="xxxx"}]->(t:Type)

如何在不向n:Node 添加新的_HAS_ATTRIBUTE 的情况下向HAS_ATTRIBUTE 名称属性添加翻译?

我应该需要在 RELATIONSHIP 上有一个 RELATIONSHIP 这样的东西......

【问题讨论】:

    标签: neo4j uml cypher relationships


    【解决方案1】:

    希望我能理解您的问题。

    考虑一个中间节点,例如

    (n:Node)-[:HAS_ATTRIBUTE]->(attr:Attribute {name: "X")),
    (attr)-[:HAS_TRANSLATION]->(tr1:Translation),
    (attr)-[:HAS_TYPE]->(t:Type)
    

    ...或类似的东西。请注意,“attr”将是新的中间节点(显然,您可以随意命名关系)。

    如果您需要更具体(例如属性实例),您始终可以将“attr”替换为“specificAttr”之类的内容,并让“attr”指向“attr”。

    中间节点是解决此类建模问题的好方法,您需要更全面地限定关系。

    【讨论】:

    • 是的,但这正是原始问题,中间节点已经存在。我的目标是删除中间节点....
    【解决方案2】:

    如果我理解正确,您希望只有 2 个节点和 1 个关系,对吗?

    要做到这一点,你可以简单地做到这一点

    (n:Node)-[r:HAS_ATTRIBUTE]->
    (a:Attr {name ="xxxx", lang_fr="yyyy", lang_de="zzzz"})->
    (t:Type)
    

    【讨论】:

    • 不,这并不能解决问题,因为我需要与所有者保持不同的翻译
    • 在这种情况下,你真的需要那个中间节点。
    • 而且,恕我直言,将关系添加到关系中的能力将是 Neo4j 的一大改进。
    • 那不再是图表了。
    • @PaoloDiPietro 你能解释一下你所说的“每个都有一个所有者的不同翻译”是什么意思吗?
    猜你喜欢
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多