neo4j - 如何使用节点和关系获取模式变量(如果存在)
问题描述
假设,我们在 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 语言方面的基本知识,我已经尝试过但无法获得所需的结果。
- 如果我在查询中同时提供关系并获取相应的模式变量,我只会在结果中得到 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 对象,并且纪念碑和地点未链接 [getMonument() 和 getPlace() 即使对于 Person 'Ron' 也是 null]。
匹配 p=(人:人) 返回 p
我找不到所有这些信息的查询。
解决方案
您需要将关系放入可选匹配项中,如下所示:
MATCH (person:Person)
OPTIONAL MATCH (person)-[:VISITED]->(monument)
OPTIONAL MATCH (person)-[:STAYS]->(place)
return person, place, monument
否则,neo4j 将您的查询 1) 中的关系视为required,这就是为什么 'Ron' 将是唯一的结果。
推荐阅读
- ios - 快速更新 Firebase 最新版本后出现错误“在范围内找不到“消息”
- postgresql - 如何删除ecto elixir中的主键列
- python-3.x - ValueError:模型的特征数量必须与输入匹配。模型 n_features 为 464,输入 n_features 为 2
- mongodb - 无法使用 Vert.x MongoClient 连接到 MongoDB Atlas
- graphviz - 如何在 Graphviz 中两个节点之间的箭头顶部添加 3 个项目符号?
- ios - 将 XCFrameworks 集成到开发和发布工作流程中
- r - 将 mob() 树(partykit 包)与logistic() 模型一起使用
- java - Realiable UDP - TCP 握手何时发生?
- python - Python:使用 pandas 库将 JSON 数据转换为 CSV
- ios - 在 CoreData Swift 中查找具有唯一父关系对象的对象