我正在使用spring-neo4j。我有一个名为User with entity with properties(username,firstName,lastName),firstName和lastName是可选属性。
现在我想实现一个用户搜索查询,它将搜索所有三个属性。
@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的所有节点。
知道如何实现此查询?
答案 0 :(得分: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分享数据并将链接和参数示例放在您的问题中。
在此之前,这可能会有所帮助:
使用!
代替?
。
<强> [ - 详细] 强>
在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 {* 1}}。这意味着您的原始查询将在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
作为参数传递)