我可以递归评估 neo4j 密码语言中的树吗?
Can I recursively evaluate a tree in neo4j cypher language?
在我的应用程序中,我有本质上是数学表达式的语法树作为 neo4j 图...一张图片可能会有帮助:
我想知道是否可以编写一个 Cypher 查询来完全评估像这样的树的顶部节点,即:
- 获取节点 1.2 的连接输入的平均值,
- 1.1.2 的最大值
- 节点 1.1 的平均 1.1.2 和 3
- 最后 returns 1.2 和 1.1 的最大值作为节点 1 的值
该值存储在输入节点的 属性 status 中,在 max 和 avg 节点中该值不存在,应该计算。
这是 neo4j 控制台中的全部内容:http://console.neo4j.org/?id=gopwjn
我觉得使用一些 WITH 和 REDUCE 以及类似的巫术可能是可行的,但我无法将它们完全拼凑在一起。
我认为没有一个 Cypher 查询可以解决使用您的图形模型表示的每个数学表达式。这是因为 Cypher 没有足够强大的循环语句来迭代计算 任意 深度的树的子结果(以正确的顺序)。
即使对于固定深度的树,Cypher 查询也会相当复杂。
这是一个似乎可以解决问题的平面解决方案。
我尝试了类似 FOREACH (n in range(0,2)....... 但你不能在 foreach 中使用匹配:/ 所以在这里我更新所有平均节点,然后更新所有最大节点然后重复导致第一个pass 不会填充 avg 的最大子节点。
我希望这至少能为您指明一个有用的方向:)
MATCH (n1:AVG)-[]-(p1)
WITH AVG(p1.status) AS NEWSTATUS1, n1 AS ND1
MERGE (n1:AVG { name:ND1.name })
ON MATCH SET n1.status=NEWSTATUS1
with 1 as A
MATCH (n2:MAX)-[]-(p2)
WITH MAX(p2.status) AS NEWSTATUS2, n2 AS ND2
MERGE (n2:MAX { name:ND2.name })
ON MATCH SET n2.status=NEWSTATUS2
with 2 as B
MATCH (n3:AVG)-[]-(p3)
WITH AVG(p3.status) AS NEWSTATUS3, n3 AS ND3
MERGE (n3:AVG { name:ND3.name })
ON MATCH SET n3.status=NEWSTATUS3
with 3 as C
MATCH (n4:MAX)-[]-(p4)
WITH MAX(p4.status) AS NEWSTATUS4, n4 AS ND4
MERGE (n4:MAX { name:ND4.name })
ON MATCH SET n4.status=NEWSTATUS4
在我的应用程序中,我有本质上是数学表达式的语法树作为 neo4j 图...一张图片可能会有帮助:
我想知道是否可以编写一个 Cypher 查询来完全评估像这样的树的顶部节点,即:
- 获取节点 1.2 的连接输入的平均值,
- 1.1.2 的最大值
- 节点 1.1 的平均 1.1.2 和 3
- 最后 returns 1.2 和 1.1 的最大值作为节点 1 的值
该值存储在输入节点的 属性 status 中,在 max 和 avg 节点中该值不存在,应该计算。
这是 neo4j 控制台中的全部内容:http://console.neo4j.org/?id=gopwjn
我觉得使用一些 WITH 和 REDUCE 以及类似的巫术可能是可行的,但我无法将它们完全拼凑在一起。
我认为没有一个 Cypher 查询可以解决使用您的图形模型表示的每个数学表达式。这是因为 Cypher 没有足够强大的循环语句来迭代计算 任意 深度的树的子结果(以正确的顺序)。
即使对于固定深度的树,Cypher 查询也会相当复杂。
这是一个似乎可以解决问题的平面解决方案。 我尝试了类似 FOREACH (n in range(0,2)....... 但你不能在 foreach 中使用匹配:/ 所以在这里我更新所有平均节点,然后更新所有最大节点然后重复导致第一个pass 不会填充 avg 的最大子节点。
我希望这至少能为您指明一个有用的方向:)
MATCH (n1:AVG)-[]-(p1)
WITH AVG(p1.status) AS NEWSTATUS1, n1 AS ND1
MERGE (n1:AVG { name:ND1.name })
ON MATCH SET n1.status=NEWSTATUS1
with 1 as A
MATCH (n2:MAX)-[]-(p2)
WITH MAX(p2.status) AS NEWSTATUS2, n2 AS ND2
MERGE (n2:MAX { name:ND2.name })
ON MATCH SET n2.status=NEWSTATUS2
with 2 as B
MATCH (n3:AVG)-[]-(p3)
WITH AVG(p3.status) AS NEWSTATUS3, n3 AS ND3
MERGE (n3:AVG { name:ND3.name })
ON MATCH SET n3.status=NEWSTATUS3
with 3 as C
MATCH (n4:MAX)-[]-(p4)
WITH MAX(p4.status) AS NEWSTATUS4, n4 AS ND4
MERGE (n4:MAX { name:ND4.name })
ON MATCH SET n4.status=NEWSTATUS4