Neo4j安装

Neo4j 4.x版本开始jdk版本最低要求11,云服务器jdk版本是14。

Neo4j Labs

包含一系列最新的图算法工具包。主要用到的有Graph Algorithms Library
Awesome Procedures on Cypher (APOC)等算法工具包,Neovis.js
前端描绘包,ETL Tool导入工具包等。

Neo4j Graph Algorithms

文档说明
支持算法:
image.png

APOC

文档说明
提供上百种函数及过程。包括CSV、JSON、EXCEL、HTML的导入导出及各种图算法。

安装APOC

官网或共享目录下载对应版本jar包,放置到plugin目录下。修改配置文件:

  1. dbms.security.procedures.unrestricted=apoc.*
  2. #允许apoc导入导出功能
  3. apoc.export.file.enabled=true
  4. apoc.import.file.enabled=true

重启服务即可。验证是否安装成功:
image.png

APOC有对应的3.x和4.x版本。
Graph Algorithm Library没有4.x版本。所以如果需要,只能使用3.x版本图库。

其他数据库驱动

导入其他数据库数据时,一般通过apoc的过程实现。现阶段用到mysql和SQL server,直接将驱动下载到plugin目录即可

image.png

Cypher

merge

通常通过merge语法创建节点和关系。
创建节点:

  1. merge(n:人员 {EmpCode:'123456'})
  2. on create set n.EmpName='张三'
  3. on match set n.EmpName='张三'

创建关系:

  1. MATCH (n:`生产批记录`) MATCH (m:`生产指令`)where n.CmdCode=m.CmdCode
  2. merge (n)-[:批记录关联生产指令]->(m)

通过merge创建节点而不用create的原因是,merge是match和create的结合,先查询,再判断是否创建。
上面例子中,如果没有查询到’123456’的节点就执行on create 操作,否则执行on match操作。
如果merge()中的属性有多个,如果有一个不相同,就会创建新的节点,所以属性一般设置节点的唯一标识,on create和on match设置其他属性值。

YIELD

yeild一般与过程一起使用,call … yield xx 从结果中过滤出需要的字段。
例如:
不使用yield,获取数据库支持所有的过程
image.png
通过yield,只获取name属性
image.png

unwind

用于展开迭代列表
image.png

其他

1.获取index等,3.x版本直接使用:schema,4.x版本不会显示具体的索引配置,需要使用call db.indexes()
image.png

2.获取所有节点标签
image.png

3.获取所有属性
image.png

4.获取所有关系
image.png

5.连接mysql数据库
CALL apoc.load.jdbc(“jdbc:mysql://{数据库IP}:{数据库端口}/{数据库名称}?user={用户名}&password={密码}&useUnicode=true&characterEncoding=utf8”,”{表名}”)
例如从tims_etl的etl_material中获取一行数据

  1. CALL apoc.load.jdbc("jdbc:mysql://10.51.14.16:3306/tims_etl?user=root&password=root&useUnicode=true&characterEncoding=utf8","etl_material")
  2. YIELD row RETURN row limit 1;

6.连接Sql server
call apoc.load.jdbc(‘jdbc:sqlserver://;servername={IP};databaseName={数据库名称};user={登陆名};password={密码}’,’表名’) yield row

call apoc.load.jdbc('jdbc:sqlserver://;servername=192.168.227.135;databaseName=Wisdom_ZBD_HZB;user=sa;password=123456','TEmployee') 
yield row return row

7.修改节点标签

MATCH (n:`生产批记录`) remove n:`生产批记录` set n:原批记录

8.修改关系标签
关系标签不能直接修改,只能删除再创建

MATCH (n)-[r:OLD_RELATION]->(m)
CREATE (n)-[r2:NEW_RELATION]->(m)
SET r2 = r // 这里是复制属性
WITH r
DELETE r

9.查询节点A且A和节点B没有关系

 MATCH(a:A)WHERE not((a)-[]->(b:B)) return a;

10.集成X岛企业数据库可能用到的cyher

//导入设备
call apoc.load.jdbc('jdbc:sqlserver://;servername=192.168.227.135;databaseName=Wisdom_ZBD_HZB;user=sa;password=123456','TDevice') 
yield row merge(n:设备 {DeviceCode:row.DeviceCode}) on create set n.DeviceName=row.DeviceName,n.DeviceStandard=row.DeviceStandard

//指令及父指令建立关系
MATCH (n:`生产指令`) match (m:`生产指令`) where n.ParentCmdCode = m.CmdCode merge (n)-[:父指令]->(m)

//批量添加批记录
//通过apoc.periodic.iterate实现
call apoc.periodic.iterate('call apoc.load.jdbc("jdbc:sqlserver://;servername=192.168.227.142;databaseName=Wisdom_ZBD_HZB;user=sa;password=123456","TProRecord")','merge(n:生产批记录 {ID:row.ID}) on create set n.Type=row.Type,n.BCmdID=row.BCmdID,n.CmdCode=row.CmdCode,n.OperateDate=row.OperateDate,n.XML=toString(row.XML)',{ batchSize:1000, parallel:true})

//执行sql语句
call apoc.load.jdbc("jdbc:sqlserver://;servername=192.168.227.142;databaseName=Wisdom_ZBD_HZB;user=sa;password=123456","select count(*) as count from TProRecord")

//通过apoc 解析xml
//批记录xml相对简单,所有数据都在一层结构中
match (n:`原批记录`) return apoc.xml.parse(n.XML) as xml limit 5

https://cloud.tencent.com/developer/ask/126177
这个是一个比较复杂的例子