Sparql上的相同查询给出了不同的结果

时间:2013-11-26 14:00:42

标签: python sparql rdflib

我读了一些与我的问题有关的问题,比如 Same sparql not returning same results,但我认为有点不同。

考虑我提交到http://live.dbpedia.org/sparql(Virtuoso端点)的这个查询,结果得到34个三元组。结果Sparql

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

然后,我在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)

这一次,我只获得了27个三元组! https://dl.dropboxusercontent.com/u/22943656/result.txt

我认为它可能与dbpedia网站有关。我多次重复这些查询,总是得到相同的区别。因此,我下载了RDF文件以在本地测试它,并使用Protége软件来模拟Virtuoso端点。尽管如此,我仍然对提交到Protége和Python,31和27的sparql有不同的结果。对于这种差异有什么解释吗?我怎样才能在两者中获得相同的结果?

1 个答案:

答案 0 :(得分:3)

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

langlangMatches和空字符串

lang定义为返回""没有语言标记的文字。根据{{​​3}}§2.1,语言标签定义如下:

  

2.1。基本语言范围

     

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

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

这意味着""实际上不是合法语言标记。作为RFC 4647,SPARQL建议说:

  

Jeen Broekstra pointed out on answers.semanticweb.com

     

SPARQL提供了由其定义的函数和运算符的子集   XQuery运算符映射。 XQuery 1.0第2.2.3节表达式   Processing描述了XPath函数的调用。下列   规则适应数据和执行模型的差异   在XQuery和SPARQL之间:...

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

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

  

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

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

在任何一种情况下,由于lang被定义为在没有语言标记的情况下为文字返回"",因此您应该能够通过更改langMatches(lang(?obj),"")来可靠地将它们包含在结果中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" ) )
}

http://live.dbpedia.org/sparql 31
DBpedia Live results 34

distinct

的问题

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

如果针对DBpedia results运行此查询,则应获得34个结果,无论您是否使用distinct修饰符,都是相同的,如果您下载了该结果,则应该获得该数字数据并对其运行相同的查询。

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

DBpedia SPARQL endpoint