如何使用节点和关系获取模式变量(如果存在)
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语言的基本了解,我尝试过但无法得到想要的结果。
- 如果我在查询中同时提供关系并获取相应的模式变量,我只会在结果中得到 Person 'Ron'。
MATCH
p=(place:Place)<-[STAYS]-(person:Person)-[VISITED]->(monument:Monument) RETURN p
- 如果我只提供关系 'STAYS',我会得到 'Ron' 和 'April'。
MATCH p=(person:Person)-[STAYS]->(place:Place) RETURN p
- 如果我在没有关系的情况下进行查询,我只会得到 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' 将是唯一的结果。
假设,我们在 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
以我对Cypher Query语言的基本了解,我尝试过但无法得到想要的结果。
- 如果我在查询中同时提供关系并获取相应的模式变量,我只会在结果中得到 Person 'Ron'。
MATCH p=(place:Place)<-[STAYS]-(person:Person)-[VISITED]->(monument:Monument) RETURN p
- 如果我只提供关系 'STAYS',我会得到 'Ron' 和 'April'。
MATCH p=(person:Person)-[STAYS]->(place:Place) RETURN p
- 如果我在没有关系的情况下进行查询,我只会得到 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' 将是唯一的结果。