我读了一些和我的问题有关的问题,比如 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中的代码中使用了相同的查询:
^{pr2}$这次,我只得到27个三分之一!https://dl.dropboxusercontent.com/u/22943656/result.txt
我想这可能和dbpedia网站有关。我把这些问题重复了好几次,结果总是一样的。因此,我下载了RDF文件在本地进行测试,并使用Protége软件模拟Virtuoso端点。尽管如此,我仍然有不同于提交给Protége和Python的sparql,31和27的结果。这种差异有什么解释吗?我怎样才能得到同样的结果呢?在
写下这个问题时,有几个可能的问题。根据这些评论,这里描述的第一个问题(关于
lang
,langMatches
,等等)似乎是您实际遇到的问题,但我将保留对其他可能问题的描述,以防其他人发现它们有用。在lang
,langMatches
,以及空字符串lang
被定义为返回""
,用于没有语言标记的文本。根据RFC 4647§2.1,语言标记定义如下:这意味着
""
实际上不是一个合法的语言标记。正如Jeen Broekstra pointed out on answers.semanticweb.com,SPARQL建议说:由于
""
不是合法的语言标记,它可能被认为是“错误类型的参数将产生类型错误”。在这种情况下,langMatches
调用将产生错误,并且在filter
表达式中将该错误视为false。即使由于这个原因它没有返回false,RFC 4647§3.3.1描述了语言标记和范围是如何比较的,但并没有确切地说明在比较中应该发生什么,因为它假设了合法的语言标记:根据您的评论和我的本地实验,对于没有语言标记的文本,
langMatches(lang(?obj),"")
似乎在Virtuoso(正如它安装在DBpedia上一样)、Jena的ARQ(来自我的实验)和Proégé(来自我们的实验),它在RDFlib中返回false(或一个被强制为false的错误)。在在这两种情况下,由于}来将它们可靠地包括在结果中。在
lang
被定义为返回""
而没有语言标记的文本,因此您应该能够通过使用lang(?obj) = ""
更改{您使用的数据有问题
你没有查询相同的数据。从中下载的数据
来自DBpedia,但是当您对
您正在针对dbpedialive运行它,它可能有不同的数据。如果在DBpedia Live端点和DBpedia端点上运行此查询,则会得到不同数量的结果:
DBpedia Live results31
DBpedia results34
与
distinct
有关的问题另一个可能的问题是,第二个查询有一个
distinct
修饰符,而第一个没有,这意味着第二个查询的结果可能比第一个少。在如果您对DBpedia SPARQL endpoint运行这个查询,您应该得到34个结果,无论您是否使用
^{pr2}$distinct
修饰符,这是您下载数据并对其运行相同查询时应该得到的数字。在SPARQL results
相关问题 更多 >
编程相关推荐