【问题标题】:retrieving a blank node used as a type检索用作类型的空白节点
【发布时间】:2017-12-31 11:02:23
【问题描述】:

我有一个类似的本体:

:indi_1 a :Segment; a [ :builds only {:indi_2}]; :hasID 1.

现在我想找到indi_1 构建的个人。 我做了以下查询:

SELECT distinct ?a
WHERE {:indi_1 a ?b. ?b a _:blankNode}

但我仍然在我的结果中得到该段。另外,我无法进入空白节点以检索indi_2

我应该如何构建我的查询?

【问题讨论】:

    标签: sparql rdf owl ontology blank-nodes


    【解决方案1】:

    我不知道您为什么希望 ?b a :blankNode 要求 ?b 是空白节点。 :blankNode 是一个空白节点,它在像这样的 SPARQL 查询中充当一个变量,所以它只要求 ?b 具有某种类型。您的书面查询甚至不合法。看起来您想要的是:indi_1 a ?b . ?b a _:blankNode(注意.,而不是;)。

    无论如何,要检查是否有空白节点,请查看SPARQL 1.1 spec,并注意有一个isBlank 函数。这就是您用来过滤结果的方法。你会有这样的东西:

    select * {
      ?a a ?b 
      filter isBlank(?b)
    }
    

    但是,如果您真正要查找的是个人列表,您实际上需要更仔细地查看数据的 RDF 序列化。您实际上并不关心 ?b 是否为空白,而是它是具有正确属性的限制。来自如下公理:

        :a 仅构建 {:b, :c}

    你最终会得到这样的 RDF:

    :a      a       owl:NamedIndividual , owl:Thing ;
            a       [ a                  owl:Restriction ;
                      owl:allValuesFrom  [ a          owl:Class ;
                                           owl:oneOf  ( :c :b )
                                         ] ;
                      owl:onProperty     :builds
                    ] .
    

    所以你的查询是:

    prefix :      <http://www.example.org/>
    prefix owl:   <http://www.w3.org/2002/07/owl#>
    prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#>
    
    select ?x ?y {
      ?x a [ owl:allValuesFrom [ owl:oneOf/rdf:rest*/rdf:first ?y ] ] .
    }
    
    -----------
    | x  | y  |
    ===========
    | :a | :c |
    | :a | :b |
    -----------
    

    您可以使用更多属性路径稍微清理一下:

    select ?x ?y {
      ?x rdf:type/owl:allValuesFrom/owl:oneOf/rdf:rest*/rdf:first ?y .
    }
    

    OWL 与 RDF 不同。 SPARQL 是一种 RDF 查询语言。 OWL 可以序列化为 RDF,但序列化并不总是那么漂亮,因此 SPARQL 不一定是查询 OWL 的最佳方式,即使 OWL 可以序列化为 RDF。这有点像通过搜索文件中的特定字节或位来搜索文档中的文本。它可能可以工作,但如果有人要更改字符编码,您可能会有相同的文本,但字节或位不同,因此查询可能不再工作。

    【讨论】:

    • 如果本体适合内存并且不需要 CWA,则使用 SPARQL DL 之类的东西。
    • 您建议的查询对我有用。非常感谢!据我所知,对于 SPARQL DL,我需要对我的本体进行推理,这是不可能的,因为它太复杂而无法推理。所以我通过编码以一种艰难的方式提取信息,这就是我需要这个查询的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 2016-01-11
    • 2017-12-31
    相关资源
    最近更新 更多