SPARQL-无法按国家/地区筛选

SPARQL-无法按国家/地区筛选,sparql,rdf,dbpedia,Sparql,Rdf,Dbpedia,我知道这是一个很容易回答的问题,但我在谷歌上搜索了几个小时却没有成功。为什么输入的以下SPARQL不返回任何内容 prefix dbo: <http://dbpedia.org/ontology/> SELECT ?country ?city ?city_name ?country_name WHERE { ?city rdf:type dbo:City . ?city foaf:name ?city_name . ?city dbo:country ?country . FILT

我知道这是一个很容易回答的问题,但我在谷歌上搜索了几个小时却没有成功。为什么输入的以下SPARQL不返回任何内容

prefix dbo: <http://dbpedia.org/ontology/>

SELECT ?country ?city ?city_name ?country_name
WHERE {
?city rdf:type dbo:City .
?city foaf:name ?city_name .
?city dbo:country ?country .
FILTER(?country=dbpedia:Canada).
?country foaf:name ?country_name .
}
LIMIT 200
前缀dbo:
选择?国家?城市?城市名称?国家名称
在哪里{
?城市rdf:类型dbo:城市。
城市名称?城市名称。
城市dbo:国家?国家。
过滤器(?country=dbpedia:Canada)。
?国家foaf:名称?国家名称。
}
限制200
我也尝试过——结果相同(即没有)

前缀dbo:
选择?国家?城市?城市名称
在哪里{
?城市rdf:类型dbo:城市。
城市名称?城市名称。
城市dbo:国家?国家。
?国家foaf:名称?国家名称。
过滤器(langMatches(lang(?country\u name),“EN”)和&country\u name=“加拿大”)
}
限制200

通过进一步挖掘找到了答案

为了得到第一个查询,我使用了错误的前缀。我需要使用
而不是本体论。这是在snorql中预定义的,但它实际上没有前缀。但通过一些摆弄,下面的方法奏效了

prefix dbo: <http://dbpedia.org/ontology/>

SELECT ?country ?city ?city_name ?country_name
WHERE {
?city rdf:type dbo:City .
?city foaf:name ?city_name .
?city dbo:country ?country .
FILTER(?country=:Canada).
?country foaf:name ?country_name .    
}
LIMIT 200

不需要为相等设置过滤器

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 

SELECT ?country ?city ?city_name
WHERE {
    ?city rdf:type dbo:City ;
          foaf:name ?city_name ;
          dbo:country ?country .

    ?country foaf:name "Canada"@en .

    FILTER(langMatches(lang(?city_name), "en"))
}
ORDER BY ?city_name
LIMIT 100
前缀dbo:
前缀foaf:
前缀rdf:
选择?国家?城市?城市名称
在哪里{
?城市rdf:类型dbo:城市;
foaf:名称?城市名称;
国家?国家。
?国家foaf:名称“加拿大”@en。
过滤器(langMatches(lang(?城市名称),“en”))
}
按城市名称订购
限制100

测试:

如果您已经将标签设置为特定值,则在第二次查询中不需要对语言进行筛选,您可以使用
str
函数对文本进行匹配,而无需使用语言标记:
filter(str(?country_name)=“Canada”)
-显然,这要慢得多,因为它必须处理所有国家的名称,而不是使用数据库索引
prefix dbo: <http://dbpedia.org/ontology/>

SELECT ?country ?city ?city_name
WHERE {
?city rdf:type dbo:City .
?city foaf:name ?city_name .
?city dbo:country ?country .
?country foaf:name ?country_name .
FILTER(langMatches(lang(?country_name),"EN") && ?country_name="Canada"@en)
}
LIMIT 200
PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 

SELECT ?country ?city ?city_name
WHERE {
    ?city rdf:type dbo:City ;
          foaf:name ?city_name ;
          dbo:country ?country .

    ?country foaf:name "Canada"@en .

    FILTER(langMatches(lang(?city_name), "en"))
}
ORDER BY ?city_name
LIMIT 100