owlready2 Python面向本體編程軟件包中文文檔_第1頁
owlready2 Python面向本體編程軟件包中文文檔_第2頁
owlready2 Python面向本體編程軟件包中文文檔_第3頁
owlready2 Python面向本體編程軟件包中文文檔_第4頁
owlready2 Python面向本體編程軟件包中文文檔_第5頁
已閱讀5頁,還剩25頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、from owlready2 import *get_ontology()方法,傳入一個iri作為本體的標識,iri可以是不真實存在的,如果此iri是一個已存在的本體的標識,則會返回該本體;有些本體使用#分割本體名和本體內的實體名,有些使用/,owlready2默認使用#。如果想使用/則iri應該以/結尾onto = get_ontology("/onto.owl")# => /onto.owl#entityonto = get_ontology("/onto")#

2、 => /onto#entityonto = get_ontology("/onto/")# => /onto/entity創建一個全新空白本體:從已有的OWL文件中加載本體from owlready2 import *仍然使用get_ontology()方法,但傳入的iri之前要加上file:/,這樣此方法就認為是從已有文件中加載本體path = 'file:/C:/Users/朗語/Desktop/語義檢索/數據/CFNOnto1.owl'CFNOnto =

3、get_ontology(path).load() .call()方法從本地或者互聯網中加載一個本體的副本,如果調用多次call()方法則只會加載一次訪問本體內容:你可以用.運算符來訪問本體內容。這種方式支持訪問本體中定義的Class、Instances、Properties、Annotation Properties。的訪問方式也支持。1. 本體類屬性:1. .base_iri:本體的標識iri2. imported_ontologies:已導入的本體列表2. 本體類方法:1. .classes():返回一個本體內定義的Class的生成器2. .individuals():返回一個本體內定義

4、的個體(或者實例)的生成器3. .object_properties() : returns a generator for ObjectProperties defined in the ontology4. .data_properties() : returns a generator for DataProperties defined in the ontology5. .annotation_properties() : returns a generator for AnnotationProperties defined in the ontology6. .propertie

5、s() : returns a generator for all Properties (object-, data- and annotation-) defined in the ontology7. .disjoint_classes() : returns a generator for AllDisjoint constructs for Classes defined in the ontology8. .disjoint_properties() : returns a generator for AllDisjoint constructs for Properties de

6、fined in the ontology9. .disjoints() : returns a generator for AllDisjoint constructs (for Classes and Properties) defined in the ontology10. .different_individuals() : returns a generator for AllDifferent constructs for individuals defined in the ontology11. .get_namepace(base_iri) : returns a name

7、space for the ontology and the given base IRIfrom owlready2 import *path = 'file:/C:/Users/朗語/Desktop/語義檢索/數據/CFNOnto1.owl'CFNOnto = get_ontology(path).load() print(IRIS'/apple/ontologies/2015/10/untitled-ontology-38#框架')-CFNOnto1.框架-使用IRIS偽字典可以根據full IRI訪問本體

8、的實體(必須先加載本體)簡單的查詢可以用.search()方法進行簡單的查詢,傳入一些關鍵值參數指定查詢要求· iri, for searching entities by its full IRI· type, for searching Individuals of a given Class· subclass_of, for searching subclasses of a given Class· is_a, for searching both Individuals and subclasses of a given Class·

9、; any object, data or annotation property name導入其他本體:如同一個python文件可以導入其他python模型一樣,也可以向一個本體中導入其他本體,例如:CFNOnto.imported_ontologies.append(other_onto)將本體保存到文件:可以用.save()方法保存本體,默認的無參數方法將會把本體保存到onto_path中的第一條路徑中;.save也可接受兩個參數來指定保存到的文件和保存格式,默認格式為RDF/XMLonto.save(file = "filename or fileobj", for

10、mat = "rdfxml")類和類實例1. 創建類通過繼承owlready2.Thing類來在本體中創建類;本體類屬性(attribute)可以被用于將你的類和指定的本體相連接,如果創建類時沒有指定屬性,則屬性將從父類中繼承。owlready2中定義的Thing類中的namespace屬性可以用來創建本體類的full IRIfrom owlready2 import *onto = get_ontology("/onto.owl")class Drug(Thing):namespace = onto#或者可以這樣寫,用wit

