电影智能问答——neo4j数据库创建

一 数据库的选用

我们要实现一个智能问答的系统,所以问到的关键词是不确定的,所以查询的时候更注重的是数据的连接性。而普通的表格数据库它们不能提供用于遍历大量数据的适当性能,无论是遍历还是检索都比较困难。做为图数据库的Neo4j 可以提供存储更多的连接数据。 它将每个配置文件数据作为节点存储在内部,它与相邻节点连接的节点,它们通过关系相互连接,这样检索或遍历是非常容易和更快的。

所以我们选用Neo4j数据库,相比而言他有着以下的有点:

  • 它很容易表示连接的数据
  • 检索/遍历/导航更多的连接数据是非常容易和快速的
  • 它非常容易地表示半结构化数据
  • Neo4j CQL查询语言命令是人性化的可读格式,非常容易学习
  • 它使用简单而强大的数据模型
  • 它不需要复杂的连接来检索连接的/相关的数据,因为它很容易检索它的相邻节点或关系细节没有连接或索引

二 构建Neo4j数据库

1.mysql数据库结构

因为我们要做的是一个电影的智能问答系统,所以足够的数据是确保问答成功的基础,我们不可能将数据一条一条的导入,所以我们在网上找到一个关于电影的mysql数据库。该数据库的结构包括以下内容:

(1).genre表(电影类型表)

(2). movie表(电影信息表)

(3). person表(演员信息表)

(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”

猜你喜欢

转载自www.cnblogs.com/Mask-D/p/9267446.html
今日推荐