2017-10-02 13 views
0

ディアーズを見つけることができません。私は春ブーツ(1.5.7.RELEASE)と春データのNeo4j(4.2.7.RELEASE)とのNeo4j-OGMと非常に簡単なアプリケーションを作成しました 、NodeEntityまたは関連するエンティティ

( 2.1.5)。私のpom.xmlの

関連部品:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-data-neo4j</artifactId> 
</dependency> 
<dependency> 
    <groupId>org.neo4j</groupId> 
    <artifactId>neo4j-ogm-test</artifactId> 
    <version>${neo4j-ogm.version}</version> 
    <type>test-jar</type> 
    <scope>test</scope> 
</dependency> 

私は2つの簡単なエンティティと(一般的なもので)片方の親があります。

@NodeEntity 
public abstract class BaseEntity { 

    @GraphId 
    private Long id; 

    @Convert(value = InstantConverter.class) 
    private Instant createdOn; 

    private Date modifiedOn; 
} 

public class User extends BaseEntity { 

    @Index(unique = true) 
    private String username; 

    @Index(unique = true) 
    private String email; 

    private String password; 

    public User() { 
     //default 
    } 

    public User(String username, String email, String password) { 
     this.username = username; 
     this.email = email; 
     this.password = password; 
    } 
} 

public class Tag extends BaseEntity { 
    @Index 
    private String label; 

    @Relationship(type = "CREATOR") 
    private User creator; 

    public Tag() {} 

    public Tag(String label, User creator) { 
     this.label = label; 
     this.creator = creator; 
    } 
} 

を私はセッター/ゲッター/等しい/のハッシュコードを削除明快さ。ここで

@Configuration 
@EnableNeo4jRepositories(value = "xxx.repository") 
public class Neo4jConfiguration { 
    @Bean 
    public NewEntityPreSaveEventListener newEntityPreSaveEventListener() { 
     return new NewEntityPreSaveEventListener(); 
    } 
} 

は、私が使用するリポジトリです::

できるだけシンプルにしようとしている、のNeo4jのためにこの設定を使用して...本当に、

@Repository 
public interface TagRepository extends GraphRepository<Tag> { 
    Tag findOneByLabelAndCreator(String label, User creator); 

    Tag findOneByLabel(String label); 

    Tag findOneByCreator(User creator); 

    @Query("MATCH (tag:Tag)-[:CREATOR]->(creator:User) WHERE id(creator) = {creatorId} RETURN tag") 
    @Depth(value = 5) 
    Tag getByCreator(@Param("creatorId") User creator); 
} 

派手なので、何も

と仮定すると、

User myCreator = userRepository.save(new User("myCreator", "email", "password")); 
Tag myTag = tagRepository.save(new Tag("taglabel", myCreator)); 

「tagRepository.findOneByLabel( "taglabel")」を実行すると、すべてのプロパティが設定されたタグが返されます。完璧!

「tagRepository.findOneByCreator(myCreator)」を実行すると、単にnullが返されます。

"tagRepository.getByCreator(myCreator)"を実行すると、正しいラベルのタグが返されますが、 "creator"というプロパティはnullです。

私は本当にそれを取得しません。もちろん、私はドキュメントを読んで、@Depth、Custom @Queryを試してみました。フィールドの "Set tags"のUserクラスに@Relationshipを追加し、インデックスを削除しています。それは単に適切に動作したくありません。 私は非常に、非常に愚かな何かを逃すべきであることはとてもシンプルです... 残念ながら、私が見つけたすべての例は、これより簡単です...これはあまり有用ではありません。

ご協力いただきありがとうございます。

答えて

0

「tagRepository.findOneByCreator(myCreator)」を実行すると、単にnullが返されます。

org.neo4j.ogmの情報ログをオンにし、生成されたcypherクエリでこれを確認します。

「tagRepository.getByCreator(myCreator)」を実行すると、右のラベルのタグが返されますが、プロパティ「creator」はnullです。

は、ドキュメントのthis part参照してください:

カスタムクエリは、カスタムの深さをサポートしていません。さらに、@Queryはドメインエンティティへのパスのマッピングをサポートしていないため、パスをCypherクエリから返さないでください。代わりに、ノードとリレーションシップを返して、それらをドメインエンティティにマップします。

マップするすべてのノード/リレーションシップを返す必要があります。また、クエリの深さを自分で処理する必要があります。

@Query("MATCH (tag:Tag)-[:CREATOR]->(creator:User) " + 
     "WHERE id(creator) = {creatorId} WITH tag " + 
     "MATCH p=(tag)-[*..5]-() " + 
     "RETURN nodes(p),relationships(p)") 
@Depth(value = 5) 
Tag getByCreator(@Param("creatorId") User creator); 
関連する問題