你应该知道的图数据库

2021-10-15 17:59:09 图数据库 2777 0

可以设想一个社交场景
如果我们想查 A 的人脉关系
如果用 Mysql 去做的话 对我们来说还挺容易
存储下与A相关的人脉关系就可以了
根据 领英 职场人脉关系网
一到三度人脉是跟我们自身或多或少有点交集的
如果这时候用再使用 Mysql 查询 A 的三度人脉关系
你可能会发现,查询的复杂度就会大很多了
作为写代码的人 你可以感知到 性能很可能也会很差
这时候就需要用图数据库了

它是什么

它是一种 NoSql 主要用于记录实体与实体之间关系的一种数据库
主要应用于社交关系场景
点此查看-度娘百科

哪些项目在用它

信用风控

当事人 A 如果想用某个贷款APP借钱
贷款APP一定要 A 把它通讯录信息收集才肯借他

然后 贷款APP 在收到 A 的通讯录后
可以把这个关联数据放到图数据库中
当收集了足够多的类似 A 的用户通讯录信息后
就可以进行风控

比如 A 在 贷款APP 上借过钱而且是老赖不还钱
为了防止 A 结队找其他人一起借钱不还
贷款APP 考虑多方面成本与回报
得出结论: 不能给 A 的一度人脉放款;对于A的二度人脉,得运营审核更多信息后再决定是否放款
这种时候就需要图数据库的支持

社交广告

在社交网络上 比如,微博
有一些大V【网红、明星】给某个产品【比如,女士化妆品】打广告
投广告的一方就想评估下哪些大V给这类产品打广告 转化率可能会最高
因为微博这种是社交网络式的
一般来说 对此感兴趣的人 可能会在看到广告后转发微博推荐相关朋友来购买产品
而且平时刷微博久了 微博也会给用户打标签
比如,这个用户是对 【化妆品】这个领域感兴趣的
然后评估对 女士化妆品 有一定影响力的大v的一到三度脉人汇总对化妆品感兴趣的总体转化率
可以提升广告的转化率,也能让广告对用户造成的干扰降低很多

相关推荐

现在电商运营维护了一堆商品百科数据
想人工做一些百科相关推荐【比如,都是高通芯片、都是同一个厂家等等】
那么需要建立百科之间的关联关系
这时候就用图数据库处理一度关系就很方便

用哪款图数据库

云天河在这里主要使用 Neo4j

搭建

先新建目录,然后进入目录

话不多说 直接 docker-compose 一把梭操作

docker-compose.yml
version: '3'
services:

  neo4j:
    image: neo4j:3.4.7
    container_name: neo4j-app
    # volumes: # 生产环记得把注释打开,线下测试可以不用挂载
    #   - ./conf:/var/lib/neo4j/conf  #数据卷,前面是宿主机目录,后面是容器目录
    #   - ./mnt:/var/lib/neo4j/import
    #   - ./plugins:/plugins
    #   - ./data:/data

    restart: always
    ports:
      - 7474:7474 # UI交互端口
      - 7687:7687 # 图数据库对外提供连接的端口
    environment:
      - NEO4J_dbms_memory_heap_maxSize=1G # 目前云天河测试,1G内存空间是没问题的,请根据业务场景,自行调整内存大小
      - NEO4J_AUTH=neo4j/123456  # 用户名/密码

networks:
  default:
    external:
      name: network_neo4j_app
Makefile

为了少写点命令,云天河在这里准备了 Makefile 集成命令

all: run

run:
    @# 删除镜像
    @make -s down
    @# 以后台挂起的模式运行
    @docker-compose  --compatibility -p neo4j_instance  up -d

down:
    @docker-compose  -p neo4j_instance down

cnet:
    @# 创建网卡
    @docker network create --subnet=172.30.0.0/16 network_neo4j_app

ini:
    @make -is cnet
    @make -s run

in:
    @docker exec -it neo4j-app bash

log:
    @docker logs -f neo4j-app

clear:
    @clear
    @make -s down
    @#docker rmi nginx_hlz-php-fpm

然后就可以跑起来了

make run


对外的视图操作页面就在 7474 端口了
我们访问一下看看

输入刚刚我们在 docker-compose.yml 里配置的账号 neo4j 密码 123456 就可以玩了


我们可以看到顶部带 $ 的那里 就是我们的命令行了

常用命令

我这里准备了一些常用的命令
大家就可以适配大多场景了

创建一个节点名为 Person 属性 name 值 Mike 的数据

当然节点名可以自己随便命名

CREATE (n:Person {name:'Mike'}) RETURN n

增加或修改一个节点名为 Person 属性 name 值 Mike 的节点对应属性

MATCH (a:Person {name:'Mike'}) SET a.age=34

删除一个节点名为 Person 属性 name 值 Mike 的节点对应 age 属性

MATCH (a:Person {name:'Mike'}) REMOVE a.age

删除一个节点名为 Person 属性 name 值 Mike 的所有关系

MATCH (n:Person {name:'Mike'})-[r]-() DELETE r

删除一个节点名为 Person 属性 name 值 Mike 的节点

注意:该节点被删除前,必须先删除所有关系

MATCH (a:Person {name:'Mike'}) DELETE a

查询出所有 Person 节点

MATCH (n:Person) RETURN n

关联两个节点,并命名关系名为 FRIENDS

无向关联,如,双向关联

MATCH (a:Person {name:'Liz'}), (b:Person {name:'Mike'}) MERGE (a)-[:FRIENDS]-(b)

有向关联,如,单向关联 a 关注 b

MATCH (a:Person {name:'Liz'}), (b:Person {name:'Lisa'}) MERGE (a)-[:FRIENDS]->(b)

取消指定关联关系

MATCH (n:Person {name:'Mike'})-[r]-(b:FROM {city:'Chongqing'}) DELETE r

更多取消关系 见 https://www.cnblogs.com/jpfss/p/11328772.html

取消指定节点所有关联关系

MATCH (n:Person {name:'Mike'}) DETACH DELETE n

查询一度人脉关系

MATCH (a:Person {name:'Mike'})-[:FRIENDS]-(b) RETURN b

同理,查询把 Mike 当成朋友的一度人脉

MATCH (a)-[:FRIENDS]->(b:Person {name:'Mike'}) RETURN b

查询二度人脉关系

MATCH (a:Person {name:'Liz'})-[r1:FRIENDS]-()-[r2:FRIENDS]-(friend_of_a_friend) RETURN friend_of_a_friend

查询二度人脉关系,并吐出指定数据

MATCH (a:Person {name:'Liz'})-[r1:FRIENDS]-()-[r2:FRIENDS]-(friend_of_a_friend) RETURN friend_of_a_friend.name AS fofName
注:若无特殊说明,文章均为云天河原创,请尊重作者劳动成果,转载前请一定要注明出处