11、h關鍵字加namespace的值with onto:class Drug(Thing):pass#兩者效果相同可以用with在同一namespace下創建多個類Thing類中定義的iri屬性保存有類的full IRIprint(Drug.iri)-/onto.owl#Drug-可以通過直接修改類的iri屬性來更改類的iri2. 創建和管理子類通過繼承一個已有的本體類來創建子類,在上例中Drug就是Thing的子類,而Thing是所有本體類的父類。.is_a屬性保存有當前類的一個父類列表,也可以通過修改列表的內容來增加或移除一些父類.descendants()方法返回

12、當前類的所有子類的集合;.ancestors()方法返回當前類的所有父類集合;兩種方法都包括當前類自身,但是不包括非實體類(python里的集合是無序的,所以集合里的元素順序和類的等級無關)3. 動態地創建類import typesNewClass = types.new_class("NewClassName", (SuperClass,), kwds = "namespace" : my_ontology )利用python的types模塊可以動態地創建類4. 創建相等的類.equivalent_to屬性保存當前類的所有相等類的列表,可以通過修改此屬

13、性的值來增加或刪除相等類5. 創建類實例創建類實例的方法和在Python中創建類實例相同也可以在創建類實例時指定多個額外的關鍵詞參數,如namespace值和各種本體中的類屬性值。創建完成的類實例可以立即訪問;類名.instances()方法會返回一個生成器,可以用于遍歷或者創建一個包含該類所有實例的列表;實例也包含有.equivalent_to()方法6. 屬于多個類的實例Owlready2中也支持實例屬于多個類的情況,類實例有.is_a屬性,此屬性和Class.is_a相似。創建屬于多個類的實例時,要先創建單類實例,然后通過向.is_a中添加類名來增加它所從屬的類。Owlready2會自動

14、創建一個隱藏的類,這個類繼承自Drug以及BloodBasedProdut。這個隱藏類在a_blood_based_drug._class_中可見,但在a_blood_based_drug.is_a中不可見7. 銷毀實體destroy_entity()這個全局函數可以被用來銷毀一個實體。它將實體從本體以及quad store中移除。Owlreaddy2和Protege4在銷毀實體時的處理相似:將實體所有的相關的關系也一并移除,所有相關的類、constructs以及blank nodes也一并移除屬性1. 創建屬性一個新的屬性可以用繼承一個ObjectProperty類或者DataPropert

15、y類來創建(兩個都是Owlready2中的類)。這兩個類中的domain和range屬性可以用來指定本體中屬性的domain和range,這兩個類屬性為列表類型,因為OWL允許為本體屬性指定多個域,但是最終的domain或者range為列表中各元素的交集。下例在本體中建立了兩個類,Drug和Ingredient以及一個關聯兩者的ObjectProperty屬性也可以用以下的方法創建ObjectProperty,作用同上,其中domain >> range將取代ObjectProperty這個父類2. 創建一個關系在本體中,關系是一個三元組(主語、謂語、賓語),其中本體的屬性用作謂語

16、,類實例或者文字類型作為主語和賓語,具體誰做主語誰做賓語會在屬性的domain和range中定義。使用主語的Python屬性(attribute)可以獲取或者創建一個關系,屬性(attribute)名稱與本體屬性類(Property)名稱相同可以使用instance_1_perty_name.append(instance_2_name)或者instance_1_perty_name.remove(instance_2_name)方法來增加或者刪除關系的賓語。3. 數據屬性數據屬性是本體中屬性的range為特定數據類型的屬性,Owlready2目前支持以下數據類

