2013-11-27 27 views
7

假设我有一个uri http://dbpedia.org/page/Manmohan_Singh 现在他在他的标签dbpprop:years中有一个年份列表。如何连接sparql中的值列表?

当我写这样

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') 


      } 

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

与之相似的道具DBpedia的猫头鹰:办公室

+0

[从SPARQL查询汇总结果的可能的复制(http://stackoverflow.com/q /1281433分之18212697)。 –

+0

该重复将告诉你如何做你想做的事情,但你需要注意的是,年份不是唯一值有多个值。也有各种各样的名字,出生地和办公室。 –

+0

你有没有在这方面取得任何进展? –

回答

2

GROUP_CONCAT外观,但它可能会更容易检索多行数据(您可以排序把彼此相邻的重复)和处理代码。

9

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

您可以使用group_concat解决此问题,但您还需要使用distinct以避免在连接字符串中重复出现多次,例如相同的?yeargroup 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