OWL 2 中的 SWRL 规则
SWRL rules in OWL 2
我目前正在探索 Owlready 库的所有可能性。
现在我正在尝试处理一些 SWRL 规则,到目前为止一切顺利,但我卡在了某一点上。
我在我的 ontology 中定义了一些规则,现在我想查看所有结果(因此,从规则推断的所有内容)。
例如,如果我有一个规则
has_brother(David, ?b) ^ has_child(?b, ?s) -> has_uncle(?s, David)
David 有两个兄弟,John 和 Pete,John 的孩子是 Anna,Pete 的孩子是 Simon,我也想看这样的:
has_brother(David, John) ^ has_child(John, Anna) -> has_uncle(Anna, David)
has_brother(David, Pete) ^ has_child(Pete, Simon) -> has_uncle(Simon, David)
这有可能吗?
我想也许如果我 运行 推理器,我可以在它的输出中看到它,但我无法在任何地方找到它。
感谢任何可能的帮助!
这是我的解决方案:
import owlready2 as owl
onto = owl.get_ontology("http://test.org/onto.owl")
with onto:
class Person(owl.Thing):
pass
class has_brother(owl.ObjectProperty, owl.SymmetricProperty, owl.IrreflexiveProperty):
domain = [Person]
range = [Person]
class has_child(Person >> Person):
pass
class has_uncle(Person >> Person):
pass
rule1 = owl.Imp()
rule1.set_as_rule(
"has_brother(?p, ?b), has_child(?p, ?c) -> has_uncle(?c, ?b)"
)
# This rule gives "irreflexive transitivity",
# i.e. transitivity, as long it does not lead to has_brother(?a, ?a)"
rule2 = owl.Imp()
rule2.set_as_rule(
"has_brother(?a, ?b), has_brother(?b, ?c), differentFrom(?a, ?c) -> has_brother(?a, ?c)"
)
david = Person("David")
john = Person("John")
pete = Person("Pete")
anna = Person("Anna")
simon = Person("Simon")
owl.AllDifferent([david, john, pete, anna, simon])
david.has_brother.extend([john, pete])
john.has_child.append(anna)
pete.has_child.append(simon)
print("Uncles of Anna:", anna.has_uncle) # -> []
print("Uncles of Simon:", simon.has_uncle) # -> []
owl.sync_reasoner(infer_property_values=True)
print("Uncles of Anna:", anna.has_uncle) # -> [onto.Pete, onto.David]
print("Uncles of Simon:", simon.has_uncle) # -> [onto.John, onto.David]
备注:
有人可能认为 has_brother
是
- 对称,即
has_brother(A, B)
⇒ has_brother(B, A)
- 传递性,即
has_brother(A, B) + has_brother(B, C) ⇒ has_brother(A, C)
- 非反身性,即没有人是自己的兄弟。
然而,传递性仅在 唯一名称假设 成立时成立。否则 A
可能与 C
是同一个人,这与反身性相冲突。因此,我使用了这种“弱传递性”的规则。
一次,has_brother
像预期的那样工作,叔叔规则也一样。当然推理者必须先运行.
更新:我在this Jupyter notebook中发布了解决方案(其中也包含执行的输出)。
我目前正在探索 Owlready 库的所有可能性。 现在我正在尝试处理一些 SWRL 规则,到目前为止一切顺利,但我卡在了某一点上。
我在我的 ontology 中定义了一些规则,现在我想查看所有结果(因此,从规则推断的所有内容)。
例如,如果我有一个规则
has_brother(David, ?b) ^ has_child(?b, ?s) -> has_uncle(?s, David)
David 有两个兄弟,John 和 Pete,John 的孩子是 Anna,Pete 的孩子是 Simon,我也想看这样的:
has_brother(David, John) ^ has_child(John, Anna) -> has_uncle(Anna, David)
has_brother(David, Pete) ^ has_child(Pete, Simon) -> has_uncle(Simon, David)
这有可能吗? 我想也许如果我 运行 推理器,我可以在它的输出中看到它,但我无法在任何地方找到它。
感谢任何可能的帮助!
这是我的解决方案:
import owlready2 as owl
onto = owl.get_ontology("http://test.org/onto.owl")
with onto:
class Person(owl.Thing):
pass
class has_brother(owl.ObjectProperty, owl.SymmetricProperty, owl.IrreflexiveProperty):
domain = [Person]
range = [Person]
class has_child(Person >> Person):
pass
class has_uncle(Person >> Person):
pass
rule1 = owl.Imp()
rule1.set_as_rule(
"has_brother(?p, ?b), has_child(?p, ?c) -> has_uncle(?c, ?b)"
)
# This rule gives "irreflexive transitivity",
# i.e. transitivity, as long it does not lead to has_brother(?a, ?a)"
rule2 = owl.Imp()
rule2.set_as_rule(
"has_brother(?a, ?b), has_brother(?b, ?c), differentFrom(?a, ?c) -> has_brother(?a, ?c)"
)
david = Person("David")
john = Person("John")
pete = Person("Pete")
anna = Person("Anna")
simon = Person("Simon")
owl.AllDifferent([david, john, pete, anna, simon])
david.has_brother.extend([john, pete])
john.has_child.append(anna)
pete.has_child.append(simon)
print("Uncles of Anna:", anna.has_uncle) # -> []
print("Uncles of Simon:", simon.has_uncle) # -> []
owl.sync_reasoner(infer_property_values=True)
print("Uncles of Anna:", anna.has_uncle) # -> [onto.Pete, onto.David]
print("Uncles of Simon:", simon.has_uncle) # -> [onto.John, onto.David]
备注:
有人可能认为 has_brother
是
- 对称,即
has_brother(A, B)
⇒has_brother(B, A)
- 传递性,即
has_brother(A, B) + has_brother(B, C) ⇒ has_brother(A, C)
- 非反身性,即没有人是自己的兄弟。
然而,传递性仅在 唯一名称假设 成立时成立。否则 A
可能与 C
是同一个人,这与反身性相冲突。因此,我使用了这种“弱传递性”的规则。
一次,has_brother
像预期的那样工作,叔叔规则也一样。当然推理者必须先运行.
更新:我在this Jupyter notebook中发布了解决方案(其中也包含执行的输出)。