在我的应用程序中,我有一个基本上是数学表达式的语法树作为neo4j图...一张图片可能有帮助:
我想知道是否有可能编写一个Cypher查询来为顶级节点完全评估这样的树,即:
该值存储在输入节点的属性 status 中,在max和avg节点中,该值不存在且应该计算。
这是neo4j控制台中的全部内容:http://console.neo4j.org/?id=gopwjn
我觉得有可能使用一些WITH和REDUCE以及类似的伏都教,但我不能将它拼凑在一起。
答案 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