2013-10-15 2 views
0

Я использую spring-neo4j. У меня есть объект под названием User со свойствами (имя пользователя, firstName, lastName) и firstName и lastName являются дополнительными свойствами.запрос neo4j для свойства с нулевым значением

Теперь я хочу реализовать поисковый запрос пользователя, который будет искать по всем трем свойствам.

@Query(value = "start user=node:__types__(className='com.xxx.entity.User') where user.username =~ {0} or user.firstName =~ {0} or user.lastName =~ {0} return user") 
List<User> searchByName(String keyword); 

запрос не выполняется говоря, что:

The property 'firstName' does not exist on Node[21]. 

Однако, если искать только по имени пользователя, это дает мне результат. Я попытался использовать? оператор обнуляемого свойства:

@Query(value = "start user=node:__types__(className='com.xxx.entity.User') where user.username =~ {0} or user.firstName? =~ {0} or user.lastName? =~ {0} return user") 
List<User> searchByName(String keyword); 

Но это принесите мне все узлы, где ПгвЬЫат или LastName пропало без вести.

Любая идея, как реализовать этот запрос?

ответ

1

Would

start user=node:__types__(className='com.xxx.entity.User') 
where user.username =~ {0} 
    or (has(user.firstName) and user.firstName =~ {0}) 
    or (has(user.lastName) and user.lastName =~ {0}) 
return user 

работа?

Edit:

Есть много причин для запроса не возвращать данные. Если вам нужна помощь в этом, поделите образцы данных и параметры, которые вы передаете с вашим запросом. Используйте Neo4j console для обмена данными и поместите ссылки и примеры параметров в свой вопрос.

До тех пор, пока это может быть полезно:

Использование ! вместо ?.

[--verbose]
В Neo4j 1.x вы действительно можете использовать синтаксис ? и !, но вы их используете неправильно. ? по умолчанию присваивает значение true, когда свойство отсутствует, что означает, что ваш запрос соответствует нумерам узлов, а также всем узлам, которые не имеют firstName или которые не имеют lastName. ! по умолчанию будет false, если свойство отсутствует, и, следовательно, исключить эти узлы. n.prop! = val эквивалентен has(n.prop) and n.prop=val, который я использовал выше. См. Neo4j stable docs.

В Neo4j 2.0+ синтаксис !? удален. Не существующие свойства по умолчанию: null. Поэтому n.prop=val будет оценивать значение false, когда has(n.prop) делает (*). Это означает, что ваш исходный запрос будет работать в 2.0 - запрос разрешит отсутствующее свойство как несоответствие, и он не сломает и не включит все узлы, которые не имеют firstName или lastName (**). См. Neo4j milestone docs. Вы также можете использовать синтаксис, который не будет ломаться, когда SpringDataNeo4j переместится на Neo4j 2.0, поэтому используйте has(n.prop) and n.prop=val, который работает в любой версии.

Также см. How to cypher query a neo4j DB with WHERE clause on sparse property.

(*) (за исключением того, что не будет, если val=null)
(**) (если вы не пройдете null в качестве параметра)

+0

Этот запрос не дает какой-либо ошибки, но это не принеси мне какой-нибудь Результаты. –

+0

Спасибо, прикрепите! оператор работал. –

Смежные вопросы