Sparql Jena删除和URI

Sparql Jena删除和URI,sparql,jena,Sparql,Jena,我有Jena(2.6.4)和ARQ(2.8.8),无法从triple store中删除数据。 SPARQL请求: DELETE {?doc ?p ?o} WHERE { ?doc ?p ?o; <http://example#fullName> <file:/c:/1.txt> } 我找到的唯一方法-比较字符串: {?doc base:fullName ?fname. FILTER(str(?fname) = "file:/c

我有Jena(2.6.4)和ARQ(2.8.8),无法从triple store中删除数据。 SPARQL请求:

  DELETE {?doc ?p ?o} 
  WHERE {  ?doc ?p ?o; 
        <http://example#fullName> <file:/c:/1.txt> }
我找到的唯一方法-比较字符串:

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

您没有说明会出现什么错误,但考虑到您使用的是非常旧的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" . 
}
删除{doc?p?o}
其中{?doc?p?o;
“文件:/c:/1.txt”。
}

尽管上述方法仅在文本值为无语言标记的非类型化文本时有效。否则,您可以选择(对字符串值使用筛选条件)是一种很好的处理方法。或者,当然,如果您希望这些值是URI而不是文字,请修改您的实际数据。

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

更新在我看来,您的数据似乎有问题。您的更新操作和您使用的查询都试图将
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" . 
}
删除{doc?p?o}
其中{?doc?p?o;
“文件:/c:/1.txt”。
}
尽管上述方法仅在文本值为无语言标记的非类型化文本时有效。否则,您可以选择(对字符串值使用筛选条件)是一种很好的处理方法。当然,如果希望这些值是URI而不是文字,也可以修改实际数据。

不是一个正确的URI(它不是正确的绝对值,尽管文件:URL的定义不是很好)

文件:URL的正式定义要求:
file://host/path
主机
可能被省略,给出
文件://

SPARQL解析器将其转换为

您可以使用

arq.qparse --file QueryInFile.rq
数据加载似乎没有执行相同的步骤。从命令行运行Jena RIOT parse时会发出警告:

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.
WARN[line:1,col:46]错误的IRI:code:57/权限中缺少必需的组件:缺少方案所需的组件。
最好修复数据。

不是正确的URI(它不是正确的绝对URI,尽管file:URL的定义不是很好)

文件:URL的正式定义要求:
file://host/path
主机
可能被省略,给出
文件://

SPARQL解析器将其转换为

您可以使用

arq.qparse --file QueryInFile.rq
数据加载似乎没有执行相同的步骤。从命令行运行Jena RIOT parse时会发出警告:

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.
WARN[line:1,col:46]错误的IRI:code:57/权限中缺少必需的组件:缺少方案所需的组件。

最好是修复数据。

+1关于升级的一点很好,尽管我怀疑问题可能出在IBM DB2后端,而不是Jena,因为这篇文章最近提出了一个关于删除不工作的类似主题的问题,select也不适用于查询字符串:“select?s where{s}”;(Jena 2.7.2)+关于升级,我有一个很好的观点,尽管我怀疑问题可能在于IBM DB2后端,而不是Jena,因为这篇文章最近提出了一个关于删除不工作的类似主题的问题,select也不适用于查询字符串:“select?s where{s}”;(Jena 2.7.2)我在没有DB2的情况下重新测试了Jena 2.7.2和ARQ 2.9.2。相同的结果是:删除{doc?p?o}WHERE{doc。?doc?p?o}-没有错误,也没有删除任何内容。要删除,我应该使用以下查询:删除{doc?p?o}WHERE{doc fname.FILTER(str(?fname)=“file:/c:/1.txt”)?doc p?o}我认为问题是您需要一个URI,但该值实际上是一个文本。我已经更新了我的答案,请参见下文。不知道为什么Jena和Sesame之间会有不同,除非您使用不同版本的数据进行Sesame测试。我在没有DB2的情况下重新测试了Jena 2.7.2和ARQ 2.9.2。相同的结果是:删除{doc?p?o}其中{doc。?doc?p?o}-没有错误,也没有删除任何内容。要删除,我应该使用以下查询:删除{doc?p?o}其中{doc?fname.FILTER(str(?fname)=“文件:/c:/1.txt”)?doc p?o}我认为问题在于您需要一个URI,但该值实际上是一个文本。我已经更新了我的答案,请参见下文。不知道为什么Jena和Sesame之间会有不同,除非您在使用Sesame的测试中使用了不同版本的数据。谢谢,您是对的,问题是数据格式-“file:/localhost/c:/data/1.txt”.当我把它改成“file://localhost/c:/data/1.txt“它开始工作了。谢谢,你说得对,问题出在数据格式——”file:/localhos