我读了一些与我的问题有关的问题,比如 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有不同的结果。对于这种差异有什么解释吗?我怎样才能在两者中获得相同的结果?
答案 0 :(得分:3)
正如问题所写,有一些可能的问题。根据评论,此处描述的第一个(约lang
,langMatches
等)似乎是您实际遇到的,但我会离开其他可能问题的描述,以防其他人发现它们有用。
lang
,langMatches
和空字符串 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") )
}