来自密码的难以求和的结果

时间:2014-07-30 17:30:15

标签: neo4j cypher

我有一个查询

start ko=node:koid('ko:"ko:K01963"') 
match p=(ko)-[r:abundance*1]-(n:Taxon) 
with p, extract(nn IN relationships(p) | nn.`c1.mean`) as extracted 
return extracted;

我想使用extractedreturn sum(extracted)中的值求和,但是,这会引发以下错误

SyntaxException: Type mismatch: extracted already defined with conflicting type Collection<Boolean>, Collection<Number>, Collection<String> or Collection<Collection<Any>> (expected Relationship)`

另外,当我返回提取时,我的值用方括号括起来

+---------------+
| extracted     |
+---------------+
| [258.98813]   |
| [0.0]         |
| [0.0]         |
| [0.8965624]   |
| [0.85604626]  |
| [0.0]         |

知道如何解决这个问题。这是对返回的整列进行求和。

2 个答案:

答案 0 :(得分:2)

使用reduce作为折叠操作:

return p, reduce(sum=0,nn IN relationships(p) |  sum + nn.`c1.mean`) as sum

方括号中的值是集合/数组。

答案 1 :(得分:2)

首先,假设您使用“WITH”和标签,我将假设您正在使用Cypher 2.x.

另外,说实话,你在这里所做的并不完全清楚,所以我做了一些假设并陈述了它们。

其次,查询的某些部分是不必要的。同样,你们关系中的* 1意味着你的路径中只会有一个“跳”。我不知道你是不是这样,所以我会假设你想要深入几级(但我们会限制它以免杀死你的Neo4j实例;或者,你可以使用类似“allShortestPaths”的东西,但我们不会进入那个)。通过移除上限可以很容易地改变这种假设。并且表示单跳。

至于您在括号中返回的结果,extract会返回一个值列表,可能只返回一个值。

所以让我们稍微重写一下这个问题(请注意,对于ko,标识符在上面有点令人困惑,所以用你需要的任何东西替换它。)

如果我们假设您只想要每条路径的总和,我们可以这样做:

MATCH p=(ko:koid {ko: 'K01963'})-[r:abundance*1..5]-(n:Taxon)     
WITH reduce(val = 0, nn IN relationships(p) | val + nn.`c1.mean`) as summed 
RETURN summed;

(我相信,这也可以修改为所有路径的总和。)

如果我们想要返回所有关系的总和,我们需要一些不同的东西,它甚至更简单(假设在这种情况下你真的只有:

MATCH p=(ko:koid {ko: 'K01963'})-[r:abundance]-(n:Taxon)     
RETURN sum(r.`c1.mean`);

希望即使我的假设和我如何阅读这些内容,这至少会让你以正确的方式思考。

大多数情况下,当你只有1个跳转路径时使用路径的想法有点令人困惑,但也许这会有所帮助。