属性图查询:Cypher 与 Gremlin

属性图用节点、边与属性建模,查询方式与 RDF/SPARQL 的「三元组 + 图模式」不同:一类是声明式Cypher(Neo4j 等),用接近图结构的语法描述「谁连谁」;另一类是过程式Gremlin(TinkerPop),用「从某点出发、沿边走、再过滤」的步骤链做遍历与图计算。本章介绍 Cypher 的 MATCH、WHERE、RETURN、CREATE,Gremlin 的遍历与图计算,以及与 SPARQL 的思维差异与选型

一、Cypher 语法概览

Cypher 是面向属性图的声明式查询语言,核心思想是「图模式」:用括号表示节点、方括号表示边,箭头表示方向,整体读起来像一张小图。MATCH 子句指定要匹配的模式;WHERE 对节点或边的属性施加条件;RETURN 指定返回的变量或表达式;CREATE 用于插入新节点与边。

节点用 (变量:Label {key: value}) 表示,可省略变量或标签;边用 -[变量:REL_TYPE]-,方向为 -><-。例如 (a:Person)-[:KNOWS]->(b:Person) 表示 a、b 均为 Person,且存在从 a 到 b 的 KNOWS 边。

MATCH (a:Person)-[r:KNOWS]->(b:Person)
WHERE a.name = 'Alice'
RETURN b.name, r.since
Cypher 图模式:节点 (变量:Label)、边 [变量:REL_TYPE]、方向与属性

CREATE 示例:CREATE (a:Person {name: 'Alice'})-[:KNOWS {since: 2020}]->(b:Person {name: 'Bob'}) 会创建两个节点与一条边。与 MATCH 结合可写 MERGE(存在则匹配、不存在则创建),实现「若无则插入」。

二、Gremlin 遍历与图计算

Gremlin 是 Apache TinkerPop 的图遍历语言,采用步骤链(step chain):从图 g 出发,g.V() 取所有顶点,g.V(id) 取指定顶点;.out(label) 沿出边到邻居,.in(label) 沿入边,.both(label) 无向;.has(key, value) 过滤属性;.values('name') 取属性值;.limit(n).count() 等做聚合或截断。每一步的输入是上一步产生的元素(顶点或边),输出传给下一步。

Gremlin 既可做查询(谁的朋友的朋友),也可做图计算(如 PageRank、最短路径),与 TinkerPop 的图 API 和多种图数据库(Neo4j、JanusGraph、Neptune 等)集成。风格是「一步步走」,适合需要精细控制遍历顺序或嵌入到程序中的场景。

g.V().has('name', 'Alice').out('KNOWS').values('name')
Gremlin 步骤链:V → has → out → values;每步输入输出传递

三、与 SPARQL 的思维差异与选型

SPARQL 面向 RDF:数据是三元组集合,查询是图模式(三元组模式的合取),变量绑定到图中的节点或边;强调「模式匹配」与标准、多源(LOD)。Cypher 面向属性图:数据是节点+边+属性,查询是「图模式」的声明式描述,语法贴近图的形状;强项为可读性与 Neo4j 生态。Gremlin 是过程式遍历:从起点一步步走,每步变换流;强项为灵活控制、图算法与多后端(TinkerPop)。

选型时可考虑:若数据已是 RDF、需 SPARQL 或与 LOD 互操作,用三元组存储 + SPARQL;若以属性图建模、希望查询易读且以 Neo4j 为主,用 Cypher;若需要复杂遍历、图算法或统一多图后端,用 Gremlin。部分系统同时支持多种语言(如 Neptune 支持 SPARQL 与 Gremlin),可按场景切换。

SPARQL

RDF, triple pattern, BGP; declarative; LOD, standard; good for knowledge graphs and federation.

Cypher

Property graph, pattern (node-edge-node); declarative, readable; Neo4j; good for business graph.

Gremlin

Step chain, traversal; imperative; TinkerPop, multi-backend; good for traversal and graph algo.

三种语言对比:SPARQL 三元组声明式;Cypher 图模式声明式;Gremlin 步骤链过程式

选型小结

RDF + 标准 + 联邦 → SPARQL;属性图 + 易读 + Neo4j → Cypher;遍历 + 图算法 + 多后端 → Gremlin。数据模型(RDF vs 属性图)与团队习惯、生态一起考虑。

一句话: Cypher 用图模式 (a)-[r:REL]->(b) 做声明式查询,MATCH/WHERE/RETURN/CREATE/MERGE;Gremlin 用步骤链 g.V().out().has().values() 做过程式遍历与图计算。与 SPARQL:SPARQL 面向 RDF 与图模式匹配;Cypher 面向属性图、语法像图;Gremlin 面向遍历与算法。选型看数据模型、查询风格与生态(LOD/Neo4j/TinkerPop)。

实践: 在 Neo4j 中建一个小图(若干 Person 与 KNOWS 边),用 Cypher 写 MATCH 查「Alice 认识的人」和 CREATE 插入新节点;再用 Gremlin(若环境支持)写等价的 g.V().has('name','Alice').out('KNOWS'),体会声明式与过程式的差异。

四、小结

Cypher 以 MATCH、WHERE、RETURN、CREATE 描述属性图上的图模式,语法贴近图结构。Gremlin 以步骤链做遍历与图计算,与 TinkerPop 和多图后端集成。与 SPARQL 相比:SPARQL 为 RDF 声明式,Cypher 为属性图声明式,Gremlin 为过程式;选型依数据模型、查询需求与生态。下一章讲存储选型与性能优化