Несколько значений напечатаны для RDF: TYPE
Вопрос
Я создал класс 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
Конечно, вы можете определить другие подклассы позже, и вы, возможно, не захотите добавить больше типов на значения
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
) на самом деле не требуется, но я оставляю его для ясности, так как у вас его в вашем первоначальном запросе.Вы можете безопасно пропустить его, хотя.