• 图数据库Neo4j进阶(转载)


    转载:https://www.csdn.net/tags/OtDaUg0sMTg2NzgtYmxvZwO0O0OO0O0O.html

    Neo4j

    图和Neo4j

    图论起源于柯尼斯堡七桥问题。

    • 图必须是完整的图
    • 图中必须有0个或者2个奇数点
    图和节点

    图是由一组节点和连接这些节点的关系组成,图形存储在节点和关系所在的属性上,属性是键值对表示的数据。

    节点关系表
    简单关系

    两个节点之间创建关系为跟随,意味着节点1跟随节点2

    复杂关系

    三个节点有的是双向关系,有的单向关系

    知识图谱和图库

    知识图谱

    一种基于图的数据结构,由节点和边组成,其中节点即实体,边就是关系用于连接两个节点,知识图谱就是把不同种类的信息连接在一起得到的关系网络,只是图谱提供了从关系角度触发分析问题的能力。

    图数据库

    图数据库是指以图数据结构的形式来存储数据

    图数据库的优势
    • 性能上,对长程关系的查询速度快
    • 善于发现隐藏关系

    Neo4j基础

    Neo4j是开源无Shcema的基于java开发的图形数据库。数据存储在面向对象的灵活的网络结构下,而不是严格静态的表,但又可以享受到完全的事务特性。

    Neo4j的主要模块
    • 节点:图表中的基本单位,包含键值对属性
    • 属性:键值对,代表数据
    • 关系:用来连接两个节点
    • 标签:标签使节点和关系相关联,节点或关系可以包含多个标签
    Neo4j主要运用场景
    • 社交媒体和社交网络
    • 推荐引擎和产品推荐系统
    • 身份和访问管理
    • 金融反欺诈多为关联分析场景

    Neo4j CQL

    CQL是Neo4j的查询语言。

    • create

      create(
       <node-name>:<lable-name>
          [{
           <property1-name>:<property1-value>
           ...
           }]
      )
      
    • match和return

      match
      (
        <node-name>:<lable-name>
      )
      return <node-name>.<property1-name>,
      ...
      
    • 使用现有节点创建没有属性的关系

      match(<node1-name>:<node1-lable-name>,(<node-name>:<node20label-name>))
      create
      (<node1-name>)-[<relationship-name>:<relationship-label0name>]-(<node2-name>)
      return 相应内容
      
    • 使用现有的节点创建有属性的关系

      match(person1:Person{name:"范闲"}),(person2:Person{name:"林婉 儿"}) create(person1)-[r:Couple]->(person2)
      
      //查询
      match (p1:Person{name:"范闲"})-[r:Couple]-(p2:Person) return p1,p2
      match p = (person1:Person{name:"范闲"})-[r:Couple]->(:Person) return p
      
    • 使用新节点创建没有属性的关系

      match(person1:Person{name:"范闲"}),(person2:Person{name:"林婉 儿"}) create(person1)-[r:Couple{mary_date:"12/12/2014",price:55000}]->(person2) return r;
      
    • 使用新节点创建有属性的关系

      CREATE (<node1-label-name>:<node1-name>{<define-properties-list>}) 
      -[<relationship-label-name>:<relationship-name>{<define-properties-list>}] 
      ->(<node1-label-name>:<node1-name>{<define-properties-list>})
      
    • 创建多个标签

      CREATE (<node-name>:<label-name1>:<label-name2>.....:<label-namen>)
      //例如:
      create(p:Person:Beauty:Picture {cid:20,name:"叶轻眉"})
      
    • where子条件

      WHERE <condition>
      //例如:
      match(p:Person) where p.money >=1000  return p
      
    • DELETE

      //删除关系
      match p = (:Person {name:"林婉儿"})-[r:Couple]-(:Person) delete r
      //删除节点
      match(p:Person) where ID(p)=1 delete p
      
    • 移除属性

      match (p:Person) where p.cid = 1 remove p.character
      
    • SET字句

      //除了可以更新属性外,还可以设置新的属性
      match (p:Person) where p.name = "范闲" set p.character=1 ,p.address="庆国"
      
    • order by

      match(p:Person) return ID(p),p.name,p.money order by p.money desc
      
    • skip&limit

      //偏移量为1,查询数量为5个
      match(p:Person) return ID(p),p.name,p.money order by p.money desc skip 1 limit 5
      
    • distinct

      match (p:Person) return distinct(p.character)
      
    CQL函数
    • 字符串函数

      //4.0开始不支持lower()函数要写成toLower()
      match(p:Person) return p.character,toLower(p.character),p.name,substring(p.name,2),replace(p.name,"子","zi")
      
    • 聚合函数

      //count,max,min,sum,avg
      match (p:Person) return max(p.money),sum(p.money)
      
    • 关系函数

      //关系是有方向的,如果指定方向查询结果不同
      match p = (:Person{name:"林婉儿"})-[r:Couple]-(:Person) return startnode(r)
      //最短路径 
      match p=shortestpath((node1)-[*]-(node2)) return p
      //例如查找深度1-3的最短路径
      match p=shortestpath((:Person{name:"王启年"})-[*1..3]-(:Person{name:"九品射手燕小乙"})) return p
      

    多深度关系节点

    • 使用with关键字

      match (na:Person)-[re]->(nb:Person) where na.name="范闲" WITH na,re,nb match (nb:Person)- [re2]->(nc:Person) return na,re,nb,re2,nc
      
    • 直接拼接关系节点

      match (na:Person{name:"范闲"})-[re]->(nb:Person)-[re2]->(nc:Person) return na,re,nb,re2,nc
      
    • 使用深度运算符

      match data=(na:Person{name:"范闲"})-[*1..2]-(nb:Person) return data
      

    事务

    Neo4j支持事务,也支持ACID的特性,

    • 对Neo4j数据库的修改操作必须封装在事务里
    • 默认是隔离级别是读提交
    • 死锁保护内置到核心事务管理(会在死锁发生之前检测到死锁并抛出异常,异常抛出之前事务会被标记为回滚,事务结束时,事务会释放锁,此时事务引起的死锁也就解除了,其他事务正常执行,当用户需要时,抛出异常的事务还可以尝试重试执行)
    • Neo4j的API操作都是线程安全的,没必要做额外的线程同步操作

    索引

    Neo4j支持在节点或者关系上创建索引以提高查询性能

    单键索引
    create index on :Label(property)
    //例如 在Person节点的name属性上创建索引
    create index on :Person(name)
    
    创建复合索引
    create index on :Label(property1,property2)
    //例如 在Person节点的name,gender属性上创建索引
    create index on :Person(name,gender)
    
    全文索引
    call db.index.fulltext.createNodeIndex("索引名",[Label,Label],[属性,属性]) call 
    //例如
    db.index.fulltext.createNodeIndex("nameAndDescription",["Person"],["name", "description"])
    //全文索引使用
    call db.index.fulltext.queryNodes("nameAndDescription", "范闲") YIELD node, score RETURN node.name, node.description, score
    
    查看删除索引
    //查看索引
    call db.indexes()
    //查看索引
    :schema
    //删除索引
    DROP INDEX ON :Person(name)
    DROP INDEX ON :Person(age, gender)
    //删除全文索引
    call db.index.fulltext.drop("nameAndDescription")
    

    约束

    唯一约束
    作用
    • 避免重复记录
    • 强制执行数据完整性规则
    创建唯一约束
    CREATE CONSTRAINT ON (变量:<label_name>) ASSERT 变量.<property_name> IS UNIQUE
    //例如 给person节点的name属性添加唯一约束
    CREATE CONSTRAINT ON (person:Person) ASSERT person.name IS UNIQUE
    
    删除唯一性约束
    DROP CONSTRAINT ON (cc:Person) ASSERT cc.name IS UNIQUE
    
    属性存在约束(企业版可用)
    CREATE CONSTRAINT ON (p:Person) ASSERT exists(p.name)
    
    查看约束
    call db.constraints 
    :schema
    

    Neo4j Admin管理员操作

    数据库备份恢复
    • 冷备份

      #关闭Neo4j
      ./bin/neo4j stop
      #数据备份到文件
      ./bin/neo4j-admin dump --database=graph.db --to=/root/qyn.dump
      #还原、迁移之前 ,关闭neo4j服务。操作同上
      ./bin/neo4j-admin load --from=/root/qyn.dump --database=graph.db --force
      
    • 热备份(社区版可用)

    Neo4j调优思路
    • 增加服务器内存,调整neo4j配置文件

      # java heap 初始值 
      dbms.memory.heap.initial_size=1g
      # java heap 最大值,一般不要超过可用物理内存的80% 
      dbms.memory.heap.max_size=16g 
      # pagecache大小,官方建议设为:(总内存-dbms.memory.heap.max_size)/2, 
      dbms.memory.pagecache.size=2g
      
    • 数据预热

      MATCH (n) OPTIONAL MATCH (n)-[r]->() RETURN count(n.name) + count(r);
      
    查看执行计划进行索引优化
    • EXPLAIN:是解释机制,加入该关键字的Cypher语句可以预览执行的过程但并不实际执行,所以也不会产生任何结果。

    • PROFILE:则是画像机制,查询中使用该关键字,不仅能够看到执行计划的详细内容,也可以看到查询的执行结果。

  • 相关阅读:
    1.1. 哪一种 Python 适合您?
    使用自定义的 grafana插件
    ubuntu更换pip源
    安装gitlfs
    密钥配置
    java学习ArrayList集合讲解
    java学习Scanner常用类学习
    java学习猜数字游戏
    java学习匿名对象
    java学习一个标准类
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/16284373.html
Copyright © 2020-2023  润新知