1

Neo4J でソーシャル ネットワークをモデル化しようとしています。これには、ユーザーが別のユーザーと複数の関係を持つことができる必要があります。これらの関係を維持しようとすると、保存されるのは 1 つだけです。たとえば、これは私が行うテストユニットです:

@Test
public void testFindConnections() {

    Id id1 = new Id();
    id1.setId("first-node");

    Id id2 = new Id();
    id2.setId("second-node");
    idService.save(id2);

    id1.connectedTo(id2, "first-rel");
    id1.connectedTo(id2, "second-rel");

    idService.save(id1);

    for (Id im : idService.findAll()) {
        System.out.println("-" + im.getId());
        if (im.getConnections().size() > 0) {
            for (ConnectionType ite : im.getConnections()) {
                System.out
                        .println("--" + ite.getId() + " " + ite.getType());
            }
        }
    }
}

これにより、次のように出力されます。

-first-node
--0 first-rel
--1 second-rel
-second-node
--0 first-rel
--1 second-rel

ただし、次のように出力されます。

-first-node
--0 first-rel
-second-node
--0 first-rel

これは私のノードエンティティです:

@NodeEntity
public class Id {

    @GraphId
    Long nodeId;
    @Indexed(unique = false)
    String id;

    @Fetch
    @RelatedToVia(direction=Direction.BOTH)
    Collection<ConnectionType> connections = new HashSet<ConnectionType>();
}

そして私の関係エンティティ:

@RelationshipEntity(type = "CONNECTED_TO")
public class ConnectionType {

    @GraphId Long id;
    @StartNode Id fromUser;
    @EndNode Id toUser;

    String type;
}

問題は何でしょうか?ノード間のいくつかの関係をモデル化する他の方法はありますか?

4

1 に答える 1

4

これは Neo4j の欠点ではなく、Spring Data Neo4j の制限です。

通常、異なるタイプのリレーションシップがある場合は、実際には異なるリレーションシップ タイプも選択し、これにはリレーションシップ プロパティを使用しない方がよいでしょう。

CONNECTED_TOもかなり一般的です。

Idもかなり一般的なクラスですが、それはそうではないUserでしょうか。

FRIEND COLLEAGUEなどのほうが意味があります。


とはいえ、モデルにとどまりたい場合は、次のいずれかを使用できます

template.createRelationshipBetween(entity1,entity2,type,properties,true)

allow-duplicatesのtrue略です。

または、2 種類の関係に 2 つの異なるターゲット タイプを使用し、

@RelatedTo(enforceTargetType=true)

于 2013-02-21T20:38:53.773 に答える