Neo4j - ГДЕ отрицание на пути не работает - PullRequest
1 голос
/ 01 мая 2019
MATCH (n:Owner) MATCH (v:Vehicles)
WHERE NOT (n)-[:OWNS]->(v)
RETURN  DISTINCT n.email, n.name ORDER BY n.name

и

MATCH (n:Owner) MATCH (v:Vehicles)
WHERE  (n)-[:OWNS]->(v)
RETURN  DISTINCT n.email, n.name ORDER BY n.name

дает мне тот же результат ... Что я здесь упускаю?

С другой стороны, это работает:

MATCH (n:Owner) MATCH (v:Vehicles)
WHERE NOT (n)-[:OWNS]-()
RETURN  DISTINCT n.email

Ответы [ 2 ]

4 голосов
/ 02 мая 2019

Примечание. Это расширение @raj Answer, в котором больше внимания уделяется объяснению проблемы.

Этот запрос неверен и может возвращать нежелательные результаты.

Для понимания возьмем в качестве набора данных следующий пример:

Owner       Vehicle
P1          V1
P2          V2
P3          V3

Так как вы делаете

MATCH (n:Owner) MATCH (v:Vehicles)

В результате получается декартово произведение для двух совпадений, подобных первым двум столбцам

Owner   Vehicle         NOT (n)-[:OWNS]->(v)    (n)-[:OWNS]->(v)

P1      V1              -                       P1
P2      V1              P2                      -
P3      V1              P3                      -
P1      V2              P1                      -
P2      V2              -                       P2
P3      V2              P3                      -
P1      V3              P1                      -
P2      V3              P2                      -
P3      V3              -                       P3

Теперь при фильтрации с NOT (n)-[:OWNS]->(v) дает (P1, P2, P3, P1, P2, P3)

Теперь выполняется фильтрация с помощью (n)-[:OWNS]->(v) gives (P1, P2, P3)

Теперь при возврате отличных с NOT (n)-[:OWNS]->(v) т (P1, P2, P3)

Теперь при возврате отличных с (n)-[:OWNS]->(v) т (P1, P2, P3)

Ясно, что эти двое заканчивают тем же, верно ??

Но учтите, что это будет верно только в том случае, если у всех владельцев есть хотя бы транспортное средство, и ни один владелец не владеет всем транспортным средством.

Это то, что вы можете сделать, чтобы найти владельцев без транспортных средств.

MATCH (a:Owner)
WHERE SIZE((a)-[:OWNS]->(:Vehicles)) = 0 
RETURN a
3 голосов
/ 02 мая 2019

Это выглядит хорошо для меня.

Рекомендуется, я думаю, что и WHERE, и Negation работают должным образом.И есть большая вероятность, что оба дадут одинаковые результаты.

Позвольте мне сказать вам, когда оба дают одинаковые результаты:

Оба этих запроса дадут одинаковые результаты, когда все Owners имеют по крайней мере один Vehicle и Ни один из Owner не владеет всеми Vehicle в базе данных И существует высокая вероятность того, что это будет верно в вашем случае.

Я предполагаю, что вы хотите найти users, у которых нет Vehicle, и вернуть их имя и адрес электронной почты.И во втором запросе вы хотите, чтобы пользователь, которому принадлежит Vehicle, возвратил его имя и адрес электронной почты.

Если это так, то здесь запросы для того же самого:

1.Найдите Owner, которые не владеют Vehicle

MATCH (n:Owner)
WHERE NOT (n)-[:OWNS]->(:Vehicles)
RETURN  DISTINCT n.email, n.name 
ORDER BY n.name

2.Owner кому принадлежит Vehicle

MATCH (n:Owner)
WHERE (n)-[:OWNS]->(:Vehicles)
RETURN  DISTINCT n.email, n.name 
ORDER BY n.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...