17、型:· int· float· bool· str (string)· owlready2.normstr (normalized string, a single-line string)· owlready2.locstr (localized string, a string with a language associated)· datetime.date· datetime.time· datetime.datetime上例創建了一個has_for_synonym的數據屬性,它的range為s

18、tr類型,并且為acetaminophen這一實例創建了has_for_synonym關系;效果相同的數據屬性也可以如下圖所示創建:4. 反轉屬性(Inverse Properties)Inverse Properties的定義:如果兩個屬性以相反的方式(domain和range相反)表達同樣的意思,則這兩個屬性互為相反屬性。如is_ingredient_of和has_for_ingredient互為相反屬性。就像:“a drug A has for ingredient B” 與“B is ingredient of drug A”含義相同。在Owlready2中定義相反屬性需要先定義屬性的

19、domain和range然后在屬性類的inverse_property的屬性(attribute)中指定與它相反的屬性名。Owlready2會自動處理反轉屬性,如果設置A is_ingredient_of B則會自動設置B has_for_ingredient A。但是這只會在聲明反轉屬性之后生效,例如在先創建A類、B類以及屬性has_for_ingredient,再設置A.has_for_ingredient.append(B),最后才創建反轉屬性is_ingredient_of,則B.is_ingredient_of中不會有A5. 函數型屬性和反轉的函數型屬性函數型屬性是一種屬性值為特定數

20、據類型的屬性,繼承FunctionalProperty類來創建函數型屬性。反轉的函數型屬性的反轉屬性是函數型屬性,可以通過繼承InverseFunctionalProperty創建。6. 創建子屬性通過繼承已經創建的屬性(或類)來創建子屬性(或子類)。Owlready2暫時不支持在子屬性被定義后自動更新父屬性,如果需要這個功能,使用get_relations()全局函數。7. 將Python別稱(alias)關聯到屬性在本體中屬性名一般都很長,例如has_for_ingredient,但是在Python中短的屬性名更常見一些,如ingredients。Owlready2允許使用ANNOTATI

21、ONS二維列表來為屬性名重命名。注意,此時在屬性類里,被聲明別名的屬性仍然只能使用原名。例如如果要創建has_for_ingredient的子屬性,應該是 class sub_prop(has_for_ingredient),寫成 class sub_prop(ingredients)無效。約束(是一種特殊的本體類)1. 屬性約束例如,Placebo是一個沒有活性成分(Active Principle)的藥物在上例中,has_for_active_principle.some(ActivePrinciple)返回一個至少有一種ActivePrinciple的類。NOT()函數返回一個類的補集,

22、&運算符求兩個類的交集。所以這行代碼定義了一個Placebo類,并且聲明它與Drug類和沒有任何ActivePrinciple的類的交集類等價。Owlready2現在支持以下的約束形式:· some : Property.some(Range_Class)· only : Property.only(Range_Class)· min : Property.min(cardinality, Range_Class)· max : Property.max(cardinality, Range_Class)· exactly : Prop

23、erty.exactly(cardinality, Range_Class)· value : Property.value(Range_Individual / Literal value)上例說明DrugAssociation是一種有至少兩種ActivePrinciple的Drug。2. 邏輯運算符Owlready2提供了以下的邏輯運算符,用于類之間的計算:· & : and operator (intersection). For example: Class1 & Class2· | : or operator (union). For e

24、xample: Class1 | Class2· Not() : not operator (negation or complement). For example: Not(Class1)3. One Of構造器在本體中,One Of語句被用來通過擴展來定義類,例如通過列舉出類的實例而不是定義它的屬性來定義類。4. Inverse-of構造器Inverse-of構造器返回一個屬性的反轉,不必新建一個屬性5. 有約束的數據類型一個被約束的數據類型是一種值被限制的數據,例如整數被限制在0到20。全局函數ConstrainedDataType()從一個基礎數據類型中創建一個約束數據類型

