Valori multipli Stampati per RDF: Tipo
Domanda
Ho creato un asset di classe che è una sottoclasse di http://schema.org/creativework Asset ha 2 sottoclassi dicono Articolo e pubblicazione
Ora avrei istanze di solo articolo o classe di pubblicazione. Asset è la classe astratta
Quando stampa i metadati per l'articolo o la pubblicazione anche io Vuoi stampare il tipo di risorsa.In questo caso sarebbe articolo o pubblicazione.
Eseguo la seguente query
SELECT ?id ?title ?type
WHERE
{
?asset rdf:type Asset ;
somePrefix:id ?id ;
somePrefix:title ?title ;
rdf:type ?type .
}
.
Ora invece di stampa tipo come articolo o pubblicazione per ogni risorsa ottengo più valori in RDF: tipo. Esempio
id title Type
1 this is a article CreativeWork
1 this is a article Asset
1 this is a article Article
2 this is a publication CreativeWork
2 this is a publication Asset
2 this is a publication Article
.
Voglio in qualche modo stampare solo articolo o pubblicazione nella colonna Tipo
Come posso ottenere questo?
Soluzione
Come ti capisco, la tua gerarchia della classe è:
CreativeWork
Asset
Article
Publication
.
Hai alcune opzioni.
Ottenere nient'altro che Articolo e pubblicazione
Il più semplice è dire che vuoi considerare solo i valori di tipo? Tipo che sono articolo e pubblicazione, nel qual caso è possibile specificarlo con Valori :
SELECT ?id ?title ?type
WHERE
{
values ?type { Article Publication }
?asset rdf:type Asset ;
somePrefix:id ?id ;
somePrefix:title ?title ;
rdf:type ?type .
}
.
Questa è la cosa più specifica che puoi fare, e tu sei garantito che? Il tipo sarà solo articolo o pubblicazione.
Ottenere tutto tranne Creativework and Asset
Certo, potresti definire altre sottoclassi in seguito, e potresti non voler aggiungere più tipi ai valori blocca ogni volta che lo fai. Potresti considerare semplicemente filtrando la lavori e il bene e il bene, quindi:
SELECT ?id ?title ?type
WHERE
{
?asset rdf:type Asset ;
somePrefix:id ?id ;
somePrefix:title ?title ;
rdf:type ?type .
filter ( ?type != Asset && ?type != CreativeWork )
}
.
Puoi anche fare quel filtro con:
filter ( ?type NOT IN ( Asset, CreativeWork ) )
.
Ottenere solo lezioni massimamente specifiche
Questo non ha alcuna garanzia su quali classi You You potrebbero , però, e se in seguito aggiungi sottoclassi dell'articolo o di pubblicazione, ad esempio, JournalArticelle ⊑ Articolo, allora otterresti risultati includere sia l'articolo che il giornalino, e potresti non volerlo. Quello che potresti voler invece, è la classe "più specifica" per un individuo. Cioè, vuoi la classe c di un individuo tale che l'individuo non ha altri tipo d ⊑ c. (nota che altri c'è importante, dal momento che c ⊑ c .) L'idea generale viene catturata in Come ottenere il sottostruttore meno comune in ontologia usando la query sparql? , insieme ad alcune altre domande , ma è facile riprodurre la parte importante qui:
SELECT ?id ?title ?type
WHERE
{
?asset rdf:type Asset ;
somePrefix:id ?id ;
somePrefix:title ?title ;
rdf:type ?type .
filter not exists { # Don't take ?type as a result if
?asset rdf:type ?subtype . # ?asset has some other ?subtype
?subtype rdfs:subClassOf* ?type . # that is a subclass of ?type
filter ( ?subtype != ?type ) # (other than ?type itself).
}
}
.
Questo ti porterà la classe "più profonda" nella gerarchia che un individuo ha. Questo potrebbe ancora restituire molteplici risultati, se il tuo individuo è un membro di lezioni tali che nemmeno una sottoclasse dell'altro. Naturalmente, in tal caso, probabilmente saresti ancora interessato a tutti i risultati.
Altri suggerimenti
Stai ricevendo questa output, perché le tue risorse sono tutte bensse e creative, e possono anche essere articoli o pubblicazioni.Se si desidera stampare solo le sottoclassi di Asset, è possibile utilizzare la seguente query per limitare i valori di ?type
(come il tuo con una linea extra):
SELECT ?id ?title ?type
WHERE
{
?asset rdf:type Asset ;
somePrefix:id ?id ;
somePrefix:title ?title ;
rdf:type ?type .
?type rdfs:subClassOf Asset .
}
.
Dove rdfs
è il prefisso del namespace di http://www.w3.org / 2000/01 / rdf-schema # .
.
Significa che il ?type
dovrebbe essere solo una sottoclasse di risorse.
La prima restrizione (generacodictagcode) non è effettivamente necessaria, ma la lascio per chiarezza, dal momento che lo hai nella tua domanda iniziale.Puoi tranquillamente saltarelo però.