如何在sparql中连接值列表?

时间:2013-11-27 01:56:14

标签: rdf sparql semantic-web dbpedia

假设我有一个uri http://dbpedia.org/page/Manmohan_Singh 现在,他的标签名为dbpprop:years。

当我写一个像

这样的查询时
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
            PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
            PREFIX dbpedia: <http://dbpedia.org/resource/>PREFIX dcterms: <http://purl.org/dc/terms/>
            PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>PREFIX category: <http://dbpedia.org/resource/Category:>
            PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>PREFIX foaf: <http://xmlns.com/foaf/0.1/>PREFIX dbpprop: <http://dbpedia.org/property/>
            PREFIX dbprop: <http://dbpedia.org/property/>PREFIX grs: <http://www.georss.org/georss/>
            PREFIX category: <http://dbpedia.org/resource/Category:>
            PREFIX owl: <http://www.w3.org/2002/07/owl#>
            PREFIX dbpprop: <http://dbpedia.org/property/>
            PREFIX foaf: <http://xmlns.com/foaf/0.1/>
            SELECT DISTINCT ?x ?name ?abs ?birthDate ?birthplace ?year ?party ?office ?wiki WHERE {
            ?x owl:sameAs? dbpedia:Manmohan_Singh.
            ?x dbpprop:name ?name.
            ?x dbpedia-owl:birthDate ?birthDate.
            ?x dbpedia-owl:birthPlace ?birthplace.
            ?x dbpprop:years ?year.
            ?x dbpprop:party ?party.
            ?x dbpedia-owl:office ?office.
            ?x foaf:isPrimaryTopicOf ?wiki.
            ?x rdfs:comment ?abs.
            FILTER(lang(?abs) = 'en')


            }

我得到每年的结果在不同的行..因此重复其他列的数据。有没有一种方法可以将它作为一个列表中的列表,就像所有年份中的一个逗号分隔或像这样的smthng?

类似于prop dbpedia-owl:office

2 个答案:

答案 0 :(得分:9)

这类似于Aggregating results from SPARQL query,但问题实际上有点复杂,因为有多个变量有多个结果。 ?name?office?birthPlace有同样的问题。

您可以使用group_concat解决此问题,但您也需要使用distinct,以避免在连接中重复多次?year重复串。 group by减少了解决方案中的行数,但在每个行中,您的值 em> group by。例如,由于?year不在group by中,因此?year的值为 ,您必须对它们执行某些操作。你可以,例如,select (sample(?year) as ?aYear)只从集合中抓取一个,或者你可以像我们在这里完成的那样,并select (group_concat(distinct ?year;separator=", ") as ?years)将不同的值连接成一个字符串。

您需要一个类似以下的查询,它会生成一行:

SELECT ?x
       (group_concat(distinct ?name;separator="; ") as ?names)
       ?abs
       ?birthDate
       (group_concat(distinct ?birthplace;separator=", ") as ?birthPlaces)
       (group_concat(distinct ?year;separator=", ") as ?years)
       ?party
       (group_concat(distinct ?office;separator=", ") as ?offices)
       ?wiki
WHERE {
  ?x owl:sameAs? dbpedia:Manmohan_Singh.
  ?x dbpprop:name ?name.
  ?x dbpedia-owl:birthDate ?birthDate.
  ?x dbpedia-owl:birthPlace ?birthplace.
  ?x dbpprop:years ?year.
  ?x dbpprop:party ?party.
  ?x dbpedia-owl:office ?office.
  ?x foaf:isPrimaryTopicOf ?wiki.
  ?x rdfs:comment ?abs.
  FILTER(langMatches(lang(?abs),"en"))
}
group by ?x ?abs ?birthDate ?party ?wiki

SPARQL results

答案 1 :(得分:2)

查看GROUP_CONCAT但是可以更容易地检索多行中的数据(您可以将重复放在彼此相邻的位置)并在代码中处理。