暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

手把手教你用neo4j搭建简单关联图谱(基于家有儿女中的人物关系)

阿黎逸阳的代码 2020-05-16
1798
阿黎逸阳

  精选Python、SQL、R、MATLAB等相关知识,让你的学习和工作更出彩(可提供风控建模干货经验)

我第一次建立关联图谱用的是R语言,通过写代码帮公安挖掘团伙犯罪,并用图形展示团伙之间的关联关系。
如有需要请关注本公众号的后续文章,会手把手教大家用R搭建关联图谱,做成app,让没有安装R的电脑通过你分享的网址链接看到罪犯的关联关系。

本文跟大家一起用neo4j一步步搭建简单关联图谱,让大家快速熟悉neo4j的语法。为便于理解,关系数据采用家有儿女中的人物关系。


一、创建节点

 1  删除数据库中以往的图,确保在一个空白的环境中进行操作
    match (n) detach delete n

    match是匹配操作,小括号(可以想象成小圆)表示节点node,n为标识符,通过该语句可以删除neo4j数据库中所有点。


     2  创建人物节点
      create (n:Person {name:'夏东海'}) return n
      create是创建操作,n是节点名,Person是标签,代表节点的类型,花括号中存放节点的属性
      该语句表示创建一个标签为Person的节点,该节点有一个name属性,属性值是夏东海。
      加了return n就会在neo4j中显示创建好该节点的图,不加只创建点,不展示图。

      创建家有儿女中主要人物的节点

        create (n:Person {name:'刘梅'}) return n
        create (n:Person {name:'刘星'}) return n
        create (n:Person {name:'夏雪'}) return n
        create (n:Person {name:'夏雨'}) return n
        create (n:Person {name:'胡统一'}) return n
        create (n:Person {name:'玛丽'}) return n
        create (n:Person {name:'范晓英'}) return n
        create (n:Person {name:'夏祥'}) return n
        create (n:Person {name:'杨欣'}) return n
        create (n:Person {name:'戴明明'}) return n
        create (n:Person {name:'戴天高'}) return n
        create (n:Person {name:'胖婶'}) return n

        运行如下语句

          match(n) return n

          得到结果如下:


           3  创建工作节点和地点节点

            create (n:Job {title:'护士长'}) return n
            create (n:Job {title:'学生'}) return n
            create (n:Job {title:'编导'}) return n
            create (n:Job {title:'无业游民'}) return n
            create (n:Job {title:'社区工作人员'}) return n
            create (n:Job {title:'无业游民'}) return n
            create (n:Location {country:'中国',city:'北京'})
            create (n:Location {country:'美国',city:'纽约'})
            运行如下语句
              match(n) return n
              得到结果如下:

              感觉这个颜色组合起来有点丑,可以运行如下语句:
                :style

                点击右下角的图标可以更换颜色

                二、创建关系
                 1  创建人物之间的关系

                建刘梅和夏东海之间的关系

                  match (a:Person {name:'刘梅'}), (b:Person {name:'夏东海'}) MERGE (a)-[:妻子]->(b)

                  该语句中的-[:妻子]->表示刘梅是夏东海的妻子。

                  创建家有儿女中主要人物的关系

                    match (a:Person {name:'刘梅'}), (b:Person {name:'夏东海'}) MERGE (a)-[:'妻子']->(b)
                    match (a:Person {name:'刘梅'}), (b:Person {name:'夏雨'}) MERGE (a)-[:继母]->(b)
                    match (a:Person {name:'刘梅'}), (b:Person {name:'夏雪'}) MERGE (a)-[:继母]->(b)
                    match (a:Person {name:'刘梅'}), (b:Person {name:'胡统一'}) MERGE (a)-[:前妻]->(b)
                    match (a:Person {name:'刘星'}), (b:Person {name:'刘梅'}) MERGE (a)-[:儿子]->(b)
                    match (a:Person {name:'刘星'}), (b:Person {name:'胡统一'}) MERGE (a)-[:儿子]->(b)
                    match (a:Person {name:'夏东海'}), (b:Person {name:'刘星'}) MERGE (a)-[:继父]->(b)
                    match (a:Person {name:'玛丽'}), (b:Person {name:'夏东海'}) MERGE (a)-[:前妻]->(b)
                    match (a:Person {name:'夏雪'}), (b:Person {name:'夏东海'}) MERGE (a)-[:女儿]->(b)
                    match (a:Person {name:'夏雨'}), (b:Person {name:'夏东海'}) MERGE (a)-[:儿子]->(b)
                    match (a:Person {name:'夏雪'}), (b:Person {name:'玛丽'}) MERGE (a)-[:女儿]->(b)
                    match (a:Person {name:'夏雨'}), (b:Person {name:'玛丽'}) MERGE (a)-[:儿子]->(b)
                    match (a:Person {name:'夏雨'}), (b:Person {name:'夏雪'}) MERGE (a)-[:弟弟]->(b)
                    match (a:Person {name:'夏雪'}), (b:Person {name:'刘星'}) MERGE (a)-[:姐姐]->(b)
                    match (a:Person {name:'刘星'}), (b:Person {name:'夏雨'}) MERGE (a)-[:哥哥]->(b)
                    match (a:Person {name:'戴明明'}), (b:Person {name:'夏雪'}) MERGE (a)-[:朋友]->(b)
                    match (a:Person {name:'戴天高'}), (b:Person {name:'刘梅'}) MERGE (a)-[:同学]->(b)
                    match (a:Person {name:'戴天高'}), (b:Person {name:'戴明明'}) MERGE (a)-[:父亲]->(b)
                    match (a:Person {name:'胖婶'}), (b:Person {name:'刘梅'}) MERGE (a)-[:邻居]->(b)
                    match (a:Person {name:'夏祥'}), (b:Person {name:'夏东海'}) MERGE (a)-[:父亲]->(b)

                    运行如下语句

                      match(n) return n

                      得到结果如下:


                       2  创建人物和居住地址之间的关系

                      创建家有儿女中主要人物的居住地址关系

                        match (a:Person {name:'刘梅'}),(b:Location {country:'中国',city:'北京'})  MERGE (a)-[:居住]->(b)
                        match (a:Person {name:'夏东海'}),(b:Location {country:'中国',city:'北京'}) MERGE (a)-[:居住]->(b)
                        match (a:Person {name:'玛丽'}),(b:Location {country:'美国',city:'纽约'}) MERGE (a)-[:居住]->(b)

                        得到结果如下:


                         3  创建人物和职业之间的关系

                        创建家有儿女中主要人物职业关系

                          match (a:Person {name:'刘梅'}),(b:Job {title:'护士长'})  MERGE (a)-[:职业]->(b)
                          match (a:Person {name:'夏东海'}),(b:Job {title:'编导'}) MERGE (a)-[:职业]->(b)
                          match (a:Person {name:'胡统一'}),(b:Job {title:'无业游民'}) MERGE (a)-[:职业]->(b)
                          match (a:Person {name:'夏雨'}),(b:Job {title:'学生'}) MERGE (a)-[:职业]->(b)
                          match (a:Person {name:'刘星'}),(b:Job {title:'学生'}) MERGE (a)-[:职业]->(b)
                          match (a:Person {name:'夏雪'}),(b:Job {title:'学生'}) MERGE (a)-[:职业]->(b)
                          match (a:Person {name:'胖婶'}),(b:Job {title:'社区工作人员'})  MERGE (a)-[:职业]->(b)

                          得到结果如下:

                          至此,基于家有儿女中人物关系的关联图谱已经建好,接下来讲一讲查询。

                          三、查询
                           1  查询单个点
                            MATCH (n:Person) 
                            WHERE n.name = '夏东海'
                            RETURN n

                            上面的语句为查询属性名为夏东海的节点,得到结果


                             2  查询所有关系的节点
                              MATCH (n)--() RETURN n

                              得到结果如下:


                               3  查询单个关系

                              查询身份为学生的所有人
                                MATCH (a:Person)-[:职业]->(b:Job {title:'学生'}) RETURN a,b
                                得到结果如下:

                                找到了夏雪、刘星、夏雨三个身份为学生的人。


                                 4  查询所有对外有关系的节点
                                  MATCH (n)-->() RETURN n

                                  得到结果如下:

                                  职业和居住地址等对外有关系的节点就不会展示。


                                   5  查询关系为父亲的子图
                                    MATCH (n)-[:父亲]-() RETURN n

                                    得到结果如下:


                                    四、更新图形

                                     1  为节点增加属性

                                      match (n) where id(n)=48 set n.sex = '男' return n;

                                      得到结果如下:

                                       2  为节点增加标签

                                        match (n) where id(n)=33 set n:护士 return n;
                                        得到结果如下:

                                         3  为关系增加属性

                                          match (n)<-[r]-(m) where id(n)=48 and id(m)=33 set r.team='夫妻' return n;
                                          match (n)<-[r]-(m) where id(n)=48 and id(m)=68 set r.team='父子' return n;
                                          match (n)<-[r]-(m) where id(n)=48 and id(m)=36 set r.team='父子' return n;
                                          查询所有点
                                            MATCH (n) RETURN n LIMIT 25

                                            得到结果如下:

                                            neo4j创建关联图谱的基本语句就是上面这些啦,大家入门愉快

                                            这一次想一起推送关于neo4j的几篇文章,大家久等啦,以后我会争取更快的更新频率。大家有好的想法可以写成文章,欢迎联系我发表,可以署上你的名字,并提供相应报酬

                                            参考文献

                                              https://zhuanlan.zhihu.com/p/88745411
                                              https://www.cnblogs.com/ljhdo/p/5516793.html
                                              https://www.w3cschool.cn/neo4j/neo4j_cql_where_clause.html
                                              往期回顾:
                                              3D星空图
                                              3D星空图V2版
                                              用python绘制皮卡丘

                                              娱乐圈排行榜动态条形图绘制

                                              扫一扫关注我

                                              19967879837

                                              我的微信号、手机号

                                              转发与在看是更好的支持
                                              文章转载自阿黎逸阳的代码,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                              评论