【问题标题】:Make relationship based on other relationships in neo4j?根据neo4j中的其他关系建立关系?
【发布时间】:2016-04-07 12:09:47
【问题描述】:

假设我在 neo4j 中存储了以下关系。

A->B,A->D,C->B,C->E

这里A、C是同一个标签节点,B、E也是同一个标签节点。 计算 A 和 C 共有多少个节点的密码查询是什么? 基于此,我想建立 A 和 C 之间的关系。我想在它们之间添加一个关系等级并给它一些值,比如 0.5,因为 1 个节点是常见的。该查询会是什么样子?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    要返回 AC 之间的公共节点数,匹配具有 的模式A 在一个,C 在另一个带有中间节点。然后统计中间节点的出现次数。

    match (:TypeOne {name: 'A'})--(common)--(:TypeOne {name: 'C'})
    return count(common)
    

    如果您想作为匹配结果直接在 AC 之间创建关系,那么将 mergecreateAC 节点一起使用。并使用set 为新创建的关系添加一个值。

    这样的东西应该可以满足你的要求。

    match (a:TypeOne {name: 'A'})--(common)--(c:TypeOne {name: 'C'})
    with a, c, count(common) as in_common
    merge (a)-[rel:COMMON_WITH]->(c)
    set rel.value = in_common * 0.5
    return *
    

    【讨论】:

    • 但是假设我有一个csv文件并且有相同类型A,C的不同节点,那么我必须根据它们之间的公共节点在所有这些节点之间建立关系。那么应该查询什么?
    • 我假设 csv 文件的每一行都包含正在寻找的两个节点的键(或某些标识符)。您可以将上述查询中的 'A' 和 **'C'** 匹配项替换为您要查找的实际节点(例如 line.a_node 和 line.c_node)。