zoukankan      html  css  js  c++  java
  • 上手Neo4j

    Neo4j是什么

    软件安装及常用的配置选项介绍

    下载

    wget https://neo4j.com/artifact.php?name=neo4j-community-3.5.3-unix.tar.gz
    

    解压:

    tar -zxvf neo4j-community-3.5.3-unix.tar.gz
    

    解压后进入指定目录

    drwxr-xr-x 3  187 root       4096 Feb  7  2019 bin
    drwxr-xr-x 2  187 ssh_keys   4096 Sep  4 15:41 conf
    drwxr-xr-x 3  187 ssh_keys   4096 Feb  7  2019 data
    drwxr-xr-x 2  187 ssh_keys   4096 Feb  7  2019 import
    drwxr-xr-x 2 root root       4096 Sep  4 15:41 lib
    -rw-r--r-- 1  187 ssh_keys 141211 Feb  7  2019 LICENSES.txt
    -rw-r--r-- 1  187 ssh_keys  36005 Feb  7  2019 LICENSE.txt
    drwxr-xr-x 2  187 ssh_keys   4096 Feb  7  2019 logs
    -rw-r--r-- 1  187 ssh_keys   6546 Feb  7  2019 NOTICE.txt
    drwxr-xr-x 2  187 ssh_keys   4096 Sep  4 15:41 plugins
    -rw-r--r-- 1  187 ssh_keys   1596 Feb  7  2019 README.txt
    drwxr-xr-x 2  187 ssh_keys   4096 Feb  7  2019 run
    -rw-r--r-- 1  187 ssh_keys     96 Feb  7  2019 UPGRADE.txt
    

    配置环境变量

    vim /etc/profile
    
    追加以下内容
    
    后面的 路径是neo4j的解压路径
    export NEO4J_HOME=/home/changwu/neo4j-community-3.5.3
    添加path
    export PATH=$PATH:$NEO4J_HOME/bin
    

    修改neo4j的配置文件,使其启动起来/conf/neo4j.conf

    分配内存
    dbms.memory.heap.initial_size=1024m
    dbms.memory.heap.max_size=1024m
    
    # 修改54行,去掉改行的#,可以远程通过ip访问neo4j数据库
    dbms.connectors.default_listen_address=0.0.0.0
    
    # 默认 bolt端口是7687
    # 端口可以自定义,别忘了去 安全组中开放这个端口
    dbms.connector.bolt.listen_address=:9999
    
    # 默认通过http访问的端口是7474, 开放这个端口,可以在浏览器打开
    # HTTP Connector. There can be zero or one HTTP connectors.
    dbms.connector.http.enabled=true
    dbms.connector.http.listen_address=:9998
    

    启动命令

    [root@ecs-t6-large-2-linux-20190824103606 bin]# ./neo4j
    Usage: neo4j { console | start | stop | restart | status | version }
    

    概念名词

    Label

    label 相当于数据库中的表, 比如有一个Label="Person" 代表一类节点

    Node

    node 节点, 也叫它定点,每一个节点都代表一个对象, 相当于数据表中的一行数据

    节点可以有若干个属性来描述自己

    relation

    relation 关系,也叫做边,有类型,带方向

    • 有类型:表示节点之间的关系可以有多种, 比如 朋友关系, 上下级关系
    • 带方向:表示节点之间的关系可以是单向的, 也可以是双向的, 注意在创建节点的关系时,必须指定方向性,否则会报错,但是在查询时,如果不指定方向,默认会查询双向的关系

    id

    每个节点,关系,都有系统自动分配的id,从0开始,全局唯一

    如果我们手动创建一个node,然后指定它的id=1, 我们自己指定的id是属性, 与系统默认的id无关

    create(Person{  id : '1' } )  
    

    通过id函数,可以获取出node的id值

    match (n:Person{id:'erzi'}) return id(n)
    

    Index

    如果未来会频繁的根据node的某一个属性查询节点, 考虑为node的这个属性添加一个索引(不需要给index取名字),为了更强的性能

    • 创建索引
     create index on :Person(id)
    
    • 删除索引
     drop    index on :Person(id)
    
    • 查询
    // where in = < >  substring 都会走索引
    explain match (n:Person) where n.id=2008  return n
    

    注意点: 如果是给某一个字段创建了索引,那么查询这个字段是会扫描索引然会返回这个node, 但是,如果是给某一个字段创建索引后查询一个label下的全部节点,依然会走全表扫描

    创建了索引的属性,自带唯一性的约束

    consiraint 唯一性约束

    • 添加唯一约束
    create constraint on (a:Person) Assert a.id is unique
    Assert a.id is unique 
    
    • 删除唯一约束
    drop constraint on (a:Person) Assert a.id is unique
    

    Cypher语言

    cypher是语言是针对 neo4j设计的语言,类sql,但是他没有sql中多表之间的jion操作

    创建 标签 | 节点 | 属性 | 关系

    创建了两个节点,并且使用love 关联了他们的关系   张三-love->李四
    create (:Person{name:'张三'})-[:love]->(:Person{name:'李四'})
    其中 Person 是 Label
         {name:'张三'} 整体是 node
         name: 是属性
         [:love] 是关系 (别忘了加: 冒号)
    

    创建节点时,取个别名会很方便后续的操作

    下面这句就是创建的一个id为'grandmother'的节点,并返回新创建的这个节点展示
    如果你用浏览器访问,看到的每一个节点上的描述文字,其实就是id的值

    create (n:Persion{id:'grandmother',name:'奶奶'}) return n
    

    属性类型

    Neo4j Java
    Null null
    Boolean java.lang.Boolean
    Integer java.lang.Long
    Float java.lang.Double
    String java.lang.String
    List java.util.List
    Map java.util.Map
    Node org.neo4j.driver.v1.types.Node(*)
    Relation org.neo4j.driver.v1.types.Relationship(*)
    Path org.neo4j.driver.v1.types.Path(*)

    Match 查询匹配

    基本上所有的操作之间都得先把符合条件的node match出来, match 相当于 select

    从Person标签中匹配出25条
    match(n:Person) return n limit 25
    
    匹配出id为2008的25个节点
    match(n:Person{id:'2008'}) return n limit 25
    
    同上
    match(n:Person) where n.id ='2008'  return n limit 25
    

    Merge == Match or Create

    先匹配出符合条件的节点,在给两个节点添加关系

    match (n:Person{id:'son'} ),(f:Persion{id:'jiao'})
    merge (n)-[:fuqi]->(f)
    

    Delete & Remove

    delete 用于删除 节点和关系

    //删除son和jiao的  jiao   -[:girlfriend]->  son 的关系
    match (n:Person{id:'son'}),(f:Persion{id:'jiao'})
    merge (n)<-[r:girfrield]-(f) delete r
    
    // 删除节点
    match (n:Person{id:'1'}) delete n 
    // 当把一个label下的全部node删除后, label也会消失
    match (n:Person{id:'1'})-[r:love]->(f:Person{id:'2'}) delete n,r,f
    

    remove 用户删除 标签

    查询出一个标签然后删除它
    match (n:Test) remove n:Test
    
    // 当然,如果label中只有一个node了, 那么delete这个节点之后,label依然会消失
    

    Set 修改属性

    set 相当于update

    如: 给指定的node,动态添加属性, 可以同时添加多个值,用逗号分隔

    这也反应出 neo4j是无schme的特性,非结构化数据

    match (n:Person{id:'1'}) set n.id='2',n.name='张三' 
    

    补充

    • 排序
    按照age正序排序
    match (n:Person) return n order by n.age limit 25
    按照age倒叙排序
    match (n:Person) return n order by n.age desc limit 25
    
    • 跳过
    match (n:Person) return n   skip 2
    
    • 去重 : 连接两个match语句, 取出中间的重复部分
    match XXX   union all  match YYY   
    
    • Null
    match (n:Person) return n where n.age is not null
    
    • In
    match (n:Person) return n where n.age in [2,3,4,5,6,7] 
    

    常用的函数

    • 普通函数
    函数名 作用
    Upper 字母转大写
    Lower 字母转小写
    Substring 获取给定串的子串
    replace 字符串替换
    • 聚合函数
    函数名 作用
    count 返回 match 返回的行数
    max 返回match到的最大值
    min 返回match到的最小值
    sum 返回match命令的所有行求和值
    avg 返回match返回的所有行的平均值
    • 查询节点之间的最短路径 shortestPath
    //其中   *..2  表示查看他们之间的最短路径为2, 路径数==关系数 ,2 要求关系层在2 以内
    match p=shortestPath((a:Persion{id:'1'})-[*..2]-(b:Persion{id:'5'})) return p
    
    • 查询节点之间全部的最短路径 shortestPath
    match p=allshortestpaths((N:Actor{name:'123'})-[*..6]-(M:Actor{name:'789'})) return p
    

    六层关系理论: 六度关系理论由美国社会心理学家斯坦利-米尔格兰姆(Stanley Milgram)于1967年最先提出。通俗地说,你和世界上任何人之间所间隔的关系不会超过六度,也就是说最多通过六个人你就能够认识任何一个陌生人

    数据备份和恢复

    它的备份超级简单,当你把数据全部录入neo4j之后呢,只需要备份下data目录即可,当遭受攻击,或者主动数据迁移时,只需要将我们备份的data目录替换原data目录即可,数据自然会恢复

    SpringDataNeo4j

    Spring boot 版本 2.1.3RELEASE
    点击进入: SpringDataNeo4j的官方文档

    • 导入jar包坐标
        <dependency>
                <groupId>org.neo4j</groupId>
                <artifactId>neo4j-ogm-http-driver</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-neo4j</artifactId>
            </dependency>
    

    如何使用javaBean表示node

    @Data
    @NodeEntity(label = "Actor") // 通过label设置  标签的名字
    @NoArgsConstructor
    @AllArgsConstructor
    public class Actor {
        // 这个id,如果我们没有自定义,使用的就是系统默认生成的
        // 自定义了的话, 使用的是我们自己的, 但是不能缺少, 而且 必须是Long类型的
        @Id
        @GeneratedValue
        private Long id ;
    
        //@Property(name="name")  改变生成的json格式数据中的key
        private String name;
        private String image;
    }
    
    

    如何使用javaBean表示node之间的relation

    @RelationshipEntity(type = "学生")
    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    public class StudentRelation {
        @Id
        @GeneratedValue
        private Long id;
    
        //todo 关系节点这两个下面的两个不能少
        @StartNode
        private Actor startNode;
    
        @EndNode
        private Actor endNode;
    }
    
    

    简单的curd

    自定义Repository,让他继承Neo4jRepository

    public interface ActorRepository extends Neo4jRepository<Actor,Long> {}
    

    使用方法跟jpa一样,无脑是就行

    复杂查询

    使用@Query注解,自定义cypher

    public interface StudentRelationRepository extends Neo4jRepository<StudentRelation,Long> {
        // todo ok
        @Query(value = "MATCH p=(n:Actor)<-[StudentRelation]->(m:Actor) WHERE m.name={name} RETURN p")//
        List<StudentRelation> findAll(@Param("name") String name);
    
    
        //todo ok 返回节点n以及n指向的所有节点与关系
        @Query("MATCH p=(n:Actor)-[StudentRelation]->(m:Actor) WHERE id(n)={0} RETURN p")
        List<StudentRelation> findAllByBotNode(Actor actor);
    }
    

    批量导入csv文件数据

    批量导入csv里面的数据,前提是打开两个配置

    dbms.security.allow_csv_import_from_file_urls=true
    dbms.directories.import=import
    

    命令:

    load csv with headers from "file:///bank.csv" As line create (:Bank{name:line.bank,number:line.count,detail:line.detail})
    
  • 相关阅读:
    Perl-晶晨2021届笔试题
    数字IC设计流程
    后端一些常考知识点
    sklearn: 利用TruncatedSVD做文本主题分析
    用截断奇异值分解(Truncated SVD)降维
    numpy.linalg.norm(求范数)
    岭回归和lasso回归及正则化
    什么是范数?
    MySQL三大范式和反范式
    汇编知识之EIP寄存器
  • 原文地址:https://www.cnblogs.com/ZhuChangwu/p/11461197.html
Copyright © 2011-2022 走看看