在 Sparql 中省略变量会改变结果
Omitting variables in Sparql changes results
我正在查询欧盟理事会 public 投票记录的 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
仅用于在测试查询期间加快执行速度。以下是结果:
但是,我必须在select列表中包含?act
,否则结果是错误的:
这是为什么?
结果不是 "wrong",它们都是正确答案:它们为您提供了与查询匹配的所有结果的 10 个解决方案的子集。
您在结果中得到不同解决方案的原因是,当您将 ?act
排除在 SELECT
子句之外时,SPARQL 端点会以不同方式优化查询执行。它可能会切换到不同的内部索引,并且 returns 解决方案的顺序不同。如果您不考虑限制,您会发现这两个结果是相同的,只是顺序不同。
您可以通过使用 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
将 return 得到相同的结果(当然减去一列)。
我正在查询欧盟理事会 public 投票记录的 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
仅用于在测试查询期间加快执行速度。以下是结果:
但是,我必须在select列表中包含?act
,否则结果是错误的:
这是为什么?
结果不是 "wrong",它们都是正确答案:它们为您提供了与查询匹配的所有结果的 10 个解决方案的子集。
您在结果中得到不同解决方案的原因是,当您将 ?act
排除在 SELECT
子句之外时,SPARQL 端点会以不同方式优化查询执行。它可能会切换到不同的内部索引,并且 returns 解决方案的顺序不同。如果您不考虑限制,您会发现这两个结果是相同的,只是顺序不同。
您可以通过使用 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
将 return 得到相同的结果(当然减去一列)。