Jena DELETE和URI

时间:2012-07-26 16:02:09

标签: sparql jena

我有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")

2 个答案:

答案 0 :(得分:2)

<file:/c:/1.txt>不是一个合适的URI(尽管文件:URL的定义不是很明确,但它并不是绝对的。)

文件的正式定义:URls要求:file://host/pathhost可能省略,给予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.

最好修复数据。

答案 1 :(得分:1)

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

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

 <file:/c:/1.txt>

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

以下可能有效:

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

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