2013-02-21 161 views
1

我想用Neo4J建模一個社交網絡。這要求用戶可以與另一個用戶有多重關係。當我試圖堅持這些關係時,只有一個存儲。例如,這是測試單元我做的:不能在neo4j中添加多個節點之間的關係

@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

這不是Neo4j的缺點,它是Spring Data Neo4j的一個限制。

通常,如果您有不同類型的關係,則實際選擇不同的關係類型也是有意義的,並且不要使用關係屬性。

CONNECTED_TO也很通用。

Id也是一個非常通用的類,不應該是User或類似的東西嗎?

FRIENDCOLLEAGUE等等會更有意義。


這就是說,如果你想留在你的模型,你可以使用

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

true代表讓 - 重複。

或者使用兩種不同的目標類型爲2種類型的關係,並使用

@RelatedTo(enforceTargetType=true)

+0

感謝您的信息!是的,這是非常通用的,這只是一個測試。我想用不同的類型來實現,問題是它們是在運行時定義的。我發現DynamicRelationshipEntity類,但不知道如何使用它,我找不到任何示例。你知道一個有效的例子嗎? – 2013-02-21 23:23:39

+0

使用枚舉作爲rel-types。否則'DynamicRelationshipType.withName(type)'。 – 2013-02-24 20:33:36

相關問題