我有一个查询
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;
我想使用extracted
对return 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] |
知道如何解决这个问题。这是对返回的整列进行求和。
答案 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个跳转路径时使用路径的想法有点令人困惑,但也许这会有所帮助。