Neo4j基本介绍
图数据库在社交网络、实时推荐、征信系统、人工智能等领域有广泛应用,知识图谱以图数据库作为存储引擎,对海量信息进行智能化处理,形成大规模的知识库并进而支撑业务应用。.
软件安装后的引导介绍:
图数据库通过使用节点、关系、属性这三种概念,可以存储任何数据
最简单的图只有一个节点和一些有值的属性
- 节点是图的数据记录的名字
- 数据以属性形式被存储
- 属性是简单的name-value键值对
节点可以通过一个标签被归纳为一组 - 节点可以有0个或多个标签
- 标签没有属性
neo4j数据库的厉害之处在于连接数据,通过关系连接两个节点,关系描述了节点如何连接的 - 关系总有方向
- 关系总有类型
- 关系形成数据模板
在属性图中,关系也能包含属性
1.安装 :
官网下载社区版安装文件:https://neo4j.com/download-center/#releases
系统环境变量配置 :NEO4J_HOME: 安装目录/bin
2.启动:
cmd到安装目录下**\neo4j-community-3.5.5\bin
执行neo4j.bat console (退出:ctrl+c即可)
安装neo4j的自启动服务,到安装bin目录下,输入命令:neo4j.bat install-service,等待安装完成
安装启动有问题可参考:cnblogs.com/sea520/p/11919060.html
3.进入前端界面操作
打开浏览器,输入http://127.0.0.1:7474/browser/ 输入默认密码neo4j
重新设置密码(不能与旧密码相同)
进入主页
4.基本概念
标签Label: 相当于数据表名,比如Person
节点Node: 每个标签下可以有N个节点Node,每个节点代表一个对象,相当于数据表里的一行。
关系Relation: 节点之间的连线代表对象之间的关系。
注意:节点和关系都可以带若干属性。
5.neo4j语法-cyper
create创建:
CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 })
- CREATE 创建数据
- () 括号指节点
- ee:Person 节点变量 :标签
- {} 大括号为节点增加属性
match 查找:
MATCH (ee:Person) WHERE ee.name = "Emil" RETURN ee
- MATCH 指定节点和关系的模式
- (ee:Person) 标签为Person的单节点模式会赋值给变量EE
- WHERE 约束结果
- ee.name = “Emil” 把名字属性同“Emil”值比较是否相等
- RETURN 用于请求特定结果
create more创建多个节点和关系:
CREATE
(js:Person { name: "Johan", from: "Sweden", learn: "surfing" }),
(ir:Person { name: "Ian", from: "England", title: "author" }),
(rvb:Person { name: "Rik", from: "Belgium", pet: "Orval" }),
(ally:Person { name: "Allison", from: "California", hobby: "surfing" }),
(ee)-[:KNOWS {since: 2001}]->(js),
(ee)-[:KNOWS {rating: 5}]->(ir),
(js)-[:KNOWS]->(ir),
(js)-[:KNOWS]->(rvb),
(ir)-[:KNOWS]->(js),
(ir)-[:KNOWS]->(ally),
(rvb)-[:KNOWS]->(ally)
Pattern matching 模式匹配:
MATCH (ee:Person)-[:KNOWS]-(friends) WHERE ee.name = "Emil" RETURN ee, friends
- MATCH 从已知节点到要找的节点的模式描述
- (ee) 开始Person的模式
- -[:KNOWS]- 匹配KNOWS的关系(两种方向)
- (friends) 将绑定到Emil的朋友
推荐:
模式匹配可用于提出建议。
MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)
WHERE js.name = "Johan" AND surfer.hobby = "surfing"
RETURN DISTINCT surfer
- () 空括号
- DISTINCT 超过一条路径会匹配模式
解析
了解为什么查询生效可以使用EXPLAIN 或者PROFILE:
PROFILE MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)
WHERE js.name = "Johan" AND surfer.hobby = "surfing"
RETURN DISTINCT surfer
其他 语法:
查找:
match (n) return n #返回所有信息
Match (n:Person) where n.id='' Return n #通过id查找节点信息
Match (n:Person) where n.id in [''] Return n #通过id查找节点信息
match (n) where id(n) = 107 return n.name #通过id返回节点名字属性
match q=(n:病人信息{name:'用户ID'})-[]-()return q #查一层结构和关系
Match data=(na:Person)-[1..3]->(nb:Person) return na,nb #查节点3层结构
Match data=(na:Person)-[r:``]->(nb:Person) where na.name='*' return na,nb #查节点名字为*的三层节点
match data=(na:用户信息)-[r:保存条件]->(nb:条件信息{name:'条件1'}) return na,r,nb #查两个群的一种关系的节点和关系
match (na:用户信息{name:'dirac'})-[r:保存条件]->(nb:条件信息{name:'条件1'}) return na,r,nb #再限制条件
删除:
删除所有节点和关系:
MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r
MATCH (r) DETACH DELETE r
删除一个节点:
MATCH (r) WHERE id(r) = 492 DELETE r
MATCH (n:TEST1{name:'temp'}) delete n #通过名字删除节点
删除一个节点及其所有的关系:
MATCH (r) WHERE id(r) = 493 DETACH DELETE r
MATCH (n) where n.name = '条件1' DETACH DELETE n #通过名字删除
修改
MATCH (r) WHERE id(r) = 501 SET r.test = "testtest" #通过id查找节点修改/添加属性
MATCH p=(m:用户信息{name:'dirac'})-[r:`保存条件`]->() set m={title:'gachibi'} RETURN p #注意 这样修改后m的属性就只有title,name就会丢失
match (d:用户信息) remove d.name return d #删除某个属性
6.事务
#如果批量处理节点和信息,可以放在list
tx = graph.begin()
nodes = Subgraph(node_list)#Subgraph(relationships=inner_list)
tx.create(nodes)
tx.commit()
7.python操作neo4j实践
实现功能:增加节点和关系、修改节点信息、删除(假)
# coding:utf-8
from py2neo import Graph, Node, Relationship, NodeMatcher, RelationshipMatcher, NodeMatch
import time
import json
##连接neo4j数据库,输入地址、用户名、密码
graph = Graph('http://localhost:7474', auth=('neo4j', '123456'))
nodematcher = NodeMatcher(graph) # 节点查询器
def del_node(id):
graph.run("MATCH (n) where id(n) = $nodeID DETACH DELETE n",
parameters={"nodeID": id})
# 如果假删除,则添加一个属性is_delete,创建节点时设置为False,查询节点时添加一个条件is_delete=False
def query_node(user_id, condition_name):
'''
用户ID
条件名
return 条件节点
'''
condition_node = graph.run("MATCH (m:record)-[r:relation]->(n:condition) where id(n) = $nodeID and n.name = &condition_name return n",
parameters={"nodeID": id,"condition_name":condition_name}).data()[0]['n']
return condition_node
def add_relation(user_id, condition_node):
patient_node = nodematcher.get(user_id)
node_1_zhangfu_node_1 = Relationship(patient_node, '保存条件', condition_node)
graph.create(node_1_zhangfu_node_1)
def create_node(label, name, other_info):
##创建条件结点,查找节点
node = Node(label, name=name)
for k, v in other_info.items():
node[k] = v
graph.create(node)
return node
if __name__ == '__main__':
time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
other_info = {'create_time': time,'update_time': time}
# create_node('用户信息','良知',other_info)#1.创建病人节点
# 创建条件节点,通过id创建关系
condition_node = create_node('条件信息','条件3',other_info)
add_relation(107,condition_node)
# 查询节点
query_node(107, '条件1')
# 删除 创建新的节点
# del_node(0)#删除节点
结果类似:
其他入门教程 参考
手把手教你快速入门知识图谱 - Neo4J教程
neo4j语法
python操作neo4j
(使用python需要下载py2neo包,python37需要对应版本pywin32-227,下载地址:https://pypi.org/project/pywin32/227/#files )