【问题标题】:How to define the type of elements in an rdf:Seq?如何定义 rdf:Seq 中元素的类型?
【发布时间】:2015-05-29 12:42:38
【问题描述】:

我想创建一个属性,将rdf:Seq 定义为对象的rdfs:range

eg:myProperty a rdf:Property;
    rdfs:range rdf:Seq;
    .

我正在寻找一种方法来定义存储在rdf:Seq 中的元素的类型。例如,我不想要这个:

eg:typeOfElement a rdf:Class;
    .

eg:somethingElse a rdf:Class;
    .

[] eg:myProperty [
        a rdf:Seq;
        rdf:_1 [a eg:typeOfElement];   # It's the type I want
        rdf:_2 [a eg:typeOfElement];   # It's the type I want
        rdf:_3 [a eg:somethingElse];   # I don't want this type
    ];
    .

当我定义eg:myProperty 时,有没有办法定义rdf:Seq 元素只是eg:typeOfElement 的类型?

(如果需要,我可以使用猫头鹰。)

【问题讨论】:

    标签: syntax rdf owl rdfs turtle-rdf


    【解决方案1】:

    可能有多种方法可以实现这一点,具体取决于您的实施偏好。我的建议是使用rdf:li 特殊属性来代替更容易扩展的任意rdf:_nnnrdf:li 依次相当于 rdf:_1rdf:_2。所以下面的代码块是等价的:

    :mySeq a rdf:Seq;
      rdf:_1 :foo;
      rdf:_2 :bar .
    
    :mySeq a rdf:Seq;
      rdf:li :foo;
      rdf:li :bar .
    

    请注意,第二个块中的顺序很重要。

    要完成您的要求,您可以使用新属性扩展 rdf:li 并优化其域/范围(尽管这些仅对人类读者真正有意义,因为子属性继承了父属性的语义):

    :myItem rdfs:subPropertyOf rdf:li;
      rdfs:range :typeOfElement;
      rdfs:domain :mySeq .
    

    :myItem 继承了rdf:li 的语义,所以无论你有什么实现逻辑都可以推断出:myItem 的值有某种有意义的顺序。接下来通过属性限制定义:mySeq 类:

    :mySeq rdfs:subClassOf [ 
        a owl:Restriction; 
        owl:onProperty :myItem;
        owl:allValuesFrom :typeOfElement;].
    

    它断言:mySeq 是所有事物的类,其中属性:myItem 显式用于:typeOfElement 的值。您现在可以使用:mySeq 创建列表。


    更进一步,您可以将:mySeq 定义为上述规则与rdf:Seq 的交集:

    :mySeq a owl:Class;
        owl:equivalentClass
        [ a owl:Class;
            owl:intersectionOf
              ( rdf:Seq
                [a owl:Restriction;
                 owl:onProperty :myItem;
                 owl:allValuesFrom :typeOfElement ]) ] .
    

    注意使用owl:equivalentClass 代替rdfs:subClassOf。如果我们将owl:equivalentClass 视为对称并被rdfs:subClassOf 包含,例如:

    owl:equivalentClass a owl:SymmetricProperty .
    owl:equivalentClass rdfs:subPropertyOf rdfs:subClassOf .
    

    那么我们可以得到双向的等价。因此,:myItem 的值为:typeOfElement 的所有rdf:Seq 实例也是:mySeq 的实例。在这种情况下,您正在推断类型。所以通过声明:

    :x a rdf:Seq; :myItem :foo, :bar .
    

    你可以推断出:x a :mySeq

    【讨论】:

    • 这只是答案的一部分。我不能说rdf:_n:myItem 中的哪个属性,我将在:mySeq 中使用。我的主要问题是强制:mySeq 只使用:myItem。所以我想我必须定义一个rdf:Seq 的子类或类似的东西。
    • 是的,你是对的。我已经更新了我的答案。希望它能让你走上更好的轨道。还可以查看ordered list ontology,它可能比 rdf 容器更易于使用。
    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 2010-09-25
    • 2021-12-04
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多