我希望这个问题不是微不足道的,我花了相当多的时间寻找答案。 我在OWL中创建了一个本体,我一直在尝试将特定约束强制执行到类描述中,但是不能用OWL提供的工具来执行它,并且在类的描述中使用空白节点作为存在变量。 Protege5不喜欢它。 我想对从一个空间到另一个空间的空间和运动类进行建模,特别是我想建模一个与起始空间作为目标相同空间的运动。 在逻辑中,我将我的InternalMovement类描述为:
InternalMovement = forall ?x exist ?y (Movement(?x) ^ space(?x,?y) ^ direction(?x,?y))
在OWL中,变量不存在,并且似乎不可能在整个类描述中强制执行空白节点的标识。我使用空白节点,因为它们应该被视为存在变量,我希望使用空白节点ID可以解决这个问题。我错了,我不知道如何模拟这个简单的类。 Turtle片段是这样的:
:Movement rdf:type owl:Class .
:Space rdf:type owl:Class .
:direction rdf:type owl:FunctionalProperty ,
owl:ObjectProperty ;
rdfs:domain :Movement ;
rdfs:range :Space .
:space rdf:type owl:FunctionalProperty ,
owl:ObjectProperty ;
rdfs:domain :Movement ;
rdfs:range :Space .
:InternalMovement rdf:type owl:Class ;
owl:equivalentClass [ rdf:type owl:Class ;
owl:intersectionOf ( :Movement
[ rdf:type owl:Restriction ;
owl:onProperty :space ;
owl:hasValue _:sp1
]
[ rdf:type owl:Restriction ;
owl:onProperty :target ;
owl:hasValue _:sp1
]
)
] .
我希望以下个人被归类为InternalMovement,但显然不会。
:internalmovement rdf:type :Movement ,
:space :room1 ;
:direction :room1 .
:room1 rdf:type :Space.
有人可以帮帮我吗? 感谢
答案 0 :(得分:1)
听起来你想要的是通过指定它对两个特定属性具有相同的值来定义一个类。如果OWL支持属性交集(某些描述逻辑),那么你可以编写
InternalMovement≡∃(空间⊓方向)
不幸的是,OWL没有这个。但是,您可以定义属性,该属性是 space 和 target 的子属性并使用它。那就是:
spaceAndDirection⊑space
spaceAndDirection⊑目标
InternalMovement≡∃spaceAndDirection
这意味着如果x是一个InternalMovement,那么存在一个y,使得spaceAndDirection(x,y),然后从子属性公理,我们可以推断空间(x,y)和方向(x,y)。
这将照顾你想要的一些东西,但不是全部。如果您只知道某些运动x有一些y作为空格和方向,您仍然无法推断spaceAndDirection(x,y),因此您无法推断x是一个InternalMovement。
如果添加基数公理,即运动只有一个空格且只有一个方向,那么你可以确保如果x的y为其空间和方向,那么如果它有一个spaceAndDirection值,那个值必须是y。
如果你还添加了(最小或精确)基数公理,即InternalMovement(至少或确切地说)有一个spaceAndDirection值,那么如果x是一个InternalModement,那么从以下任意两个中,你可以推断出第三个:< / p>