25、,它有如下可選參數:· length· min_length· max_length· pattern· white_space· max_inclusive· max_exclusive· min_inclusive· min_exclusive· total_digits· fraction_digits6. 屬性鏈屬性鏈支持鏈接兩個屬性,使用PropertyChain()函數傳入一個包含兩個要被鏈接的屬性的列表:PropertyChain(prop2, prop2)不相交、開放以

26、及本地限制的推理(Disjointness, open and local closed world reasoning)OWL默認世界是開放的,例如所有在本體中生命的東西都被認為不是錯的,而是可能的(這種說法一般叫做開放世界假設)。因此如果想要讓事物或事實是錯的,就一定要在本體中明顯地聲明出來。1. 不相交的(disjoint)類如果沒有一個個體同時屬于這幾個類,那就認為這幾個類不相交。類的不相交性(disjointness)是用AllDisjoint()來創建,它接收一個類的列表作為參數。在下例中,有兩個類Drug和ActivePrinciple,我們可以聲明他們是不相交的(根據開放世界假

27、設,我們必須顯性地將他們不相交的這一事實聲明出來)。3. 不相交的屬性使用AllDisjoint()也可聲明不相交的屬性4. 不同的個體在OWL中,兩個個體有可能會被認為是相同的個體,除非他們被顯性地聲明他倆不同。不同性之于個體就像不相交之于類。下例創建了兩個ActivePrinciple實例并且聲明他倆不同。在Owlready2中AllDifferent()函數和AllDisjoint()函數事實上是一樣的,不一樣的僅僅是參數。如果傳來了類,那它就是AllDisjoint(),如果傳來實例那就是AllDifferent()。5. 查詢和修改不相交.disjoint()方法返回一個生成器(Py

28、thon 里的generator)以遍歷某個類、實例、屬性的所有不相交的對象。上例中的.entities屬性可以修改,通過修改這個屬性就可以增加或刪除不相交的對象。OWL也提供了disjointWith 和 propertyDisjointWith關系來設定只涉及兩個元素的不相交。Owlready26. 關閉個體開放世界假設同樣意味著一個給定個體的屬性并不會限制于被聲明出來的那些。例如,你創建了一個有單個ActivePrinciple的Drug實例,但并不意味著它只有單個ActivePrinciple。在上例中,my_acetaminophen_drug是一個有一個ActivePrincipl

29、e的藥物,但是它可能還有別的ActivePrinciple。如果你想讓my_acetaminophen_drug是一個只有acetaminophen作為ActivePrinciple的藥物,你必須顯性地聲明它。在約束這一章中,我們知道Property.only(Range_Class)這個函數只接受類域作為參數,所以我們使用OneOf()這一函數來將acetaminophen這個個體轉換為類。你也許已經注意到,開放世界假設這一原則經常會導致乏味的一長列的AllDifference或者其他約束。幸運的是,Owlready2提供了close_world()這一函數以自動地關閉一個實例。close_

30、world()會自動地添加ONLY約束,它接收一個可選參數:一個供關閉的屬性列表(傳入一個實例則會關閉以該實例為domain的所有屬性)。7. 關閉類close_world()也接受一個類,在這種情況下,它會關閉這個類以及它的子類和個體。默認地,當close_world()沒有被調用時,本體實施開放世界推理。通過選擇你想關閉的類和個體,close_world()函數允許OWL實施本地關閉世界推理(loal closed world reasoning)。8. 關閉本體最后,close_world()也可接受一個本體。在這種情況下,它關閉本體中定義的所有的類。這相當于全關閉世界推理。混合Pyth

