2013-10-04 2 views
3

Мне сложно собирать данные из двух разных источников и объединять коллекции так, чтобы последний был набором объектов, упорядоченных по «dateCreated».Neo4j cypher query: using ORDER BY with COLLECT (S)

Контекст

Пользователи могут задавать вопросы в группах. Вопрос может быть как общим, так и связанным с конкретной видео-игрой. Если вопрос, заданный в группе, связан с видеоигрой, этот вопрос также появляется на странице вопросов видеоигр.

В настоящее время у меня есть два общих вопроса и один для одной видеоигры. Следовательно, при получении вопросов у меня должно быть 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? 

Что такое правильный способ достижения того, что я пытаюсь сделать ?

Второй вопрос: неправильные результаты

Если удалить ОКВЕК ВУ, вместо того, 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"} 
] 

Есть ли что-то не так с тем, как Я собираю результаты?

EDIT

Расширенный запрос для получения gamesQuestion:

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

Спасибо за вашу помощь,

ответ

3

"Приказ от" ожидает, что свойство на узле или отношения. «Вопросы» в вашем запросе - это сборка узлов вместо узла/отношения, вы не можете сортировать коллекцию с помощью «Сортировать по», вы можете сортировать узлы или отношения только по своим свойствам.

Чтобы использовать «Заказать», вам нужно вернуть вопросы как столбец строк, а не сбор. С точки зрения отношений, указанных в исходном запросе, следующий запрос должен возвращать общие и специфические игровые вопросы как столбец строк и сортировать их по недвижимости «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] -группа, у меня есть игрыQuestions - [: GAME_QUESTION] ->() < - [: ВОПРОСЫ] -Игры - [: ИНТЕРЕСЫ] ->() < - [: HAS_ INTEREST_FOR] -interests < - [: ИНТЕРЕСЫ] -группа», вы можете просто расширить шаблон в предыдущем запросе следующим образом,

START group = node(627) 
Match question-[:GENERAL_QUESTION|GAME_QUESTION]->()-[*0..4]-(group) 
Return distinct question 
Order by question.dateCreated 

идея заключается в том, чтобы соответствовать вопросам, которые могут достигнуть узел группы или с одним шаг, или более 4 шага.

Другой вариант заключается в определении двух моделей в ИНЕКЕ,

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 
+0

Лиза, спасибо вам за ответ! Я понимаю, почему я не мог использовать Order By. Но скажем, для «игровых вопросов» вместо игрQuestions - [?: GAME_QUESTION] -> games <- [: GAMES] -группа, у меня есть игрыQuestions - [: GAME_QUESTION] ->() <- [: QUESTIONS] -games - [: INTERESTS] ->() <- [: HAS_INTEREST_FOR] -interests <- [: INTERESTS] - группа (на этот раз цель состоит в том, чтобы получить все вопросы игр, обсуждаемых группой). Есть ли у вас идеи, можно ли получить как общие, так и игровые вопросы так же, как и столбцы или строки? – Brice

+0

Я обновил ответ, чтобы решить расширенный случай. –

+0

Спасибо тебе столько Лизы! :) – Brice