2013-10-15 3 views
0

spring-neo4j를 사용하고 있습니다. 나는 속성 (username, firstName, lastName)을 가진 User라는 엔티티를 가지고 있으며 firstName과 lastName은 선택적 속성입니다.nullable 속성에 대한 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]. 

을하지만, 난 단지 사용자 이름을 검색 할 경우, 그것은 나에게 결과를 제공합니다. 내가 사용하려고? 널 (NULL) 속성에 대한 연산자 :

@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에서 작동 함을 의미합니다. 쿼리는 누락 된 속성을 일치하지 않는 것으로 확인하고 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

감사합니다. 운영자가 일했다. –

관련 문제