一 數據庫的選用mysql
咱們要實現一個智能問答的系統,因此問到的關鍵詞是不肯定的,因此查詢的時候更注重的是數據的鏈接性。而普通的表格數據庫它們不能提供用於遍歷大量數據的適當性能,不管是遍歷仍是檢索都比較困難。作爲圖數據庫的Neo4j 能夠提供存儲更多的鏈接數據。 它將每一個配置文件數據做爲節點存儲在內部,它與相鄰節點鏈接的節點,它們經過關係相互鏈接,這樣檢索或遍歷是很是容易和更快的。sql
因此咱們選用Neo4j數據庫,相比而言他有着如下的有點:數據庫
二 構建Neo4j數據庫性能
1.mysql數據庫結構學習
由於咱們要作的是一個電影的智能問答系統,因此足夠的數據是確保問答成功的基礎,咱們不可能將數據一條一條的導入,因此咱們在網上找到一個關於電影的mysql數據庫。該數據庫的結構包括如下內容:ui
(1).genre表(電影類型表)編碼
(2). movie表(電影信息表)spa
(3). person表(演員信息表).net
(4). movie_to_genre表(電影與類別對應關係)命令行
(5):person_to_movie表(電影與演員的對呀關係)
以上爲mysql的數據類型以及部分數據,咱們要將mysql數據已csv格式導出,才能夠用在Neo4j的數據庫上。
2. 導出csv文件
因爲mysql導出數據的默認目錄是:安裝路徑\Uploads\,所以,咱們導出csv的時候,必定要在這個目錄下指定導出文件名,不然會提示權限不足。
腳本語言以下:
1 use movie; 2 3 #CMD命令 查看MySql的導入與導出的目錄【其餘目錄無權限】 4 # 使用mysql -u root -p 鏈接mysql 5 # show variables like '%secure%' 6 #+--------------------------+------------------------------------------------+ 7 #| Variable_name | Value | 8 #+--------------------------+------------------------------------------------+ 9 #| require_secure_transport | OFF | 10 #| secure_auth | ON | 11 #| secure_file_priv | C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\ |genregenre 12 #+--------------------------+------------------------------------------------+ 13 #3 rows in set, 1 warning (0.00 sec) 14 15 #MySql導出csv數據,帶表頭 16 17 18 #導出電影的類型 19 SELECT * INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/genre.csv' 20 FIELDS TERMINATED BY ',' 21 FROM (select 'gid','gname' union select*from genre) genre_; 22 23 24 25 #導出電影的信息 == 若是太多能夠只導出前500個,加限制 26 SELECT * INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/movie.csv' 27 FIELDS TERMINATED BY ',' 28 OPTIONALLY ENCLOSED BY '"' 29 LINES TERMINATED BY '\r' #電影描述中出現\r換行字符, 30 FROM (select 'mid','title','introduction','rating','releasedate' union select*from movie) movie_; 31 32 33 34 #導出演員person的信息 == 若是有中文名要中文名,若是沒有取英文名 35 SELECT * INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/person.csv' 36 FIELDS TERMINATED BY ',' 37 OPTIONALLY ENCLOSED BY '"' 38 FROM (select 'pid','birth','death','name','biography','birthplace' union 39 select person_id,person_birth_day,person_death_day,case when person_name is null then person_english_name else person_name end 40 as name,person_biography,person_birth_place from person) person_; 41 42 #導出電影ID和電影類別之間的對應 【1對1】 43 SELECT * INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/movie_to_genre.csv' 44 FIELDS TERMINATED BY ',' 45 OPTIONALLY ENCLOSED BY '"' 46 FROM (select 'mid','gid' union select*from movie_to_genre) movie_to_genre_; 47 48 49 #導出演員ID和電影ID之間的對應 【1對多】 50 SELECT * INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/person_to_movie.csv' 51 FIELDS TERMINATED BY ',' 52 OPTIONALLY ENCLOSED BY '"' 53 FROM (select 'pid','mid' union select*from person_to_movie) person_to_movie_; 54 55 56 #解決導出csv中文亂碼問題:將csv用txt打開,另存爲,選擇utf8編碼保存覆蓋便可
導出後在Upload目錄下有着以下的導出文件:
注意:若是csv文件中出現亂碼,將其以記事本方式打開,保存時將編碼方式改成「UTF-8」,覆蓋源文件便可。
三 導入Neo4j數據庫
1. neo4j導入路徑
在neo4j安裝目錄下有一個import文件夾(沒有的話本身新建一個這樣的文件夾),將剛纔導出的csv文件存放到這個文件夾中。
2. Neo4j導入數據
開啓Neo4j服務以後,進入服務頁面 http://localhost:7474/browser/
在輸入命令行中依次輸入如下命令進行導入數據庫。
1 找到neo4j的安裝路徑,並在D:\neo4j-community-3.4.0\目錄下建立import目錄 2 完整路徑以下D:\neo4j-community-3.4.0\import 3 由於neo4j支持導入csv文件,其默認目錄入口是 ...\import 4 5 6 //導入節點 電影類型 == 注意類型轉換 7 LOAD CSV WITH HEADERS FROM "file:///genre.csv" AS line 8 MERGE (p:Genre{gid:toInteger(line.gid),name:line.gname}) 9 10 11 //導入節點 演員信息 12 LOAD CSV WITH HEADERS FROM 'file:///person.csv' AS line 13 MERGE (p:Person { pid:toInteger(line.pid),birth:line.birth, 14 death:line.death,name:line.name, 15 biography:line.biography, 16 birthplace:line.birthplace}) 17 18 19 // 導入節點 電影信息 20 LOAD CSV WITH HEADERS FROM "file:///movie.csv" AS line 21 MERGE (p:Movie{mid:toInteger(line.mid),title:line.title,introduction:line.introduction, 22 rating:toFloat(line.rating),releasedate:line.releasedate}) 23 24 25 // 導入關係 actedin 電影是誰參演的 1對多 26 LOAD CSV WITH HEADERS FROM "file:///person_to_movie.csv" AS line 27 match (from:Person{pid:toInteger(line.pid)}),(to:Movie{mid:toInteger(line.mid)}) 28 merge (from)-[r:actedin{pid:toInteger(line.pid),mid:toInteger(line.mid)}]->(to) 29 30 //導入關係 電影是什麼類型 == 1對多 31 LOAD CSV WITH HEADERS FROM "file:///movie_to_genre.csv" AS line 32 match (from:Movie{mid:toInteger(line.mid)}),(to:Genre{gid:toInteger(line.gid)}) 33 merge (from)-[r:is{mid:toInteger(line.mid),gid:toInteger(line.gid)}]->(to)
檢測查詢:
1 //問:章子怡都演了哪些電影? 2 match(n:Person)-[:actedin]->(m:Movie) where n.name='章子怡' return m.title 3 //刪除全部的節點及關係 4 MATCH (n)-[r]-(b) 5 DELETE n,r,b
因爲csv導入neo4j的數據都是字符串的數據類型,所以,對於一些有特殊要求的字段,咱們須要在導入的時候進行類型轉換。以下等等:
導入以後,Neo4j結構以下:
能夠查詢關聯記錄以下:
1 $ match (n)-[r:is]-(b) return n,r,b limit 10
以上,就完成了電影問答系統中Neo4j數據庫的建立。
!文中部分引用「https://blog.csdn.net/Appleyk/article/details/80332911」