0

I am using spring-neo4j. I have an entity called User with properties (username, firstName, lastName) and firstName and lastName are optional properties.

Now I want to implement a user search query which will search across all three properties.

@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 query fails saying that:

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

However, if I search only on username, it gives me the result. I tried using the ? operator for nullable properties:

 @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);

But this will fetch me all the nodes where firstName or lastName are missing.

Any idea how do I implement this query?

4

1 回答 1

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 控制台共享数据并将链接和参数示例放入您的问题中。

在那之前,这可能会有所帮助:

使用!而不是?.

[--verbose]
在 Neo4j 1.x 中你确实可以使用?and!语法,但是你使用错了。?缺少属性时默认为 true,这意味着您的查询匹配您想要的节点以及所有没有 afirstName或没有lastName!当该属性缺失时将默认为 false 并因此排除这些节点。n.prop! = val相当于has(n.prop) and n.prop=val我上面使用的。请参阅Neo4j 稳定文档

在 Neo4j 2.0+!?中删除了语法。不存在的属性默认为null. 因此将在什么时候(*)n.prop=val准确评估为假。has(n.prop)这意味着您的原始查询将在 2.0 中工作——该查询会将缺少的属性解析为不匹配,并且它既不会破坏也不包括所有没有firstNamelastName(**) 的节点。请参阅Neo4j 里程碑文档。当 SpringDataNeo4j 迁移到 Neo4j 2.0 时,您不妨使用不会中断的语法,因此请使用has(n.prop) and n.prop=val适用于任一版本的语法。

另请参阅如何在稀疏属性上使用 WHERE 子句对 neo4j DB 进行密码查询

(*)(除非它不会 if val=null) (**)(除非你作为参数
传递)null

于 2013-10-15T15:41:25.023 回答