2011-12-26 6 views
9

Come mostrato in this question che ha un titolo simile, vorrei recuperare una risorsa dbpedia conoscendo una parte del suo nome. Sono un principiante quando si tratta di SPARQL e simili, ma l'esempio nella domanda mi ha aiutato molto, poiché l'autore ha cercato "Romania", e la persona che rispondeva lo ha agganciato con una richiesta di Sparql per fare il lavoro. È carino, ma ecco la cosa.Recupero di una risorsa DBpedia tramite il suo nome stringa con SPARQL e senza conoscere il tipo

Nell'esempio, hanno già "sapevano" che la Romania è un paese, da qui il

?c a dbpedia-owl:Country ; 

nella clausola WHERE. La richiesta completa SPARQL essere

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

Ma, questa domanda non risponde quasi completamente il nostro bisogno, quindi, alla ricerca di qualsiasi risorsa con il suo nome, il "nome" è il nome reale di una risorsa, o una parte di it, indipendentemente dal suo (rdf:) tipo. L'obiettivo sarebbe quello di cercare "qualsiasi cosa", solo conoscendo il nome o una parte di esso.

Ho fatto qualche ricerca prima di farti questa domanda, e so già che il problema del "nome del nome" potrebbe essere risolto con la funzione bif (il modo sbagliato, dato che non è conforme a sparql), o la clausola CONTAINS, ma non ho trovato alcun esempio che mostra come usarlo.

Supponiamo ora che ci sia una "parola" da cercare tra le risorse di dbpedia, quella parola sarebbe un input da parte di qualche utente. E chiamiamolo "INPUT".

La richiesta, immagino, sarebbe simile:

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

La mia domanda principale è di circa due aspetti importanti:

  1. C'è qualcosa che descrive il tipo di risorsa DBpedia? Non penso sia in ontologia o altro. Con knwoing che mi piacerebbe cercare tra tutte le risorse per trovare una corrispondenza ...
  2. Un nome specifico vorrei fornire, o qualche stringa. Ho considerato l'opzione FILTER, ma ciò significherebbe ottenere TUTTE le risorse e quindi filtrarle in base al loro nome dopo che sono state ritirate, il che sarebbe, suppongo, non così ottimale.

Quindi, qualcuno conosce questa "Master Query" per ottenere una risorsa fornendo il suo nome o una parte di esso? (Un esempio è fornire "Obama" e ottenere risultati non solo per Barrack, ma anche per Michelle).

Grazie in anticipo.

risposta

15

Presumo che nella tua prima domanda sei interessato a esaminare solo le risorse di istanza. Non so se è possibile chiedere esplicitamente, ad esempio, risorse nel caso generale, poiché in RDF tutto è una risorsa. Se si ha specificamente bisogno di questo per il set di dati DBpedia, è possibile eseguire una query per le risorse che hanno dcterms: subject as a property (in DBPedia solo le risorse di istanza hanno un dcterms: subject). Così si può avere una query come questa:

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

Allo stesso modo per la tua seconda domanda - se si utilizza solo il set di dati DBpedia si potrebbe desiderare di usare "BIF: contiene" anche se non è compatibile SPARQL.Non penso che esista un altro modo ottimale per farlo e, come hai detto, l'uso di FILTER non è ottimale, soprattutto se devi eseguire rapidamente le query. Penso che la ricerca e l'indicizzazione delle parole chiave siano gestite ad hoc da ogni negozio triplo, non esiste ancora un modo standardizzato per gli utenti di ricerca full-text.

Quindi, per riassumere, se si lavora con dbpedia utilizzare solo le funzionalità del negozio e le specifiche del set di dati per risolvere il problema.

+0

In realtà è un peccato che dobbiamo passare attraverso un "trucco" (i dcterms: soggetto), ma hey, le mie richieste sono solo per le risorse DBBedia. Quindi la tua risposta è assolutamente incredibile e mi ha salvato CARICHI di mal di testa. Grazie mille. Per quanto riguarda le funzioni bif, so che non sono compatibili con SPARQL, è per questo che ho cercato CONTAINS, anche se penso che cercherò ancora esempi in cui usano questa clausola. Quindi, grazie ancora per la tua risposta, il mio viaggio con dbpedia e rdf è appena iniziato, ma tu mi hai appena dato l'avvio di cui avevo bisogno. –

+0

Ci sono alcune restrizioni dolorose con questo approccio. Non consente spazi. Quindi, se stai cercando di recuperare la rappresentazione dell'entità canonica per "Barak Obama" (o, a livello di codice, qualsiasi stringa di nome che hai trovato, che è il mio caso), non puoi usare bif: contains. E poi ho pensato, forse l'URL codifica la stringa? '? Label bif: contiene" barak% 20obama ".' Nessun dado lì. Forse due dichiarazioni separate per catturare parti costituenti? No. :( 'Virtuoso 37000 Errore SP031: compilatore SPARQL: Più di un BIF: contiene() o predicato di simile per la variabile '$ label' in un unico group' Tutte le idee – sands

+3

@sands si può fare etichetta bif??: contiene '"barak obama"' (annota le virgolette extra) – MrM

Problemi correlati