Поиск связанных узлов по меткам, которые не возвращаются в путях - PullRequest
0 голосов
/ 06 марта 2019

У меня есть три начальных узла, возвращающие пути p1,p2,p3, которые все заканчиваются на общем узле com. Все узлы в трех путях имеют метку type. Ноль или более узлов в каждом пути имеют второй тип метки file. Я хочу найти все file узлы, которые являются родителями узла com, которые не находятся в путях p1,p2,p3.

MATCH p1=(s1:type{id:882591})-[:sub*0..35]->(com:type{id:882680})
MATCH p2=(s2:type{id:541990})-[:sub*0..35]->(com) 
MATCH p3=(s3:type{id:542007})-[:sub*0..35]->(com)  
WITH com, collect(p1) as pa, collect(p2) as pb, collect(p3) as pc
OPTIONAL MATCH (f:file)-[:sub*0..35]->(com)
WHERE NOT f IN pa AND NOT f IN pb AND NOT f IN pc
RETURN DISTINCT f limit 100

Это самый близкий, который я получил, но он по-прежнему возвращает все file узлы, которые являются родителями com - даже те, которые находятся в путях. Первые узлы и последний узел com каждого пути никогда не будут иметь метку file, если их быстрее удалить. Спасибо за помощь!

1 Ответ

1 голос
/ 06 марта 2019

Собрать по путям p1, p2 и p3 будет список путей, а не узлов.

Попробуйте nodes(p1) as pa и т. Д. Для сбора узлов.

EDIT:

Как подсказывает @InverseFalcon, приведенный выше запрос имеет проблему с количеством элементов.

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

WITH [882591,541990,542007] as typeIds
UNWIND typeIds as typeId
MATCH p=(s1:type{id:typeId})-[:sub*0..35]->(com:type{id:882680})
WITH com, nodes(p) as ps
OPTIONAL MATCH (f:file)-[:sub*0..35]->(com)
WHERE NOT f IN ps
RETURN DISTINCT f 
LIMIT 100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...