首页 文章

在 SPARQL 查询中指定多个 rdf:types

提问于
浏览
12

我有这样的 SPARQL 查询

PREFIX prefix: <http://example.org/ns#>
SELECT *
WHERE 
{
    ?x rdf:type ?type .
}

假设现在我想将?type的类型指定为prefix:type1prefix:type2;该怎么做?

3 回答

  • 13

    FILTER IN函数快得多的是使用BINDINGS。我强烈建议使用以下查询而不是FILTER(?type IN (wo:Kingdon, wo:Phylum)的内容。

    SELECT * WHERE { ?x rdf:type ?type } BINDINGS ?type {(prefix:type1) (prefix:type2)}
    

    使用BINDINGS允许 SPARQL 引擎在处理结果时限制结果,而不是在过滤之前返回所有结果。这样可以更快地返回结果。

  • 12

    你可以使用UNION e.g.

    PREFIX prefix: <http://example.org/ns#>
    SELECT *
    WHERE {
        { ?x a prefix:type1 } UNION { ?x a prefix:type2 }
    }
    

    注意使用a这是一个 SPARQL 关键字,可以在谓词位置使用并对应于 RDF 类型 URI 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 语法执行此操作,如下所示:

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

    请注意,我不能保证效率,因为我不知道在所有结果将被退回后是否适用过滤。

相关问题