Укажите несколько типов rdf: в запросе SPARQL
У меня есть запрос SPARQL, подобный этому
PREFIX prefix: <http://example.org/ns#>
SELECT *
WHERE
{
?x rdf:type ?type .
}
Предположим теперь, что я хочу указать тип ?type
как либо prefix:type1
, либо prefix:type2
; как это должно быть сделано?
Ответы
Ответ 1
Вы можете использовать UNION
например.
PREFIX prefix: <http://example.org/ns#>
SELECT *
WHERE {
{ ?x a prefix:type1 } UNION { ?x a prefix:type2 }
}
Обратите внимание на использование a
, которое является ключевым словом SPARQL, которое может использоваться в позиции предиката и соответствует URI типа RDF http://www.w3.org/1999/02/22-rdf-syntax-ns#type
Существуют и другие способы сделать это, например, с помощью предложений FILTER
с различными выражениями:
- Серия
?type = prefix:type1
в сочетании с условным или оператором ||
-
?type IN (prefix:type1, prefix:type2)
Или вы можете использовать предложение VALUES
, чтобы указать параметры для ?type
Это может быть лучше, если ваш запрос более сложный, и вы не хотите дублировать большую часть запроса на обеих сторонах UNION
или иметь больше двух возможных возможностей.
Ответ 2
Гораздо быстрее, чем функция FILTER IN
- это использование BINDINGS
. Я настоятельно рекомендую использовать что-то по строкам следующего запроса, а не FILTER(?type IN (wo:Kingdon, wo:Phylum)
.
SELECT * WHERE { ?x rdf:type ?type } BINDINGS ?type {(prefix:type1) (prefix:type2)}
Использование BINDINGS
позволяет механизму SPARQL ограничить результаты по мере их обработки, а не возвращать все результаты перед их фильтрацией. Это значительно ускоряет возврат результатов.
Ответ 3
Вы можете сделать это, используя синтаксис FILTER, например:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX prefix: <http://example.org/ns#>
SELECT ?s ?p ?o ?type
WHERE {
?s a ?type .
?s ?p ?o .
FILTER(?type IN (prefix:Type1, prefix:Type2))
}
Обратите внимание, что я не могу гарантировать эффективность, так как я не знаю, будет ли фильтрация применяться после того, как все результаты будут возвращены или нет.