如何获取具有节点和关系的模式变量(如果存在)

时间:2018-08-23 15:03:04

标签: neo4j cypher spring-data-neo4j

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

enter image description here

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 作为结果,而且如果链接可用,Monument and Place对象也应该与每个Person对象链接。 为了进一步说明这一点,对于“罗恩”人,我应该能够看到他所参观的纪念碑和他所住的地方,而无需执行任何其他查询来获取关系。同样,对于“ 4月”人员,我应该能够看到她的住处,但由于那里没有链接,所以不知道她去过哪个纪念碑。

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

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

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

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

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

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

MATCH p =(person:Person)返回p

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

1 个答案:

答案 0 :(得分:1)

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

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

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