neo4j: помечать параметры только для прыжков раздела? - PullRequest
1 голос
/ 29 января 2020

Есть ли способ ограничить тип меток в пределах неограниченного количества участков шаблона? И как бы вы реализовали это в более крупном шаблоне?

WITH n, end
OPTIONAL MATCH (n:Label1)<-[:REL2]-(a:Label2)-[:CONSTRICT_HOPS_TO_LABEL*..]->(b)<-[:REL3]-(:Label3)->(end:Label1)
WITH b, ... continue

Я бы хотел, чтобы раздел между a и b включал только узлы определенной метки.

WITH n, end
 OPTIONAL MATCH (n:Label1)<-[:REL2]-(a:Label2)-[:CONSTRICT_HOPS_TO_LABEL*..]->(b)<-[:REL3]-(:Label3)->(end:Label1), 
p=(a)-[:CONSTRICT_REL_LABEL*..]->(b) WHERE nodes(p):Label
WITH b, ... continue

Есть ли способ сделать это?

   WITH n, end
    OPTIONAL MATCH (n:Label1)<-[:REL2]-(a:Label2)-[:CONSTRICT_HOPS_TO_LABEL*..]->(b)<-[:REL3]-(:Label3)->(end:Label1), 
    p=(a)-[:CONSTRICT_REL_LABEL*..]->(b) 
   WHERE ALL(node IN nodes(p) WHERE node:Label)
   WITH b, ...continue

1 Ответ

1 голос
/ 29 января 2020

Поскольку nodes(path) является списком узлов, вы можете использовать индексный доступ для получения соответствующего среза узлов в пути и использовать его для своей фильтрации:

...
WITH n, end
OPTIONAL MATCH path = (n:Label1)<-[:REL2]-(a:Label2)-[:CONSTRICT_HOPS_TO_LABEL*..]->(b)<-[:REL3]-(c:Label3)-[:REL4]->(end:Label1), 
WHERE ALL(node IN nodes(path)[2..-3] WHERE node:Label)
WITH b, ...
...

nodes(path)[0..2] is [n, a], поэтому, если вы хотите, чтобы узлы проходили мимо a (но не включая сам a), вы должны начать с 2.

Отрицательные индексы - это элементы в конце списка, поэтому -3 означает, что он исключит последние 3 элемента списка, включая [b, c, end].

Если вы хотите включить a, а также b, тогда ваш срез будет nodes(path)[1..-2] вместо

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