2012-06-14 16 views
7

Non riesco a descrivere il mio problema formalmente a causa del mio pessimo inglese; lasciami dire usando un esempio. La tabella sottostante è in realtà raggruppata per 'soggetto', 'predicato'.Combina più serie di righe in SPARQL

Definiamo un insieme su righe, se hanno lo stesso 'oggetto'. Ora voglio combinare due insiemi se contengono lo stesso 'predicato', sommano il 'conteggio' dello stesso 'predicato' e contano il numero di soggetti distinti che hanno lo stesso set.

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

Pertanto, quello voluto da questa tabella è due insiemi:

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

dove nel primo set, 2 indica esistono due soggetti (s1 s3) avente questa serie; (p1,3) è la somma da (s1, p1, 1) e (s3, p1, 2).

Quindi, come posso recuperare questi set e memorizzarli in Java?

  • Come posso farlo utilizzando SPARQL?

  • Oppure, in primo luogo memorizzare questi tripli in Java, quindi come posso ottenere questi set utilizzando Java?


Una soluzione potrebbe essere concat predicati e conteggi,

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 

Poi potrebbe essere disaccoppiati i conteggi, poi riassumere. Funziona bene su dataset di piccole dimensioni, ma richiede molto tempo.

Penso che rinuncerò a questo strano problema. Grazie mille per aver risposto.

risposta

9

Cominciamo con

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

Questo è il po 'di base, ma il raggruppamento non è giusto (ora chiarificato).

La variabile di raggruppamento dovrebbe essere così (spero che questo è la sintassi a destra):

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

spero che dà:

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

Quindi la query finale dovrebbe essere:

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 

Funziona?

+0

sì, intendo 's1 e s3 hanno lo stesso set'. scusa per l'errore di battitura, l'ho modificato (e modificato il valore del predicato di s2 per renderlo più chiaro). Tuttavia, il risultato che voglio è "l'insieme degli insiemi". Due set, ad esempio {p1, p2} e {p1}, non possono essere combinati poiché sono diversi. Pertanto, non solo sommiamo il valore di ogni stesso predicato. Grazie per aver risposto :) – bobharris

+0

Ah, capito. Potrebbe essere difficile, ma ho aggiunto un secondo passaggio. – user205512

+0

È quasi vicino a quello che voglio :) ma continua a funzionare e sembra che non darà alcun risultato. Inoltre, se questa query ha esito positivo, come posso recuperare quei set dalla tabella risultante?Posso solo vedere la tabella risultante contiene due colonne, ma non fornisce informazioni sui set. Per i risultati, saranno archiviati in java, quindi in realtà voglio solo questi risultati. Grazie ancora. – bobharris