【问题标题】:Specify multiple rdf:types in a SPARQL query在 SPARQL 查询中指定多个 rdf:types
【发布时间】:2013-04-15 22:03:02
【问题描述】:

我有一个这样的 SPARQL 查询

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

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

【问题讨论】:

    标签: rdf sparql


    【解决方案1】:

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

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

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

    【讨论】:

    • 它不再是 BINDINGS;这是价值观。不过,这种方法比使用 UNION 的方法更好,也比使用 FILTER(?type IN ...) 更好。
    【解决方案2】:

    您可以使用UNION,例如

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

    注意a的使用,这是一个SPARQL关键字,可以用在谓词位置,对应于RDF类型URIhttp://www.w3.org/1999/02/22-rdf-syntax-ns#type

    还有其他方法可以做到这一点,例如使用带有各种表达式的FILTER 子句:

    • ?type = prefix:type1 系列与条件或运算符组合||
    • ?type IN (prefix:type1, prefix:type2)

    或者您可以使用VALUES 子句来指定?type 的选项

    如果您的查询更复杂,并且您不想将大部分查询复制到 UNION 的两侧,或者有两个以上的可能性需要考虑,那么这些可能会更好。

    【讨论】:

    • “?type in”看起来很有趣,但它不起作用,我肯定在语法上犯了错误,对吗? SELECT * WHERE { ?x rdf:type ?type ?type in (wo:Kingdom, wo:Phylum) }
    • 这些是可以在FILTER 子句中使用的表达式,所以它是FILTER(?type IN (wo:Kingdon, wo:Phylum))
    【解决方案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))
    }
    

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

    【讨论】:

      【解决方案4】:

      正如 Joshua 所说,在 SPARQL 1.1 中接受的答案不再准确。

      在 SPARQL 1.1 中,可以使用 VALUES 关键字,但对于像这样的用例,语法看起来更复杂。但是,您也可以将其写成紧凑的形式:

      SELECT * WHERE {
        VALUES ?type { prefix:Type1 prefix:Type2 }
        ?x rdf:type ?type
      }
      

      【讨论】:

        猜你喜欢
        • 2022-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        相关资源
        最近更新 更多