如何根据 属性 值而不是 class 编写 RDF 域和范围限制
how to write RDF domain and range restriction based on property value rather than class
我有以下案例,我正在尝试为其编写 RDF/OWL 规则。目标是改进结果数据库中的一致性检查。
我有一个叫 "Expression" 的 class 和一个叫 "Manifestation" 的 class,它们可以通过 "hasManifestation" 联系起来。
很容易相应地限制域和范围,因此 "hasManifestation" 的域是 "Expression",范围是 "Manifestation"。
但我想更进一步。
表达式和表现形式有一个 属性 称为结构级别,级别 1、2、3、4
因此,第 1 级的表达式应始终通过 "hasManifestation" 与同样处于第 1 级的 "Manifestation" 相关,永远不要与第 2、3 级等相关。
同样,第 2 级的表达应该始终与第 2 级的表现形式相关,而不应与第 1 级或第 3 级的表现相关,等等。
所以我想为 "hasManifestation" 的域和范围编写如下规则:
范围:Y 必须是一个表现形式,如果域的值是 Z 级,那么 Y 必须是 Z 级
域:X 必须是表达式,如果范围的值是级别 Z,则 X 是级别 X。
我想我可以在谓词逻辑中这样写:E = expression, M=manifestation, L=level, R=Range, D=Domain
范围:y(My and (xz)(Dx and Lxz) -> (Lyz))
域:x(Ex and (yz)(Ry and Lyz) -> (Lxz))
我可能在某个地方搞砸了,但希望你明白我想做什么。
但是我怎么能把它写成 ttl 中的 OWL 语句呢?
非常感谢任何建议。
您可以使用 hasValue
限制来表达这一点,但不能在 属性 的域和范围级别 - 在 属性 上限制它需要 属性每个级别。
因此,您可以按照以下行创建一个通用概念包含公理:
(<urn:test:Expression> and (<urn:test:hasLevel> value 1)) subclassOf
(<urn:test:hasManifestation> some (<urn:test:Manifestation> and (<urn:test:hasLevel> value 1)))
(用曼彻斯特语法重写的示例 - GCI 实际上不能用这种语法编写,但它更容易阅读)
在函数语法中,公理如下所示:
SubClassOf(
ObjectIntersectionOf(
Expression
DataHasValue(hasLevel "1"^^xsd:integer)
)
ObjectSomeValuesFrom(hasManifestation
ObjectIntersectionOf(
Manifestation
DataHasValue(hasLevel "1"^^xsd:integer)
)
)
)
在海龟中:
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://www.w3.org/2002/07/owl#> .
[ rdf:type owl:Ontology] .
<urn:test:hasManifestation> rdf:type owl:ObjectProperty .
<urn:test:hasLevel> rdf:type owl:DatatypeProperty .
<urn:test:Expression> rdf:type owl:Class .
<urn:test:Manifestation> rdf:type owl:Class .
[ owl:intersectionOf ( <urn:test:Expression>
[ rdf:type owl:Restriction ;
owl:onProperty <urn:test:hasLevel> ;
owl:hasValue 1
]
) ;
rdf:type owl:Class ;
rdfs:subClassOf [ rdf:type owl:Restriction ;
owl:onProperty <urn:test:hasManifestation> ;
owl:someValuesFrom [ owl:intersectionOf ( <urn:test:Manifestation>
[ rdf:type owl:Restriction ;
owl:onProperty <urn:test:hasLevel> ;
owl:hasValue 1
]) ;
rdf:type owl:Class
]
]
] .
如果您选择使用多个属性,声明域和范围会更容易,但您必须使用多个属性:
hasManifestation1 domain exist hasLevel (hasValue 1)
hasManifestation1 range exist hasLevel (hasValue 1)
等等(不需要修改现有的域和范围表达式,因为多个公理已经暗示了 class 表达式的交集)。
我有以下案例,我正在尝试为其编写 RDF/OWL 规则。目标是改进结果数据库中的一致性检查。
我有一个叫 "Expression" 的 class 和一个叫 "Manifestation" 的 class,它们可以通过 "hasManifestation" 联系起来。
很容易相应地限制域和范围,因此 "hasManifestation" 的域是 "Expression",范围是 "Manifestation"。
但我想更进一步。
表达式和表现形式有一个 属性 称为结构级别,级别 1、2、3、4
因此,第 1 级的表达式应始终通过 "hasManifestation" 与同样处于第 1 级的 "Manifestation" 相关,永远不要与第 2、3 级等相关。
同样,第 2 级的表达应该始终与第 2 级的表现形式相关,而不应与第 1 级或第 3 级的表现相关,等等。
所以我想为 "hasManifestation" 的域和范围编写如下规则:
范围:Y 必须是一个表现形式,如果域的值是 Z 级,那么 Y 必须是 Z 级
域:X 必须是表达式,如果范围的值是级别 Z,则 X 是级别 X。
我想我可以在谓词逻辑中这样写:E = expression, M=manifestation, L=level, R=Range, D=Domain
范围:y(My and (xz)(Dx and Lxz) -> (Lyz))
域:x(Ex and (yz)(Ry and Lyz) -> (Lxz))
我可能在某个地方搞砸了,但希望你明白我想做什么。 但是我怎么能把它写成 ttl 中的 OWL 语句呢?
非常感谢任何建议。
您可以使用 hasValue
限制来表达这一点,但不能在 属性 的域和范围级别 - 在 属性 上限制它需要 属性每个级别。
因此,您可以按照以下行创建一个通用概念包含公理:
(<urn:test:Expression> and (<urn:test:hasLevel> value 1)) subclassOf
(<urn:test:hasManifestation> some (<urn:test:Manifestation> and (<urn:test:hasLevel> value 1)))
(用曼彻斯特语法重写的示例 - GCI 实际上不能用这种语法编写,但它更容易阅读)
在函数语法中,公理如下所示:
SubClassOf(
ObjectIntersectionOf(
Expression
DataHasValue(hasLevel "1"^^xsd:integer)
)
ObjectSomeValuesFrom(hasManifestation
ObjectIntersectionOf(
Manifestation
DataHasValue(hasLevel "1"^^xsd:integer)
)
)
)
在海龟中:
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://www.w3.org/2002/07/owl#> .
[ rdf:type owl:Ontology] .
<urn:test:hasManifestation> rdf:type owl:ObjectProperty .
<urn:test:hasLevel> rdf:type owl:DatatypeProperty .
<urn:test:Expression> rdf:type owl:Class .
<urn:test:Manifestation> rdf:type owl:Class .
[ owl:intersectionOf ( <urn:test:Expression>
[ rdf:type owl:Restriction ;
owl:onProperty <urn:test:hasLevel> ;
owl:hasValue 1
]
) ;
rdf:type owl:Class ;
rdfs:subClassOf [ rdf:type owl:Restriction ;
owl:onProperty <urn:test:hasManifestation> ;
owl:someValuesFrom [ owl:intersectionOf ( <urn:test:Manifestation>
[ rdf:type owl:Restriction ;
owl:onProperty <urn:test:hasLevel> ;
owl:hasValue 1
]) ;
rdf:type owl:Class
]
]
] .
如果您选择使用多个属性,声明域和范围会更容易,但您必须使用多个属性:
hasManifestation1 domain exist hasLevel (hasValue 1)
hasManifestation1 range exist hasLevel (hasValue 1)
等等(不需要修改现有的域和范围表达式,因为多个公理已经暗示了 class 表达式的交集)。