2012-06-14 15 views
7

No puedo describir mi problema formalmente debido a mi mal inglés; déjame decirte usando un ejemplo. La tabla a continuación está en realidad agrupada por 'sujeto', 'predicado'.Combinar múltiples conjuntos de filas en SPARQL

Definimos un conjunto en filas, si tienen el mismo 'asunto'. Ahora quiero combinar dos conjuntos si contienen el mismo 'predicado', suma el 'recuento' del mismo 'predicado' y cuenta el número de sujetos distintos que tienen el mismo conjunto.

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

Por lo tanto, lo que quería de esta tabla es dos conjuntos:

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

donde en el primer conjunto, 2 indica que hay dos sujetos (S1 y S3) que tiene este conjunto; (p1,3) es la suma de (s1, p1, 1) y (s3, p1, 2).

Entonces, ¿cómo puedo recuperar estos conjuntos y almacenarlos en Java?

  • ¿Cómo puedo hacerlo usando SPARQL?

  • O, primero almacene estos triples en Java, entonces ¿cómo puedo obtener estos conjuntos usando Java?


Una solución podría ser concat predicados y los recuentos,

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 

A continuación, los conteos se puede desacoplar, a continuación, resumen. Funciona bien en pequeños conjuntos de datos, pero consume mucho tiempo.

Creo que abandonaré este extraño problema. Muchas gracias por responder.

Respuesta

9

Vamos a empezar con

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

Esa es la parte básica, pero la agrupación no es correcto (ahora clarificada).

La variable de agrupación debe ser como este (espero que esta es la sintaxis correcta):

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

espero que da:

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

Así que la pregunta final debería ser:

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 

¿Eso funciona?

+0

sí, quiero decir 's1 y s3 ​​tienen el mismo conjunto'. perdón por el error tipográfico, lo he modificado (y cambiado el valor del predicado de s2 para hacerlo más claro). Sin embargo, el resultado que quiero es 'el conjunto de conjuntos'. Dos conjuntos, digamos {p1, p2} y {p1}, no pueden combinarse ya que son diferentes. Por lo tanto, no solo sumaríamos el valor de cada mismo predicado. Gracias por responder :) – bobharris

+0

Ah, lo tengo. Eso puede ser difícil, pero he agregado un segundo pase. – user205512

+0

Es casi lo que quiero :), pero sigue funcionando y parece que no dará ningún resultado. Además, si esta consulta tiene éxito, ¿cómo puedo recuperar esos conjuntos de la tabla resultante?Solo puedo ver que la tabla resultante contiene dos columnas, pero no da información sobre los conjuntos. Para los resultados, se almacenarán en Java, así que ... en realidad solo quiero estos resultados. Gracias de nuevo. – bobharris

Cuestiones relacionadas