1。關於RDF、RDFS、OWL的理解
1) RDF:三元組(IRI在知識圖譜中唯一標識實體,literals是帶有資料型別的純文字)。
例如:“
http://www。
kg。com/person/1
” “kg:chineseName” “羅納爾多” 表示一個三元組,對應兩個IRI和一個literals。
2) 在此基礎之上考慮了語義和概念層面,就引出了RDFS,即提供schema層的描述來進行區分。
3) 之後發現RDFS引入schema層表達能力還是不足,vocab不足,進一步的引入OWL,新增額外的vocab,能夠進行推理。
關於RDF中某些寫法的解釋:
RDF定義了一種特殊的rdf:type特性表示兩個資源之間的類性關係。
一般rdf:type特性值的資源稱為類,表示屬於rdf:resource表示屬性,rdfs: range/domain經過OWL之後對映為ObjectProperty和DataProperty。
2。關於mysql相對RDF的理解
關於mysql的資料對映:
1) 表作為本體中的類Class
2) 表的列作為屬性Property
3) 表的行為作為例項或者資源
4) 表的單元格作為字面量
5) 如果單元格所在的列是外來鍵,那麼其值值IRI,或者說是實體或者醫院
3。如何將mysql的資料轉化為RDF
如何將mysql的資料對映到我們在protege中定義的本體上?
要注意到使用D2RQ的優勢在於:
1) 先將mysql中資料出自動轉化為預定義的mapping檔案,然後使用者在這個mapping檔案上進行修改,將資料對映到自己定義的本體上。
注意:當資料關係比較複雜的時候,直接在由D2RQ生成的mapping檔案上進行修改更加節省時間。
這裡使用D2RQ進行資料轉化:
generate-mapping -u root -p 8610912 -o kg_demo_movie_mapping。ttl jdbc:mysql://localhost/kg_demo_movie
直接編輯kg_demo_movie_mapping。ttl檔案,主要剔除掉關於主鍵id的map描述, 另外主要更改d2rq:class和d2rq:property,將其後面的值對應到自己定義的本體上。
接下來開始轉化為RDF: 透過使用如下命令將資料轉化為kg_demo_movie_mapping。ttl轉化為kg_demo_movie。nt的RDF檔案。
D:\kg\software\d2rq-0。8。1>dump-rdf。bat -o kg_demo_movie。nt kg_demo_movie_mapping。ttl
其中預設匯出RDF格式為: “TURTLE”, “RDF/XML”, “RDF/XML-ABBREV”, “N3”和“N-TRIPLE”, 其中“N-TRIPLE”是預設的輸出格式。
現在已經有了三元組RDF,就需要開始進行檢索和查詢RDF資料,而SPARQL是專門為了訪問和查詢RDF設計的,是語義網的核心概念。
SPARQL(SPARQL Protocol and RDF Query Language),透過http協議在客戶端和SPARQL伺服器(SPARQLendpoint)之間進行傳輸和查詢。
對於d2rq,開啟web查詢功能:
d2r-server。bat kg_demo_movie_mapping。ttl
這裡不做過多關於d2rq的說明,只要注意到d2rq最主要的功能是將mysql對映到mapping上,透過修改,最終獲取RDF形式的資料,即重在資料格式或者內容的轉化,而關於另外的重頭戲關於儲存和查詢會接下來介紹JENA。
4。關於RDF資料的儲存和查詢
關於JENA,是一個開源的Java語義網框架(open source Semantic Web Framework for Java),用於構建語義網和連結資料應用。其架構如下:
簡單解釋:
1) 底層也相當於是資料儲存或者資料來源,主要使用sql資料庫或者一種高速持久的三元組形式直接在磁碟上進行儲存。
2) 之上是推理層,內含內部已有的推理和外部定義的推理。
3) 繼續之上,提供各種方式的查詢。
首先配置JENA的環境變數:
path路徑上增加如下:
%JENA_HOME%\bat;%JENA_HOME%\bin
繼續執行如下命令:
tdbloader。bat ——loc=“D:\kg\software\apache-jena-3。8。0\tdb” “D:\kg\software\d2rq-0。8。1\kg_demo_movie。nt”
——loc指定jena儲存RDF資料的目錄,第二個引數是mysql資料經過mapping然後再轉化為RDF資料
同時tdb的目錄下產生了新的資料:
接下來,開啟服務,透過Fuseki進行開啟。Fuseki是Jena提供的SPARQL伺服器,也就是SPARQL endpoint。
注意關於apache-jena-fuseki的版本問題: 若選擇版本apache-jena-fuseki-3。8。0,則後續在執行的過程中會報出如下錯誤:
檢查之後是版本問題,重新下載低版本的,使用版本apache-jena-fuseki-3。5。0。
進入到
cd D:\kg\software\apache-jena-fuseki-3。5。0
執行
fuseki-server。bat
會自動建立並生成“run”資料夾,然後將本體檔案移動到run目錄下的databases資料夾,將字尾改為ttl。
注意,當在protege中儲存本體檔案時,需要儲存為Turtle Syntax,若儲存為其他型別的檔案,則後續執行的過程中會報錯。
然後我們進入到apache-jena-fuseki-3。5。0\run\configuration目錄中,新建檔案fuseki_conf。ttl 再次執行
fuseki-server。bat
執行成功!
登入http://localhost:3030/,頁面如下:
為了能夠提供python查詢,找到SPARQL endpoint, 可以透過如下頁面找到: http://localhost:3030/kg_demo_movie/sparql http://localhost:3030/kg_demo_movie/query
不過需要注意的是很容易導致java。lang。OutOfMemoryError: Java heap space的錯誤問題。 注意每次重啟需要刪除apache-jena-3。8。0\tdb下如下的檔案,否則報錯:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/8/23 12:45
# @Author :
# @File : jena_query。py
# @Software: PyCharm
from
SPARQLWrapper
import
SPARQLWrapper
,
JSON
sparql
=
SPARQLWrapper
(
“http://localhost:3030/kg_demo_movie/query”
)
sparql
。
setQuery
(
“”“
PREFIX :
PREFIX rdf:
SELECT * WHERE {
?x :movieTitle ‘功夫’。
?x ?p ?o。
}
”“”
)
sparql
。
setReturnFormat
(
JSON
)
results
=
sparql
。
query
()
。
convert
()
# print(results)
for
result
in
results
[
“results”
][
“bindings”
]:
# print(result[“n”][“value”])
(
result
[
“x”
][
“value”
],
result
[
“p”
][
“value”
],
result
[
“o”
][
“value”
])
列出部分結果如下:
file:///D:/kg/software/d2rq-0。8。1/kg_demo_movie。nt#movie/9470 http://www。kgdemo。com#hasGenre file:///D:/kg/software/d2rq-0。8。1/kg_demo_movie。nt#genre/35
file:///D:/kg/software/d2rq-0。8。1/kg_demo_movie。nt#movie/9470 http://www。kgdemo。com#hasGenre file:///D:/kg/software/d2rq-0。8。1/kg_demo_movie。nt#genre/28
file:///D:/kg/software/d2rq-0。8。1/kg_demo_movie。nt#movie/9470 http://www。kgdemo。com#hasGenre file:///D:/kg/software/d2rq-0。8。1/kg_demo_movie。nt#genre/80
file:///D:/kg/software/d2rq-0。8。1/kg_demo_movie。nt#movie/9470 http://www。kgdemo。com#hasGenre file:///D:/kg/software/d2rq-0。8。1/kg_demo_movie。nt#genre/14
參考:
1。實踐篇(一):資料準備和本體建模
2。實踐篇(二):關係資料庫到RDF
3。RDF查詢語言SPARQL
4。實踐篇(三):D2RQ SPARQL endpoint與兩種互動方式
5。實踐篇(四):Apache jena SPARQL endpoint及推理
6。知識圖譜基礎之RDF,RDFS與OWL
7。資源描述框架RDF
8。SPARQL Endpoint interface to Python