2013-11-27 15 views
7

Giả sử tôi có một uri http://dbpedia.org/page/Manmohan_Singh bây giờ anh ta có danh sách năm trong thẻ của mình dbpprop: năm.Làm thế nào để nối một danh sách các giá trị trong sparql?

Khi tôi viết một truy vấn như

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


      } 

tôi nhận được kết quả của mỗi năm trong hàng khác nhau .. và do đó lặp đi lặp lại dữ liệu cho collumns khác. Có cách nào tôi có thể làm cho nó như là một danh sách chỉ trong một collumn như tất cả các năm trong một comma colla tách ra hoặc smthng như thế?

Tương tự cho prop dbpedia-cú: văn phòng

+0

có thể trùng lặp của [Tập hợp kết quả từ SPARQL truy vấn] (http://stackoverflow.com/q/18212697/1281433). –

+0

Bản sao đó sẽ cho bạn thấy cách bạn có thể làm những gì bạn muốn làm, nhưng bạn cần lưu ý rằng năm đó không phải là giá trị duy nhất có nhiều giá trị. Cũng có nhiều tên, nơi sinh, và văn phòng khác nhau. –

+0

Bạn đã từng thực hiện bất kỳ tiến bộ nào về điều này chưa? –

Trả lời

2

Nhìn vào GROUP_CONCAT nhưng nó có thể được dễ dàng hơn để lấy lại dữ liệu trong nhiều hàng (bạn có thể sắp xếp để đưa lặp đi lặp lại liền kề với nhau) và quá trình trong mã.

9

Điều này tương tự như Aggregating results from SPARQL query, nhưng vấn đề thực sự phức tạp hơn một chút, bởi vì có nhiều biến có nhiều kết quả. ?name, ?office?birthPlace có cùng một vấn đề.

Bạn có thể giải quyết vấn đề này bằng cách sử dụng group_concat, nhưng bạn cũng cần sử dụng distinct để tránh nhận được, ví dụ: ?year lặp lại nhiều lần trong chuỗi nối của bạn. group by giảm số hàng mà bạn có trong một giải pháp, nhưng trong mỗi hàng đó, bạn có đặt giá trị cho các biến số mà bạn không nhóm theo. Ví dụ: kể từ ?year không có trong số group by, bạn có một đặt giá trị cho ?year và bạn phải làm điều gì đó với chúng. Bạn có thể, ví dụ: select (sample(?year) as ?aYear) để chỉ lấy một từ bộ hoặc bạn có thể làm như chúng tôi đã thực hiện ở đây và select (group_concat(distinct ?year;separator=", ") as ?years) để nối các giá trị khác biệt vào một chuỗi.

Bạn sẽ muốn có một truy vấn như sau, trong đó sản xuất một dòng:

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

Các vấn đề liên quan