使用FILTER进行SPARQL查询

时间:2014-06-02 16:25:50

标签: sparql dbpedia

我对使用FILTER的方式有疑问 当我在DBPedia SPARQL端点中使用如下查询时,检索到1个结果。 但是,如果我从查询中取消FILTER ( langMatches(lang(?sl),'en') && langMatches(lang(?ol),'en') ),那么就没有检索到任何内容。 我认为应该有更多的结果,因为没有使用FILTER

这怎么可能?

SPARQL端点:dbpedia.org/sparql

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?s ?sl (<http://xmlns.com/foaf/0.1/depiction> as ?p) ?o ?ol

WHERE {
  ?s rdfs:label ?sl . 
  ?s <http://xmlns.com/foaf/0.1/depiction> ?o .
  ?o rdfs:label ?ol .

  FILTER (   langMatches(lang(?sl),'en') && langMatches(lang(?ol),'en') )  <------- this part
} 
LIMIT 100

1 个答案:

答案 0 :(得分:2)

这很奇怪,我确实看到了你所说的结果。您有一个可以运行查询的Web服务,并且可以轻松地修改查询以获取有关正在发生的事情的更多信息。首先,让我们看看总共有多少结果(没有过滤器):

select (count(*) as ?nResults) where {
  ?s rdfs:label ?sl . 
  ?s <http://xmlns.com/foaf/0.1/depiction> ?o .
  ?o rdfs:label ?ol .
} 
  

24

现在,如果我们只选择带有英文标签的那对,会剩下多少?

select (count(*) as ?nResults) where {
  ?s rdfs:label ?sl . 
  ?s <http://xmlns.com/foaf/0.1/depiction> ?o .
  ?o rdfs:label ?ol .
  filter ( langMatches(lang(?sl),'en') && langMatches(lang(?ol),'en') )
} 
  

1

这很有希望,因为当我们添加其他约束时,我们希望数字减少。这些数字也足够小,我们不需要担心限制,我们可以直接查看结果。首先,对于未经过滤的结果:

select * where {
  ?s rdfs:label ?sl . 
  ?s <http://xmlns.com/foaf/0.1/depiction> ?o .
  ?o rdfs:label ?ol .
} 

当我运行此查询时,我期望返回24个结果行,如第一个查询建议的那样。但是,当我运行它时,我实际上并没有得到任何结果。这个查询似乎需要一段时间,而且可能是我们遇到了一些超时。在任何情况下,都会发生一些奇怪的事情。在过滤的查询上:

select * where {
  ?s rdfs:label ?sl . 
  ?s <http://xmlns.com/foaf/0.1/depiction> ?o .
  ?o rdfs:label ?ol .
  filter ( langMatches(lang(?sl),'en') && langMatches(lang(?ol),'en') )
} 

只有一个结果,它有这些值:

s  <http://dbpedia.org/resource/Franz_Kruckenberg>
sl "Franz Kruckenberg"@en
o  <http://dbpedia.org/resource/Schienenzeppelin>
ol "Schienenzeppelin"@en

由于未经过滤的案例中的count(*)查询给出了24,我认为这里发生的事情并不完全正确。这可能是一个时间限制,在这种情况下,您可能需要在本地下载数据并在本地运行查询。但是,如果它是其他类型的错误,您可能想要访问DBpedia邮件列表并询问它们。

运行一些相关的查询并没有太多帮助。例如,如果你只是要求有标签描述的东西,你只会得到一些结果,而且它们都是关于相同的资源(Frank Kruckenberg):

select * where {
  ?s <http://xmlns.com/foaf/0.1/depiction> [ rdfs:label ?dl ]
} 
dl                      s
---------------------------------------------------------------------
"Schienenzeppelin"@de   http://dbpedia.org/resource/Franz_Kruckenberg
"Schienenzeppelin"@en   http://dbpedia.org/resource/Franz_Kruckenberg
"Schienenzeppelin"@fr   http://dbpedia.org/resource/Franz_Kruckenberg
"Schienenzeppelin"@it   http://dbpedia.org/resource/Franz_Kruckenberg
"シーネンツェッペリン"@ja   http://dbpedia.org/resource/Franz_Kruckenberg
"Schienenzeppelin"@pl   http://dbpedia.org/resource/Franz_Kruckenberg
"Рельсовый Цеппелин"@ru http://dbpedia.org/resource/Franz_Kruckenberg
"Schienenzeppelin"@sv   http://dbpedia.org/resource/Franz_Kruckenberg