0

我有以下 RDF:

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
   xmlns:ppl="http://www.blah.com/people#">

    <rdfs:Class rdf:ID="Person">
        <ppl:Name/>
        <ppl:LastName/>
    </rdfs:Class>

    <rdfs:Class rdf:ID="John">
        <rdfs:subClassOf rdf:resource="#Person"/>
        <ppl:name>John</ppl:name>
        <ppl:LastName>Smith</ppl:LastName>
    </rdfs:Class>
</rdf:RDF>

这看起来不错,但我想避免做一个 subClassOf John 的可能性。例如,这不应该工作:

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
   xmlns:ppl="http://www.blah.com/people2#">

    <rdfs:Class rdf:ID="Person">
        <ppl:Name/>
        <ppl:LastName/>
    </rdfs:Class>

    <rdfs:Class rdf:ID="John">
        <rdfs:subClassOf rdf:resource="#Person"/>
        <ppl:name>John</ppl:name>
        <ppl:LastName>Smith</ppl:LastName>
    </rdfs:Class>

    <rdfs:Class rdf:ID="Peter">
        <rdfs:subClassOf rdf:resource="#John"/>
        <ppl:name>Peter</ppl:name>
        <ppl:LastName>Smith</ppl:LastName>
    </rdfs:Class>
</rdf:RDF>

我该如何添加该限制?

编辑:

cygri的回答之后,我尝试了一种不同的方法:

<rdf:Description ID="John">
    <rdf:type rdf:resource="#Person"/>
    <ppl:name>John</ppl:name>
    <ppl:LastName>Smith</ppl:LastName>
</rdf:Description>

<rdf:Description ID="Peter">
    <rdf:type rdf:resource="#John"/>
    <ppl:name>Peter</ppl:name>
    <ppl:LastName>Smith</ppl:LastName>
</rdf:Description>

但这仍然有效:(

4

2 回答 2

3

不确定您要做什么。你的造型在我看来很奇怪,为什么约翰是一个班级?John 应该是 Person 类型的个人。(而且您不能拥有个人的子类,因此将 John 更改为个人也可以回答您关于防止子类化的问题。)

更新: RDF 本身并不能阻止您说无意义的事情。所以你仍然可以解析、序列化和查询你的数据,即使它是无意义的。但是您可以使用 OWL 一致性检查器来验证您的本体。在这种特殊情况下,您必须检查本体是否在 OWL DL 中。(OWL DL 是 OWL 的变体,它引入了个人不能拥有子类等限制。在 OWL Full 中,这是允许的,除非您添加Class类与类不相交的约束Person

于 2010-07-01T21:31:50.337 回答
3

你仍然把约翰当作一个班级。你想要这样的东西:

<rdf:RDF
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
   xmlns:ppl="http://www.blah.com/people#">

    <rdfs:Class rdf:ID="Person" />

    <rdf:Description rdf:ID="John">
        <rdf:type rdf:resource="#Person"/>
        <ppl:name>John</ppl:name>
        <ppl:LastName>Smith</ppl:LastName>
    </rdf:Description>

</rdf:RDF>

rdfs:subClassOf 和 rdf:type 是不同类型的关系。

rdfs:subClassOf 可用于说明所有的人都是哺乳动物,所有的哺乳动物都是动物。

rdf:type 用于说明,比如说,约翰是一个人(约翰是哺乳动物和动物)。

值得一提的是,semanticoverflow.com 也是询问 RDF 相关问题的好地方。

于 2010-07-08T17:52:30.447 回答