0

我有 Jena(2.6.4) 和 ARQ(2.8.8),无法从三重存储中删除数据。SPARQL 请求:

  DELETE {?doc ?p ?o} 
  WHERE {  ?doc ?p ?o; 
        <http://example#fullName> <file:/c:/1.txt> }

此请求在 Sesame Workbench 中运行良好。

但是,当我尝试使用 DB2 v.10 RDF 三重存储从 Java 发出它时,什么也没有发生:

       Dataset ds = RdfStoreFactory.connectDataset(store, conn);
       GraphStore graphStore = GraphStoreFactory.create(ds) ;
       UpdateAction.parseExecute(deleteDocumentString, graphStore);

我发现的唯一方法 - 比较字符串:

       {?doc base:fullName ?fname. FILTER(str(?fname) = "file:/c:/1.txt")
4

2 回答 2

2

<file:/c:/1.txt>不是一个正确的 URI(它不是绝对的,尽管 file: URL 的定义不是很好)。

文件的正式定义: URls 要求:file://host/path并且host可能省略,给出file:///.

SPARQL 解析器将其转换为

你可以用

arq.qparse --file QueryInFile.rq

似乎数据加载没有执行相同的步骤。Jena RIOT 解析从命令行运行时会发出警告:

WARN  [line: 1, col: 46] Bad IRI: <file:/c:/1.txt> Code: 57/REQUIRED_COMPONENT_MISSING in AUTHORITY: A component that is required by the scheme is missing.

最好修复数据。

于 2012-07-31T17:00:07.230 回答
1

你没有说你得到了什么错误,但鉴于你使用的是非常旧的 Jena 和 ARQ 版本,我怀疑问题只是它们不支持 SPARQL 更新请求。我建议您升级到更新版本的 Jena(或坚持使用 Sesame :))

更新在我看来,您的数据似乎有问题。您的更新操作和您使用的查询都尝试将值fullName视为 URI(因为您通过将其放在尖括号中来使用 URI 语法,如下所示:

 <file:/c:/1.txt>

但是,显然该值在您的数据中不作为 URI 存在(因为您执行的 SELECT 查询不会返回它,并且您使用它的 DELETE 操作不会删除任何内容)。由于您执行基于字符串的检查的版本确实有效,因此我怀疑在您的数据中,该值是文字,而不是 URI。

以下可能有效:

DELETE {?doc ?p ?o} 
WHERE {  ?doc ?p ?o; 
              <http://example#fullName> "file:/c:/1.txt" . 
}

尽管只有当文字值是没有语言标签的无类型文字时,上述方法才有效。否则,您自己找到的替代方案(在字符串值上使用 FILTER 条件)是处理此问题的好方法。或者,当然,如果您希望这些值是 URI 而不是文字,请修改您的实际数据。

于 2012-07-26T20:44:35.240 回答