如何使用节点和关系获取模式变量(如果存在)

How to fetch pattern variable with node and relationships (if present)

假设,我们在 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;
}

现在,我想获取居住在 linked 地点和纪念碑(如果存在)的所有人。这意味着,密码查询不仅会向我提供 List 作为结果,而且如果 link 可用(否则无效的)。 为了进一步澄清,对于 Person 'Ron',我应该能够看到他访问过的纪念碑和他停留的地方,而无需执行任何更多查询来获取关系。同样,对于Person 'April',我应该能够看到她住在哪里,但不会知道她去了哪个纪念碑,因为那里没有link。

以我对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 对象,而纪念碑和地点不会 linked [getMonument() 和 getPlace() 即使对于 Person 'Ron'] 也是空的.

MATCH p=(person:Person) RETURN p

我找不到可以获取所有这些的查询。

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

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

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