0

我目前正在使用他们的 RDF4J API 与 ontext 的 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) 只允许在名为 的查询参数中使用类似的 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" .
}

任何帮助将不胜感激。

非常感谢,约翰

4

2 回答 2

2

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

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

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

于 2017-11-21T03:25:43.983 回答
0

在玩了之后,我创建了以下内容,这似乎适用于我所追求的,但是我不能说它是否会被认为是“最佳实践”——我会让比我更了解的人对此发表评论.

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

谢谢,约翰

于 2017-11-23T10:33:39.583 回答