对dbpedia上的机构的所有人进行SPARQL查询

时间:2014-04-14 18:26:32

标签: sparql wikipedia dbpedia

我正在尝试使用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
  }

但这速度要慢得多,可能是因为在人员空间进行搜索太费力了。这确实有效,但它会在应用程序中返回一组不同的结果 - 即所有拥有上市母校的人,而不是大学列为校友的所有人。我更喜欢一种让我成为校友的语法。

我如何用这句话来回复所有为大学列出的校友?

3 个答案:

答案 0 :(得分:3)

DBpedia的SPARQL端点的性能有时可能有点不可靠。毕竟,它是公共服务,并不适合进行大量查询。尽管如此,我认为你可以毫不费力地获得你在这里寻找的东西。首先,您可以在public SPARQL endpoint

中查看此类查询的结果数量
select (count(*) as ?nResults) where {
 ?person dbpedia-owl:almaMater ?almaMater
}

SPARQL results (64928)

现在,如果你只想要一个大清单,你可以这样得到它。 order by有助于整理结果以方便消费,但技术上并非必要:

select ?almaMater ?person where {
 ?person dbpedia-owl:almaMater ?almaMater
}
order by ?almaMater ?person

SPARQL results

如果您需要对?almaMater设置一些额外的限制,例如,为了确保它是一所大学,那么您可以将它们添加到查询中。例如:

select ?almaMater ?person where {
 ?person dbpedia-owl:almaMater ?almaMater .
 ?almaMater a dbpedia-owl:University .
}
order by ?almaMater ?person

SPARQL results

答案 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/)。