Получить актер с Mov ie и ролевая игра - PullRequest
0 голосов
/ 07 января 2020

Я новичок в Neo4j, и у меня возникла небольшая проблема:

Я использую пример базы данных движения / актеров, и я хотел бы иметь актера с фильмами, которые есть у актера действовал и роль (для каждого фильма ie)

На самом деле я делаю так:

MATCH (a:Person)-[r:ACTED_IN]-(m:Movie)
WHERE ALL (role in r.roles WHERE NOT role IS NULL)
WITH DISTINCT(a), collect(r.roles) as roles, collect(m) as movies
RETURN a{.*, roles, movies} as result

Я разделяю фильмы и роли, я хотел бы чтобы включить роль внутри узла фильмов, структура, которую я хочу, это:

{
name:"the actor's name"
movies:[
  {
     title:"the movie title",
     roles:[{role:"the role of the actor"}] /// there could be more than one role for the actor
  }
]

}```

Thanks

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Это очень просто (при условии, что у актеров уникальные имена):

MATCH (a:Person)-[r:ACTED_IN]->(m:Movie)
WHERE EXISTS(r.roles)
RETURN {name: a.name, movies: COLLECT({title: m.title, roles: r.roles})} AS result

Если у нескольких акторов может быть одно и то же имя, вы можете использовать функцию агрегирования COLLECT для сбора данные для каждого отдельного узла Person:

MATCH (a:Person)-[r:ACTED_IN]->(m:Movie)
WHERE EXISTS(r.roles)
WITH a, COLLECT({title: m.title, roles: r.roles}) AS movies
RETURN {name: a.name, movies: movies} AS result
1 голос
/ 07 января 2020

Вы должны попробовать использовать проекции карты: https://neo4j.com/docs/cypher-manual/current/syntax/maps/

Как-то так должно работать:

 MATCH (a:Person)-[r:ACTED_IN]-(m:Movie)
 WHERE ALL (role in r.roles WHERE NOT role IS NULL)
 WITH DISTINCT(a)
 RETURN { a.name, movies: collect( { m.title, roles: r.roles } ) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...