Cypher 对动态属性值求和

Cypher to sum dynamic properties values

我在节点上有一些动态数据源 属性 值。大约有 5 个数据源,它们可以有一个或多个数据源。这些属性是通过使用 Spring Data Neo4j 中的地图的 @Properties 注释设置的。保存节点后,节点上的值设置如下:

dataSource.ds1.count="10"
dataSource.ds2.count="20"
dataSource.ds3.count="30"
... etc

我希望能够动态地对已设置的这些计数值求和,并使用该值对结果进行排序。

这是我目前拥有的一些起始 Cypher,其中列出了属性:

MATCH (n:Entity)
WITH n, [k in keys(n) where k =~ 'dataSources.(ds1|ds2).count'] as props
RETURN n.name, props

这个returns:

╒═══════════╤═════════════════════════════════════════════════╕
│"n.name"   │"props"                                          │
╞═══════════╪═════════════════════════════════════════════════╡
│"ENT1"     │["dataSources.ds1.count","dataSources.ds2.count"]│
├───────────┼─────────────────────────────────────────────────┤
│"ENT2"     │["dataSources.ds1.count","dataSources.ds2.count"]│
├───────────┼─────────────────────────────────────────────────┤
│"ENT3"     │["dataSources.ds1.count"]                        │
└───────────┴─────────────────────────────────────────────────┘

如何使用属性名称获取值并对它们求和?

我正在考虑与此类似的东西,我可以在其中使用 apoc.sum,但不确定如何遍历 属性 名称来获取它们的值。

RETURN n.name, apoc.coll.sum([COALESCE(toInteger(n.`dataSources.ds1.count`), 0), etc]) as count
ORDER by count DESC

如有任何帮助,我们将不胜感激。

这是一种方法:

MATCH (n:Entity)
RETURN
  n.name,
  COALESCE(n.`dataSources.ds1.count`, 0) + COALESCE(n.`dataSources.ds2.count`, 0) AS count
ORDER BY count

COALESCE 函数 returns 它的第一个非 NULL 参数。

或者,如果您在 props parameter 中传递 属性 姓名列表:

MATCH (n:Entity)
RETURN n.name, REDUCE(s = 0, p IN $props | s + COALESCE(n[p], 0)) AS count
ORDER BY count