電影智能問答——neo4j數據庫建立

一 數據庫的選用mysql

咱們要實現一個智能問答的系統,因此問到的關鍵詞是不肯定的,因此查詢的時候更注重的是數據的鏈接性。而普通的表格數據庫它們不能提供用於遍歷大量數據的適當性能,不管是遍歷仍是檢索都比較困難。作爲圖數據庫的Neo4j 能夠提供存儲更多的鏈接數據。 它將每一個配置文件數據做爲節點存儲在內部,它與相鄰節點鏈接的節點,它們經過關係相互鏈接,這樣檢索或遍歷是很是容易和更快的。sql

因此咱們選用Neo4j數據庫,相比而言他有着如下的有點:數據庫

  • 它很容易表示鏈接的數據
  • 檢索/遍歷/導航更多的鏈接數據是很是容易和快速的
  • 它很是容易地表示半結構化數據
  • Neo4j CQL查詢語言命令是人性化的可讀格式,很是容易學習
  • 它使用簡單而強大的數據模型
  • 它不須要複雜的鏈接來檢索鏈接的/相關的數據,由於它很容易檢索它的相鄰節點或關係細節沒有鏈接或索引

 

二 構建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」

相關文章
相關標籤/搜索