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

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)

  • 难以置信的.快.非常低估了答案.:) (3认同)

Som*_*luk 6

使用此cypher查询,我们可以在neo4j中获得不同的标签及其计数.

MATCH (n) RETURN DISTINCT LABELS(n), COUNT(n)
Run Code Online (Sandbox Code Playgroud)

  • 如果您没有多个重叠的标签组合,则可以使用.尝试在[Neo4j控制台](http://console.neo4j.org/r/lxoasa)中的示例数据,它将`[Matrix]`,`[Crew]`和`[Matrix,Crew]`返回为三单独的结果. (3认同)

jja*_*erg 4

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

我确信这可以做得更优雅,但据我所知。