3

I read some questions related to my question, like Same sparql not returning same results, but I think is a little different.

Consider this query which I submit into http://live.dbpedia.org/sparql (Virtuoso endpoint) and get 34 triples as a result. Result Sparql

SELECT  ?pred ?obj
    WHERE { 
           <http://dbpedia.org/resource/Johann_Sebastian_Bach> ?pred ?obj
        FILTER((langMatches(lang(?obj), "")) ||
                      (langMatches(lang(?obj), "EN"))
          )
    }

Then, I used the same query in a code in python:

import rdflib
import rdfextras
rdfextras.registerplugins()

g=rdflib.Graph()
g.parse("http://dbpedia.org/resource/Johann_Sebastian_Bach")

PREFIX = """
                PREFIX dbp: <http://dbpedia.org/resource/>
"""

query = """
                SELECT ?pred ?obj
                    WHERE {dbp:Johann_Sebastian_Bach ?pred ?obj
                        FILTER( (langMatches(lang(?obj), "")) ||
                                (langMatches(lang(?obj), "EN")))}
"""
query = PREFIX + query
result_set = g.query(query)
print len(result_set)

This time, I get only 27 triples! https://dl.dropboxusercontent.com/u/22943656/result.txt

I thought it could be related to the dbpedia site. I repeated these queries several time and always got the same difference. Therefore, I downloaded the RDF file to test it locally, and used the software Protége to simulate the Virtuoso endpoint. Even though, I still have different results from the sparql submitted into Protége and Python, 31 and 27. Is there any explanation for this difference? And how can I get the same result in both?

4

1 回答 1

3

正如问题所写,有一些可能的问题。根据评论,此处描述的第一个问题(关于langlangMatches等)似乎是您实际遇到的问题,但我将保留其他可能问题的描述,以防其他人发现它们有用。

lang, langMatches, 和空字符串

lang被定义为返回""没有语言标签的文字。根据RFC 4647 §2.1,语言标签定义如下:

2.1。基本语言范围

“基本语言范围”具有与 [RFC3066] 语言标签相同的语法,或者是单个字符“*”。基本语言范围最初由 HTTP/1.1 [RFC2616] 和后来的 [RFC3066] 描述。它由以下 ABNF [RFC4234] 定义:

language-range   = (1*8ALPHA *("-" 1*8alphanum)) / "*"
alphanum         = ALPHA / DIGIT

这意味着这""实际上不是合法的语言标签。正如Jeen Broekstra 在 answers.semanticweb.com 上指出的那样,SPARQL 建议说:

17.2 滤波器评估

SPARQL 提供了由 XQuery 运算符映射定义的函数和运算符的子集。XQuery 1.0 第 2.2.3 节表达式处理描述了 XPath 函数的调用。以下规则适应 XQuery 和 SPARQL 之间数据和执行模型的差异:……</p>

  • 使用错误类型的参数调用的函数将产生类型错误。有效的布尔值参数(在下面的运算符映射表中标记为“xsd:boolean (EBV)”)使用第 17.2.2 节中的 EBV 规则强制转换为 xsd:boolean。

由于""不是合法的语言标签,它可能被认为是“错误类型的参数 [that] 会产生类型错误”。在这种情况下,调用会产生错误,并且该错误将在表达式langMatches中被视为 false 。filter即使由于这个原因它没有返回 false ,描述语言标签和范围如何比较的RFC 4647 §3.3.1 也没有准确说明比较中应该发生什么,因为它假设了合法的语言标签:

基本过滤将基本语言范围与语言标签进行比较。根据优先级依次考虑语言优先级列表中的每个基本语言范围。如果在不区分大小写的比较中,语言范围与特定语言标签完全匹配,或者如果它完全等于标签的前缀,则前缀后面的第一个字符是“-”。例如,语言范围“de-de”(德国使用的德语)匹配语言标签“de-DE-1996”(德国使用的德语,1996 的正字法),但不匹配语言标签“de- Deva”(以梵文书写的德语)或“de-Latn-DE”(德语,拉丁文,在德国使用)。

根据您的评论和我的本地实验,似乎langMatches(lang(?obj),"")对于没有语言标签的文字(真的,langMatches("",""))在 Virtuoso(因为它安装在 DBpedia 上)、Jena 的 ARQ(来自我的实验)和 Proégé(来自我们的实验)中返回 true ,并且它在 RDFlib 中返回 false(或被强制为 false 的错误)。

在任何一种情况下,由于lang定义为返回""不带语言标签的文字,因此您应该能够通过更改langMatches(lang(?obj),"")with可靠地将它们包含在结果中lang(?obj) = ""

您使用的数据存在问题

您不是在查询相同的数据。您从中下载的数据

来自DBpedia,但是当您运行查询时

您正在针对可能有不同数据的DBpedia Live运行它。如果您在 DBpedia Live 端点和 DBpedia 端点上运行此查询,您将获得不同数量的结果:

SELECT count(*) WHERE { 
  dbpedia:Johann_Sebastian_Bach ?pred ?obj
  FILTER( langMatches(lang(?obj), "")  || langMatches(lang(?obj), "EN" ) )
}

DBpedia 实时结果31
DBpedia 结果34

问题distinct

另一个可能的问题,虽然它似乎不是你遇到的问题,但你的第二个查询有一个distinct修饰符,但你的第一个没有。这意味着您的第二个查询很容易得到比第一个查询更少的结果。

如果您对DBpedia SPARQL 端点运行此查询,您应该得到 34 个结果,无论您是否使用distinct修饰符,结果都是一样的,如果您下载数据并针对它运行相同的查询,则应该得到这个数字。

select ?pred ?obj where { 
  dbpedia:Johann_Sebastian_Bach ?pred ?obj
  filter( langMatches(lang(?obj), "") || langMatches(lang(?obj), "EN") )
}

SPARQL 结果

于 2013-11-26T17:12:55.490 回答