【问题标题】:Undirected Relationship in Neo4JNeo4J 中的无向关系
【发布时间】:2016-01-26 20:53:00
【问题描述】:

我正在使用 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" 

“->”被“-”代替,但我不想用这个。

我该怎么办?

我正在使用 spring-data-neo4j.version 4.0.0.RELEASE 和 spring-boot 版本 spring-boot-starter-parent 1.3.0.M5

【问题讨论】:

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


    【解决方案1】:

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

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

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

    你为什么不想用这个?

    【讨论】:

    • 是的,我可以,但是“direction=Relationship.UNDIRECTED”有什么用??
    • SDN 将为您选择一个方向。双向关系不好顺便说一句graphaware.com/neo4j/2013/10/11/…
    • 它可以可视化为无向边吗?
    猜你喜欢
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多