zaragoza-sedeelectronica / zaragoza-sedeelectronica.github.io

21 stars 5 forks source link

[SPARQL] [GRAVE] pedir ordenación provoca resultados con errores en imágenes #24

Open jrub opened 9 years ago

jrub commented 9 years ago

Los orderBy provocan que se devuelvan resultados con las misma imágen repetida para muchos eventos, en vez de la imágen correcta, así como muchos eventos sin imagen.

Ejemplo:

SELECT DISTINCT *
WHERE { 
?uri a s:Event;
dcterms:identifier ?id;
rdfs:label ?title;
rdfs:comment ?description.
OPTIONAL {?uri s:subEvent ?subEvent.} 
OPTIONAL {?subEvent s:startDate ?startDate.}

OPTIONAL {?subEvent s:endDate ?endDate.}

OPTIONAL {?subEvent s:startTime ?startTime.}

OPTIONAL {?subEvent s:endTime ?endTime.}

OPTIONAL {?subEvent s:openingHours ?horario.}
OPTIONAL{ ?uri s:image ?image}.
OPTIONAL {?uri geo:geometry ?geo.
?geo geo:lat ?latitud.
?geo geo:long ?longitud.}
?uri <http://vocab.linkeddata.es/datosabiertos/def/cultura-ocio/agenda#programa> ?programa.
FILTER (REGEX(STR(?programa), "Fiestas del Pilar", "i"))
FILTER (xsd:date(?startDate) < "2015-10-12"^^xsd:date and xsd:date(?endDate) > "2015-10-12"^^xsd:date)
}
order by ?startTime

Si la ejecutáis en el Virtuoso, veréis que en este ejemplo se devuelve como 20 veces la imágen "//zaragoza.es/cont/paginas/actividades/imagen/PixelFlyerB.jpg"

jrub commented 9 years ago

Personalmente esto me parece grave, hace que el SPARQL "pierda todo su poder".

En LaAgendica estamos reordenando en cliente (navegador) lo cual hace que todo sea aún más lento, y la petición del SPARQL de por sí ya eran 3 segundos, que para una app móvil es demasiado. Eso sin contar la descarga de (las gigantes) imágenes, que se merece issue aparte.

ocorcho commented 9 years ago

Si estás buscando eventos con subeventos que tienen que cumplir esas condiciones la query que debes usar es la siguiente:

SELECT DISTINCT *
WHERE { 
?uri a s:Event;
dcterms:identifier ?id;
rdfs:label ?title;
rdfs:comment ?description.
OPTIONAL {?uri s:subEvent ?subEvent.
          ?subEvent s:startDate ?startDate.
          ?subEvent s:endDate ?endDate.
          ?subEvent s:startTime ?startTime.
          ?subEvent s:endTime ?endTime.
          ?subEvent s:openingHours ?horario.}
OPTIONAL{ ?uri s:image ?image}.
OPTIONAL {?uri geo:geometry ?geo.
?geo geo:lat ?latitud.
?geo geo:long ?longitud.}
?uri <http://vocab.linkeddata.es/datosabiertos/def/cultura-ocio/agenda#programa> ?programa.
FILTER (REGEX(STR(?programa), "Fiestas del Pilar", "i"))
FILTER (xsd:date(?startDate) < "2015-10-12"^^xsd:date and xsd:date(?endDate) > "2015-10-12"^^xsd:date)
}
order by ?startTime

Esto es porque al poner un OPTIONAL para cada tripleta del subevento está haciendo un "producto cartesiano" de todas las opciones. Dime si esto es lo que estabas buscando

ocorcho commented 9 years ago

De hecho, acabo de ver que el startDate está dentro del OPTIONAL, por lo que debería ser:

SELECT DISTINCT *
WHERE { 
?uri a s:Event;
dcterms:identifier ?id;
rdfs:label ?title;
rdfs:comment ?description.
OPTIONAL {?uri s:subEvent ?subEvent.
          ?subEvent s:startDate ?startDate.
          ?subEvent s:endDate ?endDate.
          ?subEvent s:startTime ?startTime.
          ?subEvent s:endTime ?endTime.
          ?subEvent s:openingHours ?horario.
           FILTER (xsd:date(?startDate) < "2015-10-12"^^xsd:date and xsd:date(?endDate) > "2015-10-12"^^xsd:date)
}
OPTIONAL{ ?uri s:image ?image}.
OPTIONAL {?uri geo:geometry ?geo.
?geo geo:lat ?latitud.
?geo geo:long ?longitud.}
?uri <http://vocab.linkeddata.es/datosabiertos/def/cultura-ocio/agenda#programa> ?programa.
FILTER (REGEX(STR(?programa), "Fiestas del Pilar", "i"))
}
order by ?startTime
jrub commented 9 years ago

@ocorcho si pruebas a correr la última query en el Virtuoso, verás que devuelve la imagen //zaragoza.es/cont/paginas/actividades/imagen/aytod178.JPG 125 veces