0

我有一个基于ARC2的 RDF 存储设置并填充了一些数据。当我在没有该部分的情况下运行以下查询时,将返回预期的结果(类型为vcard:Individualor的所有 URI ):foaf:PersonFILTER NOT EXISTS

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX app: <http://example.com#>

SELECT ?person
WHERE {
  ?person rdf:type ?type .
  FILTER (?type = vcard:Individual || ?type = foaf:Person)
  FILTER NOT EXISTS {
    ?person app:id ?id
  }
}

当我尝试app:id通过运行完整查询来排除具有该属性的那些东西时,它会失败并显示以下消息:

Incomplete FILTER in ARC2_SPARQLPlusParser
Incomplete or invalid Group Graph pattern. Could not handle &quot;        FILTER NOT EXISTS {   &quot; in ARC2_SPARQLPlusParser

在 sparql.org 上的查询验证器中测试查询时,没有问题。我的查询是否有问题,或者这是 ARC2 的缺点?

您能想出一个替代查询,我可以尝试使用 ARC2 来获得所需的结果吗?

4

1 回答 1

3

ARC2 不支持SPARQL 1.1,因此,您必须使用常见的 OPTIONAL-FILTER(!BOUND()) 模式:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX app: <http://example.com#>

SELECT ?person
WHERE {
  ?person rdf:type ?type .
  FILTER (?type = vcard:Individual || ?type = foaf:Person)
  OPTIONAL {
    ?person app:id ?id
  }
  FILTER ( !BOUND(?id) ) 
}
于 2017-01-27T13:56:13.047 回答