如何基于属性值而不是类编写RDF域和范围限制

如何基于属性值而不是类编写RDF域和范围限制,rdf,owl,Rdf,Owl,我有以下案例,我正在尝试为其编写RDF/OWL规则。目标是改进结果数据库中的一致性检查 我有一个叫做“表达式”的类和一个叫做“显化”的类,它们可以通过“显化”来关联 因此,很容易对域和范围进行相应的限制,使“hasExamification”的域为“Expression”,范围为“Examification” 但我想更进一步 表达式和显示有一个称为结构级别、级别1、2、3、4的属性 因此,一级的表达应该始终通过“hasExamification”与一级的“Examification”相关联,而不

我有以下案例,我正在尝试为其编写RDF/OWL规则。目标是改进结果数据库中的一致性检查

我有一个叫做“表达式”的类和一个叫做“显化”的类,它们可以通过“显化”来关联

因此,很容易对域和范围进行相应的限制,使“hasExamification”的域为“Expression”,范围为“Examification”

但我想更进一步

表达式和显示有一个称为结构级别、级别1、2、3、4的属性

因此,一级的表达应该始终通过“hasExamification”与一级的“Examification”相关联,而不是在二级、三级等等

同样地,2级表达应该始终与2级表现相关,而不是与1级或3级表现相关,以此类推

因此,我想为“hasExamification”的域和范围编写一个规则,如下所示:

范围:Y必须是一个显示,如果域的值是Z级,那么Y必须是Z级

域:X必须是表达式,如果范围的值为Z级,则X为X级

我想我可以在谓词逻辑中这样写:E=表达式,M=表现,L=级别,R=范围,D=域

范围:
y(My和(xz)(Dx和Lxz)->(Lyz))

域:
x(Ex和(yz)(Ry和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)))
乌龟:

@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
                    ]
          ]
] .

依此类推(无需修改现有的域和范围表达式,因为多个公理已经暗示了类表达式的交集)。

您可以使用
hasValue
限制来表达这一点,但不能在属性的域和范围级别进行限制-将其限制在属性上需要每个级别的属性

因此,您可以创建一个通用的概念包含公理,大致如下:

(<urn:test:Expression> and (<urn:test:hasLevel> value 1)) subclassOf
    (<urn:test:hasManifestation> some (<urn:test:Manifestation> and (<urn:test:hasLevel> value 1)))
乌龟:

@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
                    ]
          ]
] .

以此类推(无需修改现有的域和范围表达式,因为多个公理已经暗示了类表达式的交集)。

只需使用SWRL,您就完成了,而不是试图在本体本身中编写此规则,只需在SWRL中为推理机提供一组额外的规则?你能为我在SWRL中想要的规则举个例子吗?我在protege expression(?a)^HasImpression(?a,?man)^hasLevel(?a,?level)->hasLevel(?man,?level)中写了一些类似的东西,它似乎可以正确推断出显化级别,但如果设置了不一致的级别,protege不会给出任何错误,例如,手动将显示级别设置为2,当它应该为1时,只需使用SWRL,您就可以在本体中编写此规则,而不是尝试在SWRL中为推理机提供一组额外的规则?你能为我在SWRL中想要的规则举个例子吗?我在protege expression(?a)^HasImpression(?a,?man)^hasLevel(?a,?level)->hasLevel(?man,?level)中写了一些类似的东西,它似乎可以正确推断出显化级别,但如果设置了不一致的级别,protege不会给出任何错误,例如,手动将显示级别设置为2,此时显示级别应为1千克。我想这是我真正想避免的第二个选择。为每个级别创建一个新属性似乎既烦人又多余。所以我更喜欢第一种解决方案。我想大多数人都能理解,但我对“subassof”的用法感到困惑。在这个公理中,什么被宣布为什么的子类?还有,如果你有时间的话,你愿意给我展示一下我的TTL语法中的公理是什么吗?例如,我需要使用OWL:Restriction吗?一般概念包含或简称GCI意味着
子类
术语的两侧都有类表达式-这是一个规则的子类公理,从结构上讲,唯一的区别是左侧没有IRI。它们在推理性能和本体的可读性方面具有重要意义,因此您可以选择在左侧定义IRI。使用
owl:Restriction
是对Turtle和RDF/XML的纯语法约束,正如你所看到的,它并没有出现在其他语法中。我在GCI的:)@Ignazio上找到了这篇有用的帖子。谢谢你的帮助和扩展的例子。我应该期望Protege的推理者能够执行这条公理吗?我认为我已经正确地实现了GCI,但是如果我将其中一个hasLevel值更改为2,Protege推理机不会抱怨不一致。(如果Protege抱怨,我会用屏幕截图创建一个新问题)非常感谢。我想这是我真正想避免的第二个选择。为每个级别创建一个新属性似乎既烦人又多余。所以我更喜欢第一种解决方案。我想大多数人都能理解,但我对“subassof”的用法感到困惑。在这个公理中,什么被宣布为什么的子类?还有,如果你有时间的话,你愿意给我展示一下我的TTL语法中的公理是什么吗?例如,我需要使用OWL:Restriction吗?一般概念包含或简称GCI意味着
子类
术语的两侧都有类表达式-这是一个规则的子类公理,从结构上讲,唯一的区别是左侧没有IRI。它们在推理性能和本体的可读性方面具有重要意义,所以您可以选择定义