批量替换 ontotext GraphDB 中的语句
Bulk replacing statements in ontotext GraphDB
我目前正在使用他们的 RDF4J 与 ontotext 的 GraphDB 集成 API。
我正在尝试插入和替换大量语句,最好是一次性插入和替换。我目前正在我的 Fuseki 实例(我正在迁移)上执行此操作,方法是为我想插入到我的图形中的每个三元组创建此块(目前仅使用默认图形)并将其作为一个 update
调用提交使用分号分隔语句(进入 post
正文的地方);
delete { <x:test> <y:name> ?o }
insert { <x:test> <y:name> "Test" }
where { optional{ <x:test> <y:name> ?o }};
delete { <x:test> <y:description> ?o }
insert { <x:test> <y:description> "Test" }
where { optional{ <x:test> <y:description> ?o }};
delete { <x:test2> <y:name> ?o }
insert { <x:test2> <y:name> "Test" }
where { optional{ <x:test2> <y:name> ?o }};
我一直在查看 API,据我所知,声明 Post 方法 (POST /repositories/{repositoryID}/statement
) 只允许像查询中那样的 SPARQL 1.1 更新字符串参数调用 update
.
这意味着我最终会将数千个 SPARQL 块附加到查询参数上,这确实感觉不对。
我是否遗漏了有关您在 GraphDB 中更新语句的方式?我应该遵循更好的策略吗?
编辑 1
经过一番尝试,我创建了以下似乎有效的方法,但我不能说它是否会被认为是一种好方法;
DELETE {
<x:test> ?p ?o
}
WHERE {
<x:test> ?p ?o .
VALUES (?p) {
(<y:name>)
(<y:description>)
}
};
INSERT DATA {
<x:test> <y:name> "New Name" .
<x:test> <y:description> "New Description" .
}
如有任何帮助,我们将不胜感激。
非常感谢,
约翰
您可以使用分号“;
”对多个 SPARQL 更新进行排序。例如:
delete { <x:test1> <y:name> ?o }
insert { <x:test1> <y:name> "Test 1" }
where { <x:test1> <y:name> ?o }};
delete { <x:test2> <y:name> ?o }
insert { <x:test2> <y:name> "Test 2" }
where { <x:test2> <y:name> ?o }
只需要将这样一个序列字符串发送到更新端点,就会一次性执行。
至于这是否是最有效的方法,那是另一回事。您试图替换的语句是否具有任何共同特征?如果是这样,则可以在单个查询中表达更新,而不是每个三元组/主题的序列。
玩了一圈之后,我创建了以下内容,这似乎对我所追求的有用,但我不能说是否会考虑它 "Best Practice" - 我会让那些更多比我知道的评论。
DELETE {
<x:test> ?p ?o
}
WHERE {
<x:test> ?p ?o .
VALUES (?p) {
(<y:name>)
(<y:description>)
}
};
INSERT DATA {
<x:test> <y:name> "New Name" .
<x:test> <y:description> "New Description" .
}
关于使用 GraphDB API 处理大量更新存在一个问题,但是我将把它作为一个单独的问题提出,因为如果我单独(或小批量)处理这些更新,它会完美地工作.
谢谢,
约翰
我目前正在使用他们的 RDF4J 与 ontotext 的 GraphDB 集成 API。
我正在尝试插入和替换大量语句,最好是一次性插入和替换。我目前正在我的 Fuseki 实例(我正在迁移)上执行此操作,方法是为我想插入到我的图形中的每个三元组创建此块(目前仅使用默认图形)并将其作为一个 update
调用提交使用分号分隔语句(进入 post
正文的地方);
delete { <x:test> <y:name> ?o }
insert { <x:test> <y:name> "Test" }
where { optional{ <x:test> <y:name> ?o }};
delete { <x:test> <y:description> ?o }
insert { <x:test> <y:description> "Test" }
where { optional{ <x:test> <y:description> ?o }};
delete { <x:test2> <y:name> ?o }
insert { <x:test2> <y:name> "Test" }
where { optional{ <x:test2> <y:name> ?o }};
我一直在查看 API,据我所知,声明 Post 方法 (POST /repositories/{repositoryID}/statement
) 只允许像查询中那样的 SPARQL 1.1 更新字符串参数调用 update
.
这意味着我最终会将数千个 SPARQL 块附加到查询参数上,这确实感觉不对。
我是否遗漏了有关您在 GraphDB 中更新语句的方式?我应该遵循更好的策略吗?
编辑 1
经过一番尝试,我创建了以下似乎有效的方法,但我不能说它是否会被认为是一种好方法;
DELETE {
<x:test> ?p ?o
}
WHERE {
<x:test> ?p ?o .
VALUES (?p) {
(<y:name>)
(<y:description>)
}
};
INSERT DATA {
<x:test> <y:name> "New Name" .
<x:test> <y:description> "New Description" .
}
如有任何帮助,我们将不胜感激。
非常感谢, 约翰
您可以使用分号“;
”对多个 SPARQL 更新进行排序。例如:
delete { <x:test1> <y:name> ?o }
insert { <x:test1> <y:name> "Test 1" }
where { <x:test1> <y:name> ?o }};
delete { <x:test2> <y:name> ?o }
insert { <x:test2> <y:name> "Test 2" }
where { <x:test2> <y:name> ?o }
只需要将这样一个序列字符串发送到更新端点,就会一次性执行。
至于这是否是最有效的方法,那是另一回事。您试图替换的语句是否具有任何共同特征?如果是这样,则可以在单个查询中表达更新,而不是每个三元组/主题的序列。
玩了一圈之后,我创建了以下内容,这似乎对我所追求的有用,但我不能说是否会考虑它 "Best Practice" - 我会让那些更多比我知道的评论。
DELETE {
<x:test> ?p ?o
}
WHERE {
<x:test> ?p ?o .
VALUES (?p) {
(<y:name>)
(<y:description>)
}
};
INSERT DATA {
<x:test> <y:name> "New Name" .
<x:test> <y:description> "New Description" .
}
关于使用 GraphDB API 处理大量更新存在一个问题,但是我将把它作为一个单独的问题提出,因为如果我单独(或小批量)处理这些更新,它会完美地工作.
谢谢, 约翰