【问题标题】:Repeated properties from same Node when using keys()使用键()时来自同一节点的重复属性
【发布时间】:2018-04-20 10:51:35
【问题描述】:

我试图从带有标签的节点中获取所有属性:

如您所见,第一行和第五行属于同一个节点标签,但它们的属性交换了位置。它们似乎各自相同,所以这不是区分大小写的问题。

查询

MATCH (N:INCIDENT) RETURN COUNT(N)

返回两行的 count(N) 值之和。

我使用keys() 来返回属性,值是地图the properties are structured as 的列表。我知道地图本身并没有排序,但这种方式不符合重点。

这就是我创建违规节点的方式:

它应该像这样工作吗?如果节点缺少属性之一,我会理解重复。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    由于一个节点可以有多个标签,以下是@logisma 的第二个查询的更安全版本。它使用 APOC 函数 apoc.coll.sortlabels keys 集合进行排序,以确保不同的标签/键排序不会影响结果。

    MATCH (n)
    RETURN
      apoc.coll.sort(LABELS(n)) AS labels,
      apoc.coll.sort(KEYS(n)) AS keys,
      COUNT(*);
    

    【讨论】:

    • 所以我似乎不得不依赖 APOC,但是,你知道为什么会发生这种情况吗?如果它源于我的节点创建,它可能会帮助我避免问题。谢谢。
    • 标签和属性的返回顺序是一个实现细节,没有记录。因此,您不应该假设任何特定的顺序或者它是一致的。
    • 好的,这真的很有帮助。再次感谢。
    【解决方案2】:

    你可以试试这个查询:

    MATCH (n) 
    WITH labels(n) AS labels, keys(n) AS keys
    UNWIND keys AS key 
    WITH labels, key ORDER BY labels, key
    RETURN labels, collect(DISTINCT key) AS keys, count(*)
    

    但是这个查询会很慢,因为你扫描了所有的节点......

    如果你有APOC,你也可以使用apoc.coll.sort(coll)函数对keys()数组进行排序:

    MATCH (n) 
    RETURN labels(n) AS labels, apoc.coll.sort(keys(n)) AS keys, count(*)
    

    【讨论】:

    • 第一个查询不太正确,因为它使用了 2 个aggregation functionsCOLLECTCOUNT),并使用labels 作为分组键。这意味着labels 的所有键都将组合在一起,即使它们并不总是一起出现在所有相关节点中。
    猜你喜欢
    • 2021-03-18
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 2017-09-07
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    相关资源
    最近更新 更多