Neo4J Cypher 计算多个属性的平均值
Neo4J Cypher calculate average across multiple properties
在 Neo4J 中我遇到了以下问题:
节点以树状或 parent/child 样式结构排列。
在 "leafs" 或子节点上,每个节点都有一组数字属性。
我需要一个 Cypher 查询来计算每个属性的平均值并将其存储在父节点中具有相同名称的属性中。
类似于
MATCH (p:Parent)-[]->(c:Child)
SET p.attrib1 = avg(c.attrib1)
SET p.attrib2 = avg(c.attrib2)
会完成任务,但是...
子节点中的属性数量应该是动态的,我不想在子节点出现附加属性名称时更改代码。只要 属性 是小数,代码就应该适应这个。
有办法实现吗?
您可以在 APOC procedure library 的帮助下完成此操作。您可以 almost 在本机 Cypher 中执行此操作,但您不能动态指定要创建的 属性 的名称,但我们可以使用 apoc.create.setProperty
来执行此操作:
MATCH (parent:Parent)<-[]-(child:Child)
WITH parent, child, keys(child) AS props
UNWIND props AS prop
WITH parent, prop, avg(child[prop]) AS mean
CALL apoc.create.setProperty(parent, prop, mean) YIELD node
RETURN *
这里有一个简单的例子Neo4j Console.
在 Neo4J 中我遇到了以下问题:
节点以树状或 parent/child 样式结构排列。 在 "leafs" 或子节点上,每个节点都有一组数字属性。
我需要一个 Cypher 查询来计算每个属性的平均值并将其存储在父节点中具有相同名称的属性中。
类似于
MATCH (p:Parent)-[]->(c:Child)
SET p.attrib1 = avg(c.attrib1)
SET p.attrib2 = avg(c.attrib2)
会完成任务,但是...
子节点中的属性数量应该是动态的,我不想在子节点出现附加属性名称时更改代码。只要 属性 是小数,代码就应该适应这个。
有办法实现吗?
您可以在 APOC procedure library 的帮助下完成此操作。您可以 almost 在本机 Cypher 中执行此操作,但您不能动态指定要创建的 属性 的名称,但我们可以使用 apoc.create.setProperty
来执行此操作:
MATCH (parent:Parent)<-[]-(child:Child)
WITH parent, child, keys(child) AS props
UNWIND props AS prop
WITH parent, prop, avg(child[prop]) AS mean
CALL apoc.create.setProperty(parent, prop, mean) YIELD node
RETURN *
这里有一个简单的例子Neo4j Console.