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?

È stato utile?

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ò.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top