我正在使用pellet进行一个sparql查询,根据查询中三元组的顺序,我得到了不同的结果,对吗?
例如,给定以下N-Triples数据输入:
<http://example.com/thing1> <http://example.com/hasDefinition> <http://example.com/def_thing1> .
<http://example.com/thing1> <http://www.w3.org/2000/01/rdf-schema#label> "Thing 1" .
<http://example.com/def_thing1> <http://www.w3.org/2000/01/rdf-schema#comment> "thing 1 it's awesome".
<http://example.com/thing2> <http://example.com/hasDefinition> <http://example.com/def_thing2> .
<http://example.com/thing2> <http://www.w3.org/2000/01/rdf-schema#label> "Thing 2" .
<http://example.com/def_thing2> <http://www.w3.org/2000/01/rdf-schema#comment> "thing 1 it's cool".
<http://example.com/thing3> <http://example.com/hasDefinition> <http://example.com/def_thing3> .
<http://example.com/thing3> <http://www.w3.org/2000/01/rdf-schema#label> "Thing 3" .
<http://example.com/def_thing3> <http://www.w3.org/2000/01/rdf-schema#comment> "thing 3 it's fine".
<http://example.com/thing4> <http://example.com/hasDefinition> <http://example.com/def_thing4> .
<http://example.com/thing4> <http://www.w3.org/2000/01/rdf-schema#label> "Thing 4" .
<http://example.com/def_thing4> <http://www.w3.org/2000/01/rdf-schema#comment> "thing 4 it's exactly what i need".
以下查询:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX example: <http://example.com/>
SELECT * WHERE {
?thing ?rel "Thing 4".
?thing example:hasDefinition ?def.
?def rdfs:comment ?definition.
}
退货:
Query Results (1 answers):
thing | rel | def | definition
================================================================
thing4 | label | def_thing4 | "thing 4 it's exactly what i need"
但以下查询(只是对前一个查询的更改):
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX example: <http://example.com/>
SELECT * WHERE {
?thing example:hasDefinition ?def.
?def rdfs:comment ?definition.
?thing ?rel "Thing 4".
}
我得到以下答案:
Query Results (5 answers):
thing | def | definition | rel
==============================================================================
thing4 | def_thing4 | "thing 4 it's exactly what i need" | _TOP_DATA_PROPERTY_
thing4 | def_thing4 | "thing 4 it's exactly what i need" | label
thing1 | def_thing1 | "thing 1 it's awesome" | _TOP_DATA_PROPERTY_
thing2 | def_thing2 | "thing 1 it's cool" | _TOP_DATA_PROPERTY_
thing3 | def_thing3 | "thing 3 it's fine" | _TOP_DATA_PROPERTY_
我没想到会有这种行为,我不知道这是否正确,我是那个提出错误质疑的人。有人能向我解释一下吗?
这两个查询肯定会得到相同的结果,像这样更改三重模式的顺序应该没有什么区别。这可能是查询引擎中的一个错误。
Jan建议,在给定数据和查询的情况下,纯SPARQL引擎不应该给出不同的结果。
然而,您使用的是Pellet(尽管您没有说明是哪个版本),它有一个带有嵌入式推理器的SPARQL引擎。这意味着,如果SPARQL引擎可以通过推理器导出额外的结果,那么它可以合法地返回这些结果(请参阅规范中的扩展SPARQL基本图模式匹配)。
事实上,一个版本的查询导致推理器启动,而另一个版本则没有,这有点奇怪,你可能应该询问Pellet开发人员。
三重模式的顺序不应该改变结果。
查询的异常之处在于在属性位置中使用了?rel
。
_TOP_DATA_PROPERTY_
可能是Pellet引擎内部会抑制的东西,但如果?thing ?rel "Thing 4".
是最后一个模式,数据就不会再次通过Pellet,只是来自数据库。