Исключить узлы, использующие ГДЕ не работает - PullRequest
0 голосов
/ 13 декабря 2018

У меня ошибка, когда я пытаюсь исключить узлы, используя MATCH & WHERE

У меня есть следующие узлы и соотношения:

MERGE (a1:accz {id: 1}) 
MERGE (a2:accz {id: 2}) 
MERGE (a3:accz {id: 3}) 
MERGE (a4:accz {id: 4}) 
MERGE (a5:accz {id: 5}) 
MERGE (i1:itemz {id: 1}) 
MERGE (i2:itemz {id: 2}) 
MERGE (i3:itemz {id: 3}) 
MERGE (i4:itemz {id: 4}) 
MERGE (a1)-[:AUTHOR]->(i1) 
MERGE (a2)-[:AUTHOR]->(i2) 
MERGE (a3)-[:AUTHOR]->(i1) 
MERGE (a3)-[:AUTHOR]->(i3) 
MERGE (a4)-[:AUTHOR]->(i4) 
MERGE (a4)-[:AUTHOR]->(i5) 
MERGE (a4)-[:AUTHOR]->(i5) 
MERGE (a5)-[:AUTHOR]->(i2) 
MERGE (a5)-[:AUTHOR]->(i5)

Когда я выполняю (я включаю в явном виде элементыс которым у accz нужно иметь отношение):

MATCH (a:accz)-[:AUTHOR]->(i:itemz) WHERE ({id: i.id} IN [({id: 3}), ({id: 4})]) RETURN a

я получил accz узлов (3,4,5), и все в порядке.Но затем я исключаю некоторые узлы, используя WHERE, например следующий запрос:

MATCH (a:accz)-[:AUTHOR]->(i:itemz) WHERE ({id: i.id} IN [({id: 3}), ({id: 4})]) AND (NOT (a)-[:AUTHOR]->(:itemz {id:5})) RETURN a

, но я продолжаю получать accz id узла: 5, это следует исключить, потому что acc {id:5} это АВТОР (: itemz {id: 5})

что я делаю не так?

1 Ответ

0 голосов
/ 13 декабря 2018

Странное поведение, наблюдаемое в вашем примере, может показаться ошибкой, но его можно объяснить (после некоторого тщательного обдумывания).После всего сказанного и сделанного один вывод заключается в том, что следует избегать использования несвязанных узлов в предложении MERGE .

Нечетное поведение

Ваш запрос на создание имеетНет MERGE предложение для создания itemz узла i5.То есть этот пункт отсутствует: MERGE (i5:itemz {id: 5}).

  1. Поэтому может показаться, что предложения 2 MERGE (a4)-[:AUTHOR]->(i5) должны привести к созданию нового немеченого узла i5 снет свойств - но такой узел не создается!

  2. И может показаться, что предложение MERGE (a5)-[:AUTHOR]->(i5) должно привести к связи с этим новым i5 - но вместо этогонеожиданно приводит к отношениям с i4!

Объяснение

Этот фрагмент кода вызывает странное поведение (я добавил комментарии, чтобы уточнить):

MERGE (a4)-[:AUTHOR]->(i4) // Makes sure `(a4)-[:AUTHOR]->(i4)` relationship exists
MERGE (a4)-[:AUTHOR]->(i5) // Matches above relationship, so creates `i5` and binds it to `i4`!
MERGE (a4)-[:AUTHOR]->(i5) // Matches same relationship, so nothing is done.

Итак, после выполнения фрагмента i4 и i5 связаны с одним и тем же узлом.Это объясняет странное поведение.

Заключение

Чтобы избежать неожиданных результатов, следует избегать использования несвязанных узлов в предложениях MERGE.

Если ваш запрос на создание имел включал предложение MERGE (i5:itemz {id: 5}) до того, как были созданы отношения, тогда ваши запросы работали бы разумно.Результат первого запроса будет содержать accz узлов 3 и 4, а результат второго запроса будет содержать только 3.

Кстати, ({id: i.id} IN [({id: 3}), ({id: 4})]) можно значительно упростить доi.id IN [3, 4].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...