[英]Neo4j cypher query : using ORDER BY with COLLECT(S)
我很难从两个不同的来源收集数据并合并集合,以便最后一个是一组按“dateCreated”排序的对象。
语境
用户可以分组提问。 问题可以是一般性的,也可以是与特定视频游戏相关的问题。 如果小组中提出的问题与视频游戏相关,则该问题也会出现在视频游戏的问题页面中。
目前,我有两个一般性问题,一个是针对一款视频游戏的。 因此,在获取问题时,我应该有 3 个问题。
询问
这是查询:
START group = node(627)
MATCH generalQuestions-[?:GENERAL_QUESTION]->group
WITH group, generalQuestions
MATCH gamesQuestions-[?:GAME_QUESTION]->games<-[:GAMES]-group
WITH (collect(generalQuestions) + collect(gamesQuestions)) as questions
RETURN questions
ORDER BY questions.dateCreated
第一个问题:使用 ORDER BY
Cached(questions of type Collection) expected to be of type Map but it is of type Collection - maybe aggregation removed it?
实现我想要做的事情的正确方法是什么?
第二个问题:错误的结果
如果我删除 ORDER BY 子句,而不是 3 个结果,我得到 14 ... :
[
Node[641]{dateCreated:1380892636,dateUpdated:1380892636,title:"GENERAL TITLE 1",type:1,content:"GENERAL CONTENT 1"},
Node[641]{dateCreated:1380892636,dateUpdated:1380892636,title:"GENERAL TITLE 1",type:1,content:"GENERAL CONTENT 1"},
Node[641]{dateCreated:1380892636,dateUpdated:1380892636,title:"GENERAL TITLE 1",type:1,content:"GENERAL CONTENT 1"},
Node[641]{dateCreated:1380892636,dateUpdated:1380892636,title:"GENERAL TITLE 1",type:1,content:"GENERAL CONTENT 1"},
Node[641]{dateCreated:1380892636,dateUpdated:1380892636,title:"GENERAL TITLE 1",type:1,content:"GENERAL CONTENT 1"},
Node[641]{dateCreated:1380892636,dateUpdated:1380892636,title:"GENERAL TITLE 1",type:1,content:"GENERAL CONTENT 1"},
Node[642]{dateCreated:1380892642,dateUpdated:1380892642,title:"GENERAL TITLE 2",type:1,content:"GENERAL CONTENT 2"},
Node[642]{dateCreated:1380892642,dateUpdated:1380892642,title:"GENERAL TITLE 2",type:1,content:"GENERAL CONTENT 2"},
Node[642]{dateCreated:1380892642,dateUpdated:1380892642,title:"GENERAL TITLE 2",type:1,content:"GENERAL CONTENT 2"},
Node[642]{dateCreated:1380892642,dateUpdated:1380892642,title:"GENERAL TITLE 2",type:1,content:"GENERAL CONTENT 2"},
Node[642]{dateCreated:1380892642,dateUpdated:1380892642,title:"GENERAL TITLE 2",type:1,content:"GENERAL CONTENT 2"},
Node[642]{dateCreated:1380892642,dateUpdated:1380892642,title:"GENERAL TITLE 2",type:1,content:"GENERAL CONTENT 2"},
Node[632]{dateCreated:1380889484,dateUpdated:1380889484,title:"GTA5 TITLE",type:2,content:"GTA5 CONTENT"},
Node[632]{dateCreated:1380889484,dateUpdated:1380889484,title:"GTA5 TITLE",type:2,content:"GTA5 CONTENT"}
]
我收集结果的方式有问题吗?
编辑
扩展查询以获取 gamesQuestion :
gamesQuestions-[:GAME_QUESTION]->()<-[:QUESTIONS]-games-[:INTERESTS]->()<-[:HAS_INTEREST_FOR]-interests<-[:INTERESTS]-group
谢谢你的帮助,
“Order by”需要节点或关系上的属性。 查询中的“问题”是节点集合而不是节点/关系,您不能使用“排序依据”对集合进行排序,您只能根据其属性对节点或关系进行排序。
为了使用“Order by”,您需要将问题作为一列行而不是集合返回。 根据您原始查询中指示的关系,以下查询应将一般和特定游戏问题作为一列行返回,并根据属性“dateCreated”对它们进行排序,
START group = node(627)
Match question-[?:GENERAL_QUESTION|GAME_QUESTION]->()<-[:GAMES*0..1]-(group)
Return distinct question
Order by question.dateCreated
对于游戏问题通过关系序列“gamesQuestions-[?:GAME_QUESTION]->games<-[:GAMES]-group 与组相关的扩展情况,我有 gamesQuestions-[:GAME_QUESTION]->() <-[:QUESTIONS]-games-[:INTERESTS]->()<-[:HAS_ INTEREST_FOR]-interests<-[:INTERESTS]-group",你可以简单地扩展前面查询中的模式如下,
START group = node(627)
Match question-[:GENERAL_QUESTION|GAME_QUESTION]->()-[*0..4]-(group)
Return distinct question
Order by question.dateCreated
这个想法是将可以到达组节点的问题与一个步骤或 4 个以上的步骤进行匹配。
另一种选择是在 where 子句中指定两种模式,
START group = node(627)
MATCH question-[*]-group
Where question-[:GENERAL_QUESTION]->group or (question-[:GAME_QUESTION]->()<-[:QUESTIONS]-()-[:INTERESTS]->()<-[:HAS_INTERESTS_FOR]-()<-[:INTERESTS]-group)
Return distinct q
Order by q.dateCreated
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.