一、概念介紹
【知識圖譜】
A knowledge graph consists of a set of interconnected typed entities and their attributes.
即,知識圖譜是由一些互相連接配接的實體和他們的屬性構成的。換句話說,知識圖譜是由一條條知識組成,每條知識
表示為一個SPO三元組(Subject-Predicate-Object)。
【RDF】
RDF(Resource Description Framework),即資源描述架構,其本質是一個資料模型(Data Model)。它提供了一
個統一的标準,用于描述實體/資源。簡單來說,就是表示事物的一種方法和手段。RDF形式上表示為SPO三元組,
有時候也稱為一條語句(statement)。
知識圖譜的推理主要分為兩類:基于本體的推理和基于規則的推理。OWL/RDFS推理的推理機(reasoner),就能
夠執行基于本體的推理。
二、本體模組化和資料準備
推薦本體模組化工具【Protege】
【知識圖譜基礎之RDF,RDFS,OWL】
關系資料庫到RDF,d2rq這個工具把mysql的資料轉為RDF。
d2rq:Accessing Relational Databases as Virtual RDF Graphs
下載下傳【D2RQ】,進入其目錄,運作下面的指令生成預設的mapping檔案:
generate-mapping -u root -o kg_demo_movie_mapping.ttl jdbc:mysql:///kg_demo_movie
D2RQ支援的資料庫有Oracle、MySQL、PostgreSQL、SQL Server、HSQLDB、Interbase/Firebird。
使用下面的指令将我們的資料轉為RDF:
.\dump-rdf.bat -o kg_demo_movie.nt .\kg_demo_movie_mapping.ttl
三、Apache jena SPARQL
Apache Jena(後文簡稱Jena),是一個開源的Java語義網架構(open source Semantic Web Framework
for Java),用于建構語義網和連結資料應用。
下載下傳Jena的最新版本(fuseki和其他的功能子產品不在同一個檔案中,需要分别下載下傳apache-jena和
apache- jena- fuseki)。
進入“apache-jena-X.X.X”檔案夾的bat目錄,使用“tdbloader.bat”将之前我們的RDF資料以TDB的方式存儲。
指令如下:
.\tdbloader.bat --loc="D:\apache jena\tdb" "D:\d2rq\kg_demo_movie.nt"
【RDF查詢語言SPARQL】
SPARQL即SPARQL Protocol and RDF Query Language的遞歸縮寫,專門用于通路和操作RDF資料,是語義網
的核心技術之一。
例子(僅供參考):
周潤發演了什麼電影
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?x
WHERE { ?s :personName '周潤發'.?s :hasActedIn ?m.?m :movieTitle ?x }
功夫有那些演員
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?x
WHERE { ?m :movieTitle '功夫'.?m :hasActor ?a.?a :personName ?x }
成龍和李連傑合作的電影
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?x
WHERE { ?p1 :personName '成龍'.?p2 :personName '李連傑'.?p1 :hasActedIn ?m.?p2 :hasActedIn ?m.?m :movieTitle ?x }
鞏俐參演電影大于0.8的電影
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?x
WHERE { ?p :personName '鞏俐'.?p :hasActedIn ?m.?m :movieTitle ?x.?m :movieRating ?r.filter(?r > 0.8) }
成龍演了多少部電影
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT COUNT(?x)
WHERE { ?s :personName ' 成龍'.?s :hasActedIn ?x. }
李連傑簡介
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?x
WHERE { ?s :personName '李連傑'.?s :personBiography ?x. }
功夫簡介
PREFIX : <http://www.kgdemo.com#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?x
WHERE { ?s :movieTitle '功夫'.?s :movieIntroduction ?x. }
四、KBQA Demo
python代碼見github