2015-10-27 125 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