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



我正在尝试从neo4j图中获取邻接矩阵。该矩阵包含丰富的功能。这意味着,如果连接了两个节点,则将节点的类型(类型是节点的字段(和边类型放入相应的单元格中。 这是一个示例矩阵:

[
[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;

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

由于邻接矩阵几乎是定义上的笛卡尔乘积,因此我建议以直接的方式执行此操作。由于最终结果是笛卡尔乘积,因此在这种情况下避免它没有任何好处。

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( (结果为 List(
  2. (a(-->(b([0]|从列表中获取第一个结果(结果是路径(
  3. 关系(a(-->(b([0](|从路径中提取关系(结果列表<关系>(
  4. 关系(a(-->(b([0]([0]|从该列表中获取第一个结果(结果是关系(
  5. 类型( 关系((a(-->(b([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;

最新更新