DBpedia SPARQL筛选器不适用于所有结果

DBpedia SPARQL筛选器不适用于所有结果,sparql,dbpedia,Sparql,Dbpedia,过滤器不存在与可选三元组组合时允许通过某些结果 我的问题是: SELECT DISTINCT * WHERE { { ?en rdfs:label "N'Djamena"@en . BIND("N'Djamena" AS ?name) . } UNION { ?en rdfs:label "Port Vila"@en . BIND("Port Vila" AS ?name) . } UNION { ?en rdfs:label "At

过滤器不存在
可选
三元组组合时允许通过某些结果

我的问题是:

SELECT DISTINCT * WHERE 
{
  {
    ?en rdfs:label "N'Djamena"@en .
    BIND("N'Djamena" AS ?name) .
  }
  UNION {
    ?en rdfs:label "Port Vila"@en .
    BIND("Port Vila" AS ?name) .
  }
  UNION {
    ?en rdfs:label "Atafu"@en .
    BIND("Atafu" AS ?name) .
  }
  FILTER NOT EXISTS { ?en rdf:type skos:Concept } .
  OPTIONAL { ?en owl:sameAs ?es . FILTER regex(?es, "es.dbpedia") .  }
  OPTIONAL { ?en owl:sameAs ?pt . FILTER regex(?pt, "pt.dbpedia") .  }
} 
LIMIT 100
这个查询获得了预期的三个位置,但它也返回了“Category:Atafu”,应该通过“rdf:type skos:Concept”过滤掉它

如果使用时没有
可选
行,我会得到预期的三个位置。当非选择性地与这些条款一起使用时,我只得到其中两个国家,因为Atafu没有葡萄牙语页面

我还可以将
FILTER NOT EXISTS
语句移动到每个联合国国家/地区块中,但这似乎会影响服务器的响应时间


为什么
过滤器不存在
子句会过滤掉“Category:N'Djamena”和
Category:Port_Vila
而不是“Category:Atafu”,后面跟的是
OPTIONAL

我真的不知道你的查询为什么不起作用。我得把这归因于一些古怪的艺术大师。肯定有什么奇怪的事情发生了。例如,如果删除姓氏的绑定,您将获得所需的资源:

SELECT DISTINCT * WHERE 
{
  {
    ?en rdfs:label "N'Djamena"@en .
    BIND("N'Djamena" AS ?name) .
  }
  UNION {
    ?en rdfs:label "Port Vila"@en .
    BIND("Port Vila" AS ?name) .
  } 
  UNION {
    ?en rdfs:label "Atafu"@en .
  }
  FILTER NOT EXISTS { ?en rdf:type skos:Concept }
  OPTIONAL { ?en owl:sameAs ?es . FILTER regex(?es, "es.dbpedia") }
  OPTIONAL { ?en owl:sameAs ?pt . FILTER regex(?pt, "pt.dbpedia") .  }
} 
LIMIT 100

这真的很奇怪。这是查询的一个修改版本,它可以获取您要查找的结果。它使用而不是联合,这使得查询更简单。但是,它在逻辑上应该是等价的,所以我不确定它为什么会有不同

select distinct * where {
  values ?label { "N'Djamena"@en "Port Vila"@en "Atafu"@en }
  ?en rdfs:label ?label .
  optional { ?en owl:sameAs ?pt . filter regex(?pt, "pt.dbpedia") }
  optional { ?en owl:sameAs ?es . filter regex(?es, "es.dbpedia") }
  filter not exists { ?en a skos:Concept }
  bind(str(?label) as ?name)
}

不过我实际上会清理字符串匹配,因为正则表达式可能比这里需要的功能更强。您只需要检查该值是否以给定的子字符串开头:

选择en标签(str(?标签)作为名称)?es?pt在哪里{
值?标签{“N'Djamena”@en“Port Vila”@en“Atafu”@en}
?en rdfs:标签?标签。
可选的{en owl:sameAs?pt.过滤器strstarts(str(?pt),”http://pt.dbpedia") }
可选的{en owl:sameAs?es.过滤器strstarts(str(?es),”http://es.dbpedia") }
筛选器不存在{en a skos:Concept}
}

您使用的是什么SPARQL引擎?(似乎为Jena ARQ工作)您研究过SPARQL中的值吗?这更适合你对联合的使用。哦,你看到和的区别了吗?后者是skos:Concept的成员,确实被查询过滤掉了。前者是一个有效的结果,我使用的是DBpedia的Virtuoso编辑器。我只是在那里玩我的查询,然后从我的web应用程序向该端点提交一个HTTP请求;我甚至不知道你可以用这种方式把bind和values结合起来。ruby开发人员将很高兴看到这些结果!为了记录在案,谢谢你证明不仅仅是我。我对这个问题的理解几乎和教育性的回答一样多。:-)