我正在使用sparql来查找实体的位置。我有来自dbpedia-spootlight的网址,并希望为他们找到位置。所以我使用的查询是:
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" ) }
在我得到这个网址之前一切正常:http://dbpedia.org/resource/Valencia,_Spain。 它有wikiPageRedirects到http://dbpedia.org/resource/Valencia,没有其他数据。 我迷路了如何构建查询来检查重定向的情况。
有人能帮助我吗?
答案 0 :(得分:2)
尝试更改查询的第一部分以使用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
来设置常量,我强烈建议用{{1}替换?uri
变量的所有用法而不应该看到更好的性能
答案 1 :(得分:0)
...
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&amp;地理:LAT
那么,有谁知道更好的解决方案?