考虑以下GeoNames数据库的摘录:
@prefix gn: <http://www.geonames.org/ontology#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
<http://sws.geonames.org/690791/>
a gn:Feature ;
gn:featureClass gn:A ;
gn:featureCode gn:A.PCLI ;
gn:alternateName "Україна"@uk , "ܐܘܟܪܢܝܐ"@arc , "Ուկրաինա"@hy , "ウクライナ"@ja , "Úkraína"@is;
gn:name "Ukraine" ;
gn:officialName "Ucraína"@gl , "Ukraine"@fr , "U-crai-na (Ukraine)"@vi , "ཡུ་ཀརེན།"@bo.
因此,我尝试使用特定语言来获取名称,例如fr
,如果它不可用,则会回退到默认值。此外,此名称可以来自三个谓词中的任何一个:gn:alternateName
,gn:name
和gn:officialName
。
因此,例如,对于此示例,我希望恢复
----------------
| name |
================
| "Ukraine"@fr |
----------------
但是根据我目前的解决方案:
PREFIX gn: <http://www.geonames.org/ontology#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?name
WHERE {
values ?nameBearing { gn:name gn:alternateName gn:officialName}
values ?countryfc { gn:A.PCLI gn:A.PCLD gn:A.PCLIX }
?loc gn:featureCode ?countryfc;
OPTIONAL
{
?loc ?nameBearing ?nameFR
FILTER(langMatches(lang(?nameFR), "fr"))
}
OPTIONAL
{
?loc ?nameBearing ?nameOTHER
FILTER(langMatches(lang(?nameOTHER), ""))
}
BIND(COALESCE(?nameFR, ?nameOTHER) AS ?name)
}
我得到了
----------------
| name |
================
| "Ukraine" |
| |
| "Ukraine"@fr |
----------------
可能是因为在SPARQL中评估谓词的多个值的方式。
那么有什么方法可以按?loc
&#34;分组。并且只获得一种语言的值?
答案 0 :(得分:1)
您可以从这样的查询开始,查找名称值并将其分为法语名称和默认(即非法语)名称:
prefix gn: <http://www.geonames.org/ontology#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?s ?name ?frenchName ?defaultName where {
values ?name { gn:alternateName gn:name gn:officialName }
?s ?name ?name_
bind(if(langMatches(lang(?name_),"fr"),?name_,?undef) as ?frenchName)
bind(if(langMatches(lang(?name_),"fr"),?undef,?name_) as ?defaultName)
}
--------------------------------------------------------------------------------------------------
| s | name | frenchName | defaultName |
==================================================================================================
| <http://sws.geonames.org/690791/> | gn:alternateName | | "Úkraína"@is |
| <http://sws.geonames.org/690791/> | gn:alternateName | | "ウクライナ"@ja |
| <http://sws.geonames.org/690791/> | gn:alternateName | | "Ուկրաինա"@hy |
| <http://sws.geonames.org/690791/> | gn:alternateName | | "ܐܘܟܪܢܝܐ"@arc |
| <http://sws.geonames.org/690791/> | gn:alternateName | | "Україна"@uk |
| <http://sws.geonames.org/690791/> | gn:name | | "Ukraine" |
| <http://sws.geonames.org/690791/> | gn:officialName | | "ཡུ་ཀརེན།"@bo |
| <http://sws.geonames.org/690791/> | gn:officialName | | "U-crai-na (Ukraine)"@vi |
| <http://sws.geonames.org/690791/> | gn:officialName | "Ukraine"@fr | |
| <http://sws.geonames.org/690791/> | gn:officialName | | "Ucraína"@gl |
--------------------------------------------------------------------------------------------------
这是一个开始,但样品和合并似乎并没有像我们想要的那样发挥作用。例如,我们不能合并(样本(?frenchName),样本(?defaultName))来获得单个名称。
...