例如,A类的所有个体只能在一个位置B--一个实例上使用。我想把'A类'在(onlyexact 1)[位置B]使用。但是这个约束似乎只能在类之间保持。如何才能做到不创建一个 "位置B "这个实例的空类?
谢谢。
如果你想说,所有类的实例 A
位于实例 B
而且只在 B
,你可以用下面的方法来实现(Turtle语法)。
:A a owl:Class;
rdfs:subClassOf [
a owl:Restriction;
owl:allValuesFrom [
a owl:Class;
owl:oneOf ( :B )
]
], [
a owl:Restriction;
owl:onProperty :location;
owl:hasValue :B
] .
但是,请注意,这个名为 B
可能有其他的名字,所以如果你知道。
:x a :A;
:location :C, :D .
那么你就可以得出结论: C
和 D
是另外两个名字 B
. 如果你希望这被发现是一个错误,你可以明确表示 C
和 D
命名不同 B
:
:B owl:differentFrom :C, :D .
或者你可以使用像SHACL这样的约束语言,或者你可以依靠唯一名称假设(UNA)来进行你的推理程序(但是,标准OWL并没有做出UNA,所以你不能期望外部数据符合这个假设)。
也请注意,如果你想描述一个数据的约束,比如,当某个实体是已知的 A
那么,在数据中必须有这样的声明:它位于 B
你需要使用像SHACL这样的约束语言(它描述了数据是如何 应是 形成的),而不是OWL这样的知识表示语言(它描述的是世界如何被 是).