Выбор одного из двух узлов в запросе Cypher - PullRequest
0 голосов
/ 28 августа 2018

всех мастеров Cypher!

Я не могу понять, как запросить все B узлы, выбирая либо B1, либо B2, либо B4, либо B5. Нет ограничений на то, какой из них выбран, только тот, который выбран. Как и на рисунке, есть соотношение (B1, B2) и (B4, B5).

Другими словами - я хочу, чтобы MATCH все узлы типа B были подключены к какому-либо узлу с типом A, но исключая B1 или B2 и B4 или B5 (используя связь между ними) в результате. Узлы типа B могут быть соединены только попарно, то есть никакие (B1, B2), (B2, B3) не будут существовать одновременно. Хотя, как показано на рисунке, может быть несколько пар.

Любые идеи приветствуются!

enter image description here

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Я думаю, что это простое дополнительное условие:

MATCH (A:A)--(B:B)
OPTIONAL MATCH (B)--(BT:B)--(A) 
WITH B WHERE BT IS NULL OR id(B) > id(BT)
RETURN B
0 голосов
/ 28 августа 2018

Таким образом, для этого будет быстрее использовать процедуры APOC, поскольку есть несколько полезных функций сбора и процедуры, которую мы хотим легко получить, которые существуют между группой узлов.

Идея в том, что мы сопоставим подключенные узлы: B, используем процедуру cover(), чтобы получить все отношения между этими узлами, собрать эти отношения, и из них взять один из узлов для этих отношений (мы мы будем использовать начальный узел здесь), а затем мы просто вычтем эти выбранные узлы из нашего списка, оставив нас с узлами: B, которые мы хотим:

MATCH (a:A)--(b:B)
WITH collect(b) as bNodes
CALL apoc.algo.cover(bNodes) YIELD rel
WITH bNodes, [r in collect(rel) | startNode(r)] as toRemove
RETURN apoc.coll.subtract(bNodes, toRemove) as nodes

Если у вас нет (или вы не хотите использовать) APOC, вот версия для шифра:

MATCH (a:A)--(b:B)
WITH collect(b) as bNodes
UNWIND bNodes as b
OPTIONAL MATCH (b)-[r]-(other)
WHERE other IN bNodes
WITH bNodes, collect(DISTINCT startNode(r)) as toRemove
RETURN [b in bNodes WHERE NOT b in toRemove] as nodes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...