我正在尝试使用SPARQL为大学提取校友名单。
我已经确定了我需要的本体:
我尝试了此查询,you can examine here:
SELECT * WHERE {
?University dbpedia2:alumni ?Person .
}
这似乎是有意义的,除了这会返回计数而不是人,正如本体所说的属性包含。
我发现某处this query似乎在寻找大学方面做得更好,但速度很慢。
SELECT * WHERE {
{ <http://dbpedia.org/ontology/University> ?property ?hasValue }
UNION
{ ?isValueOf ?property <http://dbpedia.org/ontology/University> }
}
我也尝试过另一种方式,从所有人开始,寻找他们的almae matres,in this form:
SELECT * WHERE {
?person dbpedia2:almaMater ?University
}
但这速度要慢得多,可能是因为在人员空间进行搜索太费力了。这确实有效,但它会在应用程序中返回一组不同的结果 - 即所有拥有上市母校的人,而不是大学列为校友的所有人。我更喜欢一种让我成为校友的语法。
我如何用这句话来回复所有为大学列出的校友?
答案 0 :(得分:3)
DBpedia的SPARQL端点的性能有时可能有点不可靠。毕竟,它是公共服务,并不适合进行大量查询。尽管如此,我认为你可以毫不费力地获得你在这里寻找的东西。首先,您可以在public SPARQL endpoint:
中查看此类查询的结果数量select (count(*) as ?nResults) where {
?person dbpedia-owl:almaMater ?almaMater
}
现在,如果你只想要一个大清单,你可以这样得到它。 order by
有助于整理结果以方便消费,但技术上并非必要:
select ?almaMater ?person where {
?person dbpedia-owl:almaMater ?almaMater
}
order by ?almaMater ?person
如果您需要对?almaMater
设置一些额外的限制,例如,为了确保它是一所大学,那么您可以将它们添加到查询中。例如:
select ?almaMater ?person where {
?person dbpedia-owl:almaMater ?almaMater .
?almaMater a dbpedia-owl:University .
}
order by ?almaMater ?person
答案 1 :(得分:2)
您的第一个查询:
SELECT * WHERE {
?University dbpedia2:alumni ?Person .
}
不只是返回计数;它将返回计数和个人校友。显然,dbpedia的数据质量很差,并且有许多三元组滥用dbpedia2:alumni
关系。
您可以通过添加第二个条件来过滤掉计数,这个条件要求满足Person
的实体成为相应类的成员:
SELECT * WHERE {
?university dbpedia2:alumni ?person .
?person rdf:type <http://dbpedia.org/ontology/Person>
}
你看到的是,很少有人被标记为校友;遗憾的是,这些数据非常少。
答案 2 :(得分:2)
在您的上一次查询中,您几乎就在那里。但是,您目前要求任何资源可以取代?University
变量。由于您只希望大学占据该位置,您可以使用另一个三元组来进一步限制该变量:
SELECT * WHERE {
?University a dbpedia-owl:University.
?person dbpedia2:almaMater ?University.
}
这意味着?University
只能是班级dbpedia-owl:University
的个人(其中dbpedia-owl
映射到http://dbpedia.org/ontology/
)。