我试图通过{decisionGroupId},{decisionId}和{criteriaIds}找到{decisionGroupId}的索引号
这是我当前的Cypher查询:
MATCH (dg:DecisionGroup)-[:CONTAINS]->(childD:Decision)
WHERE dg.id = {decisionGroupId}
OPTIONAL MATCH (childD)-[vg:HAS_VOTE_ON]->(c:Criterion)
WHERE c.id IN {criteriaIds}
WITH childD, vg.avgVotesWeight as weight, vg.totalVotes as totalVotes
ORDER BY weight DESC, totalVotes DESC
WITH COLLECT(childD) AS ps
RETURN REDUCE(ix = -1, i IN RANGE(0, SIZE(ps)-1)
| CASE ps[i].id WHEN {decisionId} THEN i ELSE ix END) AS ix我在数据库中只有3个决定,但是这个查询返回以下索引:
2
3
4当我期待类似的事情(从0和-1开始,如果没有找到)
0
1
2我的查询有什么问题,以及如何修复它?
更新
此查询在COLLECT(DISTINCT childD) AS ps中运行良好。
MATCH (dg:DecisionGroup)-[:CONTAINS]->(childD:Decision)
WHERE dg.id = {decisionGroupId}
OPTIONAL MATCH (childD)-[vg:HAS_VOTE_ON]->(c:Criterion)
WHERE c.id IN {criteriaIds}
WITH childD, vg.avgVotesWeight as weight, vg.totalVotes as totalVotes
ORDER BY weight DESC, totalVotes DESC
WITH COLLECT(DISTINCT childD) AS ps
RETURN REDUCE(ix = -1, i IN RANGE(0, SIZE(ps)-1)
| CASE ps[i].id WHEN {decisionId} THEN i ELSE ix END) AS ix请帮助我重构这个查询和摆脱沉重的REDUCE。
发布于 2017-11-19 16:15:21
让我们尝试使用更简单的查询来正确处理reduce部件:
WITH ['a', 'b', 'c'] AS ps
RETURN
reduce(ix = -1, i IN RANGE(0, SIZE(ps)-1) |
CASE ps[i] WHEN 'b' THEN i ELSE ix END) AS ix
)正如我在评论中所说的,如果可能的话,最好避免使用reduce。因此,要使用列表理解表示相同的内容,请使用WHERE进行过滤。
WITH ['a', 'b', 'c'] AS ps
RETURN [i IN RANGE(0, SIZE(ps)-1) WHERE ps[i] = 'b'][0]列表理解将产生一个具有单个元素的列表,我们将使用[0]索引器来选择该元素。
在将其调整到查询之后,我们将得到如下内容:
MATCH (dg:DecisionGroup)-[:CONTAINS]->(childD:Decision)
WHERE dg.id = {decisionGroupId}
OPTIONAL MATCH (childD)-[vg:HAS_VOTE_ON]->(c:Criterion)
WHERE c.id IN {criteriaIds}
WITH childD, vg.avgVotesWeight as weight, vg.totalVotes as totalVotes
ORDER BY weight DESC, totalVotes DESC
WITH COLLECT(DISTINCT childD) AS ps
RETURN [i IN RANGE(0, SIZE(ps)-1) WHERE ps[i].id = {decisionId}][0]发布于 2017-11-24 09:33:23
如果安装了APOC,还可以使用以下函数:
return apoc.coll.indexOf([1,2,3],2)
https://stackoverflow.com/questions/47378187
复制相似问题