首页 > 解决方案 > 如何使用节点和关系获取模式变量(如果存在)

问题描述

假设,我们在 neo4j DB 中有以下数据 ->

在此处输入图像描述

java实体表示如下->

 @NodeEntity
public class Place {
    @Id
    @GeneratedValue
    private Long id;

    private String name;
}

@NodeEntity
public class Monument {
    @Id
    @GeneratedValue
    private Long id;

    private String name;
}

@NodeEntity
public class Person {
    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @Relationship(type = "VISITED", direction = Relationship.OUTGOING)
    private Monument monument;

    @Relationship(type = "STAYS", direction = Relationship.OUTGOING)
    private Place place;
}

现在,我想获取所有也填充链接的地方和纪念碑(如果存在)的人。这意味着,密码查询不仅会为我提供 List< Person> 作为结果,而且如果链接可用(否则为 null),Monument 和 Place 对象也应该与每个 Person 对象链接。为了进一步澄清,对于人“罗恩”,我应该能够看到他参观的纪念碑和他住的地方,而无需执行任何更多查询来获取关系。同样,对于 Person 'April',我应该能够看到她在哪里停留,但不知道她访问了哪个纪念碑,因为那里没有链接。

凭借我在 Cypher Query 语言方面的基本知识,我已经尝试过但无法获得所需的结果。

  1. 如果我在查询中同时提供关系并获取相应的模式变量,我只会在结果中得到 Person 'Ron'。

MATCH p=(place:Place)<-[STAYS]-(person:Person)-[VISITED]->(monument:Monument) RETURN p

  1. 如果我只提供关系“STAYS”,我会得到“Ron”和“April”。

MATCH p=(person:Person)-[STAYS]->(place:Place) RETURN p

  1. 如果我在没有关系的情况下进行查询,我只会得到 Person 对象,并且纪念碑和地点未链接 [getMonument() 和 getPlace() 即使对于 Person 'Ron' 也是 null]。

匹配 p=(人:人) 返回 p

我找不到所有这些信息的查询。

标签: neo4jcypherspring-data-neo4j

解决方案


您需要将关系放入可选匹配项中,如下所示:

MATCH (person:Person) 
OPTIONAL MATCH (person)-[:VISITED]->(monument) 
OPTIONAL MATCH (person)-[:STAYS]->(place)
return person, place, monument

否则,neo4j 将您的查询 1) 中的关系视为required,这就是为什么 'Ron' 将是唯一的结果。


推荐阅读