【问题标题】:How to get edge type between connected nodes using cypher query如何使用密码查询获取连接节点之间的边缘类型
【发布时间】:2018-09-14 03:21:30
【问题描述】:

我正在尝试从 neo4j 图中获取 Adjacency-Matrix。该矩阵包含丰富的特征。这意味着,如果两个节点相连,则将节点的类型(类型是节点的字段)和边类型放入相应的单元格中。 这是一个样本矩阵:

[
   [0, 'node_1_type : edge_type : node_2_type', 0],
   ...
]

这是我要尝试的密码查询。但我不知道如何获取连接节点的 edge_type。

MATCH (n)
WITH collect(n) AS Nodes
WITH [n IN Nodes |
        [m IN Nodes |
            CASE size((n)-[]->(m))
                WHEN 0 THEN 0
                ELSE n.type + ':' + 'edge-type ??'  +  ':' + m.type
            END
        ]
    ] AS AdjacencyMatrix
RETURN AdjacencyMatrix;

能否请您帮助如何获取连接节点之间的边缘类型。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    由于邻接矩阵几乎按照定义是笛卡尔积,因此我建议直接使用此方法。由于最终结果是笛卡尔积,因此在这种情况下避免它没有任何好处。

    MATCH (a), (b) OPTIONAL MATCH (a)-[r]->(b) 
    WITH a,b,
     CASE r 
      WHEN null THEN 0 
      ELSE a.type+":"+TYPE(r)+":"+b.type 
     END as edge 
    // collect rows into matrix
    return a, edge, b
    

    另一方面,如果出于某种原因你坚持以艰难的方式这样做,你实际上可以使用模式匹配来提取信息(不过,效率要低得多,因为你迫使 Neo4j 不必要地匹配所有内容多次)

    MATCH (a), (b) 
    WITH a,b,
    CASE SIZE((a)-->(b)) 
     WHEN 1 THEN a.type+":"+TYPE(RELATIONSHIPS((a)-->(b)[0])[0])+":"+b.type 
     ELSE 0 
    END as edge 
    // collect rows into matrix
    return a, edge, b
    

    这里的魔法显然是TYPE(RELATIONSHIPS((a)-->(b)[0])[0]),所以这是它的工作原理,按照评估的顺序(部分以粗体进行评估)

    1. (a)-->(b) |第一个模式匹配 (a)-->(b)(结果是 List
    2. (a)-->(b)[0] |从列表中取出第一个结果(结果是路径)
    3. 关系((a)-->(b)[0]) |从路径中提取关系(结果列表
    4. 关系((a)-->(b)[0])[0] |从该列表中获取第一个结果(结果是关系)
    5. 类型( 关系((a)-->(b)[0])[0]) |取那个关系的类型(结果是字符串)

    【讨论】:

      【解决方案2】:

      由于您无法在CASE 中获得命名结果,请使用UNWIND

      MATCH (n)
      WITH collect(n) AS Nodes
      UNWIND Nodes AS n
        UNWIND Nodes AS m
        OPTIONAL MATCH (n)-[r]->(m)
        WITH n, m, 
          CASE r 
            WHEN NULL THEN 0 
            ELSE n.type + ':' + type(r) + ':' + m.type
          END AS e
        WITH m, collect(e) AS row
      WITH collect(row) AS AdjacencyMatrix
      RETURN AdjacencyMatrix;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-06
        相关资源
        最近更新 更多