Есть ли у Cypher такие функции, как Group By? - PullRequest
0 голосов
/ 18 января 2019

Я новичок в Neo4j, и мне интересно, есть ли у Cypher такие функции, как GROUP BY в SQL.

Вот мой код:

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
RETURN m.title AS movie, p.name AS actor 

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

movie                       actor

"The Matrix"                "Emil Eifrem"
"The Matrix"                "Carrie-Anne Moss"
"The Matrix"                "Keanu Reeves"
"The Matrix Reloaded"       "Hugo Weaving"
"The Matrix Reloaded"       "Laurence Fishburne"
"The Matrix Revolutions"    "Hugo Weaving"
"The Matrix Revolutions"    "Laurence Fishburne"

Вот результат, который я хочу получить:

movie                       actor                  num_of_actors

"The Matrix"                "Emil Eifrem"           3
"The Matrix"                "Carrie-Anne Moss"      3
"The Matrix"                "Keanu Reeves"          3
"The Matrix Reloaded"       "Hugo Weaving"          2
"The Matrix Reloaded"       "Laurence Fishburne"    2
"The Matrix Revolutions"    "Hugo Weaving"          2
"The Matrix Revolutions"    "Laurence Fishburne"    2

По сути, я хотел бы, чтобы количество актеров играло в каждом фильме вместе с исходными результатами.

Заранее спасибо

1 Ответ

0 голосов
/ 18 января 2019

Вы захотите просмотреть функции агрегирования , которые можно использовать в предложении WITH для группировки.

Например, если вы хотите сгруппировать имена актеров с каждым фильмом, вы можете сделать это:

MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
WITH m, collect(p.name) as actors
RETURN m.title AS movie, actors

Тем не менее, есть некоторые сокращения, которые мы можем здесь сделать, поскольку вы спрашиваете об общем количестве актеров на фильм (см. Нашу статью базы знаний по , используя подсчет степеней из узла вместо выполнения расширений ).

Если вы хотите сохранить отдельную строку для каждого актера, но при этом иметь количество акторов, поскольку мы знаем: отношения ACTED_IN никогда не будут передаваться одному и тому же актеру более одного раза, мы можем получить степень: ACTED_IN отношений, поступающих в каждый: узел фильма, чтобы получить наш счет. Для достижения наилучших результатов получите степень, прежде чем перейти к актерам:

MATCH (m:Movie)
WITH m, m.title as title, size((m)<-[:ACTED_IN]-()) as num_of_actors
MATCH (p:Person)-[:ACTED_IN]->(m)
RETURN title, p.name as actor, num_of_actors
...