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
文档说明
支持算法:
APOC
文档说明
提供上百种函数及过程。包括CSV、JSON、EXCEL、HTML的导入导出及各种图算法。
安装APOC
官网或共享目录下载对应版本jar包,放置到plugin目录下。修改配置文件:
dbms.security.procedures.unrestricted=apoc.*#允许apoc导入导出功能apoc.export.file.enabled=trueapoc.import.file.enabled=true
重启服务即可。验证是否安装成功:
APOC有对应的3.x和4.x版本。
Graph Algorithm Library没有4.x版本。所以如果需要,只能使用3.x版本图库。
其他数据库驱动
导入其他数据库数据时,一般通过apoc的过程实现。现阶段用到mysql和SQL server,直接将驱动下载到plugin目录即可

Cypher
merge
通常通过merge语法创建节点和关系。
创建节点:
merge(n:人员 {EmpCode:'123456'})on create set n.EmpName='张三'on match set n.EmpName='张三'
创建关系:
MATCH (n:`生产批记录`) MATCH (m:`生产指令`)where n.CmdCode=m.CmdCodemerge (n)-[:批记录关联生产指令]->(m)
通过merge创建节点而不用create的原因是,merge是match和create的结合,先查询,再判断是否创建。
上面例子中,如果没有查询到’123456’的节点就执行on create 操作,否则执行on match操作。
如果merge()中的属性有多个,如果有一个不相同,就会创建新的节点,所以属性一般设置节点的唯一标识,on create和on match设置其他属性值。
YIELD
yeild一般与过程一起使用,call … yield xx 从结果中过滤出需要的字段。
例如:
不使用yield,获取数据库支持所有的过程
通过yield,只获取name属性
unwind
用于展开迭代列表
其他
1.获取index等,3.x版本直接使用:schema,4.x版本不会显示具体的索引配置,需要使用call db.indexes()
2.获取所有节点标签
3.获取所有属性
4.获取所有关系
5.连接mysql数据库
CALL apoc.load.jdbc(“jdbc:mysql://{数据库IP}:{数据库端口}/{数据库名称}?user={用户名}&password={密码}&useUnicode=true&characterEncoding=utf8”,”{表名}”)
例如从tims_etl的etl_material中获取一行数据
CALL apoc.load.jdbc("jdbc:mysql://10.51.14.16:3306/tims_etl?user=root&password=root&useUnicode=true&characterEncoding=utf8","etl_material")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
这个是一个比较复杂的例子