31、on與OWL3. 向OWL類中添加Python函數Python函數可以被定義在本體類中,在下面的例子里Drug類有一個Python函數以計算per-tablet的成本,使用兩種OWL屬性(這兩種屬性已經在Python中被重命名,見 將Python別稱關聯到屬性 這一節)。4. 向前聲明有時你也許需要向前聲明一個類或者屬性。如果一個類或者屬性(名稱相同命名空間也相同)被定義,新的定義將會繼承舊的定義,但不會替代它。前一個定義創建了Drug類,后一個定義在前者基礎上增加了一個is_a聲明。5. 關聯Python模塊與OWL本體關聯一個Python模塊和一個本體是可行的。當Owlready2加載本體

32、時,它會自動地引入此Python模塊。這可以通過python_module注釋來完成,這需要在本體上設置。它的值必須是你要關聯的Python模塊的名字,具體的設置可以在protégé上完成。在導入本體之后:Python模塊可以包括類和屬性的定義以及方法。然而它并不需要包含所有的is_a關系、定義域(domain)、值域(range)等,因為這些關系已經在owl定義過,不需要再在Python中重新指定。因此,如果你的類等級樹在owl中被定義,你可以創建所有的類為Thing 的子類。例如,在文件my_python_module.py中:然后在onto.owl中,你可以定義:&#

33、183; python_module 注釋(值: my_python_module)· 需要時,定義Drug的超類· has_for_cost 屬性(在Python中省略了,因為它沒有方法)· The has_for_number_of_tablets 屬性(也被省略了)推理OWL推理器可以用來檢查本體的一致性,然后依據本體內容推理出新的事實,一般是推斷個體從屬的類,類從屬的父類。OWL有多種推理器,Owlready2包含一個修改過的HermiT reasoner,由斯坦福大學計算機科學部開發,在LGPL證書下發布。HermiT是用Java開發的,因此你的電腦需要

34、裝有Java虛擬機以在Owlready2中執行推理。1. 建立所需的一切 from owlready2 import * onto = Ontology("/onto.owl") with onto: class Drug(Thing): def take(self): print("I took a drug") class ActivePrinciple(Thing): pass class has_for_active_principle(Drug >> ActivePrinciple): python_na

