密码查询,用于在任意数量的节点中分配属性值

时间:2019-01-12 19:24:38

标签: neo4j cypher

我是Neo4J初学者,因此,如果我的问题过于琐碎,请提前道歉。

我正在尝试创建一个Neo4J图形,该图形表示游戏中的一组连续步骤,如in this diagram所示。

您将在图中看到我从零点开始,并且在某些步骤(但不是每一个步骤中),会累积其他点。

我要根据以下原则将点分配给尚无点的节点:每当节点没有点时,我都希望为其分配一定数量的点,这些点等于最接近的点所拥有的点为其分配了点的上一个节点。在示例图中,步骤2将具有0点(:Step {id: 2, points_so_far: 0}),而步骤4将具有1点(:Step {id: 4, points_so_far: 1})。请注意,确实有分数的节点之间可能有任意数量的无分数节点。

在创建各自的Cypher查询方面的任何帮助将不胜感激!

非常感谢!

1 个答案:

答案 0 :(得分:0)

这是一种实现方法:

match (s:Step) WHERE not exists(s.points_so_far) 
match (prev:Step)<-[:HAS_PREVIOUS_STEP*]-(s) where exists(prev.points_so_far) 
with s, head(collect(prev)) as prev
SET s.points_so_far = prev.points_so_far

它如何工作?

首先,找到所有没有points_so_far的节点

match (s:Step) WHERE not exists(s.points_so_far) 

与该节点一起,找到所有先前具有points_so_far

的步骤
match (prev:Step)<-[:HAS_PREVIOUS_STEP*]-(s) where exists(prev.points_so_far) 

获取所有先前具有点的节点,将它们收集在列表中,并仅保留遇到的第一个节点

with s, head(collect(prev)) as prev

设置节点的值以及上一个节点的值

SET s.points_so_far = prev.points_so_far

注意: 该请求使用可变的路径长度(*中的<-[:HAS_PREVIOUS_STEP*]-),但会降低性能。