【问题标题】:neo4j query for nullable propertyneo4j 查询可空属性
【发布时间】:2013-10-15 14:16:05
【问题描述】:

我正在使用 spring-neo4j。我有一个名为 User 的实体,具有属性(用户名、名字、姓氏),名字和姓氏是可选属性。

现在我想实现一个用户搜索查询,它将搜索所有三个属性。

@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 的所有节点。

知道如何实现这个查询吗?

【问题讨论】:

    标签: neo4j spring-data-neo4j


    【解决方案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 作为参数传递)

    【讨论】:

    • 这个查询没有给出任何错误,但它没有获取任何结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    相关资源
    最近更新 更多