2011-12-26 15 views
9

Como se muestra en this question que tiene un título similar, me gustaría recuperar un recurso de dbpedia conociendo una parte de su nombre. Soy un principiante en lo que respecta a SPARQL y tal, pero el ejemplo en la pregunta me ayudó mucho, ya que el autor buscó "Rumania", y la persona que lo contestó lo enganchó con una solicitud de Sparql para hacer el trabajo. Eso está bien, pero aquí está la cosa.Recuperando un recurso de DBpedia por su nombre de cadena con SPARQL y sin saber su tipo

En el ejemplo, ya que "sabían" que Rumania es un país, de ahí el

?c a dbpedia-owl:Country ; 

en la cláusula WHERE. La solicitud completa SPARQL siendo

SELECT ?c 
    WHERE { 
    ?c a dbpedia-owl:Country ; 
    foaf:name "Romania"@en . 
    FILTER NOT EXISTS {?c dbpedia-owl:dissolutionYear ?y} 
    } 

Pero, esta pregunta no responde bastante completo nuestra necesidad, por lo tanto, la búsqueda de cualquier recurso por su nombre, el "nombre" es el nombre real de un recurso, o una parte de it, independientemente de su (rdf:) tipo. El objetivo sería buscar "cualquier cosa", simplemente conocer el nombre o una parte de él.

He estado haciendo una investigación antes de hacerles esta pregunta, y ya sé que el problema de "parte del nombre" podría resolverse con la función bif (la mala, ya que no es compatible con sparql), o la cláusula CONTAINS, pero no pude encontrar ningún ejemplo que muestre cómo usarla.

Supongamos ahora que hay una "palabra" para buscar entre los recursos de dbpedia, esa palabra sería una entrada de algún usuario. Y llamémoslo "ENTRADA".

La solicitud, me imagino, se vería así:

SELECT ?something WHERE 
    { 
    ?something a (dbpedia Resource). 
    CONTAINS(?something,"INPUT") 
    } 

Mi pregunta principal es de aproximadamente dos aspectos principales:

  1. ¿hay algo que describe el tipo de recursos DBpedia? No creo que esté en ontología ni nada. Al decir que me gustaría buscar entre todos los recursos para encontrar uno que coincida ...
  2. Un nombre específico que proporcionaría, o alguna cadena. Consideré la opción FILTER, pero eso significaría obtener TODOS los recursos, y luego filtrarlos por su nombre después de que se hayan recuperado, lo que, supongo, no sería tan óptimo.

Entonces, ¿alguien sabe esta "Consulta maestra" para obtener un recurso al proporcionar su nombre, o una parte de él? (Un ejemplo es proporcionarle a "Obama", y obtener resultados no solo para Barrack, sino también para Michelle).

Gracias de antemano.

Respuesta

15

Supongo que en su primera pregunta está interesado en ver solo los recursos de la instancia. No sé si puede pedir explícitamente, por ejemplo, recursos en el caso general, ya que en RDF todo es un recurso. Si necesita esto específicamente para el conjunto de datos de DBpedia, puede consultar recursos que tengan dcterms: subject como una propiedad (en DBPedia, solo los recursos de instancia tienen un dcterms: subject). Así que usted puede tener una consulta como esta:

SELECT DISTINCT ?s ?label WHERE { 
      ?s rdfs:label ?label . 
      FILTER (lang(?label) = 'en'). 
      ?label bif:contains "Obama" . 
      ?s dcterms:subject ?sub 
} 

forma similar a su segunda pregunta - si está utilizando sólo el conjunto de datos DBpedia es posible que desee utilizar "BIF: contiene" aunque no es compatible con SPARQL.No creo que haya otra manera óptima de hacerlo y, como dijiste, utilizar FILTER no será óptimo, especialmente si necesitas ejecutar consultas rápidamente. Creo que la búsqueda por palabras clave y la indexación se manejan de forma ad hoc por cada tienda triple, ya que aún no existe una forma estandarizada de búsqueda de texto completo.

En resumen, si trabaja con dbpedia, solo use las características de la tienda y los detalles del conjunto de datos para resolver su problema.

+0

Es una pena que tengamos que pasar por un "truco" (los dcterms: asunto), pero bueno, mis solicitudes son solo para recursos de dbpedia. Entonces tu respuesta es absolutamente increíble y me salvó CARGAS de dolores de cabeza. Muchas gracias. En cuanto a las funciones bif, sé que no cumplen con SPARQL, por eso busqué CONTAINS, aunque creo que todavía buscaré ejemplos donde usen esta cláusula. Así que gracias de nuevo por su respuesta, mi viaje con dbpedia y rdf acaba de comenzar, pero me dieron el comienzo que necesitaba. –

+0

Hay algunas restricciones dolorosas con este enfoque. No permite espacios Entonces, si intentabas buscar la representación de la entidad canónica para "Barak Obama" (o programáticamente, cualquier cadena de nombre que encontraras, que es mi caso), no puedes usar bif: contains. Y luego pensé, ¿tal vez la URL codifica la cadena? '? Label bif: contiene" barak% 20obama ".' No hay ningún dado allí. ¿Tal vez dos declaraciones separadas para capturar las partes constituyentes? Nop. :( 'Virtuoso 37000 error SP031: compilador SPARQL: Más de un BIF: contiene() o predicado similar para la variable '$ etiqueta' en una sola agrupación: Cualquier idea – sands

+3

@sands que puede hacer la etiqueta BIF??: contiene '' barak obama '' (tenga en cuenta las comillas adicionales) – MrM

Cuestiones relacionadas