Как мне структурировать запрос шифрования, чтобы включить пути между узлами из предложения MATCH, не удаляя узлы, которые не соответствуют «полному» шаблону? - PullRequest
0 голосов
/ 23 января 2020

Я пробовал это несколькими способами, поэтому я не буду перечислять их все. Позвольте мне объяснить, чего я пытаюсь достичь:

Допустим, у меня есть 3 типа узлов: A, B и C, с возможными направленными ссылками формы (: A) -> (: B) и (: B) -> (: C) и (: C) -> (: C).

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

Во-первых, я хочу вернуть узлы B и C, которые взяты из определенного c экземпляра A, например:

MATCH (a:A)-->(b:B)-->(c:C)
RETURN b,c

Я также хочу включить все пути, для которых множество узлов c сходятся на общих c узлах. Что-то вроде

MATCH path=(c)-[*]->(c2:C)<-[*]-(c)
RETURN path

Я пробовал несколько способов и обычно либо теряю узлы (b) и (c), у которых нет такого пути, либо я получаю слишком много (c2) узлы назад, которые не являются частью пути, соединяющего (c) узел с другим (c) узлом (например, если я использую отношения запроса [* 0 ..] в запросе).

Ответы [ 2 ]

1 голос
/ 23 января 2020
MATCH (a:A)-->(b:B)-->(c:C)
WITH a,COLLECT(DISTINCT b) as bNodes, COLLECT(DISTINCT c) as cNodes 
OPTIONAL MATCH (c:C)-->(c2:C)<--(c1:C)
WHERE c IN cNodes ANd c1 IN cNodes AND c<>c1 
WITH a ,bNodes,cNodes,c2 as convergePoint,COLLECT(DISTINCT c) AS convergingCNodes
RETURN a, bNodes,cNodes,convergePoint ,convergingCNodes 

насколько я понял вопрос, я думаю, это вернет то, что вы ищете. "a" Узел A, все подключенные узлы типа B в bNodes, все узлы типа C в cNodes, если какие-либо узлы c типа сходятся, то узел сходящейся точки C типа равен ConvergePoint, и все сходящиеся узлы на этот узел ConvergePoint в ConvergingCNodes

0 голосов
/ 24 января 2020

TheCrusher подобрал меня очень близко, и я сделал несколько модификаций, чтобы получить то, что мне нужно:

MATCH (a:A {name:"a_name"})-->(b:B)-->(c:C)
WITH COLLECT(DISTINCT b) as bs, COLLECT(DISTINCT c) as cs
MATCH convergingPath=(c:C)-[*]->(c2:C)<-[*]-(c1:C)
WHERE c in cs AND c1 in cs AND c<>c1
RETURN bs, cs, convergingPath
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...