NEO4J: объединить без объединения с WHERE ALL (x в списке WHERE x в другом списке) - PullRequest
0 голосов
/ 12 июля 2020

Я надеюсь, что есть способ сделать это без UNION MATCH. Это часть более крупного запроса, и я бы предпочел не выходить из него.

У меня есть список из n узлов и список из x узлов. Я хотел бы исключить любой n, который не имеет ТОЛЬКО отношения к узлам x в xlist, но через два разных отношения, и у одного из них есть метка.

WITH nlist, xlist
OPTIONAL MATCH (n1:Label)-[:FIRST]->(x1) WHERE n1 in nlist AND ALL (y in collect(x1) WHERE y in xlist)
OPTIONAL MATCH (n2)<-[:SECOND]-(x2) WHERE n2 in nlist AND ALL (z in collect(x2) WHERE z in xlist)
WITH collect (n1) + collect(n2) as n....(unwind as n)

это не работает, потому что ему не нравится собрать x во всем.

WITH n, xlist,
[(n:Label)-[:FIRST]->(x1) | x1] + [(n)<-[:SECOND]-(x2) | x2] as allx
WHERE ALL (x in allx WHERE x in xlist)
WITH n ...

это не сработает, потому что n может не иметь обоих типов отношений, и похоже, что все хотят, чтобы это были оба.

Благодарен за любые указатели.

Спасибо!

---- Дополнительный фиктивный ввод / вывод:

MERGE (n1:Label {n: 1})-[:FIRST]->(xa {x: "a"})
MERGE (n2:Label {n: 2})-[:FIRST]->(xa)
MERGE (n3:Label {n: 3})-[:FIRST]->(xa)
MERGE (n2)-[:FIRST]->(xb {x: "b"})
MERGE (n3)-[:FIRST]->(xb)
MERGE (n2)-[:FIRST]->(xa)
MERGE (n2)-[:FIRST]->(xb)
MERGE (n2)<-[:SECOND]-(xa)
MERGE (n3)<-[:SECOND]-(xc {x: "c"})
RETURN n1, n2, n3, xa, xb, xc

задано nlist из ["n1", "n2", "n3" ]:

Когда xlist имеет значение «a», ожидаемый результат равен n1

, когда xlist равен [«a», «b»], ожидаемый результат равен n1, n2

когда xlist равен ["a", "b", "c"] или ["a", "b", "c", "d"], ожидаемый результат равен n1, n2 и n3

когда xlist равен ["d"] или ["a", "d"], ожидаемый результат равен нулю.

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