或是如果使用OWL的ObjectUnionOf
表示,則在SWRL規則中是合法的。
我認爲問題出在您的代碼示例中特有的SWRL表面語法的工具支持。 Protege 3.x不支持語法上的這個OR-構造(至少它沒有上次我檢查過),而Protege 4.1可以渲染它,它不能重新分析它(只需使用rc5進行檢查)。但是,如果您使用的是最近的OWL-API(v3.2.x),並且正在使用語法,如XML或功能樣式的語法,那麼一切都應該起作用。 (請注意,Protege 3.x和4.x使用完全不同的OWL API,我建議您只使用Protege 4.x和OWL-API 3.x.)
如果您無法獲得或正在使用SWRL,那麼您可以使用與ObjectUnionOf
等效的命名類,例如
EquivalentClasses(my-processes, ObjectUnionOf(end-milling, drilling))
machine-tool(?mt)^has-process(?mt, ?p)^my-processes(?p)
-> my-machine-tool(?mt)
需要注意的是你的工作,各地(第二示例代碼)不給語義上等價的語句,因爲你只是指出:
SubClassOf(end-milling, my-processes)
SubClassOf(drilling, my-processes)
這是一樣的,說明:
SubClassOf(ObjectUnionOf(end-milling, drilling), my-processes)
即要陳述等價,您還需要其他含義:
SubClassOf(my-processes, ObjectUnionOf(end-milling, drilling))
另請注意,您的規則可以在OWL很容易表達,即你不需要在SWRL所有規則:
SubClassOf(
ObjectIntersectionOf(
:machine-tool
ObjectSomeValuesFrom(
:has-process
ObjectUnionOf(
:end-milling
:drilling
)
)
)
:my-machine-tool
)
陳述在OWL(如果可能的話)任何事物都有一些好處,例如你會得到更好的工具支持(OWL reasoners比SWRL reasoners更多),並且你得到更強大的推理(SWRL reasoners只將規則應用於已知的個體)。
指定您使用的是哪個版本的Protege。 – Kaarel
我想我應該澄清那部分。最終,我需要使用OWL API以編程方式創建和運行規則。 Protege(包括3.x和4.1)用於處理更復雜的規則,直到我找出規則的外觀。 – Christian
我已經編輯了我的答案,也許現在更有幫助。通常,不清楚哪些SWRL表面語法是「官方」的,哪些工具支持哪些語法。我認爲你的例子應該或可以工作。因此,可能會向Protege和OWL-API開發人員提交錯誤報告。 – Kaarel