美文网首页
图数据库

图数据库

作者: xieyan0811 | 来源:发表于2022-02-12 11:43 被阅读0次

传统数据库难以处理复杂多跳的关系运算。需要一种支持海量、复杂、且结构灵活的关系运算数据库,图数据库应运而生。

相关概念

简介

图数据库由顶点和边组成;
主要用于对图数据的增删改查;
目前常用的图数据库有Neo4j,JanuxGraph等

使用场景

  • 常用于社交、电商、金融、零售、物联网等行业
  • 用于关系查询
  • 用于遍历复杂关系
  • 用于实现复杂的规则:如子图比较、推荐等
  • 对于结构化数据,常可使用关系型数据库;对于关系比较多,数据不太规律的情况,则用图数据库

分类

  • 属性图数据库
    • 构成:顶点、边、顶点属性、边属性
  • RDF图数据库(不支持属性,比较古老,已经不怎么用了)
    • 针对文本语义场景产生
    • 三元组:subject->predicate->object

原生图数据库

  • 原生图数据库:使用图模型进行数据存储,可以针对图数据做优化,从而带来更好的性能,例如 Neo4j。
  • 非原生图数据库:底层存储使用非图模型,在存储之上封装图的语义,适合与其它数据应用配合使用,例如 Titan、JanusGraph 底层 采用 KV 存储非图模型。

技术栈

  • 技术架构
    • 接口层、计算层(图算法)、存储层
  • 主流查询语言
    • Cypher(CQL,类SQL),Neo4j使用这种查询
    • Gremlin(类Scala)
    • SPARQL(用于RDF框架),适用于语义场景
  • 图数据的计算
    • 图遍历(局部查询:深度优先、广度优先)
    • 路径发现(两点间最短路径)
  • 图处理引擎
    • 用于分析复杂图
    • 常用引擎:GraphX,GraphLab, Giraph

Neo4j

Neo4j是一个常用的图数据库。

基本概念

包括以下四种概念:

  • 标签:节点所属类别,一个节点可以有一个以上的标签
  • 节点:实体对象
  • 关系:实体间的关系
  • 属性:节点和关系都可以拥有属性,以key:value方式描述

安装

$ docker search neo4j # 查看所有Neo4j相关镜像
$ docker pull neo4j # 下载最新版本

最新版本约500多M

运行

$ sudo adduser neo4j
$ docker run -d --name neo4j -p 7474:7474 -p 7687:7687 -v /home/neo4j/data:/data -v /home/neo4j/logs:/logs -v /home/neo4j/conf:/var/lib/neo4j/conf -v /home/neo4j/import:/var/lib/neo4j/import --env NEO4J_AUTH=neo4j/password neo4j

浏览器打开
http://localhost:7474
输入用户名:neo4j,密码:password(启动docker时通过 NEO4J_AUTH 设置)
语法非常简单,点击按钮,即可在左侧栏查看帮助,左侧栏和VSCode,Obsidian用法相似。

image.png

使用CQL处理数据

点击左侧的”星“图标,可查看示例代码,试建立两个节点一个关系:

CREATE (database:Database {name:"Neo4j"})-[r:SAYS]->(message:Message {name:"Hello World!"}) RETURN database, message, r

建立结构后可以通过左侧的Database Infomation查看数据情况。

使用Python访问图数据库

安装

$ pip install py2neo

代码

# coding:utf-8
from py2neo import Graph, Node, Relationship
 
# 连接neo4j数据库,输入地址、用户名、密码
graph = Graph("http://192.168.1.106:7474", name="neo4j")
graph.delete_all()
# 创建结点
test_node_1 = Node('ru_yi_zhuan', name='皇帝') # 修改的部分
test_node_2 = Node('ru_yi_zhuan', name='皇后') # 修改的部分
test_node_3 = Node('ru_yi_zhuan', name='公主') # 修改的部分
 
graph.create(test_node_1)
graph.create(test_node_2)
graph.create(test_node_3)
 
# 创建关系
# 分别建立了test_node_1指向test_node_2和test_node_2指向test_node_1两条关系,关系的类型为"丈夫、妻子",两条关系都有属性count,且值为1。
node_1_zhangfu_node_1 = Relationship(test_node_1, '丈夫', test_node_2)
node_1_zhangfu_node_1['count'] = 1
node_2_qizi_node_1 = Relationship(test_node_2, '妻子', test_node_1)
node_2_munv_node_1 = Relationship(test_node_2, '母女', test_node_3)
 
node_2_qizi_node_1['count'] = 1
 
graph.create(node_1_zhangfu_node_1)
graph.create(node_2_qizi_node_1)
graph.create(node_2_munv_node_1)
 
print(graph)
print(test_node_1)
print(test_node_2)
print(node_1_zhangfu_node_1)
print(node_2_qizi_node_1)
print(node_2_munv_node_1)

此时,即可以界面中看到新建的数据:

参考

docker安装部署neo4j
Neo4j基本入门
python操作neo4j

相关文章

网友评论

      本文标题:图数据库

      本文链接:https://www.haomeiwen.com/subject/gpptlrtx.html