聚合属性

Aggregate properties

我正在根据一些 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/

本次查询returns2条匹配结果。它们仅在 dbo:genre 值上有所不同。有一种方法可以查询知识库并检索包含 genres?

列表的单个结果

是的,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")

}

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

但是,如果您使用的是 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 实际上是多余的:请参阅 和评论。