如何使用密码查询获取连接节点之间的边缘类型

问题描述 投票:1回答:2

我试图从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
2个回答
0
投票

由于邻接矩阵几乎是定义的笛卡尔积,我建议直截了当地这样做。由于最终结果是笛卡尔积,因此在这种情况下避免它是没有好处的。

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 <Path>)
  2. (a) - >(b)[0] |从列表中获取第一个结果(结果是路径)
  3. 关系((a) - >(b)[0])|从路径中提取关系(结果列表<关系>)
  4. 关系((a) - >(b)[0])[0] |从该列表中获取第一个结果(结果是关系)
  5. 类型(关系((a) - >(b)[0])[0])|采取该关系的类型(结果是字符串)

0
投票

由于你无法在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;
© www.soinside.com 2019 - 2024. All rights reserved.