我可以用neo4j cypher语言递归计算树吗?

时间:2015-01-08 20:45:34

标签: neo4j cypher

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

expression tree

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

  • 获取节点1.2的连接输入的平均值,
  • 最高为1.1.2
  • 节点1.1的平均值1.1.2和3
  • 最后返回最大值1.2和1.1作为节点1的值

该值存储在输入节点的属性 status 中,在max和avg节点中,该值不存在且应该计算。

这是neo4j控制台中的全部内容:http://console.neo4j.org/?id=gopwjn

我觉得有可能使用一些WITH和REDUCE以及类似的伏都教,但我不能将它拼凑在一起。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

这是一个平坦的解决方案似乎可以解决问题。 我试过类似FOREACH的东西(n在范围(0,2).......但你不能在foreach中使用匹配:/所以这里我更新所有avg节点,然后更新所有最大节点然后重复导致第一个pass不会填充avg的子max节点。

我希望这至少能帮助你指明方向:)

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