Question

J'ai créé une classe Asset qui est une sous-classe de http://schema.org/CreativeWork L'actif a 2 sous-classes, par exemple Article et Publication

Maintenant, j’aurais des instances uniquement de la classe Article ou Publication.L'actif est une classe abstraite.

Lorsque j'imprime les métadonnées pour l'article ou la publication, je souhaite également imprimer le type d'actif.Dans ce cas, il s'agirait d'un article ou d'une publication.

Je lance la requête suivante

SELECT ?id ?title ?type
WHERE
{
   ?asset rdf:type Asset ;
          somePrefix:id ?id ;
          somePrefix:title ?title ;
          rdf:type ?type .
}

Désormais, au lieu d'imprimer le type sous forme d'article ou de publication pour chaque actif, j'obtiens plusieurs valeurs dans rdf:type.Exemple

 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

Je souhaite d'une manière ou d'une autre imprimer uniquement l'article ou la publication dans la colonne type

Comment puis-je atteindre cet objectif ?

Était-ce utile?

La solution

Si je vous comprends, votre hiérarchie de classe est la suivante:

CreativeWork
  Asset
    Article
    Publication

Vous avez quelques options.

Obtenir rien que article et publication

Le plus simple est de dire que vous souhaitez seulement envisager des valeurs de? Tapez qui sont des articles et de la publication, auquel cas vous pouvez spécifier cela avec valeurs :

SELECT ?id ?title ?type
WHERE
{
   values ?type { Article Publication }
   ?asset rdf:type Asset ;
          somePrefix:id ?id ;
          somePrefix:title ?title ;
          rdf:type ?type .
}

C'est la chose la plus spécifique que vous puissiez faire et vous êtes assuré que? Type ne sera qu'un article ou une publication.

Obtenir tout sauf créatifwork et actif

Bien sûr, vous pouvez définir d'autres sous-classes plus tard, et vous ne voudrez peut-être pas avoir à ajouter plus de types aux valeurs bloc à chaque fois que vous faites cela. Vous pourriez envisager de filtrer simplement une création créative et un atout, puis:

SELECT ?id ?title ?type
WHERE
{
   ?asset rdf:type Asset ;
          somePrefix:id ?id ;
          somePrefix:title ?title ;
          rdf:type ?type .
   filter ( ?type != Asset && ?type != CreativeWork )
}

Vous pouvez également faire ce filtre avec:

filter ( ?type NOT IN ( Asset, CreativeWork ) )

Obtenir uniquement des classes spécifiques maximales

Cela ne fait aucune garantie sur les classes que vous pourriez-vous avoir et si vous ajoutez ultérieurement des sous-classes d'article ou de publication, par exemple JournalArticle ⊑ article, puis vous obtiendriez des résultats Incluez à la fois l'article et JournalArticle, et vous pourriez ne pas le vouloir. Ce que vous voudrez peut-être plutôt, est la classe "la plus spécifique" pour un individu. C'est-à-dire que vous voulez que la classe C d'un individu tel que l'individu ait notamment d'autres type d ⊑ C. (Notez que les Autres Il est important, car c ⊑ c .) L'idée générale est capturée dans Comment devenir moins minime de substances communes en ontologie à l'aide de la requête SPARQL? , avec d'autres questions , mais il est facile de reproduire la partie importante ici:

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).
   }
}

Ceci vous procurera la classe "la plus profonde" de la hiérarchie qu'un individu a. Cela pourrait toujours retourner plusieurs résultats si votre individu est membre de classes telles que non plus une sous-classe de l'autre. Bien sûr, dans ce cas, vous seriez probablement toujours intéressé par tous les résultats.

Autres conseils

Vous obtenez ce résultat, car vos actifs sont tous des actifs et des CreativeWorks, et ils peuvent également être des articles ou des publications.Si vous souhaitez uniquement imprimer les sous-classes de Asset, vous pouvez utiliser la requête suivante pour restreindre les valeurs de ?type (le même que le vôtre avec une ligne supplémentaire) :

SELECT ?id ?title ?type
WHERE
{
     ?asset rdf:type Asset ;
            somePrefix:id ?id ;
            somePrefix:title ?title ;
            rdf:type ?type .
     ?type rdfs:subClassOf Asset . 
}

rdfs est le préfixe d'espace de noms de http://www.w3.org/2000/01/rdf-schema#.
Cela signifie que le ?type devrait être une sous-classe d’Actif uniquement.

La première restriction (?asset rdf:type Asset) n'est pas réellement nécessaire, mais je le laisse pour plus de clarté, puisque vous l'avez dans votre requête initiale.Vous pouvez cependant l’ignorer en toute sécurité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top