获取 Neo4j 中每种关系类型和标签的关系数量

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

我有这样的疑问:

MATCH (a:Label_A)-[r]-(b:Label_B)
RETURN type(r) AS Relationship_Type, COUNT(*) AS Count

这会生成一个带有标题 Relationship_TypeCount 以及每种关系类型的计数的表。
我想扩展此表以包含每种类型标签的计数,因此不仅在

Label_A
Label_B
之间,还包括
Label_A
Label_C
Label_B
Label_C
等。对应的列,例如每个可能的组合的
Count_Label_B_Label_C

怎么才能实现呢?

database neo4j
2个回答
0
投票

以下查询将遍历数据库中的所有关系,枚举起始节点和结束节点上的所有标签,然后计算这些对出现的频率:

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

0
投票

如果不动态构建查询,就不可能拥有动态列。例如,您可以使用

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
子句可能会非常慢。

© www.soinside.com 2019 - 2024. All rights reserved.