我正在从一些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
列表检索单个结果吗?
答案 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")
}