2013-10-15 97 views
0

我正在使用spring-neo4j。我有一個實體稱爲用戶屬性(用戶名,名字,姓氏)和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); 

但是,這將取我在哪裏的firstName或lastName的缺少所有節點。

任何想法如何實現此查詢?

回答

1

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 

工作?

編輯:

有很多原因查詢不返回數據。如果您需要幫助,請分享樣本數據以及您在查詢中傳遞的參數。使用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將在has(n.prop)確實(*)時精確評估爲false。這意味着您的原始查詢將在2.0中工作 - 查詢會將缺失的屬性解析爲不匹配,並且它既不會中斷也不會包含所有沒有firstNamelastName(**)的節點。見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

謝謝!操作員工作。 –