日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

知识图谱实践篇(二):关系数据库到RDF

發布時間:2025/3/15 数据库 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 知识图谱实践篇(二):关系数据库到RDF 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一篇文章介紹了我們所使用的數據。其實,知識圖譜數據的來源主要有三個:結構化數據、半結構化數據和非結構化的數據。我們所使用的電影數據就是結構化的數據。半結構化的數據指的是數據有一定的組織形式,但較結構化數據而言更松散(屬性名和屬性值具有多樣性,比如“生日”就有“出生日期”、“誕辰”等多種表達方式),例如百度百科、維基百科、互動百科等;對infobox(下圖紅框)中的屬性和屬性值做一定處理后,我們就可以得到結構化的數據。非結構化數據通常是指我們看到的一切純文本數據。

本文首先介紹W3C的RDB2RDF工作小組制定的兩個標準,用于將關系型數據庫的數據轉換為RDF格式的數據。然后介紹如何利用d2rq這個工具把我們Mysql中的數據轉為RDF。

一、兩個標準

第一個標準是direct mapping,即直接映射。何為直接映射?看過前面文章的讀者心中應該有些猜測了(傳送門:“知識圖譜基礎之RDF,RDFS與OWL”,請參考第二個部分第一段內容)。規則十分簡單:

1. 數據庫的表作為本體中的類(Class)。比如我們在mysql中保存的數據,一共有5張表。那么通過映射后,我們的本體就有5個類了,而不是我們自己定義的三個類。

2. 表的列作為屬性(Property)。

3. 表的行作為實例/資源。

4. 表的單元格值為字面量

5. 如果單元格所在的列是外鍵,那么其值為IRI,或者說實體/資源。

?

在實際應用中我們很少用到這種方法,盡管它是最便捷的方式。詳細的解釋和示例,請參考W3C的官方文檔(A Direct Mapping of Relational Data to RDF)。

Direct mapping的缺點很明顯,不能把數據庫的數據映射到我們自己定義的本體上。RDB2RDF工作小組指定了另外一個標準——R2RML,可以讓用戶更靈活的編輯和設置映射規則。

我不打算在這里詳細地講解R2RML的具體語法和規則,讀者可以自己參考W3C的文檔(R2RML: RDB to RDF Mapping Language)。其實可以把它當做一個工具,用的時候再查文檔即可,不用把所有的特性和語法都記下來,只需要知道它是什么,能干什么即可。為了讓讀者有個直觀地認識,我們以mysql中的數據為例,介紹怎么把person這個表映射到我們在protege中定義的Person類上,person_name映射到personName上。

@prefix rr: <R2RML: RDB to RDF Mapping Language Schema>. @prefix : <http://www.kgdemo.com#>.<#TriplesMap1>rr:logicalTable [ rr:tableName "person" ];rr:subjectMap [rr:template "http://www.kgdemo.com/person/{person_id}";rr:class :Person;];rr:predicateObjectMap [rr:predicate :personName;rr:objectMap [ rr:column "person_name" ];].

?

rr:template指定實體/資源的IRI生成模板,括號中的字符串是對應表中的某個列名。在本例中指每個人物的IRI由我們預定義的前綴加人物ID組成。rr:Class聲明這些實體/資源的類是我們在Ontology中定義的Person。rr:predicate指定謂語,即屬性。rr:objectMap指定該屬性的值是來源于哪一列。其他屬性的定義類似,讀者可以自己查文檔嘗試。關于外鍵的定義,讀者也可以參考文檔相關示例。

R2RML也支持SQL語句來對查詢結果進行映射。比如,我們有一列表示某人的性別,我們可以用SQL語句選取男性的行,把這些行映射成我們定義的男性類。女性同理。這種特性大大增強了其靈活性。

下面我們介紹如何用d2rq這個工具把mysql的數據轉為RDF。

?

二、D2RQ

D2RQ的官方介紹是:

Accessing Relational Databases as Virtual RDF Graphs

沒錯,以虛擬RDF圖的方式訪問關系數據庫是其最主要的一個特性。它的機理就是通過mapping文件,把對RDF的查詢等操作翻譯成SQL語句,最終在RDB上實現對應操作。在做知識圖譜項目的時候,我們可以靈活地選擇數據訪問方式。當對外提供服務,查詢操作比較頻繁的情況下,最好是將RDB的數據直接轉為RDF,會節省很多SPARQL到SQL的轉換時間。

