Как отфильтровать родительские узлы, а затем отфильтровать дочерние узлы, чтобы родительские узлы не были затронуты дочерним фильтром? Neo4j 3.5 - PullRequest
0 голосов
/ 26 марта 2020

У меня есть набор Author узлов. Узел Author является единственным родителем нескольких узлов Book.

Шаг: 1) Я хочу отфильтровать авторов по имени. (Например, author.name СОДЕРЖИТ 'e')

Шаг: 2) Получив отфильтрованный список авторов, я хочу отфильтровать каждую из книг этих авторов по имени. (Например, book.name СОДЕРЖИТ 'the')

Желаемый результат: (Давайте представим, Оскар Уайльд не написал ни одной книги с 'the')

enter image description here

Моя проблема в том, что после шага (2) все авторы, у которых нет книги со знаком «но», но DO имеют в своем имени «е»: отброшено - Как (в этом примере) Оскар Уайльд

Я пытался:

MATCH (author:Author) WHERE (author.name CONTAINS 'e')
WITH author

MATCH (book)<-[:WROTE]-(author) WHERE (book.name CONTAINS 'the')

RETURN author, book

и

MATCH (author:Author) WHERE (author.name CONTAINS 'e')
WITH author

MATCH (book) WHERE (book.name CONTAINS 'the') AND ((book)<--(author))

RETURN author, book;

Я бы использовал подзапрос WHERE EXISTS { MATCH ()..., но его нет в Neo4j 4.0, и я использую 3.5

1 Ответ

1 голос
/ 26 марта 2020

Вы можете использовать OPTIONAL MATCH для книг, так что, если вы не найдете подходящую книгу для author, все равно можно будет вернуть author.

Например:

MATCH (author:Author) WHERE author.name CONTAINS 'e'
OPTIONAL MATCH (book)<-[:WROTE]-(author) WHERE book.name CONTAINS 'the'
RETURN author, COLLECT(book) AS books;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...