2016-02-24 29 views
5

Ho una domanda su una query SPARQL che sto cercando di compilare da un tutorial. Voglio generare triple che restituiscono un elenco di membri della band e le bande in cui si trovano utilizzando un endpoint DBPedia.query sparql semplice da dbpedia

my query

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbp: <http://dbpedia.org/resource/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 

SELECT ?name ?bandname where { 
?person foaf:name ?name . 
?band dbo:bandMember ?person . 
?band dbo:genre dbpedia:Punk_rock . 
?band dbp:name ?bandname . 
} 

Sto anche utilizzando una [SPARQL query di convalida] [2] per cercare di capire il mio problema e sembra che sto usando un prefisso non corretto per "DBP:? Nome bandname "Voglio solo che le triple vengano restituite in JSON, se possibile.

Una volta che riesco a farlo funzionare, vorrei aggiungere un altro prefisso, da GeoNames, per vedere i posti associati alle bande, se possibile (ma quella parte è in futuro). Qualsiasi opinione sarà molto apprezzata!

risposta

2

Il problema è con prefisso non definito dbpedia. Anche io penso che si debba sostituire con dbp:namefoaf:name:

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbp: <http://dbpedia.org/resource/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 

SELECT ?name ?bandname where { 
    ?person foaf:name ?name . 
    ?band dbo:bandMember ?person . 
    ?band dbo:genre dbp:Punk_rock . 
    ?band foaf:name ?bandname . 
} 

Ahimè, con SELECT non sarà possibile ottenere triple, ma solo i nomi (o altre cose) nei risultati tabulari. Molto simile a SQL. Se vuoi le triple, hai bisogno di CONSTRUCT

4

Ci sono alcuni problemi con la tua richiesta.

  • La proprietà "nome" per una banda ha il seguente URI: http://dbpedia.org/property/name. È una proprietà e non una risorsa , ma è stata definita come tale nei prefissi. Si shoud definire come segue: PREFIX dbp: <http://dbpedia.org/property/>
  • Ho appena avuto un rapido controllo a ciò che a band page has as properties, e visto che, a parte il dbo: un bandmember che si sta utilizzando, v'è un'altra proprietà, currentMembers, che sembra recuperare ulteriori informazioni . Ciò sembra logico, in quanto dbo: bandMember recupera solo entità (URI membri), mentre dbp: currentMembers recupera anche valori letterali. Dipende dal tuo caso d'uso qui ...
  • Si utilizza il dbpedia: prefisso nella query, che non sembra essere stato definito in anticipo.

Ecco la domanda che ho usato per recuperare un elenco di gruppi associati ai loro membri:

parte
PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbr: <http://dbpedia.org/resource/> 
PREFIX dbp: <http://dbpedia.org/property/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

SELECT ?members ?bandName where { 
?band dbo:genre dbr:Punk_rock . 
?band dbp:currentMembers ?members. 
?band foaf:name ?bandName 
FILTER(langMatches(lang(?bandName), "en")) 
} 

Il filtro ci permette di evitare duplicati nel caso in cui i letterali sono definiti anche in altre lingue.

Ma se si vuole ancora utilizzare la DBO: proprietà bandmember, questa query fa anche il lavoro:

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX dbr: <http://dbpedia.org/resource/> 
PREFIX dbp: <http://dbpedia.org/property/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

SELECT ?personName ?bandName where { 
?band dbo:bandMember ?person . 
?person foaf:name ?personName . 
?band dbo:genre dbr:Punk_rock . 
?band foaf:name ?bandName 
FILTER(langMatches(lang(?bandName), "en")) 
FILTER(langMatches(lang(?personName), "en")) 
} 

Speranza che aiuta!