【发布时间】:2014-06-13 14:55:17
【问题描述】:
我需要检查图形数据库 neo4j 中存在哪些不同的标签。
如何通过密码查询在 neo4j 中获取不同的标签及其数量?
【问题讨论】:
我需要检查图形数据库 neo4j 中存在哪些不同的标签。
如何通过密码查询在 neo4j 中获取不同的标签及其数量?
【问题讨论】:
您可以利用apoc library 元图,如此处所述https://stackoverflow.com/a/52489029 --> 运行下面的代码,即使有更多标签附加到一个节点,它也可以工作。
CALL apoc.meta.stats() YIELD labels
RETURN labels
【讨论】:
通过这个密码查询,我们可以得到 neo4j 中存在的不同标签及其数量。
MATCH (n) RETURN DISTINCT LABELS(n), COUNT(n)
【讨论】:
[Matrix]、[Crew] 和[Matrix, Crew] 作为三个单独的结果。
我终于找到了一个不那么复杂的多标签问题的解决方案:
MATCH (a) WITH DISTINCT LABELS(a) AS temp, COUNT(a) AS tempCnt
UNWIND temp AS label
RETURN label, SUM(tempCnt) AS cnt
【讨论】:
获取每个标签的计数非常复杂,因为节点可以有多个标签,labels (n) 返回代表这些标签的字符串集合。在由三个节点和两个标签组成的图上,如{:A}、{:B} 和{:A:B},labels (n) 返回三个不同的字符串集合。不是用:A 计算两个节点,用:B 计算两个节点,结果将是三个标签组合中的每一个的一个。见console。要聚合每个标签,而不是每个标签集合,您必须按集合中的值进行分组,这很麻烦。
我有一个丑陋的方法,也许有人可以提出更好的方法:首先找出任何节点的最大标签数。
MATCH (n)
RETURN max(length(labels(n)))
然后将多个查询与UNION 链接起来,按集合中位置i 的标签计数节点,其中i 从0 开始并递增到max-1。如果节点最多有3个标签,
MATCH (n)
RETURN labels (n)[0] as name, count (n) as cnt
UNION MATCH (n)
RETURN labels (n)[1] as name, count (n) as cnt
UNION MATCH (n)
RETURN labels (n)[2] as name, count (n) as cnt
这会正确聚合标签计数,但对于索引超出集合范围的每种情况,它都会返回 null 计数。对于第一个返回([0] 索引),这表示没有标签的节点。对于其他行,空计数同样表示标签少于查询的节点,但此信息无关紧要,因此可以忽略
MATCH (n)
RETURN labels (n)[0] as name, count (n) as cnt
UNION MATCH (n)
WITH labels (n)[1] as name, count (n) as cnt
WHERE name IS NOT NULL
RETURN name, cnt
UNION MATCH (n)
WITH labels (n)[2] as name, count (n) as cnt
WHERE name IS NOT NULL
RETURN name, cnt
我确信这可以更优雅地完成,但就我所知。
【讨论】: