如何使用带有GraphRepository的springdata Neo4j从两个节点之间的关系集合中获取关系

时间:2016-03-04 02:05:30

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

我有两个实体,如用户和帐户。与帐户节点相关的用户节点 与20个关系中的任何一个。请找到附带的样本图像设计

nodelayout image

我需要使用20个关系中的任何一个来搜索相应用户的帐户。我使用cypher查询来检索用户详细信息和帐户。两个实体之间的关系将是20个关系中的任何一个。所以我无法注释@RelationshipEntity类型值。请查找代码 User.java

public class User
{ 
    private Long id;    
    String fulltextsearch;   

    String user_id; 

    String status; 

     @Relationship(type = "perm")
     List<Acronym> acronym;
     .....
         ...    
}

Acronym.java

@JsonIdentityInfo(generator=JSOGGenerator.class)
@RelationshipEntity
public class Acronym {
@GraphId
    Long id;
    String acronym;
    @StartNode
    private User user;
    @EndNode
    private Account account;
....
....
}

Userrepository.java

@RepositoryRestResource(collectionResourceRel = "User", path = "User")
public interface Userrepository extends GraphRepository<User> { 
    User findByLogin(@Param("login") String login);

    @Query("MATCH p=(user:User)-[r*0..1]->(account) WHERE user.login =~('(?i).*'+{Login}+'.*') RETURN p")
    Collection<User> findByloginContaining(@Param("login") String login);
}

我尝试为每个关系创建对象(即20个关系对象)。我不确定是否有正确的方法来获得价值。 有谁可以帮我知道获取与帐户的关系?它总是以null返回。

提前致谢。

1 个答案:

答案 0 :(得分:1)

OGM / SDN 4不支持未知关系类型。 的关系类型必须在@RelationshipEntity上指定。

执行此操作的一种方法是按照您的说法为每种类型创建一个@RelationshipEntity,但这也意味着您必须在User类中指定20个这样的关系,因为关系类型不同(即使开始/结束节点是相同)。这可能不太理想,也很难管理。

如果您的应用程序主要用于动态关系类型,那么OGM可能不太合适。

注意:仅在OGM 2.x / SDN 4.1中支持将自定义查询结果映射到实体。您不能返回路径,只能返回构成路径的实体,例如nodes和rels。