neo4j查询可空属性

时间:2013-10-15 14:16:06

标签: neo4j spring-data-neo4j

我正在使用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的所有节点。

知道如何实现此查询?

1 个答案:

答案 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=valhas(n.prop)确切地评估为false {* 1}}。这意味着您的原始查询将在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作为参数传递)