Узлы с отношением к нескольким узлам - PullRequest
0 голосов
/ 25 октября 2018

Я хочу, чтобы Люди, которые знают всех, были в группе людей, которые знают определенные места.Это:

MATCH (:Place {name:'Breiter Weg'})<-[:knows]-(b:Person)-[:knows]->(:Place   {name:'Buchhandel'})
WITH collect(DISTINCT b) as persons
Match (a:Person)
WHERE ALL(b in persons WHERE (a)-[:knows]->(b))
RETURN a

работает, но для второй части выполняется полное сканирование узла перед применением предложения where, которое является чрезвычайно медленным - для большей базы данных это занимает 8 ~ 9 секунд.Я также попробовал это:

MATCH (:Place {name:'Breiter Weg'})<-[:knows]-(b:Person)-[:knows]->(:Place {name:'Buchhandel'})
Match (a:Person)-[:knows]->(b)
RETURN a

Для этого нужны только 2 мс, однако он возвращает всех людей, которые знают кого-либо из группы b, а не тех, кто знает всех.

Итак, мой вопрос: существует ли эффективный / быстрый запрос, чтобы получить то, что я хочу?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вот более простой запрос Cypher, который также сравнивает счетчики - та же самая базовая идея, используемая @InverseFalcon.

MATCH (:Place {name:'Breiter Weg'})<-[:knows]-(b:Person)-[:knows]->(:Place {name:'Buchhandel'}), (a:Person)-[:knows]->(b)
WITH COLLECT({a:a, b:b}) as data, COUNT(DISTINCT b) AS total
UNWIND data AS d
WITH total, d.a AS a, COUNT(d.b) AS bCount
WHERE total = bCount
RETURN a
0 голосов
/ 25 октября 2018

У нас есть статья базы знаний для этого типа запроса, в которой показано несколько подходов.

Один из них должен соответствовать: лицам, известным группе, а затем подсчитатьколичество раз, когда каждый из этих людей появляется в результатах.При условии, что их не много: они знают отношения между одними и теми же людьми, если число равно количеству людей из вашего первого матча, тогда этот человек должен знать всех людей в коллекции.

MATCH (:Place {name:'Breiter Weg'})<-[:knows]-(b:Person)-[:knows]->(:Place {name:'Buchhandel'})
WITH collect(b) as persons
UNWIND persons as b // so we have the entire list of persons along with each person
WITH size(persons) as total, b
MATCH (a:Person)-[:knows]->(b)
WITH total, a, count(a) as knownCount
WHERE total = knownCount
RETURN a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...