OrientDB REST API单POST请求实现边的存在检查与创建
没问题,我帮你搞定这个需求!用OrientDB的REST API单POST请求实现「检查边是否存在+不存在就创建」完全可行,而且能有效减少往返服务器的开销。结合你提到的Tolkien-Arda数据集,我给你整理了具体的实现方案:
用OrientDB REST API单POST请求实现“边存在检查+创建”
核心思路
OrientDB的SQL支持在单个命令中执行多步逻辑(通过变量定义+条件判断),REST API也允许在POST请求的command字段中传入完整的SQL脚本。我们可以先预定义顶点变量、检查边的存在性,再根据结果决定是否创建新边,全程在一个请求内完成。
完整请求示例
假设你要检查的是rosaBaggins到目标Creature顶点的Begets边(你原查询里的IN顶点没写完,这里保留占位逻辑),具体请求如下:
请求详情
- URL:
http://<你的OrientDB主机>:<端口>/command/Tolkien-Arda/sql - 请求方法:POST
- 请求头:
Content-Type: application/jsonAuthorization: Basic <你的base64编码的账号密码>(比如admin/admin编码后是YWRtaW46YWRtaW4=)
- 请求体(JSON格式):
{ "command": "LET $outVertex = (SELECT FROM Creature WHERE uniquename='rosaBaggins'); LET $inVertex = (SELECT FROM Creature WHERE uniquename='<你的目标顶点uniquename>'); LET $edgeExists = (SELECT COUNT(*) FROM Begets WHERE out = $outVertex AND in = $inVertex); IF($edgeExists[0].count = 0) INSERT INTO Begets (out, in) VALUES ($outVertex, $inVertex);" }
代码逻辑拆解
- 定义顶点变量:用
LET语句先获取两端的Creature顶点,避免重复执行查询,提升效率 - 检查边的存在性:查询
Begets边中同时匹配两个顶点的记录数量 - 条件创建边:如果计数为0(边不存在),就执行
INSERT语句创建新边
扩展与注意事项
- 添加边属性:如果你的
Begets边有额外属性(比如创建时间),可以在INSERT里补充:INSERT INTO Begets (out, in, createdDate) VALUES ($outVertex, $inVertex, DATE()) - 事务保障:如果需要确保操作的原子性,可以把脚本包裹在事务块里:
BEGIN; LET $outVertex = (SELECT FROM Creature WHERE uniquename='rosaBaggins'); LET $inVertex = (SELECT FROM Creature WHERE uniquename='<你的目标顶点uniquename>'); LET $edgeExists = (SELECT COUNT(*) FROM Begets WHERE out = $outVertex AND in = $inVertex); IF($edgeExists[0].count = 0) INSERT INTO Begets (out, in) VALUES ($outVertex, $inVertex); COMMIT; - 唯一性验证:确保
Creature的uniquename字段是唯一索引,这样SELECT FROM Creature WHERE uniquename='xxx'只会返回单个顶点,避免匹配多个顶点导致的异常。
测试验证
- 先手动删除目标
Begets边,发送请求后检查数据库,边应该被创建 - 再次发送相同请求,数据库中不会出现重复的边(因为存在性检查会拦截)
内容的提问来源于stack exchange,提问作者jamzsabb
相关产品推荐
相关产品推荐

