Как остановить Neo4J Cypher от обработки пустой коллекции? - PullRequest
1 голос
/ 05 мая 2019

У меня есть такой запрос Cypher Neo4J:

MATCH (c1:Concept) 
WHERE  c1.name in (['word']) 
WITH COLLECT(distinct c1) as concepts 
MATCH (ctx:Context) 
WHERE ALL(c in concepts 
       WHERE (c)-->(ctx) AND ((ctx.by) = '15229100-b20e-11e3-80d3-6150cb20a1b9')) 
RETURN ctx

Если есть c1 с name word, то он обрабатывается нормально, и я получаю приемлемые результаты.

Однако, если c1 с word не существует, то возвращается пустая коллекция, однако она подвергается дальнейшей обработке, и я просто получаю все ctx:Context узлы, которые удовлетворяют критерию ctx.by.Что не правильно.

Как это исправить в запросе?

1 Ответ

2 голосов
/ 05 мая 2019

Агрегации (в одиночку, без каких-либо неагрегирующих переменных в качестве ключей группировки) будут успешными, даже если строк нет, и будет выдана одна строка с результатом, что позволит проводить дальнейшую обработку, поскольку есть строка для работы.

Чтобы получить желаемое поведение, добавьте фильтр после агрегирования, чтобы убедиться, что у вас есть непустой список. Это обеспечит, что если список пуст, строки переходят в 0 и последующие операции не будут выполняться:

MATCH (c1:Concept) 
WHERE  c1.name in (['word']) 
WITH COLLECT(distinct c1) as concepts 
WHERE size(concepts) <> 0
MATCH (ctx:Context) 
WHERE ALL(c in concepts 
       WHERE (c)-->(ctx) AND ((ctx.by) = '15229100-b20e-11e3-80d3-6150cb20a1b9')) 
RETURN ctx
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...