D2RQ提供了自己的mapping language,其形式和R2RML類似。D2RQ發布了r2rml-kit以支持W3C制定的兩個映射標準。D2RQ有一個比較方便的地方,可以根據你的數據庫自動生成預定義的mapping文件,用戶可以在這個文件上修改,把數據映射到自己的本體上。就我們這個例子而言,數據關系比較簡單,自己編輯R2RML文件或者在D2RQ生成的mapping文件上修改效率差不多。在數據關系很復雜的時候,我建議直接在D2RQ生成的mapping文件上修改,會節省很多時間。D2RQ的mapping language也很簡潔,同樣支持對SQL結果進行映射,其SQL是用condition關鍵詞隱式地表達,不像R2RML是顯式的SQL語句。更多的細節請參考官方文檔。

?

下載D2RQ,進入其目錄,運行下面的命令生成默認的mapping文件:

generate-mapping -u root -o kg_demo_movie_mapping.ttl jdbc:mysql:///kg_demo_movie

root是mysql的用戶名,沒有密碼則不輸入,-o指定輸出文件路徑及名稱,jdbc:mysql:///kg_demo_movie 指定我們要映射的數據庫。該命令的其他參數及使用方式請參考文檔。

根據我們的mysql數據庫生成的默認mapping文件:

@prefix map: <#> . @prefix db: <> . @prefix vocab: <vocab/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xsd: <XML Schema> . @prefix d2rq: <http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1#> . @prefix jdbc: <http://d2rq.org/terms/jdbc/> .map:database a d2rq:Database;d2rq:jdbcDriver "com.mysql.jdbc.Driver";d2rq:jdbcDSN "jdbc:mysql:///kg_demo_movie";d2rq:username "root";jdbc:autoReconnect "true";jdbc:zeroDateTimeBehavior "convertToNull";.# Table genre map:genre a d2rq:ClassMap;d2rq:dataStorage map:database;d2rq:uriPattern "genre/@@genre.genre_id@@";d2rq:class vocab:genre;d2rq:classDefinitionLabel "genre";. map:genre__label a d2rq:PropertyBridge;d2rq:belongsToClassMap map:genre;d2rq:property rdfs:label;d2rq:pattern "genre #@@genre.genre_id@@";. map:genre_genre_id a d2rq:PropertyBridge;d2rq:belongsToClassMap map:genre;d2rq:property vocab:genre_genre_id;d2rq:propertyDefinitionLabel "genre genre_id";d2rq:column "genre.genre_id";d2rq:datatype xsd:integer;. map:genre_genre_name a d2rq:PropertyBridge;d2rq:belongsToClassMap map:genre;d2rq:property vocab:genre_genre_name;d2rq:propertyDefinitionLabel "genre genre_name";d2rq:column "genre.genre_name";.# Table movie map:movie a d2rq:ClassMap;d2rq:dataStorage map:database;d2rq:uriPattern "movie/@@movie.movie_id@@";d2rq:class vocab:movie;d2rq:classDefinitionLabel "movie";. map:movie__label a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property rdfs:label;d2rq:pattern "movie #@@movie.movie_id@@";. map:movie_movie_id a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property vocab:movie_movie_id;d2rq:propertyDefinitionLabel "movie movie_id";d2rq:column "movie.movie_id";d2rq:datatype xsd:integer;. map:movie_movie_title a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property vocab:movie_movie_title;d2rq:propertyDefinitionLabel "movie movie_title";d2rq:column "movie.movie_title";. map:movie_movie_introduction a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property vocab:movie_movie_introduction;d2rq:propertyDefinitionLabel "movie movie_introduction";d2rq:column "movie.movie_introduction";. map:movie_movie_rating a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property vocab:movie_movie_rating;d2rq:propertyDefinitionLabel "movie movie_rating";d2rq:column "movie.movie_rating";d2rq:datatype xsd:double;. map:movie_movie_release_date a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property vocab:movie_movie_release_date;d2rq:propertyDefinitionLabel "movie movie_release_date";d2rq:column "movie.movie_release_date";.# Table movie_to_genre (n:m) map:movie_to_genre__link a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property vocab:movie_to_genre;d2rq:refersToClassMap map:genre;d2rq:join "movie_to_genre.movie_id => movie.movie_id";d2rq:join "movie_to_genre.genre_id => genre.genre_id";.# Table person map:person a d2rq:ClassMap;d2rq:dataStorage map:database;d2rq:uriPattern "person/@@person.person_id@@";d2rq:class vocab:person;d2rq:classDefinitionLabel "person";. map:person__label a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property rdfs:label;d2rq:pattern "person #@@person.person_id@@";. map:person_person_id a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property vocab:person_person_id;d2rq:propertyDefinitionLabel "person person_id";d2rq:column "person.person_id";d2rq:datatype xsd:integer;. map:person_person_birth_day a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property vocab:person_person_birth_day;d2rq:propertyDefinitionLabel "person person_birth_day";d2rq:column "person.person_birth_day";. map:person_person_death_day a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property vocab:person_person_death_day;d2rq:propertyDefinitionLabel "person person_death_day";d2rq:column "person.person_death_day";. map:person_person_name a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property vocab:person_person_name;d2rq:propertyDefinitionLabel "person person_name";d2rq:column "person.person_name";. map:person_person_english_name a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property vocab:person_person_english_name;d2rq:propertyDefinitionLabel "person person_english_name";d2rq:column "person.person_english_name";. map:person_person_biography a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property vocab:person_person_biography;d2rq:propertyDefinitionLabel "person person_biography";d2rq:column "person.person_biography";. map:person_person_birth_place a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property vocab:person_person_birth_place;d2rq:propertyDefinitionLabel "person person_birth_place";d2rq:column "person.person_birth_place";.# Table person_to_movie (n:m) map:person_to_movie__link a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property vocab:person_to_movie;d2rq:refersToClassMap map:person;d2rq:join "person_to_movie.movie_id => movie.movie_id";d2rq:join "person_to_movie.person_id => person.person_id";.

