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,但是,你知道为什么会发生这种情况吗?如果问题源于我的节点创建,它可能会帮助我避免这个问题。谢谢。标签和属性的返回顺序是一个实现细节,没有文档记录。因此,你不应该假设任何特定的顺序或者它是一致的。好的,这真的很有帮助。再次感谢。