35、me = "active_principles" class Placebo(Drug): equivalent_to = Drug & Not(has_for_active_principle.some(ActivePrinciple) def take(self): print("I took a placebo") class SingleActivePrincipleDrug(Drug): equivalent_to = Drug & has_for_active_principle.exactly(1, ActivePrinci

36、ple) def take(self): print("I took a drug with a single active principle") class DrugAssociation(Drug): equivalent_to = Drug & has_for_active_principle.min(2, ActivePrinciple) def take(self): print("I took a drug with %s active principles" % len(self.active_principles)acetami

37、nophen = ActivePrinciple("acetaminophen")amoxicillin = ActivePrinciple("amoxicillin")clavulanic_acid = ActivePrinciple("clavulanic_acid")AllDifferent(acetaminophen, amoxicillin, clavulanic_acid)drug1 = Drug(active_principles = acetaminophen)drug2 = Drug(active_principle

38、s = amoxicillin, clavulanic_acid)drug3 = Drug(active_principles = )close_world(Drug)開始推理之前,你要先創建所有的類、屬性以及實例,并且確保約束、不相交性(disjointness)、不同一性(differences)都已被定義。下面是一個創建滿足推理條件的本體的例子。2. 啟動推理器啟動推理器僅需要調用這個全局函數:sync_reasoner()。sync_reasoner()默認將所有推斷出來的事實放入一個特殊的本體中,但你可以通過 with ontology_to_save: 這個語句方式來控制事實存入哪

39、個本體(要記得,所有的在with ontology_to_save:之內聲明的三元組都存在于ontology_to_save這個本體)。例如,將所有推理結果存入onto本體:3. 自動分類的結果Owlready自動地從HermiT獲取推理的結果并且對個體和類進行重分類,例如Owlready更改個體的類以及更改類的超類。上圖是上一節中給出的本體在推理過后的重新分類結果,可以看到,drug1、2、3剛開始定都被定義為Drug類,在進行推理之后,依據它們has_for_active_principle的屬性的不同推理器給它們重新確定了所屬的類別。請讀者注意Owlready2如何將本體類的自動分類與P

40、ython類的多態性結合的。注釋(Annotation)在Owlready2中注釋可以像Python類屬性(attribute)一樣被訪問。需要注意的是注釋不可被繼承。1. 添加注釋對于一個給定的實體(類、屬性或者實例),可以用以下方法添加注釋:可以看到,注釋是以列表的形式出現的,默認有以下幾種方式添加注釋:comment、isDefinedBy、seeAlso、backwardCompatibleWith、deprecated、incompatibleWith、priorVersion、versionInfo。Owlready2同時支持給關系三元組添加注釋,使用AnnotationPrope

41、rty(在這里用的是comment)以偽字典的方式添加注釋(字典的key分別是定義域類實例、關系名、值域類實例,字典的value是評論文本)。Owlready2提供特殊的偽屬性以注釋is-a關系(包括owl_subclassof和rdf_type)、定義域(domains,如rdf_domain)以及定義域(ranges,如rdf_range)。注釋值通常是值列表。然而在很多情況下都會使用單個值。Owlready2允許給注釋屬性設置單個值。2. 查詢注釋注釋值可以使用.運算符來獲取就如同它們是實體的屬性:如果你希望查詢結果是單個值,可以使用list類型的.first()函數,它返回列表中的首個

42、值,如果列表為空則返回None。3. 刪除注釋只需從注釋列表中將特定注釋移除即可:Dment.remove("A second comment")。或者直接給注釋列表賦值一個空列表以刪除全部注釋:Dment = 。4. 定制化的實體呈遞全局函數set_render_func()可以指定Owlready2如何呈遞實體。例如,當打印實體時如何去將他們轉換成文本。這個函數接收一個函數作為參數,做參數的函數的參數是實體,返回值是字符串。label注釋經常被用來呈遞實體,下面的例子使用它們的label注釋呈遞實體,如果label為空則使用實體名。下面的例子使用實體的iri呈遞實體:5

43、. 特定語言的注釋可以使用locstr類型來指定注釋的語言:另外,值列表支持指定語言的子列表,子列表形式為.<語言代碼>如.en、.fr等。這些子列表包含普通的字符串,可以被修改。修改指定語言的子列表會自動更新值列表,但是反過來就不會:修改值列表不會更新指定語言子列表。6. 創建新的注釋類AnnotationProperty類可以生成子類以創建新的注釋類:你也可以為已存在的注釋類創建子類。命名空間本體可以定義位于其他命名空間的實體。一個例子是Gene本體:本體的IRI是/obo/go.owl,但是本體的實體的IRI并不是如此形式ht

44、tp://obo/go.owl#GO_entity,而是/obo/GO_entity。1. 訪問定義在其他命名空間的實體實體在Owlready2中可以使用命名空間來訪問。本體的.get_namespace(base_iri)方法返回一個base_iri指定的命名空間。命名空間之后可以使用.來進行使用,和本體類似。2. 在指定命名空間中創建類當創建一個類或者屬性的時候,命名空間屬性可以用來建立類的full iri并且定義在哪個本體中創建這個類。類的iri與命名空間的base iri加上類名相同。一個本體永遠可

45、以被當成命名空間使用,見類和類實例這一章。如果你想在不同的iri中建立類你可以使用命名空間對象:在上面的例子中,Drug類的iri是/pharmaco/Drug,但是類屬于/onto這個本體。Owlready2擁有三種顯示命名空間的方法:(1)namespace類屬性(attribute);(2)with namespace:語句;(3)如果不提供,則命名空間從第一個父類處繼承。下面的例子闡明了以上三種方法:3. 更改定義在其他本體中的類在OWL中一個本體可以修改一個在其他本體中定義的類。在Owlready2中,以上特性可以使用with namesp

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論