我需要检查图形数据库neo4j中存在哪些不同的标签。
如何通过密码查询在neo4j中获取不同的标签及其数量?
答案 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