我是Neo4J初学者,因此,如果我的问题过于琐碎,请提前道歉。
我正在尝试创建一个Neo4J图形,该图形表示游戏中的一组连续步骤,如in this diagram所示。
您将在图中看到我从零点开始,并且在某些步骤(但不是每一个步骤中),会累积其他点。
我要根据以下原则将点分配给尚无点的节点:每当节点没有点时,我都希望为其分配一定数量的点,这些点等于最接近的点所拥有的点为其分配了点的上一个节点。在示例图中,步骤2将具有0点(:Step {id: 2, points_so_far: 0})
,而步骤4将具有1点(:Step {id: 4, points_so_far: 1})
。请注意,确实有分数的节点之间可能有任意数量的无分数节点。
在创建各自的Cypher查询方面的任何帮助将不胜感激!
非常感谢!
答案 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*]-
),但会降低性能。