Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Sparql上的同一查询给出不同的结果_Python_Sparql_Rdflib - Fatal编程技术网

Python Sparql上的同一查询给出不同的结果

Python Sparql上的同一查询给出不同的结果,python,sparql,rdflib,Python,Sparql,Rdflib,我读了一些与我的问题相关的问题,比如 ,但我觉得有点不同 考虑我提交到(Virtuoso端点)的这个查询,结果得到34个三元组。结果 SELECT?pred?obj 何处{ ?pred?obj 过滤器((langMatches(lang(?obj),“”)|| (langMatches(lang(?obj),“EN”)) ) } 然后,我在python代码中使用了相同的查询: import rdflib import rdfextras rdfextras.registerplugins()

我读了一些与我的问题相关的问题,比如 ,但我觉得有点不同

考虑我提交到(Virtuoso端点)的这个查询,结果得到34个三元组。结果

SELECT?pred?obj
何处{
?pred?obj
过滤器((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)
导入rdflib
导入rdfextras
rdfextras.registerplugins()
g=rdflib.Graph()
g、 解析(“http://dbpedia.org/resource/Johann_Sebastian_Bach")
前缀=”“”
前缀dbp:
"""
query=”“”
选择?pred?obj
哪里{dbp:Johann_Sebastian_Bach?pred?obj
过滤器((langMatches(lang(?obj),“”)||
(langMatches(lang(?obj),“EN”)}
"""
查询=前缀+查询
结果集=g.query(查询)
打印透镜(结果集)
这一次,我只得到27个三倍


我想它可能与dbpedia网站有关。我重复了几次这些问题,总是得到相同的结果。因此,我下载了RDF文件在本地进行测试,并使用软件Protége模拟Virtuoso端点。尽管如此,我仍然有与提交到Protége和Python中的sparql不同的结果,31和27。这种差异有什么解释吗?我怎样才能在这两方面得到相同的结果呢?

在写问题时,有几个可能的问题。根据评论,这里描述的第一个问题(关于
lang
langMatches
,等等)似乎就是您实际遇到的问题,但我将留下其他可能问题的描述,以防其他人发现它们有用

lang
langMatches
,以及空字符串
lang
被定义为对没有语言标记的文本返回
。根据§2.1,语言标签定义如下:

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

language-range   = (1*8ALPHA *("-" 1*8alphanum)) / "*"
alphanum         = ALPHA / DIGIT
这意味着
实际上不是一个合法的语言标记。正如SPARQL建议所述:

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

  • 使用 错误类型的参数将产生类型错误。有效的 运算符中的布尔值参数(标记为“xsd:boolean(EBV)” 映射表),使用EBV规则强制为xsd:boolean 在第17.2.2节中
由于
不是合法的语言标记,因此可能会将其视为“类型错误的参数,该参数将产生类型错误”。在这种情况下,
langMatches
调用将产生错误,并且该错误将在
筛选器
表达式中被视为false。即使由于这个原因它没有返回false,§3.3.1描述了如何比较语言标记和范围,也没有确切说明比较中应该发生什么,因为它假设合法的语言标记:

基本筛选将基本语言范围与语言标记进行比较。每个 语言优先级列表中的基本语言范围在 按优先顺序转动。语言范围与特定语言相匹配 如果在不区分大小写的比较中,它完全等于 标记,或,如果它正好等于标记的前缀,则 前缀后面的第一个字符是“-”。例如 语言范围“de de”(德语在德语中使用)与 语言标签“de-de-1996”(德语,在德国使用,正字法) 1996),但不是语言标签“de Deva”(德语写在 德瓦纳加里文字)或“德拉坦德”(德语、拉丁语文字,如 德国)

根据您的评论和我的本地实验,对于没有语言标记的文本(实际上,
langMatches(“,”)
)来说,
langMatches(“,”)
)在Virtuoso(安装在DBpedia上)、Jena的ARQ(来自我的实验)和Proégé(来自我们的实验)中似乎都返回了true,并且返回了false(或强制为false的错误)在RDFlib中

在任何一种情况下,由于
lang
被定义为返回
,对于没有语言标记的文本,您应该能够通过使用
lang(?obj)==“code>更改
langMatches(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" ) )
}
31
三十四

不同的问题
另一个可能的问题,尽管看起来不是您遇到的问题,是您的第二个查询有一个
distinct
修饰符,但您的第一个查询没有。这意味着您的第二个查询的结果可能比第一个查询的结果要少

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

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