首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >集合中的Neo4j Cypher查询和元素索引

集合中的Neo4j Cypher查询和元素索引
EN

Stack Overflow用户
提问于 2017-11-19 14:50:21
回答 2查看 1.2K关注 0票数 2

我试图通过{decisionGroupId}{decisionId}{criteriaIds}找到{decisionGroupId}的索引号

这是我当前的Cypher查询:

代码语言:javascript
复制
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个决定,但是这个查询返回以下索引:

代码语言:javascript
复制
2
3
4

当我期待类似的事情(从0和-1开始,如果没有找到)

代码语言:javascript
复制
0
1
2

我的查询有什么问题,以及如何修复它?

更新

此查询在COLLECT(DISTINCT childD) AS ps中运行良好。

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-19 16:15:21

让我们尝试使用更简单的查询来正确处理reduce部件:

代码语言:javascript
复制
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进行过滤。

代码语言:javascript
复制
WITH ['a', 'b', 'c'] AS ps
RETURN [i IN RANGE(0, SIZE(ps)-1) WHERE ps[i] = 'b'][0]

列表理解将产生一个具有单个元素的列表,我们将使用[0]索引器来选择该元素。

在将其调整到查询之后,我们将得到如下内容:

代码语言:javascript
复制
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]
票数 2
EN

Stack Overflow用户

发布于 2017-11-24 09:33:23

如果安装了APOC,还可以使用以下函数:

return apoc.coll.indexOf([1,2,3],2)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47378187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档