Neo4j 使用键()时来自同一节点的重复属性

Neo4j 使用键()时来自同一节点的重复属性,neo4j,cypher,Neo4j,Cypher,我试图从带有标签的节点获取所有属性时: 如您所见,第一行和第五行属于同一个节点标签,但它们的属性已交换位置。它们看起来是一样的,所以这不是一个区分大小写的问题 询问 MATCH (N:INCIDENT) RETURN COUNT(N) 返回两行的计数(N)值之和 我使用返回属性,值是映射的列表。我知道地图本身并不是有序的,但这种做法不符合这一点 这就是我创建有问题节点的方式: 它应该这样工作吗?如果节点缺少其中一个属性,我会理解重复项。您可以尝试以下查询: MATCH (n) WITH

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

如您所见,第一行和第五行属于同一个节点标签,但它们的属性已交换位置。它们看起来是一样的,所以这不是一个区分大小写的问题

询问

MATCH (N:INCIDENT) RETURN COUNT(N)
返回两行的计数(N)值之和

我使用返回属性,值是映射的列表。我知道地图本身并不是有序的,但这种做法不符合这一点

这就是我创建有问题节点的方式:


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

您可以尝试以下查询:

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)
函数对
键进行排序()
数组:

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

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

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

第一个查询不太正常,因为它使用2(
COLLECT
COUNT
),并使用
labels
作为分组键。这意味着
标签
的所有键都将组合在一起,即使它们并不总是同时出现在所有相关节点中。因此我不得不依赖APOC,但是,你知道为什么会发生这种情况吗?如果问题源于我的节点创建,它可能会帮助我避免这个问题。谢谢。标签和属性的返回顺序是一个实现细节,没有文档记录。因此,你不应该假设任何特定的顺序或者它是一致的。好的,这真的很有帮助。再次感谢。