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

时间:2018-04-19 07:59:44

标签: neo4j cypher

我试图在以下情况下使用标签从节点获取所有属性:

Query

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

使用

查询
MATCH (N:INCIDENT) RETURN COUNT(N)

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

我正在使用keys()返回属性,该值是地图the properties are structured as的列表。我知道地图本身并没有订购,但这种方式很难理解。

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

Creation

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

2 个答案:

答案 0 :(得分:0)

您可以尝试此查询:

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(*)

答案 1 :(得分:0)

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

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