neo4j图数据库

Posted by 新宇 on May 12, 2020

一、neo4j简介

  • 节点
    • 节点是主要的数据元素, 节点通过关系连接到其他节点, 节点可以具有一个或多个属性 (即存储为键/值对的属性), 节点有一个或多个标签, 用于描述其在图表中的作用. 示例: Person>节点.
    • 可以将节点类比为关系型数据库中的表, 对应的标签可以类比为不同的表名, 属性就是表中的列.
  • 关系
    • 关系连接两个节点, 关系是方向性的, 关系可以有一个或多个属性(即存储为键/值对的 属性).
  • 属性
    • 属性是命名值, 其中名称(或键)是字符串, 属性可以被索引和约束, 可以从多个属性创 建复合索引.
  • 标签
    • 标签用于组节点到集, 节点可以具有多个标签, 对标签进行索引以加速在图中查找节点.

二、neo4j图数据库的安装

  1. 将neo4j安装信息载入到yum检索列表
cd /tmp
wget http://debian.neo4j.org/neotechnology.gpg.key
rpm --import neotechnology.gpg.key
cat <<EOF>  /etc/yum.repos.d/neo4j.repo
# 写入下面内容
[neo4j]
name=Neo4j RPM Repository
baseurl=http://yum.neo4j.org/stable
enabled=1
gpgcheck=1
  1. 使用yum install命令安装
    yum install neo4j-3.3.5
    
  2. 修改配置文件默认在/etc/neo4j/neo4j.conf, 为了方便显示下面把一些修改显示在这里
# 数据库的存储库存储位置、日志位置等
dbms.directories.data=/var/lib/neo4j/data
dbms.directories.plugins=/var/lib/neo4j/plugins
dbms.directories.certificates=/var/lib/neo4j/certificates
dbms.directories.logs=/var/log/neo4j
dbms.directories.lib=/usr/share/neo4j/lib
dbms.directories.run=/var/run/neo4j

# 导入的位置
dbms.directories.import=/var/lib/neo4j/import

# 初始化内存大小
dbms.memory.heap.initial_size=512m

# Bolt 连接地址
dbms.connector.bolt.enabled=true
dbms.connector.bolt.tls_level=OPTIONAL
dbms.connector.bolt.listen_address=0.0.0.0:7687
  1. 启动neo4j数据库
# 启动命令
neo4j start

# 终端显示如下, 代表启动成功
Active database: graph.db
Directories in use:
  home:         /usr/neo4j
  config:       /etc/neo4j
  logs:         /var/log/neo4j
  plugins:      /var/lib/neo4j/plugins
  import:       /var/lib/neo4j/import
  data:         /var/lib/neo4j/data
  certificates: /var/lib/neo4j/certificates
  run:          /var/run/neo4j
Starting Neo4j.
  1. neo4j的可视化管理后台登陆: 访问地址: http://0.0.0.0:7474. ConnectURL: bolt://0.0.0.0:7687 Username: neo4j Password: neo4j (默认)

三、Cypher介绍与使用

1. cypher 是什么

Cypher是neo4j图数据的查询语言, 类似于mysql数据库的sql语句, 但是它允许对图形进行富有表现力和有效的查询和更新.

2. 基本命令和语法

  • create命令: 创建图数据中的节点.
    • CREATE (e:Employee{id:222, name:’Bob’, salary:6000, deptnp:12})
  • match命令: 匹配(查询)已有数据.
    • MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno
  • merge命令: 若节点存在, 则等效与match命令; 节点不存在, 则等效于create命令.
    • MERGE (e:Employee {id:145, name:’Lucy’, salary:7500, deptno:12})
  • 使用create创建关系: 必须创建有方向性的关系, 否则报错.
    • CREATE (p1:Profile1)-[r:Buy]->(p2:Profile2)
  • 使用merge创建关系: 可以创建有/无方向性的关系.
    • MERGE (p1:Profile1)-[r:miss]-(p2:Profile2)
  • where命令: 类似于SQL中的添加查询条件.
    • MATCH (e:Employee) WHERE e.id=123 RETURN e
  • delete命令: 删除节点/关系及其关联的属性.
    • MATCH (c1:CreditCard)-[r]-(c2:Customer) DELETE c1, r, c2
  • sort命令: Cypher命令中的排序使用的是order by.
    • MATCH (e:Employee) RETURN e.id, e.name, e.salary, e.deptno ORDER BY e.id
  • 字符串函数:
    • toUpper()函数
    • toLower()函数
    • substring()函数
    • replace()函数
  • toUpper()函数: 将一个输入字符串转换为大写字母.
    • MATCH (e:Employee) RETURN e.id, toUpper(e.name), e.salary, e.deptno
  • toLower()函数: 讲一个输入字符串转换为小写字母.
    • MATCH (e:Employee) RETURN e.id, toLower(e.name), e.salary, e.deptno
  • substring()函数: 返回一个子字符串.
    • MATCH (e:Employee) RETURN e.id, substring(e.name,0,2), e.salary, e.deptno
  • replace()函数: 替换掉子字符串.
    • MATCH (e:Employee) RETURN e.id, replace(e.name,e.name,e.name + “_HelloWorld”), e.salary, e.deptno
  • 聚合函数
    • count()函数
    • max()函数
    • min()函数
    • sum()函数
    • avg()函数
  • count()函数: 返回由match命令匹配成功的条数.
    • MATCH (e:Employee) RETURN count( * )
  • max()函数: 返回由match命令匹配成功的记录中的最大值.
    • MATCH (e:Employee) RETURN max(e.salary)
  • min()函数: 返回由match命令匹配成功的记录中的最小值.
    • MATCH (e:Employee) RETURN min(e.salary)
  • sum()函数: 返回由match命令匹配成功的记录中某字段的全部加和值.
    • MATCH (e:Employee) RETURN sum(e.salary)
  • avg()函数: 返回由match命令匹配成功的记录中某字段的平均值.
    • MATCH (e:Employee) RETURN avg(e.salary)
  • 索引index
    • Neo4j支持在节点或关系属性上的索引, 以提高查询的性能.
    • 可以为具有相同标签名称的所有节点的属性创建索引.
  • 创建索引: 使用create index on来创建索引.
    • CREATE INDEX ON:Employee(id)
  • 删除索引: 使用drop index on来删除索引.
    • DROP INDEX ON:Employee(id)

四、在Python中使用neo4j

1. neo4j-driver简介

neo4j-driver是一个python中的package, 作为python中neo4j的驱动, 帮助我们在python程序中更好的使用图数据库.

pip install neo4j-driver

2. 使用示例

from neo4j import GraphDatabase

# 关于neo4j数据库的用户名,密码信息已经配置在同目录下的config.py文件中

from config import NEO4J_CONFIG

driver = GraphDatabase.driver( **NEO4J_CONFIG)

# 直接用python代码形式访问节点Company, 并返回所有节点信息

with driver.session() as session:
    cypher = "CREATE(c:Company) SET c.name='programmer' RETURN c.name"
    record = session.run(cypher)
    result = list(map(lambda x: x[0], record))
    print("result:", result)
  • 事务的概念:
    • 如果一组数据库操作要么全部发生要么一步也不执行,我们称该组处理步骤为一个事务, 它是数据库一致性的保证
def _some_operations(tx, cat_name, mouse_name):
    tx.run("MERGE (a:Cat{name: $cat_name})"
           "MERGE (b:Mouse{name: $mouse_name})"
           "MERGE (a)-[r:And]-(b)",
           cat_name=cat_name, mouse_name=mouse_name)


with driver.session() as session:
    session.write_transaction(_some_operations, "Tom", "Jerry")