0

次の (プロジェクト、ユーザー、タスク) ドメイン オブジェクトがあります。Spring Data Neo4j 4 (SDN4) を介して特定の関連オブジェクトを持つエンティティを取得するにはどうすればよいですか? たとえば、関連するタスクはあるがユーザーがいないプロジェクトを取得したいとします。このサンプルは機能しません。depthユーザーオブジェクトを取得するため、メソッドで定義するのneo4jTemplate.loadは適切ではありません。

public Project findProjectWithTasks(Long projectId){
    Project project = neo4jTemplate.load(Project.class, projectId, 0);
    /*
        project.id      <- correct
        project.name    <- correct
        project.tasks   <- null, but in previous versions of Spring Data Neo4j I had empty entities with id 
    */

    Collection<Task> tasks = neo4jTemplate.loadAll(project.getTasks()); // <- returns null, because project.getTasks() is null 

    return project;
}

//---------

@NodeEntity
class Project {
    @GraphId
    private Long id;

    private String name;

    @Relationship(direction = Relationship.OUTGOING, type = "PROJECT_TASK")
    private Set<Task> tasks;

    @Relationship(direction = Relationship.OUTGOING, type = "PROJECT_USER")
    private Set<User> users;
}

@NodeEntity
class Task {
    @GraphId
    private Long id;

    private String name;

    @Relationship(direction = Relationship.INCOMING, type = "PROJECT_TASK")
    private Project project;

    @Relationship(direction = Relationship.OUTGOING, type = "TASK_USER_ASSIGNED")
    private User assignedTo;
}

@NodeEntity
class User {

    @GraphId
    private Long id;

    private String email;

    @Relationship(direction = Relationship.INCOMING, type = "TASK_USER_ASSIGNED")
    private Set<Task> tasks;

    @Relationship(direction = Relationship.INCOMING, type = "PROJECT_USER")
    private Set<Project> projects;
}
4

3 に答える 3

1

SDN 4 は、一部の関係を持つエンティティの読み込みをサポートしていません。それは、なし (深さ 0) またはすべて (深さ n、デフォルトの深さ 1) です。

したがって、デフォルトの深さ 1 でプロジェクトをロードすると、プロジェクトのプロパティ、関連するタスクおよびユーザーのプロパティがロードされますが、それらの関係はロードされません。

エンティティ ID のみが必要な場合は、@fkorn が回答したように、カスタム クエリが最適です。

于 2016-03-30T03:25:41.373 に答える
1

Neo4jTemplate.query とカスタム クエリを使用して結果を取得できます。この場合、n は、プロパティとタスクが取り込まれたプロジェクトになります。ID 関数は、ノードの ID を取得します。

public Project findProjectWithTasks(Long projectId){
    String query = "MATCH (n:Project)-[r:PROJECT_TASK]->(m) WHERE ID(n) = {id} RETURN n,r,m";
    Map<String,Object> map = new HashMap<>();
    map.put(id,projectId);
    Result result =  neo4jTemplate.query(query,map);
    return (Project) result.iterator().next().get("n");
}
于 2016-03-29T15:55:20.693 に答える