2012-03-19 19 views

Respuesta

4

Interesante pregunta, ya que parece bastante simple y, sin embargo, es difícil expresar correctamente la consulta. William Greenly's answer no proporciona lo que desea, aunque tiene toda la razón en sus explicaciones y utiliza correctamente un property path. Para poder hacer correctamente la consulta correcta que responde a su pregunta, debe suponerse que todas las listas están bien formadas (solo tienen un primer elemento, un descanso y terminan con un cero).

El problema en su consulta es que contará todos los miembros de todas las listas en el conjunto de datos. Necesita algo para relacionar el rdf:first con solo el elemento de una lista.

Si usted tiene un URI que identifica la lista tiene interés en conocer, puede lo siguiente:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX ex: <http://www.example.org/#> 
SELECT (COUNT(?member) AS ?count) 
WHERE { 
    ex:uriOfTheList rdf:rest*/rdf:first ?member 
} 

Pero a menudo, las listas no son identificados por un URI. En este caso, es posible identificar ciertas listas mediante el uso de otras propiedades. Por ejemplo, imagine que tiene una propiedad ex:listOfAuthors, que puede hacer:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX ex: <http://www.example.org/#> 
SELECT (COUNT(?member) AS ?count) 
WHERE { 
    ex:publication ex:listOfAuthors ?list . 
    ?list rdf:rest*/rdf:first ?member . 
} 

Tenga en cuenta que si lo único que haces:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT (COUNT(?member) AS ?count) 
WHERE { 
    ?list rdf:rest*/rdf:first ?member . 
} 

se le suman todos los tamaños de las listas y sublistas . Ahora las cosas se complican si no tiene los predicados a los que puede adjuntar la lista y no tiene un URI y tal vez desea obtener el recuento de todas las listas, por lista. Hay una manera que debería funcionar:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT (COUNT(?c) AS ?count) 
WHERE { 
    ?thing !rdf:rest ?list . 
    ?list rdf:rest*/rdf:first ?member . 
} 

Lo que esto quiere decir es que queremos encontrar algo que se conecta a una lista, pero no con el predicado rdf:rest. En principio, solo el comienzo de una lista se conecta mediante un predicado a otra entidad, si la entidad no es una lista en sí misma y el predicado no es rdf:rest. Además, las listas normalmente siempre están conectadas de alguna manera con otras entidades, ya que no tendría sentido describir una lista independientemente de cualquier otra cosa.

+0

Gracias Antoine, identificó un punto muy importante de la lista de estar conectado a algo. No pensé en eso cuando intenté la consulta en un conjunto de datos con solo una lista. – user1278577

3

Esto es realmente una muy buena pregunta porque no es una solución particularmente sencilla.

Los términos importantes en las listas de RDF son:

rdf:first 
rdf:rest 
rdf:nil 

para obtener una lista de más artículos de uno, se recomienda que usted modela de la siguiente manera:

a:a rdf:first a:b; 
    rdf:rest [ 
     rdf:first a:c; 
     rdf:rest rdf:nil. 
    ]. 

utilizando RDF: cero para indicar que una lista ya no tiene más elementos (así que esencialmente es una lista de listas). Sin embargo, también afirma que se puede utilizar RDF: primero interderterminantly de la siguiente manera:

a:a rdf:first a:b; 
    rdf:first a:c; 
    rdf:rest rdf:nil. 

El punto de RDF: cero es especificar que una lista ya no tiene ningún artículo. Recuerde que la Web semántica se basa en suposiciones de Open World, por lo tanto, a menos que se establezca otra, no puede suponer que la lista no tiene más elementos simplemente porque no se conocen o no se declaran, de ahí la necesidad de la persona, rdf: nil.

Afortunadamente, en el ejemplo anterior, hay una sola consulta para ambos, que se basa en un procesador compatible con SPARQL 1.1.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
SELECT (COUNT(?a) AS ?count) 
WHERE {?a rdf:first+ ?c} 

recuerde que a menos que la lista contenga rdf: nil, no asuma que está completa.

+0

gracias William. – user1278577