Вопрос

Я создал класс Asset, который является подклассом http://schema.org/creativework У актив есть 2 подклассы говорят, что статья и публикация

Теперь у меня были бы экземпляры только класса статьи или публикации. Актив - это абстрактный класс.

Когда я печатаю метаданные для статьи или публикации, я также Хотите распечатать тип актива.В этом случае это будет статья или публикация.

Я запускаю следующий запрос

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

Теперь вместо типа печати в качестве статьи или публикации для каждого актива я получаю несколько значений в RDF: Type. Пример

 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
.

Я хочу как-то печатать только статью или публикацию в столбце Тип

Как я могу добиться этого?

Это было полезно?

Решение

Как я понимаю тебя, иерархия вашего класса:

CreativeWork
  Asset
    Article
    Publication
.

У вас есть несколько вариантов.

Получение ничего, кроме Статья и публикация

Самый простой состоит в том, чтобы сказать, что вы хотите учитывать только значения? Тип, которые являются статьями и публикацией, в этом случае вы можете указать это с помощью значений :

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

Это самая конкретная вещь, которую вы можете сделать, и вам гарантированно, что? Тип будет только статьей или публикацией.

Получение все, кроме CreativeWork и Asset

Конечно, вы можете определить другие подклассы позже, и вы, возможно, не захотите добавить больше типов на значения Значения Блок каждый раз, когда вы это делаете. Вы можете рассмотреть возможность просто отталкивать CreativeWork и Asset, затем:

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

Вы также можете сделать этот фильтр с:

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

Получение только максимально определенных классов

Это не делает никакой гарантии о том, какие классы вы могли бы иметь, хотя, и если вы позже добавите подклассы статьи или публикации, например, статью ⊑ ⊑ статья, то вы получите результаты, которые Включите как статью, так и журнал, и вы, возможно, не захотите этого. То, что вы можете захотеть вместо этого, является «самым конкретным» классом для человека. То есть вы хотите, чтобы класс C индивидуума, такой, что у человека нет ни одного типа d ⊑ C. (обратите внимание, что другие важно, так как C ⊑ C . , но легко воспроизвести важное значение здесь:

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

Это получит вам «самый глубокий» класс в иерархии, что у человека есть. Это все еще может вернуть несколько результатов, если ваш человек является членом классов, таких что ни один подкласс другого. Конечно, в этом случае вы, вероятно, все еще заинтересованы во всех результатах.

Другие советы

Вы получаете этот вывод, потому что ваши активы - все активы и творческие работы, и они также могут быть статьями или публикациями.Если вы хотите напечатать только подклассы актива, вы можете использовать следующий запрос для ограничения значений ?type (то же самое, что и ваше с дополнительной строкой):

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

Где rdfs является префиксом пространства имен http://www.w3.org / 2000/01 / RDF-схема # .
Это означает, что генеракодицетагкод должен быть подклассом только актива.

Первое ограничение (?type) на самом деле не требуется, но я оставляю его для ясности, так как у вас его в вашем первоначальном запросе.Вы можете безопасно пропустить его, хотя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top