Som*_*luk 6 count neo4j cypher
我需要检查图形数据库neo4j中存在哪些不同的标签.
如何通过密码查询在neo4j中获取不同的标签及其数量?
acc*_*PhD 24
我终于找到了一个不太复杂的多标签问题的解决方案:
MATCH (a) WITH DISTINCT LABELS(a) AS temp, COUNT(a) AS tempCnt
UNWIND temp AS label
RETURN label, SUM(tempCnt) AS cnt
Run Code Online (Sandbox Code Playgroud)
使用此cypher查询,我们可以在neo4j中获得不同的标签及其计数.
MATCH (n) RETURN DISTINCT LABELS(n), COUNT(n)
Run Code Online (Sandbox Code Playgroud)
获取每个标签的计数非常复杂,因为节点可以有多个标签并labels (n)返回表示这些标签的字符串集合。在由三个节点和两个标签组成的图上, as {:A}、{:B}和{:A:B},labels (n)返回三个不同的字符串集合。不是计算两个节点:A和 两个节点:B,而是三个标签组合中的每一个的结果都是一个。请参阅控制台。要按标签而不是按标签集合进行聚合,您必须按集合中的值进行分组,这很麻烦。
我有一个丑陋的方法来做到这一点,也许有人可以建议一个更好的方法:首先找出任何节点拥有的最大标签数。
MATCH (n)
RETURN max(length(labels(n)))
Run Code Online (Sandbox Code Playgroud)
然后使用 链接多个查询,按集合中UNION位置的标签对节点进行计数,其中从 0 开始并递增到 max-1。如果节点最多有 3 个标签,ii
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
Run Code Online (Sandbox Code Playgroud)
这会正确聚合标签计数,但它会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
Run Code Online (Sandbox Code Playgroud)
我确信这可以做得更优雅,但据我所知。