知识图谱-Neo4j入门介绍和实践

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 )

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值