批量替换 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 处理大量更新存在一个问题,但是我将把它作为一个单独的问题提出,因为如果我单独(或小批量)处理这些更新,它会完美地工作.

谢谢, 约翰