我可以递归评估 neo4j 密码语言中的树吗?

Can I recursively evaluate a tree in neo4j cypher language?

在我的应用程序中,我有本质上是数学表达式的语法树作为 neo4j 图...一张图片可能会有帮助:

我想知道是否可以编写一个 Cypher 查询来完全评估像这样的树的顶部节点,即:

该值存储在输入节点的 属性 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