使用http://www.sparql.org/sparql.html运行此查询
prefix oxprop: <http://ophileon.com/ox/property#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix wgs84_pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>
prefix gn: <http://www.geonames.org/ontology#>
select *
from <http://www.ophileon.com/ox/poi.rdf>
where
{
?poi rdfs:label ?poiname.
?poi owl:sameAs ?geonameuri.
SERVICE <http://factforge.net/sparql>{
?geonameuri gn:population ?population.
}
FILTER(langMatches(lang(?poiname), "EN")).
}
返回
-------------------------------------------------------------------------------------------------------
| poi | poiname | geonameuri | population |
=======================================================================================================
| <http://ophileon.com/ox/poi/2> | "Wageningen"@en | <http://sws.geonames.org/2745088/> | "35433" |
| <http://ophileon.com/ox/poi/3> | "Netherlands"@en | <http://sws.geonames.org/2750405/> | "16645000" |
| <http://ophileon.com/ox/poi/1> | "Amsterdam"@en | <http://sws.geonames.org/2759794/> | "767457" |
| <http://ophileon.com/ox/poi/1> | "Amsterdam"@en | <http://sws.geonames.org/2759794/> | "741636" |
-------------------------------------------------------------------------------------------------------
即。具有多个人口价值。显然,来自不同图表的factforge正在查询。有没有办法将factforge限制或优先级为例如地理名称图?顺便说一下,geonames不提供开放的SPARQL端点,这就是我使用Factforge的原因。
答案 0 :(得分:1)
让我们从稍微改变您的查询开始吧。我们强制?poiname
为"Amsterdam"@en
,这样我们才能得到有问题的结果:
prefix oxprop: <http://ophileon.com/ox/property#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix wgs84_pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>
prefix gn: <http://www.geonames.org/ontology#>
select *
from <http://www.ophileon.com/ox/poi.rdf>
where
{
values ?poiname { "Amsterdam"@en }
?poi rdfs:label ?poiname.
?poi owl:sameAs ?geonameuri.
SERVICE <http://factforge.net/sparql> {
?geonameuri gn:population ?population.
}
FILTER(langMatches(lang(?poiname), "EN")).
}
现在,我们可以将service
块内的查询包装在graph ?g { ... }
内,以找出这些三元组的来源。也就是说,我们现在有:
SERVICE <http://factforge.net/sparql> {
graph ?g { ?geonameuri gn:population ?population. }
}
----------------------------------------------------------------------------------------------------------------------------
| poiname | poi | geonameuri | population | g |
============================================================================================================================
| "Amsterdam"@en | <http://ophileon.com/ox/poi/1> | <http://sws.geonames.org/2759794/> | "741636" | <http://nytimes.com> |
----------------------------------------------------------------------------------------------------------------------------
现在只有一个结果;似乎另一个结果是在默认图表中。
您可以通过这种方式使用graph
关键字指定要查询的图表。详细信息在SPARQL 1.1建议书的13.3 Querying the Dataset中描述。
通过在查询中使用graph ?g { }
,您将强制数据位于命名图中(即,您将不再从默认图中获取三元组)。不幸的是,这似乎删除了你想要的一些结果。例如,将此应用于您的原始查询(不限于阿姆斯特丹):
prefix oxprop: <http://ophileon.com/ox/property#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix wgs84_pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>
prefix gn: <http://www.geonames.org/ontology#>
select *
from <http://www.ophileon.com/ox/poi.rdf>
where
{
?poi rdfs:label ?poiname.
?poi owl:sameAs ?geonameuri.
SERVICE <http://factforge.net/sparql>{
graph ?g { ?geonameuri gn:population ?population. }
}
FILTER(langMatches(lang(?poiname), "EN")).
}
------------------------------------------------------------------------------------------------------------------------------
| poi | poiname | geonameuri | population | g |
==============================================================================================================================
| <http://ophileon.com/ox/poi/3> | "Netherlands"@en | <http://sws.geonames.org/2750405/> | "16645000" | <http://nytimes.com> |
| <http://ophileon.com/ox/poi/1> | "Amsterdam"@en | <http://sws.geonames.org/2759794/> | "741636" | <http://nytimes.com> |
------------------------------------------------------------------------------------------------------------------------------
只给出了两个结果;你不再拥有瓦赫宁根的结果。您可以使用
尝试使用和不使用图表来查询结果{ graph ?g { ?geonameuri gn:population ?population. } }
union
{ ?geonameuri gn:population ?population. }
------------------------------------------------------------------------------------------------------------------------------
| poi | poiname | geonameuri | population | g |
==============================================================================================================================
| <http://ophileon.com/ox/poi/2> | "Wageningen"@en | <http://sws.geonames.org/2745088/> | "35433" | |
| <http://ophileon.com/ox/poi/3> | "Netherlands"@en | <http://sws.geonames.org/2750405/> | "16645000" | <http://nytimes.com> |
| <http://ophileon.com/ox/poi/3> | "Netherlands"@en | <http://sws.geonames.org/2750405/> | "16645000" | |
| <http://ophileon.com/ox/poi/1> | "Amsterdam"@en | <http://sws.geonames.org/2759794/> | "741636" | <http://nytimes.com> |
| <http://ophileon.com/ox/poi/1> | "Amsterdam"@en | <http://sws.geonames.org/2759794/> | "767457" | |
| <http://ophileon.com/ox/poi/1> | "Amsterdam"@en | <http://sws.geonames.org/2759794/> | "741636" | |
------------------------------------------------------------------------------------------------------------------------------
现在我们更清楚地看到数据了。我们不能肯定地说,但看起来nytimes数据在默认图中是重复的,这在荷兰的情况下是好的,否则可能没有值,但在阿姆斯特丹的情况下是坏的,其中默认图已经有一个值,它与命名图中的值不同。
然后,直接回答是是您可以控制查询哪些图表,但在这种情况下,您根本不清楚您想要使用哪些数据。您可能最好通过对每个位置预期相同的值进行分组,然后以某种方式组合总体结果(例如,取最大值,或最小值,或连接它们或其他东西。例如,(请注意,我们为xsd:
添加了xsd:integer
前缀,并且?population
值是字符串,因此需要转换为xsd:integer
才能获得平均值:
prefix oxprop: <http://ophileon.com/ox/property#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix wgs84_pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>
prefix gn: <http://www.geonames.org/ontology#>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>
select
?poi
?poiname
?geonameuri
(min(?population) as ?minPopulation)
(max(?population) as ?maxPopulation)
(group_concat(?population;separator=' ') as ?allPopulations)
(avg(xsd:integer(?population)) as ?avgPopulation)
(sample(?population) as ?somePopulation)
from <http://www.ophileon.com/ox/poi.rdf>
where
{
?poi rdfs:label ?poiname.
?poi owl:sameAs ?geonameuri.
SERVICE <http://factforge.net/sparql> {
?geonameuri gn:population ?population.
}
FILTER(langMatches(lang(?poiname), "EN")).
}
group by ?poi ?poiname ?geonameuri
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| poi | poiname | geonameuri | minPopulation | maxPopulation | allPopulations | avgPopulation | somePopulation |
=============================================================================================================================================================================
| <http://ophileon.com/ox/poi/2> | "Wageningen"@en | <http://sws.geonames.org/2745088/> | "35433" | "35433" | "35433" | 35433.0 | "35433" |
| <http://ophileon.com/ox/poi/3> | "Netherlands"@en | <http://sws.geonames.org/2750405/> | "16645000" | "16645000" | "16645000" | 16645000.0 | "16645000" |
| <http://ophileon.com/ox/poi/1> | "Amsterdam"@en | <http://sws.geonames.org/2759794/> | "741636" | "767457" | "767457 741636" | 754546.5 | "767457" |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------