Почему в моем запросе не работает функция Neo4j None?

У меня возникают проблемы с возвратом узлов, которые не имеют отношения к определенному свойству.

Вот запрос для построения графика для сценария:

create ({Name:'Foo1'})-[:T]->({Name:'Bar'})<-[:T{Inactive:true}]-({Name:'Foo2'})<-[:T]-({Name:'Foo3'})

Теперь, чтобы указать желаемый результат больше: я хочу получить все узлы, которые так или иначе связаны с «Bar». Таким образом, из графика, созданного с помощью приведенного выше запроса, я ожидаю получить Foo1 и Foo3.

У меня возникли проблемы с получением узлов, которые НЕ связаны со свойством "Неактивно", с помощью следующего запроса:

match (bar)<-[rs*]-(foo) where ID(bar)= **BAR_ID**
optional match (foo)-[r]->() where r in rs
with foo, collect(distinct r) as relationships
where none(rel in relationships where rel.Inactive = true)
return foo

Теперь вы можете заметить, что запрос немного экстравагантен со вторым предложением where. Это часть другого решения другой проблемы, поэтому, пожалуйста, не сосредотачивайтесь на этой части, если только она не является частью моей проблемы. Меня интересует, почему запрос вообще ничего не возвращает. Кажется, что предикат функции none() работает неправильно. Тем более, что замена none() на any() вернет только Foo2, как и ожидалось:

match (bar)<-[rs*]-(foo) where ID(bar)= **BAR_ID**
optional match (foo)-[r]->() where r in rs
with  foo, collect(distinct r) as relationships
where any(rel in relationships where rel.Inactive = true)
return foo

Итак, снова возникает вопрос, почему запрос, использующий функцию none(), ничего не возвращает. Сначала я подумал, что это может иметь какое-то отношение к некоторым отношениям, не имеющим свойства «Неактивный», а docs, они говорят вам, что отсутствующие свойства оцениваются как ложные (поскольку они нулевые). По крайней мере, это моя интерпретация, которая, конечно, может быть ошибочной.

Меня не интересует решение проблемы, так как я уже написал другой запрос, который возвращает Foo1 и Foo3. Мне интересно узнать, почему рассматриваемый запрос не работает.


person Prowling Duck    schedule 07.02.2017    source источник


Ответы (1)


В этом специфика работы с Null:

WITH [ null, false ] as values
RETURN none(value in values where value = true)

// return Null

with true as val where not (null = true)
return val

// returns nothing

[ http://neo4j.com/docs/developer-manual/current/cypher/syntax/working-with-null/ ]

Итак, вам нужна проверка null:

match (bar)<-[rs*]-(foo) where ID(bar)= **BAR_ID**
optional match (foo)-[r]->() where r in rs
with foo, collect(distinct r) as relationships
with foo, none(rel in relationships where rel.Inactive = true) as logic
          where logic is null or logic = true
return foo 

Или вы можете проверить, существует ли свойство Inactive:

match (bar)<-[rs*]-(foo) where ID(bar)= **BAR_ID**
optional match (foo)-[r]->() where r in rs
with foo, collect(distinct r) as relationships
where none(rel in relationships where exists(rel.Inactive) and rel.Inactive = true)
return foo
person stdob--    schedule 07.02.2017