2017-02-07 6 views
2

У меня возникли проблемы с возвратом узлов, которые не имеют отношения к определенному свойству.Почему в моем запросе не работает функция Neo4j None?

Вот запрос, чтобы построить график для сценария:

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

Теперь, чтобы указать желаемый результат больше: Я хочу, чтобы получить все узлы, которые каким-то образом связанные с «Бар». Поэтому из графика, созданного с помощью запроса выше, я ожидаю получить 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 

Теперь вы можете заметить, запрос будет немного феерия со вторым где условие. Это часть другого решения другой проблемы, поэтому, пожалуйста, не сосредотачивайтесь на этой части, если она не является частью моей проблемы. Я заинтересован в том, почему запрос ничего не возвращает. Кажется, что предикат функции none() работает неправильно. Тем более, что не заменяя ни() с любого() будет возвращать только 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() функция ISN Я ничего не возвращаю. Сначала я подумал, что это может иметь какое-то отношение к некоторым отношениям, не имеющим свойство «Неактивное», но docs, они говорят вам, что недостающие свойства оцениваются как ложные (поскольку это значение равно null). По крайней мере, это моя интерпретация, которая может быть ошибочной, конечно.

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

ответ

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 

[]

Итак, вам нужно проверить 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