Neo4j:loadByProperty正在加载其他不属于该节点的对象

时间:2015-08-17 07:11:00

标签: neo4j spring-data-neo4j-4

我的结构如下:

公司 - >拥有一组用户 - >每个用户都有一套政策 - >每项政策都适用于公司。

示例图结构:

       u1 <- c1 -> u2 
       p1 -> c1
       u1 -> p1 

公司(c1)有两个用户(u1,u2),一个政策(p1)属于公司(c1)。 &#34; U1&#34;采取了政策(p1)。 &#34; U2&#34;没有政策。

当我试图通过&#34; loadByProperty&#34;加载u2时方法,预期应该是User2对象和相应的公司(c1)。

但是,政策(p1)也在加载并设置为&#34; u2&#34;对象

班级结构;

Company{
   Stirng companyName;
   @Relationship(type = "hasUsers", direction = Relationship.OUTGOING)
   List<User> users;
}

User{
   Stirng userName;
   @Relationship(type = "hasPolicy", direction = Relationship.OUTGOING)
   List<Policy> policies;
}

Policy{
   String policyName;
   @Relationship(type = "forCompany", direction = Relationship.OUTGOING)
   Company company;
}

检索用户的方法:

 public User getUser(String userName) { 
    Property<String, Object> properties = new Property<String, Object("userName", userName); 
    Set<User> users = (Set<User>) session.loadByProperty(User.class, properties); 
    if (users != null && !users.isEmpty()) 
        for (User user : users) 
            return user; 
   return null; 
 }

使用SDN 4(里程碑版)。

有什么建议吗?谢谢你的到来。

1 个答案:

答案 0 :(得分:1)

您可以通过多种方式按属性值加载实体。

<强> Neo4jOperations

使用loadByPropertyloadAllByProperty

派生的查找程序(仅限存储库)

@Repository
public interface UserRepository extends GraphRepository<User> {

User findByName(String name); 

}

SDN将使用元数据信息将其转换为Cypher查询。

@Query(仅限存储库)

@Repository
public interface UserRepository extends GraphRepository<User> {

   @Query("MATCH (user:User{name:{0}}) RETURN user")
   User findUserByName(String name);

}

<强>会话

使用接受loadAll的任何Filter方法。 例如:

session.loadAll(Person.class, new Filter("firstName", "John"))