Укажите несколько типов 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))
}

Обратите внимание, что я не могу гарантировать эффективность, так как я не знаю, будет ли фильтрация применяться после того, как все результаты будут возвращены или нет.