在SDN4中,neo4jOperations.queryForObjects返回具有空集合的实体。怎么解决?

时间:2016-04-02 06:43:33

标签: spring neo4j spring-data spring-data-neo4j-4 neo4j-ogm

我有实体,看起来像这样:

@NodeEntity
class User {
    String name;
    boolean male;
    <...>
    @Relationship(type = "friend")
    Set<User> friends;
    @Relationship(type = "participation")
    Set<Event> events;
    <...>
}

为了查询男性用户,我使用以下代码:

String q = "MATCH (u:User) WHERE u.male=true RETURN u";
Iterable<User> maleUsers = neo4jOperations.queryForObjects(User.class, q, emptyMap());

但它会返回有空朋友和事件集合的用户。

尝试解决问题我得到了以下代码:

String q = "MATCH (u:User) WHERE u.male=true WITH u MATCH p=(u)-[*0..1]-() RETURN p";
Iterable<User> maleUsers = neo4jOperations.queryForObjects(User.class, q, emptyMap());

现在集合已初始化。但这种变化带来了一个新问题:

  • 此代码旨在返回:仅限男性用户
  • 但实际上它返回:男性用户和用户,以某种方式与男性用户相关

如何妥善解决我的问题?任何想法都非常感谢!

PS:我使用的是Spring Data Neo4j 4.1.0.M1。

1 个答案:

答案 0 :(得分:1)

这是因为您返回包含许多用户实体的路径,并且OGM无法分辨您想要返回哪个用户实体。 最好的方法是使用session.query

Result result = session.query("MATCH (u:User) WHERE u.male=true WITH u MATCH p=(u)-[*0..1]-() RETURN u as user, nodes(p),rels(p)",emptyMap());

然后从result检索每个user,其中会映射朋友和事件。