【问题标题】:How to retrieve elements of OWL enumerated datatype expression?如何检索 OWL 枚举数据类型表达式的元素?
【发布时间】:2016-05-11 04:27:33
【问题描述】:

我应该使用什么 SPARQL 查询来显示两种数据类型联合的所有值?另外,我如何计算这个数据类型联合中的值的数量?每个数据类型都使用DataOneOf(...) axiom 定义。

编辑:从一些事情开始:我应该使用什么 SPARQL 查询来显示所选数据类型的所有值?

【问题讨论】:

    标签: sparql rdf owl


    【解决方案1】:

    将来,如果您能提供我们可以处理的最少数据,这会容易得多。这也将使问题更清楚一些。据我了解,您已经使用 dataOneOf 构造定义了一些数据类型来枚举多个文字。首先,让我们创建一些示例数据。这是一个具有两个属性的 OWL 本体,每个属性都有一个枚举数据类型表达式作为其范围。其中一个有 {"one", "two"} 作为范围,另一个有 {1, 2}:

    @prefix :      <http://example.org/datatypes#> .
    @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix owl:   <http://www.w3.org/2002/07/owl#> .
    @prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
    @prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
    
    :p1     a           owl:DatatypeProperty ;
            rdfs:range  [ a          rdfs:Datatype ;
                          owl:oneOf  [ a          rdf:List ;
                                       rdf:first  1 ;
                                       rdf:rest   [ a          rdf:List ;
                                                    rdf:first  2 ;
                                                    rdf:rest   ()
    
                                                  ]
                                     ]
                        ] .
    
    :p2     a           owl:DatatypeProperty ;
            rdfs:range  [ a          rdfs:Datatype ;
                          owl:oneOf  [ a          rdf:List ;
                                       rdf:first  "one" ;
                                       rdf:rest   [ a          rdf:List ;
                                                    rdf:first  "two" ;
                                                    rdf:rest   ()
    
                                                  ]
                                     ]
                        ] .
    

    请注意,数据类型表达式中的可能值列表以 RDF 列表的形式给出。使用属性路径查询 RDF 列表是最简单的,在 Stack Overflow 上还有很多其他示例。以下是查询的样子,它将检索数据类型及其每个元素以及这些元素的数据类型(如果您也想要的话)。

    prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    prefix owl:   <http://www.w3.org/2002/07/owl#>
    prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#>
    
    select ?dt ?element ?elementType {
      ?dt a rdfs:Datatype ;
          owl:oneOf/rdf:rest*/rdf:first ?element .
      bind(datatype(?element) as ?elementType)
    }
    
    ---------------------------------------------------------------
    | dt   | element | elementType                                |
    ===============================================================
    | _:b0 | "one"   | <http://www.w3.org/2001/XMLSchema#string>  |
    | _:b0 | "two"   | <http://www.w3.org/2001/XMLSchema#string>  |
    | _:b1 | 1       | <http://www.w3.org/2001/XMLSchema#integer> |
    | _:b1 | 2       | <http://www.w3.org/2001/XMLSchema#integer> |
    ---------------------------------------------------------------
    

    请注意,此类数据类型通常由空白节点表示,这意味着它们没有关联的 IRI。例如,在这种情况下,它们显示为 _:b0 和 _:b1。不过,希望您有一些方法来识别您感兴趣的特定数据类型表达式,例如,通过询问某些特定属性的范围或类似的方法。

    【讨论】:

    • 对于您的出色回答,我有一个小问题。 ?dt 一个 rdfs:数据类型;选择本体中的所有枚举。我该如何修改它,以便从您的示例(而不是其他示例)中仅绑定 p1 和 p2 的元素?
    • @Annabelle 它们不是“p1 和 p2 的元素”,而是 p1 和 p2 范围的值。在这种情况下,您可以将values ?p { :p1 :p2 } ?p rdfs:range ?dt . 添加到查询中。也就是说,您只需要 ?dt 值,即指定属性 ?p 的 rdfs:range,这些值设置为 :p1 或 :p2。
    • 我确实混淆了这个问题,但这是不正确的: DatatypeDefinition( :A DataOneOf( "a1" "a2" ) ) DatatypeDefinition( :B DataOneOf( "b1" "b2" ) ) DatatypeDefinition ( :C DataOneOf( "c1" "c2" ) ) 选择 ?dt ?element ?elementType { ?dt a rdfs:Datatype ; owl:oneOf/rdf:rest*/rdf:first ?element 。绑定(数据类型(?元素)作为?元素类型)。值 ?p { my:A my:C } ?p rdfs:range ?dt }
    • @Annabelle 我将检索方法基于我提供的本体。如果数据类型由 IRI 识别,当然还有其他方法可以选择数据类型。在您的情况下,如果您只想将 ?dt 设为 A 或 B,它看起来就像是 values ?dt {:A :B }
    • @annaBelle 如果你展示你所拥有的本体,我们实际上能够解决这个问题,但是如果没有一些真实的数据,这不是一个真正可以检查的问题
    猜你喜欢
    • 2020-05-04
    • 2022-01-26
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    相关资源
    最近更新 更多