官网地址:https://www.nebula-graph.com.cn/

  官方文档地址:https://docs.nebula-graph.com.cn/3.8.0/

1.与neo4j对比

Neo4j 更成熟、生态更完善,适合中小规模图数据和快速开发;NebulaGraph 天生分布式,适合十亿级以上节点/边、高并发和需要水平扩展的大规模场景。

主要差异

维度Neo4jNebulaGraph
架构 单机优先,分布式能力主要依赖企业版集群 原生分布式,存储与计算分离,支持水平扩展
数据规模 中小规模表现很好;超大规模扩展成本较高 更适合千亿节点、万亿边级别
查询语言 Cypher / OpenCypher,生态成熟,表达力强 nGQL,类 SQL,部分兼容 OpenCypher
性能特点 小规模图查询、深度遍历和开发体验较好 大规模导入、多跳查询、高并发查询优势明显
生态与工具 社区、文档、可视化工具、第三方集成更丰富 国内生态增长快,但整体成熟度仍略低于 Neo4j
部署运维 单机部署简单;分布式集群相对复杂且多为商业版 分布式部署复杂度更高,但扩容能力更强
信创/国产化 国产平台官方适配较少 对鲲鹏、飞腾、海光、兆芯等国产环境适配更好

怎么选

  • 优先选 Neo4j:数据量不大、团队想快速验证、需要成熟可视化工具、复杂图查询较多,或者项目依赖丰富的教程和第三方生态。
  • 优先选 NebulaGraph:数据量达到亿级甚至十亿级以上、需要高并发实时查询、要在线扩缩容、对国产化/信创有要求,或者希望开源方案支持更大规模集群。
如果只是一个知识图谱原型、中小规模关系分析,Neo4j 通常更省心;如果要承载大规模用户关系、风控图、推荐图、供应链图等,NebulaGraph 的分布式扩展能力更有优势。

2.部署安装

按官方文档可以快速部署及配置

重启命令

sudo ./nebula.service stop storaged
sudo ./nebula.service start storaged
sudo ./nebula.service stop metad
sudo ./nebula.service start metad
sudo ./nebula.service stop graphd
sudo ./nebula.service start graphd

集群安装时重启后需要

SUBMIT JOB BALANCE LEADER;

3.快速开始

创建space、tag、edge

CREATE SPACE `test` (partition_num = 10, vid_type = FIXED_STRING(256));
--创建tag
CREATE tag `id_num`
(
`roster_type` int DEFAULT 9 COMMENT "黑灰名单标识",
`source` int DEFAULT 9 COMMENT "加黑原因"
);
CREATE tag `phone`
(
`roster_type` int DEFAULT 9 COMMENT "黑灰名单标识",
`source` int DEFAULT 9 COMMENT "加黑原因"
);
--删除tag:DROP TAG `id_num`;DROP TAG `phone`;
--创建edge:
CREATE EDGE phone_with_id_num (weight int, add_time int);
CREATE EDGE id_num_with_phone (weight int, add_time int);
--删除edge:DROP EDGE phone_with_id_num;DROP EDGE id_num_with_phone;
--创建索引
CREATE TAG INDEX idx_id_num_roster_type ON `id_num`(roster_type);
CREATE TAG INDEX idx_id_num ON `id_num`();
CREATE TAG INDEX idx_phone_roster_type ON `phone`(roster_type);
CREATE TAG INDEX idx_phone ON `phone`();
---重建索引
REBUILD TAG INDEX `idx_id_num_roster_type`;
REBUILD TAG INDEX `idx_id_num`;
REBUILD TAG INDEX `idx_phone_roster_type`;
REBUILD TAG INDEX `idx_phone`;
---删除索引 DROP TAG INDEX idx_id_num_roster_type;DROP TAG INDEX idx_id_num;DROP TAG INDEX idx_phone_roster_type;DROP TAG INDEX idx_phone;

 因为negbulagraph是有向边,所以如果希望能a->b  b->a,那就需要创建双向边

添加数据

tag:
INSERT VERTEX id_num(roster_type, source) VALUES "id_num1111":(1,"原因"),"id_num2222":(2,"原因");
INSERT VERTEX phone(roster_type, source) VALUES "phone1111":(1,"原因"),"phone2222":(2,"原因");
DELETE VERTEX "id_num1111";
UPDATE VERTEX ON phone "phone1111" SET roster_type= 3 WHEN roster_type== 1 YIELD roster_type AS rosterType, source AS source;  --如果where结果为false,set子句不会生效

UPSERT VERTEX ON phone "phone1111" SET roster_type= 3 WHEN roster_type== 1 YIELD roster_type AS rosterType, source AS source;  --如果vid不存在则插入

 edge:

INSERT EDGE phone_with_id_num(weight, add_time) VALUES "phone1111"->"id_num1111":(1, 1791475200000), "phone2222"->"id_num2222":(1, 1791475200000);

DELETE EDGE phone_with_id_num "phone1111" -> "id_num1111"@0;

查询支持match和go两种

MATCH (startTag)-[edgeType*1..3]->(endTag) where id(startTag) == 'id_num1111' RETURN startTag,edgeType,endTag limit 5000;

GO 1 TO 3 STEPS FROM 'id_num1111' OVER * YIELD $^ AS startTag, edge AS edgeType, $$ AS endTag limit [200,200,200];
 
posted on 2026-10-10 14:47  程序员丁先生  阅读(24)  评论(0)    收藏  举报