neo4j пытается сделать UNION, но я все еще вижу вещи, которые находятся за пределами диапазона - PullRequest
0 голосов
/ 26 мая 2018

`` Привет!У меня есть база данных людей, которые смотрят и любят фильмы.Всего 5 человек, у которых отношения с друзьями выглядят так: a> b> c> d> e.Я пытаюсь получить все фильмы, которые они смотрели и любили от человека до человека d.Я заставил его работать с этим запросом, но было много дубликатов:

MATCH(p:Person{name:'Joe'})-[:Friend*1..3]->(f) 
MATCH(m:Movie)<-[:Watched]-(f) 
MATCH(ml:Movie)<-[:Liked]-(f) 
MATCH (mg:Movie)<-[:Watched]-(p) 
MATCH (mgl:Movie)<-[:Liked]-(p) 
RETURN m,ml,mg,mgl

Я пытался сузить его с помощью UNION, но я все еще вижу фильм, который видел только один человек, которому он понравился:

MATCH(p:Person{name:'Joe'})-[:Friend*..3]->(f)
MATCH(m:Movie)<-[:Watched]-(f)
RETURN m
UNION 
MATCH(m:Movie)<-[:Liked]-(f)
RETURN m
UNION
MATCH (m:Movie)<-[:Watched]-(p) 
RETURN m 
UNION 
MATCH (m:Movie)<-[:Liked]-(p) 
RETURN m

Как я могу их удалить?

1 Ответ

0 голосов
/ 27 мая 2018

Вам нужно: - развернуть шаблон соответствия влево и вправо - затем поместить фильмы в список - развернуть его - и удалить дубликаты

MATCH (mp:Movie)<-[:Watched|Liked]-(p:Person{name:'Joe'})
      -[:Friend*1..3]->
      (f:Person)-[:Watched|Liked]->(mf:Movie)
WITH collect(DISTINCT mp) + collect(DISTINCT mf) AS movies
UNWIND movies AS movie
RETURN DISTINCT movie
...