我有这样的疑问:
MATCH (a:Label_A)-[r]-(b:Label_B)
RETURN type(r) AS Relationship_Type, COUNT(*) AS Count
这会生成一个带有标题 Relationship_Type 和 Count 以及每种关系类型的计数的表。
我想扩展此表以包含每种类型标签的计数,因此不仅在
Label_A
和 Label_B
之间,还包括 Label_A
和 Label_C
、Label_B
和 Label_C
等。对应的列,例如每个可能的组合的Count_Label_B_Label_C
。 以下查询将遍历数据库中的所有关系,枚举起始节点和结束节点上的所有标签,然后计算这些对出现的频率:
MATCH (a)-[r]->(b)
UNWIND labels(a) AS Label_Start
UNWIND labels(b) AS Label_End
RETURN
type(r) AS RelationshipType,
Label_Start,
Label_End,
count([Label_Start, Label_End]) AS Count
如果不动态构建查询,就不可能拥有动态列。例如,您可以使用
apoc.cypher.run
从 Cypher 中执行此操作。但这需要相当多的创造力。
但是,如果可以将计数放在单独的行上,则更简单:
WITH COLLECT { CALL db.labels() yield label } AS labels
UNWIND labels AS lhs
UNWIND labels AS rhs
WITH lhs, rhs ORDER BY lhs, rhs WHERE lhs <= rhs
MATCH (a WHERE lhs IN labels(a))-[r]-(b WHERE rhs IN labels(b))
RETURN 'Count_Label_' + lhs + 'Label_' + rhs AS Label_Pair,
type(r) AS Relationship_Type,
count(*) AS COUNT
它将返回以下格式的结果:
+------------------------------------------------+
| Label_Pair | Relationship_Type | COUNT |
+------------------------------------------------+
| "Count_Label_A_B" | "R" | 2134 |
| "Count_Label_A_A" | "R" | 14 |
| "Count_Label_A_C | "S" | 52582 |
| "Count_Label_B_C | "R" | 267283 |
| "Count_Label_D_E | "L" | 35 |
+------------------------------------------------+
说明:
db.labels()
过程返回数据库中的所有标签COLLECT
将生成的标签行转换为列表UNWINDS
加上 WITH
子句创建所有标签对减去重复项的乘积MATCH
找到具有一对标签的节点对根据数据的大小,该
MATCH
子句可能会非常慢。