【问题标题】:Graph Database, Modeling three node combination relationship efficiently图数据库,高效建模三节点组合关系
【发布时间】:2015-08-21 12:24:54
【问题描述】:

我偶然发现了与neo4j - Relationship between three nodes 相同的问题。我是 Neo4J 的新手,想将关系数据库建模为图形。

我有A、B、C三种数据。B、B1的一个实例,可以属于C、C1的一个实例,A、A1的一个实例可以属于B1和C1,但是如果和仅当 B1 属于 C1。这里的问题是,我也可以让 A1 属于属于 C1 的 B2,而 A1 也属于属于 C2 的 B1。这将是三个合法的、独立的组合。因此,在我的数据库中,我将有一个连接表,在记录中我将保留三个 id 的组合,表示由实例形成的关系。

现在,据我所知,超边类似于我正在搜索的内容 (http://neo4j.com/docs/stable/cypher-cookbook-hyperedges.html)。首先,我想添加这样的关系:

A-[:PART_OF]->三重

B-[:PART_OF]->三重

C-[:PART_OF]->三重

第一个问题/问题:如果要删除 B 类实例,则三重节点将保留。我猜我在删除东西时必须以某种方式处理这个问题?

第二个问题/问题:我的主要问题是,如果我添加更多的关系会更有效吗?例如 A-[:BELONGS_TO]->C。所以,如果我想要 A1 所属的所有类型 C 实例,我可以一跳返回结果。关系遍历的数量将少于必须访问的“三重”类型节点。我想基本上我在问 Neo4j 如何在内部寻找模式(它从哪里开始,它是否重新检查节点等)。因为我猜测(可能是错误的)如果我想要 A1 所属的 Cs,我会写如下内容:

匹配 A1-[:PART_OF]->三重

该查询将如何工作?首先检索所有三元组 A1 的一部分,然后是所有 C 类型的一部分,最后返回匹配项?

有什么提示吗? 提前致谢。

【问题讨论】:

    标签: mysql graph neo4j cypher graph-databases


    【解决方案1】:

    如果我理解正确,您确实想表示transitive 关系,如:

    (:A)-[:BELONGS_TO]->(:B)-[:BELONGS_TO]->(:C)
    

    如果是这样,则无需使用“三元组”,因为 neo4j 可以轻松表示和处理传递关系。

    假设您的测试数据(如您的问题中所述)是这样创建的:

    CREATE
      (a1:A {name:"a1"}),
      (b1:B {name:"b1"}), (b2:B {name:"b2"}),
      (c1:C {name:"c1"}), (c2:C {name:"c2"}),
      (a1)-[:BELONGS_TO]->(b1),
      (b1)-[:BELONGS_TO]->(c1),
      (b1)-[:BELONGS_TO]->(c2),
      (a1)-[:BELONGS_TO]->(b2),
      (b2)-[:BELONGS_TO]->(c1)
    

    使用该数据,您可以使用以下查询来获取特定 A 节点间接所属的 C 节点。此查询还返回使用的路径,因为任何特定的 AC 对之间可以有多个路径。 Here is a console 表明这个工作正常。

    MATCH p=(:A { name:"a1" })-[:BELONGS_TO*2..2]->(c:C)
    RETURN p, c;
    

    如果您只希望结果中有不同的 C 节点,可以这样做:

    MATCH (:A { name:"a1" })-[:BELONGS_TO*2..2]->(c:C)
    RETURN DISTINCT c;
    

    【讨论】:

    • 对不起,cybersam,也许我的例子不完整。是的,这是一种传递关系,但这只会增加我的问题。假设现在,三元组 a2,b1,c2 开始发挥作用。我应该如何处理 Neo4j 中的这个新的“RDBMS”条目?因为在插入新的三元组之后(通过简单地添加 a2->b1 rel),在某些时候我可能不希望 a1 属于 c2,但是关系 b1-[:BELONGS_TO]->c2 必须保留为了a2。这意味着路径 a1->b1->c2 仍然存在。也许我应该在关系中保留一个属性,说明路径从哪个 A 实例开始。
    • 如果路径a1-[:BELONGS_TO]->b1仍然存在,那么传递性应该意味着a1也属于c2。您是说您希望能够“关闭”某些路径的传递性吗?如果是这样,在关系中保留一组“传递”(或“非传递”,取决于哪个最不常见)A 名称(或 ID,或其他)应该有效。
    • 是的,我猜这一定是解决方案。因为我希望所有关系都存在,但不希望所有形成的路径都有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多