?

下面是根據我們定義的本體修改的mapping文件。首先,為了表達簡練,我們給本體的IRI設置一個前綴。這樣

http://www.kgdemo.com#Person

就可以表達為

:Person

其他的詞匯同理。

接下來,把默認的映射詞匯改為我們本體中的詞匯即可。在處理外鍵的時候要注意當前編輯的屬性的domain和range,belongsToClassMap是domain,refersToClassMap是range。

@prefix map: <#> . @prefix db: <> . @prefix vocab: <vocab/> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xsd: <XML Schema> . @prefix d2rq: <http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1#> . @prefix jdbc: <http://d2rq.org/terms/jdbc/> . @prefix : <http://www.kgdemo.com#> .map:database a d2rq:Database;d2rq:jdbcDriver "com.mysql.jdbc.Driver";d2rq:jdbcDSN "jdbc:mysql:///kg_demo_movie";d2rq:username "root";jdbc:autoReconnect "true";jdbc:zeroDateTimeBehavior "convertToNull";.# Table genre map:genre a d2rq:ClassMap;d2rq:dataStorage map:database;d2rq:uriPattern "genre/@@genre.genre_id@@";d2rq:class :Genre;d2rq:classDefinitionLabel "genre";. map:genre_genre_name a d2rq:PropertyBridge;d2rq:belongsToClassMap map:genre;d2rq:property :genreName;d2rq:propertyDefinitionLabel "genre genre_name";d2rq:column "genre.genre_name";.# Table movie map:movie a d2rq:ClassMap;d2rq:dataStorage map:database;d2rq:uriPattern "movie/@@movie.movie_id@@";d2rq:class :Movie;d2rq:classDefinitionLabel "movie";. map:movie_movie_title a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property :movieTitle;d2rq:propertyDefinitionLabel "movie movie_title";d2rq:column "movie.movie_title";. map:movie_movie_introduction a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property :movieIntroduction;d2rq:propertyDefinitionLabel "movie movie_introduction";d2rq:column "movie.movie_introduction";. map:movie_movie_rating a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property :movieRating;d2rq:propertyDefinitionLabel "movie movie_rating";d2rq:column "movie.movie_rating";d2rq:datatype xsd:double;. map:movie_movie_release_date a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property :movieReleaseDate;d2rq:propertyDefinitionLabel "movie movie_release_date";d2rq:column "movie.movie_release_date";.# Table movie_to_genre (n:m) map:movie_to_genre__link a d2rq:PropertyBridge;d2rq:belongsToClassMap map:movie;d2rq:property :hasGenre;d2rq:refersToClassMap map:genre;d2rq:join "movie_to_genre.movie_id => movie.movie_id";d2rq:join "movie_to_genre.genre_id => genre.genre_id";.# Table person map:person a d2rq:ClassMap;d2rq:dataStorage map:database;d2rq:uriPattern "person/@@person.person_id@@";d2rq:class :Person;d2rq:classDefinitionLabel "person";. map:person_person_birth_day a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property :personBirthDay;d2rq:propertyDefinitionLabel "person person_birth_day";d2rq:column "person.person_birth_day";. map:person_person_death_day a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property :personDeathDay;d2rq:propertyDefinitionLabel "person person_death_day";d2rq:column "person.person_death_day";. map:person_person_name a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property :personName;d2rq:propertyDefinitionLabel "person person_name";d2rq:column "person.person_name";. map:person_person_english_name a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property :personEnglishName;d2rq:propertyDefinitionLabel "person person_english_name";d2rq:column "person.person_english_name";. map:person_person_biography a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property :personBiography;d2rq:propertyDefinitionLabel "person person_biography";d2rq:column "person.person_biography";. map:person_person_birth_place a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property :personBirthPlace;d2rq:propertyDefinitionLabel "person person_birth_place";d2rq:column "person.person_birth_place";.# Table person_to_movie (n:m) map:person_to_movie__link a d2rq:PropertyBridge;d2rq:belongsToClassMap map:person;d2rq:property :hasActedIn;d2rq:refersToClassMap map:movie;d2rq:join "person_to_movie.movie_id => movie.movie_id";d2rq:join "person_to_movie.person_id => person.person_id";.

