聚合属性
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
实际上是多余的:请参阅 和评论。
我正在根据一些 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
实际上是多余的:请参阅