【问题标题】:How to get different labels and their count in neo4j by cypher query?如何通过密码查询在 neo4j 中获取不同的标签及其计数?
【发布时间】:2014-06-13 14:55:17
【问题描述】:

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

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

【问题讨论】:

    标签: count neo4j cypher


    【解决方案1】:

    您可以利用apoc library 元图,如此处所述https://stackoverflow.com/a/52489029 --> 运行下面的代码,即使有更多标签附加到一个节点,它也可以工作。

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

    【讨论】:

      【解决方案2】:

      通过这个密码查询,我们可以得到 neo4j 中存在的不同标签及其数量。

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

      【讨论】:

      • 如果您没有多个重叠的标签组合,则可以使用。对Neo4j console 中的样本数据进行尝试,它返回[Matrix][Crew][Matrix, Crew] 作为三个单独的结果。
      • 哦。我没有考虑同一节点上的多个标签。感谢您的回答:)
      【解决方案3】:

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

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

      【讨论】:

      • 难以置信。也快。非常被低估的答案。 :)
      【解决方案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
      

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

      【讨论】:

      • 非常好的和全面的答案,@jjaderberg!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多