我可以用 Neo4j Cypher 语言递归地评估一棵树吗?

3
在我的应用程序中,我有一个基本上是数学表达式的语法树作为neo4j图...以下是一张图片: expression tree 我想知道是否可以编写一个Cypher查询来完全评估这样一个树的顶部节点,即:
- 获取节点1.2连接输入的平均值, - 获取节点1.1.2的最大值 - 获取节点1.1.2和3的平均值,并返回节点1.2和1.1的最大值作为节点1的值
该值存储在输入节点的属性“status”中,在max和avg节点中,该值不存在,应计算。
在neo4j控制台上查看完整内容:http://console.neo4j.org/?id=gopwjn 我感觉可以通过一些WITH和REDUCE等技巧实现,但我无法将它们拼凑起来。
2个回答

3

我认为没有一条Cypher查询语句可以解决使用您的图模型表示的每个数学表达式。这是因为Cypher没有循环语句强大到足以迭代计算子结果(按正确顺序)以获取任意深度的树。

即使对于固定深度的树,Cypher查询也会非常复杂。


3
这里有一个看似可行的简单解决方案。 我尝试过类似于 FOREACH (n in range(0,2)....... 的方法,但是你不能在 foreach 中使用 match :/ 所以这里我先更新所有平均节点,然后更新所有最大节点,然后重复操作,因为第一次遍历不会填充平均值的子节点的最大值。 希望这至少能指引你朝着有帮助的方向前进 :)
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

1
你可以使用 UNWIND range(0,10) as idx MATCH (n:AVG {level:idx}) - Michael Hunger
谢谢。看起来你的解决方案加上Michael的提示可以完成它。不幸的是,我已经提供了一个相当简化的示例,查询最终看起来会非常可怕,所以我可能会放弃使用一些自定义代码来完成它。Cypher能力的展示非常棒,我真的很感激。 - C. Ramseyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接