如何通过密码查询在neo4j中获取不同的标签及其数量?

时间:2014-04-28 07:11:18

标签: count neo4j cypher

我需要检查图形数据库neo4j中存在哪些不同的标签。

如何通过密码查询在neo4j中获取不同的标签及其数量?

4 个答案:

答案 0 :(得分:22)

我终于找到了一个不那么复杂的多标签问题的解决方案:

MATCH (a) WITH DISTINCT LABELS(a) AS temp, COUNT(a) AS tempCnt
UNWIND temp AS label
RETURN label, SUM(tempCnt) AS cnt

答案 1 :(得分:5)

使用此cypher查询,我们可以在neo4j中显示不同的标签及其计数。

MATCH (n) RETURN DISTINCT LABELS(n), COUNT(n)

答案 2 :(得分:4)

获得每个标签的计数非常复杂,因为节点可以有多个标签,而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

我确信这可以更优雅地完成,但就我而言。

答案 3 :(得分:0)

您可以按照apoc library所述使用https://stackoverflow.com/a/52489029元图->运行以下代码,即使一个节点上附加了更多标签,它也可以工作。

CALL apoc.meta.stats() YIELD labels
RETURN labels