聚合属性

时间:2017-07-04 14:14:24

标签: sparql jena dbpedia fuseki

我正在从一些DBpedia数据开发我自己的Fuseki端点。 我对如何聚合与单个资源相关的属性存有疑问。

SELECT ?name ?website ?abstract ?genre ?image
WHERE{
VALUES ?s {<http://dbpedia.org/resource/Attack_Attack!>}
  ?s  foaf:name ?name ;
      dbo:abstract ?abstract .
  OPTIONAL { ?s dbo:genre ?genre } .
  OPTIONAL { ?s dbp:website ?website } .
  OPTIONAL { ?s dbo:image ?image } .
  FILTER LANGMATCHES(LANG(?abstract ), "en")
}

SPARQL端点:http://dbpedia.org/sparql/

此查询返回2个匹配结果。它们与dbo:genre值不同。有一种方法可以查询知识库并使用genres列表检索单个结果吗?

2 个答案:

答案 0 :(得分:3)

@ chrisis的查询在DBpedia SPARQL端点上运行良好,该端点基于Virtuoso。

但是,如果您使用的是Jena Fuseki,则应使用更符合的语法:

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

SELECT
?name
(SAMPLE(?website) AS ?sample_website)
(SAMPLE(?abstract) AS ?sample_abstract)
(SAMPLE(?image) AS ?sample_image)
(GROUP_CONCAT(?genre; separator=', ') AS ?genres)
WHERE {
  VALUES (?s) {(<http://dbpedia.org/resource/Attack_Attack!>)}
  ?s  foaf:name ?name ;
      dbo:abstract ?abstract .
  OPTIONAL { ?s dbo:genre ?genre } .
  OPTIONAL { ?s dbp:website ?website } .
  OPTIONAL { ?s dbo:image ?image} .
  FILTER LANGMATCHES(LANG(?abstract ), "en")
} GROUP BY ?name

与@ chrisis的查询不同的是:

  • 由于GROUP_CONCAT是一个聚合函数,因此它只能与GROUP BY一起使用;
  • 由于使用了GROUP BY,因此应汇总所有非分组变量(例如,通过SAMPLE);
  • GROUP_CONCAT语法略有不同。

在Fuseki中,预测中的这些AS实际上是多余的:请参阅this question和评论。

答案 1 :(得分:2)

是的,GROUP_CONCAT()函数就是你想要的。

SELECT ?name ?website ?abstract (GROUP_CONCAT(?genre,',') AS ?genres) ?image
WHERE{
  <http://dbpedia.org/resource/Attack_Attack!> a dbo:Band ;
       foaf:name ?name;
      dbo:abstract ?abstract .
  OPTIONAL{   <http://dbpedia.org/resource/Attack_Attack!> dbo:genre ?genre } .
  OPTIONAL{   <http://dbpedia.org/resource/Attack_Attack!> dbp:website ?website} .
  OPTIONAL{   <http://dbpedia.org/resource/Attack_Attack!> dbo:image ?image} .
FILTER LANGMATCHES(LANG(?abstract ), "en")

}