2015-10-27 192 views
1

我使用Spring Data Neo4J來定義不同人之間的無向關係。下面提供了一個示例實體類。Neo4J中的無向關係

@NodeEntity(label="Person") 
public class Person { 

    @GraphId 
    private Long id; 
    private String name; 

    @Relationship(type = "FRIEND_WITH", direction=Relationship.UNDIRECTED) 
    List<Person> friends; 
} 

如上所述,Person具有「Person」類型的朋友的列表。的關係保持不定向,以保證如果一個人A是「Friend_With」人B,那麼某乙也是「Friend_With」人A.

添加好友的代碼如下

if((person.getFriends() == null)||(person.getFriends().size()==0)){ 
     List<Person> friendList = new ArrayList<Person>(); 
     friendList.add(friend); 
     person.setFriends(friendList); 
    }else{ 
     person.getFriends().add(friend); 
    } 

    personRepository.save(person); 

提供我已經加入PersonB作爲人物的朋友,所以理想情況下,這應該意味着

PersonA - [:FRIEND_WITH] -> PersonB 
PersonB - [:FRIEND_WITH] -> PersonA 

的關係是無向

但是當我查詢,在Neo4j的有

MATCH (p:Person)-[r:FRIEND_WITH]->(b:Person) where p.name = "PersonA" return p,b 

我得到PersonA,PersonB的結果。但是當我查詢時

MATCH (p:Person)-[r:FRIEND_WITH]->(b:Person) where p.name = "PersonB" 

沒有行被返回。因此實體類中指定的方向似乎不起作用。此外,Neo4J瀏覽器中的圖形顯示從PersonA到PersonB的有向邊。

我想要的是,如果PersonA是PersonB的朋友,我會得到結果,不管我以哪種方式詢問。該代碼似乎工作

MATCH (p:Person)-[r:FRIEND_WITH]-(b:Person) where p.name = "PersonB" 

其中「 - >」替換爲「 - 」,但我不想使用此。

我該怎麼辦?

我使用的彈簧數據neo4j.version 4.0.0.RELEASE和彈簧引導版本彈簧引導啓動父1.3.0.M5

回答

10

在Neo4j的,所有的關係被定向。

但是,您可以在查詢時具有無向邊的概念。只是從您的MATCH查詢中刪除方向:

MATCH (p:Person)-[r:FRIEND_WITH]-(b:Person) where p.name = "PersonB" 

爲什麼你不想使用它?

+0

是的,我可以,但「direction = Relationship.UNDIRECTED」的用法是什麼? – Soumya

+0

SDN將爲您選擇一個方向。雙向關係不好btw http://graphaware.com/neo4j/2013/10/11/neo4j-bidirectional-relationships.html –

+0

好吧,謝謝... – Soumya