图谱实战 | 基于半结构化百科的电影KG构建、查询与推理实践记录
轉(zhuǎn)載公眾號 |?老劉說NLP
本文圍繞基于半結構化百科的電影知識圖譜構建、查詢與推理實踐這一主題,完成基于百度百科的電影元組抽取、基于protégé的電影本體構建、基于D2RQ的RDF數(shù)據(jù)轉(zhuǎn)換與查詢、基于Apache jena的電影知識推理四個環(huán)節(jié)的實踐。
這是半結構化知識圖譜構建和應用的完整例子,希望大家能夠?qū)ζ渲械囊恍┝鞒?#xff0c;相關的工具等有個大致的了解。以對實際的工作提供幫助。
一、基于百度百科的電影元組抽取
要構建電影知識圖譜,百度百科是一個很好的數(shù)據(jù)源,可以根據(jù)解析其中的infobox信息,形成對應的三元組信息,對應的百度三元組解析腳本如下:
def?extract_avp_baidu(self,?selector):info_data?=?{}if?selector.xpath('//h2/text()'):info_data['current_semantic']?=?selector.xpath('//h2/text()')[0].replace('????',?'').replace('(','').replace(')','')else:info_data['current_semantic']?=?''if?info_data['current_semantic']?==?'目錄':info_data['current_semantic']?=?''info_data['tags']?=?[item.replace('\n',?'')?for?item?in?selector.xpath('//span[@class="taglist"]/text()')]if?selector.xpath("//div[starts-with(@class,'basic-info')]"):for?li_result?in?selector.xpath("//div[starts-with(@class,'basic-info')]")[0].xpath('./dl'):attributes?=?[attribute.xpath('string(.)').replace('\n',?'')?for?attribute?in?li_result.xpath('./dt')]values?=?[value.xpath('string(.)').replace('\n',?'')?for?value?in?li_result.xpath('./dd')]for?item?in?zip(attributes,?values):info_data[item[0].replace('????',?'')]?=?item[1].replace('????',?'')return?info_data二、基于protégé的電影本體構建
Portege是當下最流行的本體構建工具,下面利用protégé本體構建工具構建電影本體,旨在掌握在Ubuntu系統(tǒng)下,protégé、環(huán)境的搭建及配置,并實現(xiàn)protégé本體構建方法,owl數(shù)據(jù)導出等操作。
1、Protégé安裝部署
1)首先檢查系統(tǒng)中是否已經(jīng)安裝了Java,在終端里面輸入 java –version; 若如下顯示,則表示已經(jīng)安裝,:
如果沒有安裝需要安裝java環(huán)境,
sudo?apt-get?update sudo?apt-get?install?openjdk-8-jdk java?–version顯示上圖即可
2)安裝protégé
從https://protege.stanford.edu下安裝protege。或者直接解壓實驗材料中的壓縮包,在protége根目錄下執(zhí)行,即可啟動protégé。
sudo?bash?./run.sh2、Protégé構建電影本體
1)定義本體IRI
IRI即“國際化資源標識符”,可以類比于URI ,區(qū)別在于 URI 只能使用英文字符,所以沒有辦法很好的國際化兼容不同的文字語言,所以 IRI 就引入了 Unicode 字符來解決這個兼容問題,最后就有了國際化資源標識符(IRI)。protege中的ontology IRI,是默認的 IRI 路徑。不可隨意更改,必須符合RDF 文件規(guī)則。
打開Protégé潔面后,可以看到整個界面的內(nèi)容。新建一個電影知識圖譜本體,在ontologyIRI中填寫一個電影本體的唯一標識,通常以https://wwww為開頭,我們將其命名為https://www.movie_kg.com。一個知識體系統(tǒng)一使用一個IRI。
2)定義類別信息(實體建模)
在新建一個本體后,即對該本體的實體類型進行定義,包括兩個部分。實體類型名稱的定義以及實體類型屬性的定義。在實體類型名稱的定義上,點擊“Entities”tab標簽,選擇“Classes”標簽。在這個界面,我們創(chuàng)建電影知識圖譜的類/概念,所有的類都是“Thing”的子類,具體的,在Classes右鍵owl:Thing ,選擇Add Subclass,鍵入Movie,相當于新建了一個“Movie”類,重復此步,依次構建 Movie,Person,Role三個實體類型。
為了建模類之間的關系,protégé提供了類別屬性的定義功能,例如,等價關系(equivalent)、子類(subclassof)、不相交關系(Disjoint of)等。通過建這類關系,在進行實體對齊的工作中能夠用到。
3)定義對象屬性(實體關系建模)
點擊"Object Properties"按鈕,進入到構造對象屬性頁面,在此界面創(chuàng)建類之間的關系(對象屬性)對之前定義的三個類Movie,Person,Role定義關系類型。包括對關系的定義,以及關系之間關系的定義兩個部分。
首先,在定義實體關系類型上,如上圖所示,"domain"表示該屬性是屬于哪個類的(關系的頭實體類型),"range"表示該屬性的取值范圍(關系的尾實體類型)。其次,Protégé提供了傳遞關系(transitive)、對稱關系(Symmetric)、反對稱關系(Asymmetric)、自反性(Reflexive)、反自反性(irreflexive)等實體關系類型屬性的定義功能。
以點擊actedby為例。新建屬性,如actedby。
其中,inverse of用于表示說acted by與Acted as兩者是互逆關系(一個人參演了某個電影,那么這個電影也就被該人物參演),通過這種定義,借助owl推理機可以完成推理操作,如記錄中只有人參演某個電影,那么也能自動生成電影也就被該人物參演的信息。按照這種方式,依次定義movie actedby person、person actedin movie、movie hasrole role、role roleof movie、person directed movie、movie directedby person、person taked role、role takedby person等關系。
4)定義數(shù)據(jù)屬性(實體屬性建模)
在完成實體類型以及實體關系類型的定義后,需要進一步地完成對實體屬性的定義。與實體關系不同,實體屬性只有入度,而沒有出度,是概念自身的對內(nèi)關系,如人物有出生日期(Birthday)、出生地點(Birthplace),電影有電影名稱(moviename)、電影簡介(moveintro)。
與定義實體類型相似,切換"Data properties",我們在該界面創(chuàng)建類的屬性。先新建數(shù)據(jù)屬性名稱,然后在“Domain”下選擇其所屬的實體類型,在“Ranges”下選擇屬性的數(shù)據(jù)類型。Protégé提供了多種屬性取值類型,包括浮點型(float)、日期型(gDay)、整型(interge),通過對屬性類型的約束,相當于對后期進行知識填充設定了準入原則,有利于進行知識糾錯和標準化例如,創(chuàng)建了“Birthday”屬性名稱,將“Domain”選擇“Person”,以作為person的屬性,在“Ranges”下選擇“string”,表示取值為字符串型。重復該操作,依次構建Birthday、Birthplace、PersonID等屬性類型。
5)查看本體的查看與保存
在完成對類的定義、類關系以及類屬性的定義后,基本上一個本體就搭建起來了,為了對本體的整體面貌進行展示,protege可視化的方式來展示本體結構。具體地,可以點擊windows->Tabs->OntoGraf,通過移動、拖拽的方式,可以看到構建好的ontology的整個網(wǎng)絡結構標識。
本體的導出,是其中最為關鍵的部分。點擊File中的保存按鈕,可以根據(jù)所需要的本體文件類型進行選擇導出。Portege提供了利用內(nèi)部表示轉(zhuǎn)制成多種形式的文本表示格式,如:XML、RDF(S)、OIL、DAML、DAML+OIL、OWL等系統(tǒng)語言,我們選擇Owl文件最終形成movie_kg.owl本體文件。
三、基于D2RQ的RDF數(shù)據(jù)轉(zhuǎn)換與查詢
D2rq是當前將結構化關系型數(shù)據(jù)轉(zhuǎn)化成RDF數(shù)據(jù)訪問的流行工具。該平臺能夠把關系數(shù)據(jù)庫當作虛擬、只讀的RDF圖來訪問,提供了基于rdf的訪問模式,但不需要把數(shù)據(jù)以RDF的形式存儲,這種以虛擬RDF圖的方式訪問關系數(shù)據(jù)庫是其最主要的一個特性。它通過mapping文件,把對RDF的查詢等操作翻譯成SQL語句,最終在RDB上實現(xiàn)對應操作,起到的是一個查詢轉(zhuǎn)換的中間操作。
D2RQ平臺提供了SPARQL訪問,一個鏈接數(shù)據(jù)服務器,一個RDF數(shù)據(jù)集生成器,一個簡單的HTML界面和Jena API訪問D2RQ映射數(shù)據(jù)庫,本實驗在Ubuntu系統(tǒng)下,利用網(wǎng)絡搭建d2rq,mysql開發(fā)環(huán)境,并完成利用d2rq完成對mysql中的數(shù)據(jù)的轉(zhuǎn)換與查詢,目的在于掌握在Ubuntu系統(tǒng)下,d2rq,mysql環(huán)境的搭建及數(shù)據(jù)庫配置等操作,以及掌握csv數(shù)據(jù)導入mysq及d2rq將mysql數(shù)據(jù)轉(zhuǎn)換成RDF數(shù)據(jù)的方法。
1、Mysql、Apache ant與D2rq的安裝部署
1)Mysql的安裝與部署
(1)首先檢查系統(tǒng)中是否已經(jīng)安裝了MySQL。在終端里面輸入 sudo netstat -tap | grep mysql若沒有反映,沒有顯示已安裝結果,則沒有安裝。若如下顯示,則表示已經(jīng)安裝。
(2)如果沒有安裝,則安裝MySQL。在終端輸入 sudo apt-get install mysql-server mysql-client,運行結果如下所示: 在此安裝過程中會讓你輸入root用戶(管理MySQL數(shù)據(jù)庫用戶,非Linux系統(tǒng)用戶)密碼,按照要求輸入即可。
(3)測試安裝是否成功:在終端輸入 sudo netstat -tap | grep mysql完成安裝。
2)Apache Ant安裝部署
Ant類似于Unix中的Make工具,是用來編譯、生成Java的;命令行輸入sudo apt-get install ant 即可完成安裝
3)D2rq安裝部署
(1)從https://github.com/d2rq/d2rq 獲取所有文件,或解壓d2rq文件。(2)編譯D2rq,在根目錄下輸入ant , 回車即可。
2、數(shù)據(jù)導入關系數(shù)據(jù)庫與RDF的映射
為了模擬從結構化關系數(shù)據(jù)到RDF數(shù)據(jù)的映射,我們使用起先整理好的知識圖譜數(shù)據(jù)導入至mysql,包括person.csv、role.csv、movie.csv、movie_actor.csv、movie_director.csv、actor_role.csv共6個文件。
1)將csv圖譜數(shù)據(jù)導入至mysql關系型數(shù)據(jù)庫
(1)執(zhí)行pip install csv,安裝python處理csv的模塊
(2)執(zhí)行pip install pymysql,安裝python操作mysql的模塊
(3)執(zhí)行python InsertMysql.py,將該6個文件每個對應一張表的方式,進行數(shù)據(jù)庫建表操作,數(shù)據(jù)表外鍵建立,從csv數(shù)據(jù)到mysql數(shù)據(jù)的入庫操作。如:
2)生成R2ML語言的轉(zhuǎn)換和映射mapping文件
(1)在D2rq根目錄下執(zhí)行generate-mapping生成mapping文件 ./generate-mapping -u root -p 123456 -o movie_kg_mapping.ttl jdbc:mysql:///movie_kg Mapping文件定義了整個映射的主要模式,即把每個表映射成一個類,每一行是一個資源,每一列就是資源的屬性,例如生成的mapping文件內(nèi)容如下:
3)基于mapping文件,生成RDF三元組數(shù)據(jù)
由于自動生成的mapping文件對map和property并未嚴格對應,因此需要修改mapping文件。包括剔除掉關于主鍵id的map描述,更改d2rq:class和d2rq:property,將其后面的值對應到自己定義的本體上。具體地:修改movie_kg_mapping.ttl文件,另存為movie_kg_mapping_modify.ttl 具體修改部分如下所示:
4)在D2rq根目錄下執(zhí)行dump-rdf生成movie_kg.nt:
執(zhí)行命令:./dump-rdf -o movie_kg.nt movie_kg_mapping_modify.ttl Movie_kg.nt文件內(nèi)容如下,每行一個三元組,總記錄共797548條RDF三元組數(shù)據(jù)。
3、使用D2rq的sparql查詢
在生成好RDF數(shù)據(jù)后,則可以應用mapping文件對關系型數(shù)據(jù)庫進行查詢。具體地:
1)通過D2rq,應用mapping文件實現(xiàn)對關系型數(shù)據(jù)庫的查詢 ./d2r-server movie_kg_mapping_modify.ttl
2)修改mapping文件 默認情況下sparql不支持中文,因此需要修改mapping.ttl文件,添加連接數(shù)據(jù)的字符編碼屬性:
d2rq:jdbcDSN?"jdbc:mysql:///movie_kg?useUnicode=true&characterEncoding=utf8";5、啟動執(zhí)行sparql查詢
1)在根目錄執(zhí)行:
./d2r-server?movie_kg_mapping_modify.ttl2)打開瀏覽器輸入http://localhost:2020,可以看到交互的頁面窗口
3)執(zhí)行查詢,在查詢窗口中,輸入SPARQL腳本,完成查詢情況,可以得到右側(cè)的結果,如:例1:電影臥虎藏龍都有哪些演員
SELECT???n??t?WHERE?{?m:MovieName?'臥虎藏龍'.?n?:ActedIn??m.?n?:ChineseName??t }例2:王寶強和徐崢共同參演的電影
SELECT?distinct??n?WHERE?{?s1?rdf:type?:Person.?s2?rdf:type?:Person.?s1?:ChineseName?"王寶強".?s2?:ChineseName?"徐崢".?s1?:ActedIn??m.?s2?:ActedIn??m.?m?:MovieName??n } LIMIT?10例3:周星馳扮演過什么角色
SELECT?distinct??n?WHERE?{?s?rdf:type?:Person.?s?:ChineseName?"周星馳".?s?:Taked??m.?m?:RoleName??n } LIMIT?10例4:周星馳在唐伯虎點秋香中扮演了什么角色
SELECT?distinct??n?WHERE?{?s?rdf:type?:Person.?s?:ChineseName?"周星馳".?s?:Taked??r.?s?:ActedIn??m.?m?:MovieName?"唐伯虎點秋香".?r?:RoleOf??m.?r?:RoleName??n } LIMIT?10四、基于Neo4j的圖數(shù)據(jù)存儲與查詢
除RDF格式外,圖數(shù)據(jù)庫也是知識圖譜存儲的常用格式。Neo4j是當前最為流行的圖數(shù)據(jù)庫。本部分內(nèi)容利用網(wǎng)絡搭建neo4j圖數(shù)據(jù)庫實驗環(huán)境,通過neo4j-import工具將電影圖譜數(shù)據(jù)導入數(shù)據(jù)庫,最后通過cypher語言對實驗數(shù)據(jù)進行增刪改查等基本操作。
1、Neo4j安裝部署
1)neo4j圖數(shù)據(jù)庫的下載和安裝
官網(wǎng)下載neo4j壓縮包https://neo4j.com/download/,或者使用實驗材料準備好的linux版本的neo4j 3.4.5 ;
(1)解壓,Neo4j 安裝到目錄 /usr/local/neo4j,所以將壓縮包復制到該目錄下解壓:
tar?-xzvf?neo4j-community-3.4.5-unix.tar.gz(2)啟動,在 Neo4j 目錄下啟動:
root@ubuntu:/usr/local/neo4j/bin#?./neo4j?start2)neo4j圖數(shù)據(jù)庫的配置(數(shù)據(jù)庫地址設置)
neo4j的配置文件在conf文件夾中,對該配置文件進行編輯,打開neo4j.conf對數(shù)據(jù)庫進行配置,默認數(shù)據(jù)庫為graph.db,新建數(shù)據(jù)庫兩種方法(1)可以通過neo4j import新建數(shù)據(jù)庫(需要停掉neo4j服務,./bin/neo4j stop),例如新建kg.db數(shù)據(jù)庫,將kg.db放入data/database文件夾下,修改配置文件中的默認數(shù)據(jù)庫,2)無需修改配置文件,直接將原始graph.db備份為graph1.db,將新庫kg.db命名為graph.db,重新啟動neo4j服務即可./bin/neo4j stop
3)neo4j瀏覽器界面的啟動、用戶名和密碼設置
進入bin目錄下命令行輸入./neo4j start 即可啟動服務,瀏覽器輸http://localhost:7474即可啟動web界面。如果配置中設置 dbms.security.auth_enabled=true的話需要自己設置帳號密碼,默認為usename:neo4j,password:neo4j. root@ubuntu:/usr/local/neo4j/bin# ./neo4j start,啟動成功后如右圖所示:
2、neo4j圖數(shù)據(jù)庫數(shù)據(jù)導入與展示
Neo4j圖數(shù)據(jù)庫的導入可以使用自帶的工具進行導入,也可以使用py2neo插件通過程序腳本完成導入,下面介紹兩種方式的具體過程。
1)使用neo4j-import導入圖譜
(1)節(jié)點數(shù)據(jù)構造?Neo4j-import 需要定義csv的HEADER格式,nodes標準格式如下:以movie.csv為例,neo4j中每個節(jié)點都需要一個ID屬性來唯一標示,方便后續(xù)建立關系使用, LABEL屬性是可選的, ID是強制的。此處將movie_id標識為ID,即movie_id:ID;最后一列添加LABEL屬性MOVIE,即:LABEL,可以沒有列名。
同樣的方法標記actor.csv,role.csv
(2)關系數(shù)據(jù)構造
同樣的,Neo4j對關系數(shù)據(jù)的類型也進行了定義,relations標準格式如下,以movie_actor.csv為例,需要標明START-ID END-ID,以及關系類型TYPE,此處定義actor_id為START-ID,movie_id為END-ID,關系類型為ACTED_IN,即演員出演了某部電影
同樣的方法標記movie_director.csv,movie_role.csv,actor_role.csv 標記完后所有csv文件存放在import文件夾下。
(3)數(shù)據(jù)導入
切換到 neo4j/bin目錄,執(zhí)行導入命令如下:
neo4j-import?--multiline-fields=true?--bad-tolerance=1000000?--into=graph.db?--nodes=../import/actor.csv?--nodes=../import/movie.csv?--nodes=../import/role.csv?--relationships=../import/movie_actor.csv?--relationships=../import/movie_director.csv?--relationships=../import/movie_role.csv?--relationships=../import/actor_role.csv?–skip-duplicate-nodes其中--multiline-fields參數(shù)允許數(shù)據(jù)存在換行符時跨行插入;--nodes即節(jié)點文件路徑;--relationships 關系文件路徑;--skip-duplicate-nodes 重復數(shù)據(jù)跳過。運行完后會在bin目錄生成graph.db,將graph.db放入data/database文件夾下覆蓋原數(shù)據(jù)庫文件即可。
2)使用py2neo讀取csv文件導入neo4j
通過使用py2neo進行操作,先新建圖譜節(jié)點,再新建圖譜關系,兩個步驟,在該操作中,需要注意數(shù)據(jù)的重復情況,如下所示:
(1) 連接數(shù)據(jù)庫
graph?=Graph(host="127.0.0.1",??#?neo4j?搭載服務器的ip地址,ifconfig可獲取到http_port=7474,??#?neo4j?服務器監(jiān)聽的端口號user="neo4j",??#?數(shù)據(jù)庫user?name,如果沒有更改過,應該是neo4jpassword="123")(2)讀取csv文件
movies_df?=?pd.read_csv(r'./movie.csv') actors_df?=?pd.read_csv(r'./actor.csv') relations_df=pd.read_csv('./movie_actor.csv')(3)創(chuàng)建節(jié)點(實體)
1.創(chuàng)建標簽為Actor的節(jié)點
(4)創(chuàng)建節(jié)點關系(實體關系)
def?create_rels_actor_movie(df,label): selector?=?NodeSelector(graph) for?i?in?range(relations_df.shape[0]):???#movie_id?=?str(movies_df.iloc[i,?:]['movie_id'])movie_node?=?selector.select("Movie",?movie_id=movie_id).first()actor_id?=?str(actors_df.iloc[i,?:]['actor_id'])actor_node?=?selector.select("Actor",?actor_id=actor_id).first()relationship?=?Relationship(actor_node,?'ACTED_IN',?movie_node) graph.create(relationship)3)Neo4j數(shù)據(jù)的展示 Neo4j圖數(shù)據(jù)庫,基于D3js提供了一個圖數(shù)據(jù)庫可視化交互頁面,從該頁面中的左側(cè)可以看到整個圖譜的情況,包括節(jié)點的類型和規(guī)模(Node labels)、關系的類型與規(guī)模(Relationship types)以及實體屬性類型(property keys)。
其中, Neo4j中實體包括節(jié)點(node)和關系 (relation), node可以有標簽label,標識某一類節(jié)點,如Actor標識演員節(jié)點;node可以有屬性(property),如Actor節(jié)點中的cn_name,birthday等;relation包括ACTED_IN,HASE_ROLE等。
4)利用cypher進行圖譜查詢建立索引
Cypher語言是一個十分友好的語言,通過箭頭以及節(jié)點,使得整個查詢語句十分形象,可以通過編寫查詢模式的方式,在目前已建立好的知識圖譜中實施查詢。
(1)索引建立。?在導入數(shù)據(jù)之后,一般情況下為了提高查詢速度,都會對節(jié)點建立索引。例如,執(zhí)行:
CREATE INDEX ON :Actor(cn_name),該操作將給標簽為Actor的節(jié)點屬性cn_name建立索引,建立索引的好處是后續(xù)查詢更快。
(2)圖譜查詢。?基于cypher針對Neo4j進行實用查詢。例如:想找到姜文導演了哪些作品?可轉(zhuǎn)換為:
“match (n:Actor{cn_name:‘姜文’})-[r:DIRECTED]-(m) Return n,r,m”
進讓子彈飛中都有哪些角色?可轉(zhuǎn)換為:
“match (n:Movie{movie_name:‘讓子彈飛’})-[r:HASE_ROLE]-(m) Return n,r,m”
分別執(zhí)行該語句后,可以得到查詢的結果。結果包括三種,一個是Graph圖展示,一個是文本形式Text,另一個是Code型,在Graph圖中,支持節(jié)點的擴展、拖拽、顏色更改以及節(jié)點屬性切換顯示等功能。
五、基于Apache jena的電影知識推理
本部分利用網(wǎng)絡搭建Apache jena開發(fā)環(huán)境。利用jena及jena-fuseki進行自定義規(guī)則的推理查詢。
1、Jena及jena-fuseki安裝部署
1)Apache jena的下載
1)下載JENA,http://jena.apache.org/download/index.cgi下分別下載 apache-jena-3.11.0.zip apache-jena-fuseki-3.11.0.zip
2)分別解壓兩個文件至本地,形成apache-jena-3.11.0, apache-jena-fuseki-3.11.0兩個文件夾
2)Apache jena的配置
1.進入apache-jena-3.11.0文件夾 2.運行: export JENA_HOME=path_to/apache-jena-3.11.0(注意,path_to/apache-jena-3.11.0表示apache-jena-3.11.0的絕對路徑)
3)apache jena RDF文件的存儲
1.準備好原先生成的movie_kg.nt文件, 將movie_kg.nt文件移動至apache-jena-fuseki-3.11.0的根目錄. 2.進入到apache-jena-3.11.0/bin文件目錄下 3.運行./tdbloader2 --loc tdb path_to/movie_kg.nt(注意,path_to/movie_kg.nt表示movie_kg.nt的絕對路徑) 執(zhí)行結束后,會在bin文件目錄下生成一個tdb文件夾,里面是tdb數(shù)據(jù)庫內(nèi)容 4.查看tdb文件夾中內(nèi)容, 里面有dat, idn等文件
4)apache-jena-fuseki啟用tdb文件
1.將整個tdb目錄移動到apache-jena-fuseki-3.11.0文件夾下 2.jena-fuseki加載tdb文件啟動 進入到apache-jena-fuseki-3.11.0根目錄,執(zhí)行命令 ./fuseki-server --loc=tdb /db 啟動成功后, 3030端口開啟 3.打開http://127.0.0.1:3030,可以看到jena-fuseki的操作界面
5)apache-jena-fuseki數(shù)據(jù)的查詢?1.打開http://127.0.0.1:3030, 點擊dataset, 進入query的問答界面 2.在查詢框中寫入前綴,內(nèi)容如下: PREFIX rdf:?http://www.w3.org/1999/02/22-rdf-syntax-ns#?PREFIX rdfs:?http://www.w3.org/2000/01/rdf-schema#?PREFIX owl:?http://www.w3.org/2002/07/owl#?PREFIX xsd:?http://www.w3.org/2001/XMLSchema#?prefix :?http://www.movie_kg.com#?3.查詢電影”功夫”的三元組信息,在查詢框中寫入查詢體,內(nèi)容如下: SELECT * WHERE { ?s :MovieName '功夫'. ?s ?p ?o. } 4.點擊運行,得到結果:
從中我們發(fā)現(xiàn),關于電影"功夫"相關的知識三元組有7條記錄。
2、推理規(guī)則的配置與啟動
1)配置本體文件
1)將之前構建好的電影本體文件ontology.owl, 將.owl后綴改成.ttl后綴,因為fuseki-jena只識別ttl文件。
2)將該文件移動至apache-jena-fuseki-3.11.0/run/databases的文件夾下。
2)配置推理規(guī)則文件
1.進入到apache-jena-fuseki-3.11.0/run/databases文件夾下
2.新建配置文件, 命名文件名稱為”rules.ttl”
3.在rulers.ttl文件中輸入如下內(nèi)容(或參見文件夾下的rulers.ttl,復制并加以更改即可):
4.保存該rules.ttl文件
5.關于推理規(guī)則的配置說明:
@prefix : http://www.movie_kg.com# .相當于本體的前綴,這個用于解析三元組數(shù)據(jù)。
規(guī)則的定義規(guī)范,[規(guī)則名稱:(舊知識三元組)->(新知識三元組)],如果自己需要新建規(guī)則的話,則按照這種規(guī)則方式進行添加。
3)配置fuseki啟動文件
1.進入到apache-jena-fuseki-3.11.0/run/configuration文件夾下 2.新建配置文件, 命名文件名稱為”fuseki_conf.ttl” 3.在fuseki_conf.ttl文件中輸入如下內(nèi)容(或參見文件夾下的fuseki_conf.ttl,復制并加以更改即可):
@prefix?tdb:???<http://jena.hpl.hp.com/2008/tdb#>?. @prefix?rdf:???<http://www.w3.org/1999/02/22-rdf-syntax-ns#>?. @prefix?rdfs:????<http://www.w3.org/2000/01/rdf-schema#>?. @prefix?ja:????<http://jena.hpl.hp.com/2005/11/Assembler#>?. @prefix?fuseki:?<http://jena.apache.org/fuseki#>?.<#service1>?rdf:type?fuseki:Service?;fuseki:name??????????????????????"movie_kg"?;?????fuseki:serviceQuery???????????????"sparql",?"query"?;?fuseki:serviceReadGraphStore??????"get"?;fuseki:dataset???????????????????<#dataset>?;. <#dataset>?rdf:type?ja:RDFDataset?;ja:defaultGraph?<#modelInf>?;. <#modelInf>?rdf:type?ja:InfModel?;#使用推理規(guī)則推理ja:reasoner[ja:reasonerURL?<http://jena.hpl.hp.com/2003/GenericRuleReasoner>?;?ja:rulesFrom?<file:rulers.ttl的絕對路徑>?]?;ja:baseModel?<#g>?;. <#g>?rdf:type?tdb:GraphTDB?;tdb:location?"tdb文件夾的絕對路徑"?;tdb:unionDefaultGraph?true?;?.4.保存fuseki_conf.ttl文件
4)推理服務器的啟動
1.進入到apache-jena-fuseki-3.11.0 2.ctrl+c,將之前的服務關閉. 3.執(zhí)行命令:./fuseki-server, 啟動fuseki服務,提示3030端口開啟 4.打開http://127.0.0.1:3030,可以看到jena-fuseki的操作界面 5.推理運行與結果查詢 a)打開http://127.0.0.1:3030, 點擊dataset, 進入query的問答界面 b)在查詢框中寫入前綴,內(nèi)容如下:
PREFIX?rdf:?<http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX?rdfs:?<http://www.w3.org/2000/01/rdf-schema#> PREFIX?owl:?<http://www.w3.org/2002/07/owl#> PREFIX?xsd:?<http://www.w3.org/2001/XMLSchema#> prefix?:?<http://www.movie_kg.com#>查詢電影”功夫”的三元組信息,在查詢框中寫入查詢體,內(nèi)容如下:
點擊運行,得到結果:
從中,我們可以看到,關于電影”功夫”的三元組記錄,由之前的7條增加至13條,出現(xiàn)了之前沒有的三元組關系如ActedBy, DirectedBy。5) 同樣的, 我們查詢電影”功夫”都被那些人參演的結果.這個也是推理的結果.我們輸入查詢體, 點擊查詢.
SELECT?distinct??m?WHERE?{ ?s?:MovieName?'功夫'. ?s??ActedBy??n. ?n?:ChineseName??m }返回結果如下:
從結果中我們可以看到,可以直接通過推理結果完成某個三元組的直接訪問。
七、總結
本文圍繞基于半結構化百科的電影知識圖譜構建、查詢與推理實踐這一主題,完成基于protégé的電影本體構建、基于D2RQ的RDF數(shù)據(jù)轉(zhuǎn)換與查詢、基于Apache jena的電影知識推理三個環(huán)節(jié)的實踐。
實際上,我們需要認識到的是:
1、上述方法,更多的是在學術場景下使用,在真實的應用場景中更多的還是通過中間處理組建,進行轉(zhuǎn)換,上述操作更多的是作為一種教學入門級的處理。
2、當前的知識圖譜構建依舊是以半結構化數(shù)據(jù)或者結構化數(shù)據(jù)的處理,大家都被堵在數(shù)據(jù)標準化融合這一數(shù)據(jù)治理的環(huán)節(jié),其中涉及到許多技術難題和工程難題。
關于作者
老劉,劉煥勇,NLP開源愛好者與踐行者,主頁:https://liuhuanyong.github.io。
就職于360人工智能研究院、曾就職于中國科學院軟件研究所。
老劉說NLP,將定期發(fā)布語言資源、工程實踐、技術總結等內(nèi)容,歡迎關注。
OpenKG
OpenKG(中文開放知識圖譜)旨在推動以中文為核心的知識圖譜數(shù)據(jù)的開放、互聯(lián)及眾包,并促進知識圖譜算法、工具及平臺的開源開放。
點擊閱讀原文,進入 OpenKG 網(wǎng)站。
總結
以上是生活随笔為你收集整理的图谱实战 | 基于半结构化百科的电影KG构建、查询与推理实践记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我对Spring的理解
- 下一篇: 论文浅尝 | 基于文本关联的知识图谱的无