1

RelathionEntity にプロパティを保存しようとしています

私がここで読んだように

SDN 4.0 で @RelationshipEntity を CRUD する方法

これは、開始/終了ノードの 1 つを保存することは可能ですが、deth 0 でノードを保存する代わりに、これは非常に遅いことに気付きました (深さ 0 でノードを保存するには約 2ms かかり、深さ 1 でノードを保存するには約 1000ms かかります)。保存しようとしているノードには 4 つの関係しかありません

@RelationshipEntity として注釈が付けられたオブジェクトで session.save(...) (org.neo4j.ogm.session.Session) も試しましたが、何もしません

spring-data-neo4j 4.0.0.RELEASE と Neo4j 2.2.5 を使用しています

エンティティと関係のコードに従います。

@NodeEntity
public class EntityA{
   @GraphId
   private Long             nodeId;
   private String               propertyA;
   @Relationship(type = "RelationshipAB", direction = Relationship.OUTGOING)
   private Set<RelationshipAB>  entitiesB   = new HashSet<RelationshipAB>();
}

@NodeEntity
public class EntityB{
   @GraphId
   private Long nodeId;
   private String   propertyB;
}

@RelationshipEntity(type = "RelationshipAB")
public class RelationshipAB{
   @GraphId
   private Long nodeId;
   @StartNode
   private EntityA  entityA;
   @EndNode
   private EntityB  entityB;
   @Property
   private String   propertyAB;
 }

パフォーマンスをチェックするための簡単なテスト ケースに従います。

    EntityA entityA = new EntityA();
    entityA.setPropertyA("propertyA");
    entityARepository.save(entityA);

    for (int i = 0; i < 100; i++) {
        EntityB entityB = new EntityB();
        entityB.setPropertyB("propertyB-" + i);
        entityBRepository.save(entityB);

        RelationshipAB rel = new RelationshipAB();
        rel.setEntityA(entityA);
        rel.setEntityB(entityB);
        rel.setPropertyAB("propertyAB-" + i);

        entityA.getEntitiesB().add(rel);

        Date startDate = new Date();
        entityARepository.save(entityA, 1);
        Date endDate = new Date();
        System.out.println("Time for adding " + (i + 1) + " node: " + (endDate.getTime() - startDate.getTime()) + " ms");
    }

    Iterator<RelationshipAB> iter = entityA.getEntitiesB().iterator();
    for (int i = 0; i < 10; i++) {
        iter.next();
    }
    iter.next().setPropertyAB("newProperty1");
    Date startDate = new Date();
    entityARepository.save(entityA, 1);
    Date endData = new Date();
    System.out.println("Time for cahnge the first relationship property: " + (endData.getTime() - startDate.getTime()) + " ms");

    for (int i = 0; i < 20; i++) {
        iter.next();
    }
    iter.next().setPropertyAB("newProperty2");
    startDate = new Date();
    entityARepository.save(entityA, 1);
    endData = new Date();
    System.out.println("Time for cahnge the second relationship property: " + (endData.getTime() - startDate.getTime()) + " ms");

    for (int i = 0; i < 10; i++) {
        iter.next();
    }
    iter.next().setPropertyAB("newProperty3");
    startDate = new Date();
    entityARepository.save(entityA, 1);
    endData = new Date();
    System.out.println("Time for cahnge the third relationship property: " + (endData.getTime() - startDate.getTime()) + " ms");

ノードの追加にかかる時間は 100 ミリ秒未満で、最初の更新 (setPropertyAB("newProperty1") の後の保存) には約 1 秒、次の更新には約 4 秒、最後の更新には約 7 秒かかります。

4

1 に答える 1

1

Michael Hunger から示唆されているように、このパフォーマンスの問題はバージョンで修正されています。

<dependency>
    <groupId>org.neo4j</groupId>
    <artifactId>neo4j-ogm</artifactId>
    <version>1.1.3-SNAPSHOT</version>
</dependency>

1.1.3 がリリースされるまで、スナップショット リポジトリに依存関係を追加する必要があります。

<repository>
    <id>neo4j-snapshots</id>
    <url>http://m2.neo4j.org/content/repositories/snapshots</url>
    <snapshots>
        <enabled>true</enabled>
    </snapshots>
</repository>

私たちはそれを私たちのソリューションでテストしました。

于 2015-10-05T15:18:22.323 に答える