Python Sparql上的同一查询给出不同的结果
我读了一些与我的问题相关的问题,比如 ,但我觉得有点不同 考虑我提交到(Virtuoso端点)的这个查询,结果得到34个三元组。结果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()
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") )
}