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