在Sparql中省略变量会更改结果

时间:2018-12-27 22:09:20

标签: sparql

我正在从Sparql endpoint的欧洲联盟理事会投票的公开记录中查询一些数据。

当前,我想获取记录的投票的会议和行动编号,可以通过以下查询实现:

PREFIX codi: <http://data.consilium.europa.eu/def/codi/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX ecv: <http://data.consilium.europa.eu/data/public_voting/rdf/schema/>
PREFIX qb: <http://data.consilium.europa.eu/data/public_voting/qb/dimensionproperty/>

SELECT ?recordedVote ?sessionNumber ?act ?actNumber 
WHERE {
   ?recordedVote a <http://purl.org/linked-data/cube#Observation>.
   ?recordedVote qb:sessionnrnumber ?session.
   ?session skos:prefLabel ?sessionNumber.
   ?recordedVote qb:act ?act.
   ?act skos:prefLabel ?actNumber 

}
LIMIT 10

请注意,LIMIT 10仅在测试查询期间加快执行速度。结果如下: enter image description here

但是,我必须在选择列表中包括?act,否则结果是错误的:

enter image description here

那是为什么?

1 个答案:

答案 0 :(得分:4)

结果并非“错误”,它们都是正确答案:它们为您提供了所有与查询匹配的结果的10个解决方案的子集。

在结果中获得不同解决方案的原因是,当您将?act留在SELECT子句中时,SPARQL端点优化查询执行的方式有所不同。它可能会切换到不同的内部索引,并以不同的顺序返回解决方案。如果您不考虑限制,您会发现两个结果都是相同的,只是顺序不同。

您可以通过使用ORDER BY子句强制查询的特定顺序来解决此问题。例如:

PREFIX codi: <http://data.consilium.europa.eu/def/codi/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX ecv: <http://data.consilium.europa.eu/data/public_voting/rdf/schema/>
PREFIX qb: <http://data.consilium.europa.eu/data/public_voting/qb/dimensionproperty/>

SELECT ?recordedVote ?sessionNumber ?act ?actNumber 
WHERE {
   ?recordedVote a <http://purl.org/linked-data/cube#Observation>.
   ?recordedVote qb:sessionnrnumber ?session.
   ?session skos:prefLabel ?sessionNumber.
   ?recordedVote qb:act ?act.
   ?act skos:prefLabel ?actNumber 

}
ORDER BY ?act
LIMIT 10

PREFIX codi: <http://data.consilium.europa.eu/def/codi/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX ecv: <http://data.consilium.europa.eu/data/public_voting/rdf/schema/>
PREFIX qb: <http://data.consilium.europa.eu/data/public_voting/qb/dimensionproperty/>

SELECT ?recordedVote ?sessionNumber ?actNumber 
WHERE {
   ?recordedVote a <http://purl.org/linked-data/cube#Observation>.
   ?recordedVote qb:sessionnrnumber ?session.
   ?session skos:prefLabel ?sessionNumber.
   ?recordedVote qb:act ?act.
   ?act skos:prefLabel ?actNumber 
} 
ORDER BY ?act
LIMIT 10

将返回相同的结果(当然要减去一列)。