如果他们有同一个父亲,我需要推断一个人是另一个人的兄弟。
所以,如果我有这个:
巴特有父亲。Lisa hasFather Homer。
因为Bart
和Lisa
拥有相同的父亲,我想推断:
丽莎有兄弟。
使用任何属性特征是否有任何方法可以做到这一点?
答案 0 :(得分:8)
Antoine Zimmermann's answer是解决这个问题的一个非常好的开端,并触及了解决此类任务所需的主要问题:
从 x 到每个 x 兄弟,有一条路径 hasFather o hasFather -1 < / em>的
但是,现在,这实际上不仅仅是兄弟。这对所有兄弟姐妹和 x 本身都是如此。这意味着您将拥有 hasSibling 的以下定义:
hasSibling≡hasFathero hasFather -1
(实际上,那只是 hasPaternalSibling ;更精确的定义会使用 hasParent 。)现在,使用这个,你可以要求兄弟,这些兄弟只是兄弟姐妹是 x 的男性,其查询类似于:
(hasSibling值x)和Man
但是, 很好地定义了正确的 hasBrother 属性。如果你有一个特殊的属性将每个 Man 链接到他自己,并且只将男性链接到自己,你可以使用属性链和 hasSibling 执行此操作:
hasBrother≡hasSiblingo specialProperty
事实上,这样的属性就是我们从一种名为 rolification 的技术中获得的,已经在一个问题OWL 2 rolification及其答案中对此进行了更详细的描述。我们的想法是,对于类 Man ,我们创建一个新属性 r Man 并添加等价:
男人≡r男人一些自我
表示每个 Man 与 r Man 属性以及仅个实例相关联 Man 是如此连接。这正是我们上面的 specialProperty 所需的属性。因此,我们最终得到以下 Man , hasSibling 和 hasBrother 的定义:
现在我们可以通过以下查询来询问 x 的兄弟:
hasBrother -1 value x
例如,我们可以要求 Greg 的兄弟姐妹,并获得 Peter , Greg (他自己)和 Bobby
这是Turtle中的本体论:
@prefix : <http://www.example.org/brady#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix brady: <http://www.example.org/brady#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
brady:hasSibling a owl:ObjectProperty ;
owl:propertyChainAxiom ( brady:hasFather [ owl:inverseOf
brady:hasFather ] ) .
brady:Carol a owl:NamedIndividual , brady:Woman .
brady:hasBrother a owl:ObjectProperty ;
owl:propertyChainAxiom ( brady:hasSibling brady:r_Man ) .
<http://www.example.org/brady>
a owl:Ontology .
brady:Woman a owl:Class ;
rdfs:subClassOf brady:Person ;
owl:equivalentClass [ a owl:Restriction ;
owl:hasSelf true ;
owl:onProperty brady:r_Woman
] .
brady:hasFather a owl:ObjectProperty .
brady:Person a owl:Class .
brady:Man a owl:Class ;
rdfs:subClassOf brady:Person ;
owl:equivalentClass [ a owl:Restriction ;
owl:hasSelf true ;
owl:onProperty brady:r_Man
] .
brady:r_Woman a owl:ObjectProperty .
brady:r_Man a owl:ObjectProperty .
brady:Marcia a owl:NamedIndividual , brady:Woman ;
brady:hasFather brady:Mike .
brady:Peter a owl:NamedIndividual , brady:Man ;
brady:hasFather brady:Mike .
brady:Jan a owl:NamedIndividual , brady:Woman ;
brady:hasFather brady:Mike .
brady:Cindy a owl:NamedIndividual , brady:Woman ;
brady:hasFather brady:Mike .
brady:Bobby a owl:NamedIndividual , brady:Man ;
brady:hasFather brady:Mike .
brady:Greg a owl:NamedIndividual , brady:Man ;
brady:hasFather brady:Mike .
brady:Mike a owl:NamedIndividual , brady:Man .
答案 1 :(得分:2)
假设每个人都是他们自己的兄弟,姐妹也是兄弟:
:hasBrother owl:propertyChainAxiom (:hasFather [ owl:inverseOf :hasFather ]) .
几乎不可能定义:更准确地说,更为精确,不包括女性兄弟和自我兄弟情谊。但你可以推断Lisa的所有兄弟如下:
:Female a owl:Class .
:Male a owl:Class;
owl:disjointWith :Female .
:Lisa a :Female .
:Bart a :Male .
:Homer a :Male .
:hasFather a owl:ObjectProperty;
rdfs:range :Male .
:hasBrother a owl:ObjectProperty;
rdfs:range :Male .
:hasSiblingOrSelf owl:propertyChainAxiom ( :hasFather [ :hasFather ] ) .
:LisaBrother owl:equivalentClass [
a owl:Restriction;
owl:onProperty [ owl:inverseOf :hasBrother ];
owl:hasValue :Lisa
], [
a owl:Class;
owl:intersectionOf (
[ a owl:Restriction; owl:onProperty :hasSiblingOrSelf; owl:hasValue :Lisa ]
:Male
)
] .
答案 2 :(得分:1)
一种解决方法是使用SWRL规则。
处于保护状态:
编写规则:
isChildOf(?x,?y)^FatherOf(?y,?z)^differentFrom(?z,?x)->isBrotherOf(?x,?z)
这意味着,如果“ x是y的子代”,并且“ y也是z的父代”且“ z和x不同”,则“ z和x是兄弟”。
答案 3 :(得分:0)
兄弟是男性兄弟姐妹。因此,我们应该同时定义“男性”和“兄弟姐妹”。但是,由于同胞本身就是同一父母的异同孩子,因此也应该定义自己是孩子。为简单起见,我们将同父异母的兄弟姐妹视为同胞兄弟,将域限制为人类,并将诸如母性和父性之类的相关概念的明确定义放在一边。
Human
类Gender
类不相交的Human
类。创建male
和female
作为实例化Gender
类型的个人(还有其他方法可以做到这一点,但这很简单)。hasGender
对象属性,将Human
作为域,将Gender
作为其范围Man
类作为Human
的子类。使其等同于Human and (hasGender value male)
。isChildOf
对象属性(可选:将Child
类定义为与isChildOf some Human
等效的human子类型。您可以通过类似的方式还创建对象属性,然后创建Mother
,Parent
,Daughter
等的类。isSiblingOf
创建一个不自反的,对称的Human
对象属性。isChildOf(?sibling1, ?parent) ^ isChildOf(?sibling2, ?parent) ^ differentFrom(?sibling1, ?sibling2) -> isSiblingOf(?sibling1, ?sibling2)
您可能还想添加规则,以便从同级关系中推断出什么,例如isSiblingOf(?x, ?y) ^ isChildOf(?x, z?) -> isChildOf(?y, ?z)
isBrotherOf
和范围Man
创建Human
对象属性Man(?x) ^ isSiblingOf(?x, ?y) -> isBrotherOf(?x, ?y)
isBrotherOf(?x, ?y) -> Man(?x)
isBrotherOf(?x, ?y) -> isSiblingOf(?x, ?y)
第一个规则规定,任何男性兄弟姐妹都是兄弟。第二个和第三个从兄弟情谊中推断出男性和同胞。
Brother
等效的isBrotherOf some Human
类,以完成滚动过程。