看得见的叫博弈;看不见的是赌博
引言
做交易相关的风控嘛,面对两个问题1、买卖家成环;2、区域内用户交易。为了清晰的看到多个用户之间的关联关系,选择neo4j作为我们的可视化工具。
部署
建议有条件的用docker
一、准备
机器:188G内存
neo4j-community-3.5.11-unix.tar.gz 安装包
apoc-3.5.0.6-all.jar,graph-algorithms-algo-3.5.4.0.jar算法库
mysql-connector-java-8.0.8-dmr.jar 连接库
batch-import-tool-master.zip 外部增量导入数据程序
二、安装
解压neo4j-community-3.5.11-unix.tar.gz到service目录下,建立软连接neo4j
将apoc-3.5.0.6-all.jar、graph-algorithms-algo-3.5.4.0.jar和mysql-connector-java-8.0.8-dmr.jar放在neo4j/plugins下
解压batch-import-tool-master.zip到neo4j目录下
三、配置
打开neo4j/conf/neo4j.conf
更改配置:
# java heap 初始值,大一点
dbms.memory.heap.initial_size=30G
# java heap 最大值,一般不要超过可用物理内存的80%
dbms.memory.heap.max_size=140G
# pagecache大小,官方建议设为:(总内存-dbms.memory.heap.max_size)/2
dbms.memory.pagecache.size=30g
# 配置地址
dbms.connectors.default_listen_address=10.10.10.77
dbms.connectors.default_advertised_address=10.10.10.77
# 开启http和GC的日志,其他默认(分片时间、大小、保留时长等等)
dbms.logs.http.enabled=true
dbms.logs.gc.enabled=true
# 允许外界load文件
dbms.security.allow_csv_import_from_file_urls=true
## 添加apoc库配置
dbms.security.procedures.unrestricted=apoc.*,algo.*
apoc.import.file.enabled=true
apoc.export.file.enabled=true
在debug日志中发现两条warn,不影响使用:
- mysql-connector-java-8.0.8-dmr.jar的警告
- The client is unauthorized due to authentication failure. 客户端验证失效
四、启动
./bin/neo4j start
在http://neo4j01:7474/端口查看
已经做好了http日志,任何人在上面的操作都在日志中可以查看
五、测试
# 添加两个点,有则覆盖无则添加
MERGE (p1:C1{id:'4')
MERGE (p2:C2{id:'5')
# 给两个点添加一条边,有则覆盖无则添加
MATCH (p1:C1{id:'4'}),(p2:C2{id:'5'})
MERGE (p1)-[r:ce]->(p2)
set r.id=1,r.list=[2,3,4]
RETURN r
基础用法
图数据应用策略
优先考虑使用SparkGraphX进行数据的处理和初始化,然后进行数据加载到图数据库
使用图数据的目的在于灵活、直观的进行数据的查询,而不是进行计算
图数据库权限问题,防止某些的操作导致服务崩溃,比如:(n)-[r*]-(m),全量数据会把数据库卡死
基础使用规范
1、数据初始化
MATCH (n)
OPTIONAL MATCH (n)-[r]->()
RETURN count(n.uid) + count(r);
2、索引建立
查询::schema
创建:CREATE INDEX ON :Person(name)
3、点查询
1)、指明所属标签 2)、指定索引id 3)、进行limit限制
例如:MATCH (n:GangUser{uid:29043916}) RETURN n
或 MATCH (n:GangUser) RETURN n limit 25
4、关系查询
1)、指明起始点所属标签 2)、指定起始点的索引id 3)、进行度的限制 4)、进行limit限制
例如:MATCH p=(n:GangUser{uid:29043916})-[r:SameInfo]->(m:GangUser{uid:GangUser{uid:29043916}}) RETURN p
或 MATCH p=(n:GangUser{uid:29043916})-[r:SameInfo*..2]->(m) RETURN p limit 50
5、ui界面
查询后进行关闭页面,不要保留太多的查询页面,减少页面压力
6、算法使用
引入新的库algo,更加方便的进行数据查询
最小生成树的使用
进行建树(指定起点,点的标签,关系的标签,关系的权值,write:true追加关系,writeProperty:"mst"追加关系的标签)
match (n:GangUser{uid:'27386239'})
CALL algo.spanningTree.minimum("GangUser", "SameInfo", "score", id(n), {write:true, writeProperty:"mst"})
YIELD loadMillis, computeMillis, writeMillis, effectiveNodeCount
RETURN loadMillis, computeMillis, writeMillis, effectiveNodeCount
进行查询
MATCH p = (n:GangUser{uid:'30296142'})-[r:mst*]-(m) return n,r,m
运维
备份和还原
offline:
关闭neo4j
bin/neo4j stop
dump备份
bin/neo4j-admin dump --database=graph.db --to=/tmp/20191213-1650.dump
load还原
bin/neo4j-admin load --from=/tmp/20191213-1650.dump --database=graph.db --force
启动服务
bin/neo4j-admin start
online:
切换Neo4j服务域名到备份服务
登录线上Neo4j服务器,执行下列命令进行数据备份
neo4j stop && neo4j-admin dump --database=graph.db --to=/tmp/neo4j-`date "+%Y_%m_%d"`.dump && neo4j start
线上服务启动好了,将Neo4j服务域名切回线上服务
至此线上服务一切如常了,下面将备份的数据同步到备份服务器上
scp /tmp/neo4j-`date "+%Y_%m_%d"`.dump root@$backup_service_ip:/tmp
将备份数据导入备份服务,保持两个服务数据一致
neo4j stop && neo4j-admin load --from=/tmp/neo4j-`date "+%Y_%m_%d"`.dump --database=graph.db --force && neo4j start