图数据库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:则是画像机制,查询中使用该关键字,不仅能够看到执行计划的详细内容,也可以看到查询的执行结果。

posted @ 2022-05-18 13:38  Mars.wang  阅读(151)  评论(0编辑  收藏  举报