Neo4J中无根据的关系

时间:2015-10-27 12:31:02

标签: neo4j cypher spring-data spring-data-neo4j

我使用Spring Data 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,那么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的朋友,理想情况下,这应该是

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浏览器中的Graph显示了从PersonA到PersonB的有向边缘。

我想要的是,如果PersonA是PersonB的朋友,我会得到结果,无论我问哪个方式。该代码似乎适用于

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

其中“ - &gt;”被“ - ”取代,但我不想使用它。

我该怎么办?

我使用的是spring-data-neo4j.version 4.0.0.RELEASE和spring-boot version spring-boot-starter-parent 1.3.0.M5

1 个答案:

答案 0 :(得分:15)

在Neo4j中,所有关系都是定向的。

但是,您可以在查询时获得无向边的概念。只需从MATCH查询中删除方向:

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

你为什么不想用这个?