【问题标题】:Neo4j cypher query : using ORDER BY with COLLECT(S)Neo4j 密码查询:使用 ORDER BY 和 COLLECT(S)
【发布时间】:2013-10-04 14:06:47
【问题描述】:

我很难从两个不同的来源收集数据并合并这些集合,以便最后一个是一组按“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"}
]

我收集结果的方式有问题吗?

编辑

扩展查询以获取游戏问题:

gamesQuestions-[:GAME_QUESTION]->()<-[:QUESTIONS]-games-[:INTERESTS]->()<-[:HAS_‌​INTEREST_FOR]-interests<-[:INTERESTS]-group

感谢您的帮助,

【问题讨论】:

    标签: neo4j cypher collect


    【解决方案1】:

    “排序依据”需要节点或关系上的属性。查询中的“问题”是节点的集合,而不是节点/关系,您不能使用“排序依据”对集合进行排序,只能根据节点或关系的属性对节点或关系进行排序。

    为了使用“排序依据”,您需要将问题作为一列而不是一个集合返回。根据原始查询中指示的关系,以下查询应将一般和特定游戏问题作为行列返回,并按属性“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()()

    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
    

    【讨论】:

    • 丽莎,谢谢你的回答!我明白为什么我不能使用 Order By。但是让我们说“游戏问题”,而不是 gamesQuestions-[?:GAME_QUESTION]->games()()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 2023-03-21
    • 2019-01-21
    相关资源
    最近更新 更多