2012-05-03 23 views
8

Dado este modelo muy simple:Cómo hacer un recuento en SPARQL

@prefix :  <http://example.org/tags#> . 
@prefix owl:  <http://www.w3.org/2002/07/owl#> . 
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 
@prefix xsd:  <http://www.w3.org/2001/XMLSchema#> . 

:tag rdf:type rdf:Property . 

:item1 
     rdf:type owl:Thing ; 
     :tag "a"^^xsd:string . 

:item2 
     rdf:type owl:Thing ; 
     :tag "a"^^xsd:string , "b"^^xsd:string . 

:item3 
     rdf:type owl:Thing ; 
     :tag "a"^^xsd:string , "b"^^xsd:string , "c"^^xsd:string . 

Estoy tratando de obtener una lista de los artículos y el recuento de etiquetas que cada uno tiene:

item tagCount 
===== ======== 
item1 1 
item2 2 
item3 3 

Aquí es mi consulta:

SELECT ?item (count(?tag) as ?tagcount) 
WHERE { 
    ?item :tag ?tag 
} 

Sin embargo, se vuelve:

item tagCount 
===== ======== 
     6 

Por lo que he leído, esto debería funcionar. Estoy usando Jena 2.6.4

+1

'COUNT' no es una parte de la especificación SPARQL 1.0, se añadió en 1,1. Algunas implementaciones lo admiten a pesar de eso. Solo digo. –

+0

¡Voto ascendente para la pregunta claramente expresada y el formato apropiado! – cygri

Respuesta

6

No he intentado esto, pero intente agregar GROUP BY ?item al final de la consulta. Creo que sin GROUP BY solo cuenta el número total de filas.

+0

Sí, cuenta el número total de filas. Es exactamente lo mismo que SQL también en este caso. Sin embargo, no sé qué pasa con '? Item'. –

3

Para la unión al aparecer en los resultados que necesita utilizar el grupo por palabra clave por lo que este se convierte en

seleccionar el elemento (recuento (etiqueta) como tagcount??) DONDE { artículo:?? Etiqueta? etiqueta } GROUP BY? elemento

Si desea contar algo en el medio de la consulta que hacer lo siguiente, tenga en cuenta cómo se debe poner la consulta de selección interno en su propio bloque {}

SELECT * { 
    ?item a owl:Thing . 

    { 
     SELECT ?item (count(?tag) as ?tagcount) 
     WHERE { 
      ?item :tag ?tag 
     } group by ?item 
    } 
} 
0

El sub-select por @ user2316243 es innecesario, por lo tanto, la siguiente consulta es equivalente:

SELECT ?item (count(?tag) as ?tagcount) 
WHERE { 
    ?item a owl:Thing . 
    ?item :tag ?tag . 
} GROUP BY ?item