我使用sparql查找entity的位置。我有来自dbpedia-spootlight的urls,并希望找到它们的位置。所以我使用的查询是:
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX dbo: <http://dbpedia.org/ontology/>
SELECT DISTINCT *
WHERE { ?uri rdfs:label ?label .
OPTIONAL { ?uri geo:lat ?lat . ?uri geo:long ?long } .
OPTIONAL { ?uri dbpedia-owl:country ?dbpediaContry . ?dbpediaContry dbpprop:cctld ?ccTLD } .
FILTER (?uri = <URL> && lang(?label) = "en" ) } 在我得到这个url:http://dbpedia.org/resource/Valencia,_Spain之前,一切都很好。它有到http://dbpedia.org/resource/Valencia的wikiPageRedirects,没有其他数据。我迷路了,我怎么才能构建查询来检查带有重定向的案例。
有人能帮我吗?
发布于 2012-09-26 07:17:23
尝试更改查询的第一部分以使用UNION,例如
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT *
WHERE
{
{
?uri rdfs:label ?label .
}
UNION
{
[] dbo:wikiPageRedirects ?uri .
?uri rdfs:label ?label .
}
OPTIONAL
{
?uri geo:lat ?lat ;
geo:long ?long
}
OPTIONAL
{
?uri dbo:country ?dbpediaContry .
?dbpediaContry dbp:cctld ?ccTLD
}
FILTER (SAMETERM(?uri, <URL>) && lang(?label) = "en" )
} UNION允许您在应用查询的其余部分之前,通过重定向查找具有URI的事物和具有URI的事物。请注意,我还将您的FILTER更改为使用SAMETERM(),这将使查询速度更快。
一般来说,如果您有这样一种查询,您正在执行FILTER来设置一个常量,我强烈建议将所有?uri变量的使用替换为<URL>,这样可以获得更好的性能
发布于 2012-09-25 16:53:24
嗯,我找到了一个解决方案,但我不认为它是完美的。我添加了额外的列:
...
OPTIONAL { ?uri dbpedia-owl:wikiPageRedirects ?red } .
OPTIONAL { ?red geo:lat ?rlat . ?red geo:long ?rlong }
...但是现在我又有两列要检查了。
我尝试的另一种方式是:
...
OPTIONAL { ?uri dbpedia-owl:wikiPageRedirects ?red } .
{?uri geo:lat ?lat . ?uri geo:long ?long} UNION { ?red geo:lat ?lat . ?red geo:long ?long }
...但是如果实体没有geo:long & geo:lat,我就有答案了。
那么,有人知道更好的解决方案吗?
https://stackoverflow.com/questions/12578427
复制相似问题