图数据库简介
图数据库(Graph Database)是以图结构存储和查询数据的非关系型数据库,核心通过节点(Node)、边(Edge)和属性(Property)表示数据关系。相比传统关系型数据库,图数据库擅长处理复杂关联关系,适用于社交网络、推荐系统、欺诈检测等场景。
常见图数据库类型
- Neo4j:最流行的原生图数据库,支持Cypher查询语言。
- ArangoDB:多模型数据库,支持图、文档和键值存储。
- Amazon Neptune:全托管的图数据库服务,兼容Gremlin和SPARQL。
图数据库查询语句示例
Cypher(Neo4j)
创建节点和关系:
CREATE (a:Person {name: 'Alice', age: 30})-[:FRIENDS_WITH]->(b:Person {name: 'Bob'})查询朋友关系:
MATCH (a:Person)-[:FRIENDS_WITH]->(b:Person) WHERE a.name = 'Alice' RETURN b.nameGremlin(Apache TinkerPop)
遍历查询:
g.V().has('Person', 'name', 'Alice').out('FRIENDS_WITH').values('name')SPARQL(RDF图)
查询RDF数据:
SELECT ?friend WHERE { ?alice rdf:type :Person . ?alice :name "Alice" . ?alice :FRIENDS_WITH ?friend . }一、Neo4j(Cypher)—— 最主流的图数据库查询语言
1. 节点操作
(1)创建节点(含属性、标签)
cypher
// 创建单个节点(标签:Person,属性:姓名、年龄、城市) CREATE (p:Person {name: "张三", age: 30, city: "北京"}) RETURN p; // 批量创建节点 CREATE (p1:Person {name: "李四", age: 28, city: "上海"}), (p2:Company {name: "字节跳动", industry: "互联网", scale: "万人以上"});(2)查询节点
cypher
// 按标签+属性筛选节点 MATCH (p:Person {city: "北京"}) WHERE p.age > 25 RETURN p.name, p.age; // 模糊查询(正则) MATCH (p:Person) WHERE p.name =~ "张.*" RETURN p;(3)更新节点
cypher
// 修改属性 MATCH (p:Person {name: "张三"}) SET p.age = 31, p.job = "工程师" RETURN p; // 新增标签 MATCH (p:Person {name: "张三"}) SET p:Engineer RETURN p;(4)删除节点
cypher
// 删除单个节点(需先删除关联边,否则报错) MATCH (p:Person {name: "李四"}) DETACH DELETE p;2. 关系(边)操作
(1)创建关系(含属性)
cypher
// 给已有节点创建关系(张三→字节跳动,关系:WORKS_AT,属性:入职时间、职位) MATCH (p:Person {name: "张三"}), (c:Company {name: "字节跳动"}) CREATE (p)-[r:WORKS_AT {join_time: 2020, position: "后端开发"}]->(c) RETURN r; // 创建节点同时创建关系 CREATE (p:Person {name: "王五"})-[r:FRIEND_WITH {since: 2018}]->(q:Person {name: "赵六"}) RETURN p, r, q;(2)查询关系
cypher
// 查询张三的工作关系 MATCH (p:Person {name: "张三"})-[r:WORKS_AT]->(c:Company) RETURN p.name, r.position, c.name; // 查询多跳关系(张三的朋友的朋友) MATCH (p:Person {name: "张三"})-[:FRIEND_WITH*2]->(f:Person) RETURN f.name;(3)更新关系
cypher
MATCH (p:Person {name: "张三"})-[r:WORKS_AT]->(c:Company {name: "字节跳动"}) SET r.salary = 30000 RETURN r;(4)删除关系
cypher
MATCH (p:Person {name: "张三"})-[r:WORKS_AT]->(c:Company) DELETE r;3. 路径 / 聚合查询
cypher
// 最短路径(张三到字节跳动的最短路径) MATCH shortestPath((p:Person {name: "张三"})-[*]->(c:Company {name: "字节跳动"})) RETURN path; // 聚合统计(各城市的人数) MATCH (p:Person) RETURN p.city, COUNT(p) AS person_count ORDER BY person_count DESC;二、NebulaGraph(nGQL)—— 分布式图数据库
1. 基础操作(需先创建空间、标签、边类型)
ngql
// 创建空间 CREATE SPACE IF NOT EXISTS my_space (vid_type=FIXED_STRING(30)); USE my_space; // 创建标签(节点类型) CREATE TAG IF NOT EXISTS Person (name string, age int, city string); // 创建边类型 CREATE EDGE IF NOT EXISTS WORKS_AT (join_time int, position string); // 插入节点(VID为自定义唯一标识) INSERT VERTEX Person(name, age, city) VALUES "p1":("张三", 30, "北京"), "p2":("李四", 28, "上海"); // 插入边(起点VID -> 终点VID) INSERT EDGE WORKS_AT(join_time, position) VALUES "p1"->"c1":(2020, "后端开发"); // 查询节点 MATCH (p:Person) WHERE p.age > 25 RETURN p.name, p.city; // 查询边 MATCH (p:Person)-[r:WORKS_AT]->(c:Company) RETURN p.name, r.position;三、ArangoDB(AQL)—— 多模型数据库(支持图 + 文档)
aql
// 创建节点集合 CREATE COLLECTION Persons; // 创建边集合 CREATE COLLECTION WorksAt (type: EDGE); // 插入节点 INSERT {name: "张三", age: 30, city: "北京"} INTO Persons; INSERT {name: "字节跳动", industry: "互联网"} INTO Companies; // 插入边(_from/_to为节点的完整路径:集合名/文档ID) INSERT {_from: "Persons/123", _to: "Companies/456", join_time: 2020, position: "后端开发"} INTO WorksAt; // 查询(张三的工作关系) FOR p IN Persons FILTER p.name == "张三" FOR r IN WorksAt FILTER r._from == p._id FOR c IN Companies FILTER c._id == r._to RETURN {person: p.name, company: c.name, position: r.position};应用场景
- 实时推荐:基于用户行为图谱生成个性化推荐。
- 路径分析:查找社交网络中最短路径或影响力传播路径。
- 知识图谱:构建和查询复杂的实体关系网络。
图数据库通过高效的图遍历算法(如DFS、BFS)优化关联查询,适合需要频繁处理关系的场景。