2012-06-14 17 views
7

Nie mogę opisać mojego problemu formalnie z powodu mojego złego języka angielskiego; pozwól mi powiedzieć to za pomocą przykładu. Poniższa tabela jest faktycznie pogrupowana według "tematu", "orzecznika".Połączyć wiele zestawów wierszy w SPARQL

Definiujemy zestaw w wierszach, jeśli to ten sam "temat". Teraz chcę połączyć dwa zestawy, jeśli zawierają one te same "predykaty", zsumują "liczbę" tego samego "orzecznika" i policzą liczbę różnych przedmiotów, które mają ten sam zbiór.

subject predicate count 
----------------------------- 
s1   p1   1 
s1   p2   2 
s2   p1   3 
s3   p1   2 
s3   p2   2 

Zatem co chciał z tej tabeli to dwa zestawy:

{2, (p1, 3), (p2, 4)}, 
{1, (p1,3)} 

gdzie w pierwszym secie, 2 wskazuje, istnieją dwa podmioty (S1 i S3) ma ten zestaw; (p1,3) to suma z (s1, p1, 1) i (s3, p1, 2).

Jak mogę odzyskać te zestawy i zapisać je w Javie?

  • Jak mogę to zrobić za pomocą SPARQL?

  • Albo, po pierwsze, przechowuj te trójki w Javie, a następnie w jaki sposób mogę uzyskać te zestawy za pomocą Java?


Jednym z rozwiązań może być Concat predykaty i liczy,

SELECT (COUNT(?s) AS ?distinct) 
?propset 
(group_concat(?count; separator = \"\\t\") AS ?counts) 
{ 
    SELECT ?s 
    (group_concat(?p; separator = \" \") AS ?propset) 
    (group_concat(?c; separator = \" \") AS ?count 
    { 
     ?s ?p ?c   
    } GROUP BY ?s ORDER BY ?s 
} GROUP BY ?propset ORDER BY ?propset 

Wtedy liczy może być oddzielona, ​​a następnie zsumować. Działa dobrze na małym zbiorze danych, ale bardzo czasochłonne.

Myślę, że zrezygnuję z tego dziwnego problemu. Dziękuję bardzo za odpowiedź.

Odpowiedz

9

Zacznijmy

select ?predicate (sum(?count) as ?totalcount) 
{ 
    ?subject ?predicate ?count 
} 
group by ?predicate 

to podstawowy trochę, ale grupa nie jest w porządku (teraz wyjaśnione).

Zmienna grupowania powinien być tak (nadzieję, że to jest właściwa składnia):

select ?subject (group_concat(distinct ?p ; separator = ",") AS ?propset) 
{ 
    ?subject ?p ?c 
} 
group by ?subject 

Mam nadzieję, że otrzymamy:

subject propset 
------------------ 
s1   "p1,p2" 
s2   "p1" 
s3   "p1,p2" 

więc ostateczna zapytanie powinno być:

select ?predicate (sum(?count) as ?totalcount) 
{ 
    ?subject ?predicate ?count . 
    { 
     select ?subject (group_concat(distinct ?p ; separator = ",") AS ?propset) 
     { 
      ?subject ?p ?c 
     } 
     group by ?subject 
    } 
} 
group by ?propset ?predicate 

Czy to działa?

+0

tak mam na myśli "s1 i s3 mają ten sam zestaw". przepraszam za literówkę, zmieniłem go (i zmienił wartość predykatu s2, aby było bardziej jasne). Jednak pożądany wynik to "zestaw zestawów". Dwa zestawy, na przykład {p1, p2} i {p1}, nie mogą być łączone, ponieważ są różne. Dlatego nie tylko zsumowalibyśmy wartość każdego orzeczenia. Dziękuję za odpowiedź :) – bobharris

+0

Ah, rozumiem. To może być trudne, ale dodałem drugie przejście. – user205512

+0

Jest prawie blisko tego, co chcę :) ale działa dalej i wydaje się, że nie da żadnego wyniku. Poza tym, jeśli zapytanie to powiedzie się, w jaki sposób mogę odzyskać te zestawy z wynikowej tabeli?Po prostu widzę, że wynikowa tabela zawiera dwie kolumny, ale nie podaje żadnych informacji o zestawach. Dla wyników będą one przechowywane w java, więc ... tak naprawdę chcę tylko te wyniki. Jeszcze raz dziękuję. – bobharris