简介
最近给孩子买了三国演义,可是三国人物关系太复杂,就想着把三国人物关系做成一张图,这样方便看,整好neo4j图数据库非常适合社交关系的处理,下面就一起来看看,如何使用neo4j生成三国人物社交关系图。
neo4j安装
现在docker很流行,也很方便,在这里,我就用docker快速搭建一个neo4j图数据库服务。
拉取neo4j镜像
[root@mysql ~]#docker pull neo4j[root@mysql ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEneo4j latest ce22583052bf 6 days ago 546MB
创建neo4j的docker容器
[root@mysql ~]#docker run -id -d --publish=7474:7474 --publish=7687:7687 neo4j[root@mysql ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESbc33fcdae7f4 neo4j "/sbin/tini -g -- /d鈥 4 hours ago Up 4 hours 0.0.0.0:7474->7474/tcp, 7473/tcp, 0.0.0.0:7687->7687/tcp hopeful_roentgen
到这里,图数据库的服务已经搭建好了,剩下的就是将数据导入。
准备三国人物数据
在这里,我已经准备好了三国演义中蜀国主要人物的关系表,将这些数据库拷贝到linux系统的a.txt文件
刘备 关羽 结义兄弟刘备 张飞 结义兄弟刘备 卢植 主公刘备 马超 主公刘备 庞统 主公刘备 黄忠 主公刘备 赵云 主公刘备 魏延 主公刘备 蒋琬 主公刘备 法正 主公刘备 马良 主公刘备 孟获 主公刘备 啥摩柯 主公刘备 糜竺 主公刘备 糜芳 主公甘夫人 刘备 妻糜夫人 刘备 次妻孙尚香 刘备 妻关羽 关兴 父子关平 关羽 义子张飞 张苞 父子马腾 马超 父子马腾 韩遂 异性兄弟庞德 庞统 叔父马谡 马良 弟弟祝融 孟获 妻糜芳 糜夫人 兄妹糜竺 糜芳 兄弟刘备 诸葛亮 主公黄月英 诸葛亮 妻黄承彦 黄月英 父女姜维 诸葛亮 弟子诸葛亮 诸葛瑾 兄弟诸葛亮 诸葛瞻 父子刘备 刘禅 父子甘夫人 刘禅 母子刘禅 姜维 主公诸葛瞻 刘禅 女婿刘备 中山王:刘胜 后代刘胜 刘启 父子刘启 刘辩 宗亲刘辩 刘协 让位
使用awk获取不重复的人物名称
cat a.txt |awk '{print $1""$2}'|sort|uniq > b.sql
生成neo4j图数据节点插入语句
[root@mysql ~]# cat b.sql |awk '{print "create (country:shu { name:'''"$1"'''});"}'create (country:shu { name:'法正'});create (country:shu { name:'甘夫人'});create (country:shu { name:'关平'});create (country:shu { name:'关兴'});create (country:shu { name:'关羽'});create (country:shu { name:'韩遂'});create (country:shu { name:'黄承彦'});create (country:shu { name:'黄月英'});create (country:shu { name:'黄忠'});create (country:shu { name:'姜维'});create (country:shu { name:'蒋琬'});create (country:shu { name:'刘备'});create (country:shu { name:'刘辩'});create (country:shu { name:'刘禅'});create (country:shu { name:'刘启'});create (country:shu { name:'刘胜'});create (country:shu { name:'刘协'});create (country:shu { name:'卢植'});create (country:shu { name:'马超'});create (country:shu { name:'马良'});create (country:shu { name:'马谡'});create (country:shu { name:'马腾'});create (country:shu { name:'孟获'});create (country:shu { name:'糜芳'});create (country:shu { name:'糜夫人'});create (country:shu { name:'糜竺'});create (country:shu { name:'庞德'});create (country:shu { name:'庞统'});create (country:shu { name:'啥摩柯'});create (country:shu { name:'孙尚香'});create (country:shu { name:'魏延'});create (country:shu { name:'张苞'});create (country:shu { name:'张飞'});create (country:shu { name:'赵云'});create (country:shu { name:'诸葛瑾'});create (country:shu { name:'诸葛亮'});create (country:shu { name:'诸葛瞻'});create (country:shu { name:'祝融'});
生成neo4j图数据人物关系语句
[root@mysql ~]# cat a.txt |awk '{print "match (p1:shu {name:'''"$1"'''}),(p2:shu{name:'''"$2"'''}) create (p1)- [r:rel {relation:'''"$3"'''}]->(p2);"}'match (p1:shu {name:'刘备'}),(p2:shu{name:'关羽'}) create (p1)- [r:rel {relation:'结义兄弟'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'张飞'}) create (p1)- [r:rel {relation:'结义兄弟'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'卢植'}) create (p1)- [r:rel {relation:'主公'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'马超'}) create (p1)- [r:rel {relation:'主公'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'庞统'}) create (p1)- [r:rel {relation:'主公'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'黄忠'}) create (p1)- [r:rel {relation:'主公'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'赵云'}) create (p1)- [r:rel {relation:'主公'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'魏延'}) create (p1)- [r:rel {relation:'主公'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'蒋琬'}) create (p1)- [r:rel {relation:'主公'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'法正'}) create (p1)- [r:rel {relation:'主公'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'马良'}) create (p1)- [r:rel {relation:'主公'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'孟获'}) create (p1)- [r:rel {relation:'主公'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'啥摩柯'}) create (p1)- [r:rel {relation:'主公'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'糜竺'}) create (p1)- [r:rel {relation:'主公'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'糜芳'}) create (p1)- [r:rel {relation:'主公'}]->(p2);match (p1:shu {name:'甘夫人'}),(p2:shu{name:'刘备'}) create (p1)- [r:rel {relation:'妻'}]->(p2);match (p1:shu {name:'糜夫人'}),(p2:shu{name:'刘备'}) create (p1)- [r:rel {relation:'次妻'}]->(p2);match (p1:shu {name:'孙尚香'}),(p2:shu{name:'刘备'}) create (p1)- [r:rel {relation:'妻'}]->(p2);match (p1:shu {name:'关羽'}),(p2:shu{name:'关兴'}) create (p1)- [r:rel {relation:'父子'}]->(p2);match (p1:shu {name:'关平'}),(p2:shu{name:'关羽'}) create (p1)- [r:rel {relation:'义子'}]->(p2);match (p1:shu {name:'张飞'}),(p2:shu{name:'张苞'}) create (p1)- [r:rel {relation:'父子'}]->(p2);match (p1:shu {name:'马腾'}),(p2:shu{name:'马超'}) create (p1)- [r:rel {relation:'父子'}]->(p2);match (p1:shu {name:'马腾'}),(p2:shu{name:'韩遂'}) create (p1)- [r:rel {relation:'异性兄弟'}]->(p2);match (p1:shu {name:'庞德'}),(p2:shu{name:'庞统'}) create (p1)- [r:rel {relation:'叔父'}]->(p2);match (p1:shu {name:'马谡'}),(p2:shu{name:'马良'}) create (p1)- [r:rel {relation:'弟弟'}]->(p2);match (p1:shu {name:'祝融'}),(p2:shu{name:'孟获'}) create (p1)- [r:rel {relation:'妻'}]->(p2);match (p1:shu {name:'糜芳'}),(p2:shu{name:'糜夫人'}) create (p1)- [r:rel {relation:'兄妹'}]->(p2);match (p1:shu {name:'糜竺'}),(p2:shu{name:'糜芳'}) create (p1)- [r:rel {relation:'兄弟'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'诸葛亮'}) create (p1)- [r:rel {relation:'主公'}]->(p2);match (p1:shu {name:'黄月英'}),(p2:shu{name:'诸葛亮'}) create (p1)- [r:rel {relation:'妻'}]->(p2);match (p1:shu {name:'黄承彦'}),(p2:shu{name:'黄月英'}) create (p1)- [r:rel {relation:'父女'}]->(p2);match (p1:shu {name:'姜维'}),(p2:shu{name:'诸葛亮'}) create (p1)- [r:rel {relation:'弟子'}]->(p2);match (p1:shu {name:'诸葛亮'}),(p2:shu{name:'诸葛瑾'}) create (p1)- [r:rel {relation:'兄弟'}]->(p2);match (p1:shu {name:'诸葛亮'}),(p2:shu{name:'诸葛瞻'}) create (p1)- [r:rel {relation:'父子'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'刘禅'}) create (p1)- [r:rel {relation:'父子'}]->(p2);match (p1:shu {name:'甘夫人'}),(p2:shu{name:'刘禅'}) create (p1)- [r:rel {relation:'母子'}]->(p2);match (p1:shu {name:'刘禅'}),(p2:shu{name:'姜维'}) create (p1)- [r:rel {relation:'主公'}]->(p2);match (p1:shu {name:'诸葛瞻'}),(p2:shu{name:'刘禅'}) create (p1)- [r:rel {relation:'女婿'}]->(p2);match (p1:shu {name:'刘备'}),(p2:shu{name:'刘胜'}) create (p1)- [r:rel {relation:'后代'}]->(p2);match (p1:shu {name:'刘胜'}),(p2:shu{name:'刘启'}) create (p1)- [r:rel {relation:'父子'}]->(p2);match (p1:shu {name:'刘启'}),(p2:shu{name:'刘辩'}) create (p1)- [r:rel {relation:'宗亲'}]->(p2);match (p1:shu {name:'刘辩'}),(p2:shu{name:'刘协'}) create (p1)- [r:rel {relation:'让位'}]->(p2);
执行插入语句
将上面生成的节点和关系语句在neo4j中执行,就可以了。然后查询,就可以看到效果图了
