3

neo4j-graphdatabase スタンドアロン サーバーで作業するには、SDN 4.0.0.RC1 の依存関係を pom に追加します。

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-neo4j</artifactId>
        <version>4.0.0.RC1</version>
        <exclusions>
            <exclusion>
                <groupId>org.neo4j.app</groupId>
                <artifactId>neo4j-server</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

私のアプリケーションでは、家族を管理したいと考えています。Persons は NodeEntity、relationtypes は NodeEntities、家族関係は RelationshipEntities です。

ノードまたは関係を保存するには、 を使用しますrepository.save(T t) (repository extends GraphRepository<T>)。これはすべてのノードで機能しますが、リレーションシップでは機能しません。

明示的な動作しないコード:

    Relation createdRelation = new Relation(typeName, from, to, getCurrentUsername());
    createdRelation.setBegin(begin);
    createdRelation.setEnd(end);
    Relation relation = relationRepository.save(createdRelation);

save(T t) から Relation-Object を取得します。ただし、RelationshipEntity はグラフデータベースに保持されません。また、私の Relation-Object には ID がありません。

RelationshipEntity クラスは次のようになります。

@RelationshipEntity(type = "RELATION")
public class Relation extends BaseMutableGraphEntity {

@Property
private String type;

@StartNode
private Person fromPerson;

@EndNode
private Person toPerson;

private Relation() {
}

...getters and setters...}

グラフ ID は BaseClass に保存されます。

public abstract class BaseGraphEntity implements AuditEntity {

@GraphId
private Long id;

...with getters and setters...}

私の質問は次のとおりです。

RelationshipEntities を Spring Data Neo4j 4 RC1 で保存するにはどうすればよいですか?

RelationshipEntities の他のリポジトリはありますか?

PS: グラフ ID の場所をメインの RelationshipEntity に変更しようとしましたが、うまくいきません。

4

3 に答える 3

2

表示されているのは、オブジェクト グラフ (ドメイン モデル) が期待する実際のグラフに対応していないという事実です。

Relation createdRelation = new Relation(typeName, from, to, getCurrentUsername());
    createdRelation.setBegin(begin);
    createdRelation.setEnd(end);
    Relation relation = relationRepository.save(createdRelation);

ここで、関係エンティティは、開始ノードと終了ノードとの関係を正しく表現しています。ここで、この「オブジェクト グラフ」を開始エンティティに移動しようとするとbegin、関係を介して終了エンティティに移動できないことがわかりますend

エンティティが永続化されると、オブジェクト グラフが走査されて、何が新規または変更されたかが判断され、それらが永続化されます。この場合、トラバーサルが開始ノードに到達すると、他のノードとの関係が見つかりません。事実上、作成されるべきであったこの関係は作成されません。

サイモンのコードが機能するのは、彼がエンティティ グラフを物理グラフと一致させたからです。その後、エンティティを最後に保存するか、関係エンティティ自体を保存できます。

グラフのようなオブジェクトの観点から考えると、これはすべてうまくいきます。

于 2015-07-21T15:34:41.930 に答える
2

私もこの癖に遭遇し、次の方法で関係を維持することができました。

  • @StartNodeエンティティに関係を設定する
  • @StartNodeエンティティまたはを保存し@RelationshipEntityます。重要なのは、オブジェクトを@StartNode最初に設定する必要があることです

したがって、あなたの例では、次のようにする必要があります。

Relation createdRelation = new Relation(typeName, from, to, getCurrentUsername());
createdRelation.setBegin(begin);
createdRelation.setEnd(end);
begin.setRelation(createdRelation);
Relation relation = relationRepository.save(createdRelation);

とは言っても、現在のドキュメントのリビジョンでは明確ではないため、これが意図された方法であるかどうかは100%確信が持てないことを告白しなければなりませんが、SDN4サンプルテストで採用されたアプローチのようです: https://github.com/spring-projects/spring-data-neo4j/blob/4.0.x/spring-data-neo4j/src/test/java/org/springframework/data/neo4j/examples/movies/MoviesIntegrationTest .java (を参照findOneShouldConsiderTheEntityType)

于 2015-07-21T14:36:52.707 に答える
0

これは私の問題を解決するコードです、 simonlに感謝します!

Relation relation = new Relation(typeName, from, to, getCurrentUsername());
relation.setBegin(begin);
relation.setEnd(end);
from.addOutgoingRelation(relation);
personRepository.save(from);
return createResponseBuilder.build(relation);

...コードを次のように変更します

Relation relation = new Relation(typeName, from, to, getCurrentUsername());
relation.setBegin(begin);
relation.setEnd(end);
from.addOutgoingRelation(relation);
return createResponseBuilder.build(relationRepository.save(relation));

Luannesさんのコメントもありがとうございます!

于 2015-07-21T14:46:40.823 に答える