【问题标题】:Aggregate properties聚合属性
【发布时间】:2017-07-04 14:14:24
【问题描述】:

我正在根据一些 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 列表检索单个结果?

【问题讨论】:

  • 第一个三元组模式是不必要的,因为它表示没有变量的属性 RDF 三元组。此外,VALUES 可用于使查询更紧凑,请参阅我编辑的查询。

标签: sparql jena dbpedia fuseki


【解决方案1】:

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

但是,如果您使用的是 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 和 cmets。

【讨论】:

  • AS 不是多余的。这是规范要求的。如果您尝试编写法律查询,则应将其包括在内。仅仅因为某些端点可能会处理非法语法并不是忽略它的好理由。
【解决方案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")

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多