Как исключить узлы из пути в Cypher?

#java #graph #neo4j #cypher

Вопрос:

Я застрял в написании запроса на шифр, который позволил бы мне найти все узлы, код которых НЕ включен в данный список. Я пытался найти отрицание шаблона, отрицание узла, исключение в пути, но безуспешно.

Предположим, у меня есть список кодов (хотя в этом списке есть 1 элемент): [«1V2ZG»]

Я хотел бы создать запрос Cypher, который возвращал бы каждый дочерний узел ARNOG, которого НЕТ в приведенном выше списке.

Это начальный график:

введите описание изображения здесь

Ответ на график, который я хочу:

введите описание изображения здесь

Запрос, который я использую, возвращает все узлы, а это не то, что я хочу:

 MATCH 
(excl:Client)<-[:PARENT_OF*]-(n:Client:Group),
path=(b:BaseHierarchy)-[:INCLUDES]->(n)-[:PARENT_OF*]->(inc:Client) 

WHERE excl.code IN ['1V2ZG']  AND n.code = 'ARNOG' 
WITH b,
nodes(path) as nodes, relationships(path) as relationships 
RETURN b,
apoc.coll.toSet(apoc.coll.flatten(collect(relationships))) as relationships,
apoc.coll.toSet(apoc.coll.flatten(collect(nodes))) as nodes;
 

Ответ №1:

Что о:

 MATCH path=(b:BaseHierarchy)-[:INCLUDES]->(n)-[:PARENT_OF*]->(inc:Client) 
WHERE n.code = 'ARNOG' AND 
      NONE(node IN nodes(path) WHERE node.code IN ['1V2ZG'])
WITH b, nodes(path) AS nodes, relationships(path) AS relationships 
RETURN b,
       apoc.coll.toSet(apoc.coll.flatten(collect(relationships))) as relationships,
       apoc.coll.toSet(apoc.coll.flatten(collect(nodes))) as nodes;
 

?