SPARQL查询从INDIA获取AIRLINE名称?

时间:2017-04-30 22:16:59

标签: sparql dbpedia

我正试图获得印度所有航空公司的name。我的查询如下,但它应该返回没有结果。我做错了什么?

PREFIX dct: <http://purl.org/dc/terms/>
PREFIX prop: <http://dbpedia.org/property/>

SELECT ?airline ?country WHERE {

<http://dbpedia.org/resource/Airline> foaf:name  ?airline .
<http://dbpedia.org/resource/India> foaf:name ?country

}

1 个答案:

答案 0 :(得分:1)

“你应该”是什么意思?你是如何得出这个假设的?您是否看过航空公司DBpedia page提供的所有现有事实?这只是一个特定的资源,而不是一个类。

你查询做了什么: *他的第一个三重模式返回“资源航空公司的所有名称” *第二个三重模式返回“资源的所有名称印度” *由于两个三重模式都通过变量未连接,它将返回两个结果集的叉积

如果您想拥有特定类型r_i的所有资源:C,这意味着三元组看起来像:r rdf:type :C,则必须使用相应的三元模式:

?s rdf:type :C

在您的情况下,Dbpedia for Airlines中有一个类,但其URI为http://dbpedia.org/ontology/Airline,因此,三重模式将是

?s rdf:type <http://dbpedia.org/ontology/Airline> .以及获取“所有航空公司”的查询将是

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

SELECT ?airline WHERE {
 ?s a dbo:Airline .
}

下一步是在DBpedia中找到一个与航空公司相关的属性。这并不是那么简单,但您可以通过执行

从可能的属性列表开始
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT distinct ?p WHERE {
 ?s a dbo:Airline .
 ?s ?p ?o .
}
ORDER BY ?p

您还可以检查以某种方式与印度航空公司相关的所有物业:

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

SELECT ?p (count(distinct ?s) as ?cnt) WHERE {
 ?s a dbo:Airline .
 ?s ?p dbr:India .
}
order by desc(?cnt)

返回

+-------------------------------------------+-----+
|                     p                     | cnt |
+-------------------------------------------+-----+
| http://dbpedia.org/ontology/headquarter   |  27 |
| http://dbpedia.org/property/headquarters  |  16 |
| http://dbpedia.org/ontology/destination   |   1 |
| http://dbpedia.org/property/destinations  |   1 |
| http://dbpedia.org/ontology/targetAirport |   1 |
| http://dbpedia.org/property/bases         |   1 |
+-------------------------------------------+-----+

总的来说,财产dbo:headquarter似乎是一个“好”的候选人:

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

SELECT ?s WHERE {
 ?s a dbo:Airline .
 ?s dbo:headquarter dbr:India .
}

但遗憾的是,并非DBpedia中的所有资源都拥有所有信息,因为它仅从维基百科中提取:

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

SELECT ?p (count(DISTINCT ?s) as ?cnt) WHERE {
 ?s a dbo:Airline .
 ?s ?p ?o .
}
group by ?p
order by ?p

这意味着,我们的查询结果可能不完整,如果您知道应该在结果集中的其他航空公司,那么您必须分析资源的数据以发现进一步的关系,可能通过一些中间跃点...

另一种方法是经常使用维基百科类别,尽管这些数据可能包含不需要的实体:

PREFIX dbc: <http://dbpedia.org/resource/Category:>

SELECT ?s WHERE {    
 ?s dct:subject dbc:Airlines_of_India     
}