美文网首页
neo4j数据库初体验

neo4j数据库初体验

作者: 鸿雁长飞光不度 | 来源:发表于2020-06-02 12:32 被阅读0次

    NEO4j是一款非常好用的开源的图数据库,图数据库的特别擅长处理一些复杂的关联关系,虽然用关系型数据库也能实现,但是关联关系特别复杂的时候不好处理,NEO4J的语法简单,同时NEO4J的查询终端非常友好,能够以关系图的形式呈现结果。结合下面的案例,其实边看边猜大概也能掌握基本语法了。

    先创建三个人物

    CREATE(yanglin:Person{id:1,name:"车林",gender:"男"})
    CREATE(yangbing:Person{id:2,name:"杨冰",gender:"男"})
    CREATE(wangyuan:Person{id:3,name:"王媛",gender:"女"})
    CREATE(lili:Person{id:4,name:"李丽",gender:"女"})
    

    两个学校

    CREATE(qinghua:School{id:2,name:"清华大学"})
    CREATE(beijing:School{id:1,name:"北京大学"})
    

    两个公司

    CREATE(ali:Company{id:2,name:"阿里巴巴"})
    CREATE(tengxun:Company{id:1,name:"腾讯"})
    

    建立一些人物和大学之间的关联关系

    MATCH(p:Person) where p.id = 1 
    MATCH(s:School) where s.id = 1
    CREATE (p)-[r:study{year:2012,major:"计算机"}]->(s)
    
    MATCH(p:Person) where p.id = 2 
    MATCH(s:School) where s.id = 1
    CREATE (p)-[r:study{year:2014,major:"电子商务"}]->(s)
    
    MATCH(p:Person) where p.id = 3 
    MATCH(s:School) where s.id = 2
    CREATE (p)-[r:study{year:2012,major:"计算机"}]->(s)
    
    MATCH(p:Person) where p.id = 4 
    MATCH(s:School) where s.id = 1
    CREATE (p)-[r:study{year:2014,major:"电子商务"}]->(s)
    

    建立一些人物和公司之间的关联关系

    MATCH(p:Person) where p.id = 1 
    MATCH(c:Company) where c.id = 1
    CREATE (p)-[r:work{job_age:3,job_title:"PHP工程师"}]->(c)
    
    MATCH(p:Person) where p.id = 2
    MATCH(c:Company) where c.id = 1
    CREATE (p)-[r:work{job_age:2,job_title:"iOS工程师"}]->(c)
    
    MATCH(p:Person) where p.id = 3
    MATCH(c:Company) where c.id = 2
    CREATE (p)-[r:work{job_age:4,job_title:"商务经理"}]->(c)
    
    MATCH(p:Person) where p.id = 4
    MATCH(c:Company) where c.id = 2
    CREATE (p)-[r:work{job_age:3,job_title:"Web前端"}]->(c)
    
    

    添加一下人物的关系

    MATCH(p1:Person) where p1.id = 1 
    MATCH(p2:Person) where p2.id = 2
    CREATE (p1)-[r:friend{start:2010}]->(p2)
    
    MATCH(p1:Person) where p1.id = 3 
    MATCH(p2:Person) where p2.id = 2
    CREATE (p1)-[r:friend{start:2011}]->(p2)
    

    上面的Cypher语句比较简单,即是是第一次看到,结合上下文大概也能猜的差不多,但是上面只是添加了一些关系,如果到此位置心里大概有些印象,但是还不是非常直观,那下面这张图来了,这就是添加完后通过Cypher语句查出来的,非常直观吧。这就是图数据库的优点,非常善于关系类数据场景。

    image.png

    下面根据传统的mysql开发的业务自问自答,做一些查询案例。

    1.查询所有信息

    MATCH(N) RETURN N
    

    会返回上面的那个包含所有节点和关系的图。

    2.查询所有人的信息。

    MATCH(p:Person) RETURN p
    

    返回所有人物节点和人与人之间的关系。

    查询单个人

    MATCH(p:Person{name:"李丽"}) RETURN p
    
    1. 查询曾经在北京大学上学的人物信息,并且按照入学时间升序排列,取前两位。
    MATCH(p:Person)-[r:study]->(s:School)
    WHERE s.name = '北京大学'
    return p.id,p.name,r.year,s.name
    order by r.year asc  limit 2
    
    image.png

    4.查询李丽关系为1步到2步的关联关系

    MATCH (p:Person {name:"李丽"})-[*1..2]-(relation)
    RETURN p, relation
    
    image.png

    5.查询李丽和腾讯的最短路径

    MATCH path=shortestPath(
    (p:Person {name:"李丽"})-[*]-(c:Company {name:"腾讯"})
    )
    RETURN path
    

    6 .A和B是朋友,并且A和B此时在同一家公司工作,查找符合此条件的人物信息和公司信息。

    MATCH(p1:Person)-[r:friend]->(p2:Person),
    (p1)-[w1:work]->(c)<-[w2:work]-(p2)
    return p1,p2,c
    
    image.png
    1. 统计各个公司对大学毕业生的招聘数量。
    MATCH(c:Company)<-[w:work]-(p:Person)-[learn:study]->(s:School)
    return c.name,s.name,COUNT(s.name)
    
    image.png

    8.查看关系最多的人

    MATCH(p:Person)-[r]-()
    return p.name,COUNT(r) as cnt 
    order by cnt desc limit 1
    
    image.png

    9.其他查询

    MATCH ()-->() RETURN count(*);//统计所有的关系
    MATCH (n) RETURN count(n);//统计所有节点
    CALL db.labels() //看所有的标签
    CALL db.schema.visualization()  //查看节点关系汇总
    

    相关文章

      网友评论

          本文标题:neo4j数据库初体验

          本文链接:https://www.haomeiwen.com/subject/hsuszhtx.html