語法規則比較簡單,具體的操作不再贅述,讀者可以參考相關文檔(The D2RQ Mapping Language)。

D2RQ支持的數據庫有Oracle、MySQL、PostgreSQL、SQL Server、HSQLDB、Interbase/Firebird。也支持其他某些數據庫,但可能會有限制。請參考數據庫兼容性說明(Accessing Relational Databases as Virtual RDF Graphs)。

?

使用下面的命令將我們的數據轉為RDF:

.\dump-rdf.bat -o kg_demo_movie.nt .\kg_demo_movie_mapping.ttl

kg_demo_movie_mapping.ttl是我們修改后的mapping文件。其支持導出的RDF格式有“TURTLE”, “RDF/XML”, “RDF/XML-ABBREV”, “N3”, 和“N-TRIPLE”。“N-TRIPLE”是默認的輸出格式。

?

kg_demo_movie.nt 中關于演員的片段:

<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/163441> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/13> . <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/240171> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/24> . <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1336> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/79> . <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1337> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/79> . <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1338> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/79> . <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1339> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/79> . <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1340> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/79> . <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/1341> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/79> . <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#person/643> <http://www.kgdemo.com#hasActedIn> <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/82> .

?

kg_demo_movie.nt 中關于電影的片段:

<file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/54321> <http://www.kgdemo.com#movieRating> "7.0E0"^^<XML Schema> . <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/54321> <http://www.kgdemo.com#movieIntroduction> "" . <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/54321> <http://www.kgdemo.com#movieTitle> "Mang quan gui shou" . <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/54321> <http://www.kgdemo.com#movieReleaseDate> "1979-07-13" . <file:///D:/d2rq/d2rq-0.8.1/kg_demo_movie.nt#movie/54321> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.kgdemo.com#Movie> .

?

總結

本文介紹了W3C制定的從RDB到RDF的兩個標準,并介紹了如何利用D2RQ結合我們定義的Ontology將數據轉為RDF。mapping文件和RDF數據存放在github項目中,讀者可以下載查看或編輯。下一篇文章是概念篇,將介紹語義網技術棧中另一個重要技術標準——RDF的查詢語言SPARQL。

https://zhuanlan.zhihu.com/p/32552993

總結

以上是生活随笔為你收集整理的知识图谱实践篇(二):关系数据库到RDF的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。