批量替换ontotext GraphDB中的语句

时间:2017-11-20 18:05:29

标签: sparql rdf graphdb

我目前正在使用他们的RDF4J API与ontotext的GraphDB集成。

我正在尝试插入和替换大量语句,理想情况下一次性使用。我目前在我的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,据我所知,Statement Post Method(POST /repositories/{repositoryID}/statement)只允许在查询参数中使用名为 update的SPARQL 1.1更新字符串

这意味着我最终会将数千个这样的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" .
}

非常感谢任何帮助。

非常感谢, 约翰

2 个答案:

答案 0 :(得分:2)

您可以使用分号&#34; ;&#34;对多个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 }

只需将这样的序列字符串发送到更新端点,它就会一次执行。

至于这是否是最有效的方式,这是另一回事。您要替换的语句是否共享任何特征?如果是这样,则可以在单个查询中表达更新,而不是每个三元组/主题的序列。

答案 1 :(得分:0)

在玩完游戏之后,我创造了以下内容,这似乎适用于我所追求的内容但是我不能说它是否会被认为是&#34;最佳实践&#34; - 我会让那些比我更了解的人对此发表评论。

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处理大量更新时存在一个问题,但是我会将其作为一个单独的问题提出来,因为如果我单独处理这些更新(或小批量处理),它就能完美运行。

谢谢, 约翰