neo4j查询语句 查询语句

图数据库已经越来越被人们熟知 , 同时也在许多企业中得到了应用 , 但是由于市面上没有统一的图查询语言标准 , 所以有部分开发者对于不同图数据库的用法存在着疑问 。因此本文作者对市面上主流的几款图数据库进行了一番分析 , 并以查询操作为例进行深入介绍 。
文章的开头我们先来看下什么是图数据库 , 根据维基百科的定义:图数据库是使用图结构进行语义查询的数据库 , 它使用节点、边和属性来表示和存储数据 。
虽然和关系型数据库存储的结构不同(关系型数据库为表结构 , 图数据库为图结构) , 但不计各自的性能问题 , 关系型数据库可以通过递归查询或者组合其他 SQL 语句(Join)完成图查询语言查询节点关系操作 。得益于 1987 年 SQL 成为国际标准化组织(ISO)标准 , 关系型数据库行业得到了很好的发展 。同 60、70 年代的关系型数据库类似 , 图数据库这个领域的查询语言目前也没有统一标准 , 虽然 19 年 9 月经过国际 SQL 标准委员会投票表决 , 决定将图查询语言(Graph Query Language)纳为一种新的数据库查询语言 , 但 GQL 的制定仍需要一段时间 。

neo4j查询语句 查询语句

文章插图
neo4j查询语句 查询语句

文章插图
neo4j查询语句 查询语句

文章插图
neo4j查询语句 查询语句

文章插图
neo4j查询语句 查询语句

文章插图
删除数据复制代码
# nGQLnebula> DELETE VERTEX hash("prometheus");# Gremlingremlin> g.V(prometheus).drop();# Cyphercypher> MATCH (n:character {name:"prometheus"}) DETACH DELETE n 这里 , 我们可以看到大家的删除关键词都是类似的:Delete 和 Drop , 不过这里需要注意的是上面术语篇中提过 nGQL 中删除操作对应单词有 Delete 和 Drop  , 在 nGQL 中 Delete 一般用于点边 , Drop 用于 Schema 删除 , 这点和 SQL 的设计思路是一样的 。
更新数据复制代码
# nGQLnebula> UPDATE VERTEX hash("jesus") SET character.type = 'titan';# Gremlingremlin> g.V(jesus).property('age', 6000);==>v<32># Cyphercypher> MATCH (n:character {name:"jesus"}) SET n.type = 'titan';可以看到 Cypher 和 nGQL 都使用 SET 关键词来设置点对应的类型值 , 只不过 nGQL 中多了 UPDATE 关键词来标识操作 , Gremlin 的操作和查看点操作类似 , 只不过增加了变更 property 值操作 , 这里我们注意到的是 , Cypher 中常见的一个关键词便是 MATCH , 顾名思义 , 它是一个查询关键词 , 它会去选择匹配对应条件下的点边 , 再进行下一步操作 。
查看数据复制代码
# nGQLnebula> FETCH PROP ON character hash("saturn");===================================================| character.name | character.age | character.type |===================================================| saturn| 10000| titan|---------------------------------------------------# Gremlingremlin> g.V(saturn).valueMap();==>,age:<10000>># Cyphercypher> MATCH (n:character {name:"saturn"}) RETURN properties(n)╒════════════════════════════════════════════╕│"properties(n)"│╞════════════════════════════════════════════╡│{"name":"saturn","type":"titan","age":10000}│└────────────────────────────────────────────┘在查看数据这块 , Gremlin 通过调取 valueMap() 获得对应的属性值 , 而 Cypher 正如上面更新数据所说 , 依旧是 MATCH 关键词来进行对应的匹配查询再通过 RETURN 返回对应的数值 , 而 nGQL 则对 saturn 进行 hash 运算得到对应 VID 之后去获取对应 VID 的属性值 。
查询 hercules 的父亲复制代码
# nGQLnebula>LOOKUP ON character WHERE character.name == 'hercules' | \-> GO FROM $-.VertexID OVER father YIELD $$.character.name;=====================| $$.character.name |=====================| jupiter|---------------------# Gremlingremlin> g.V().hasLabel('character').has('name','hercules').out('father').values('name');==>jupiter# Cyphercypher> MATCH (src:character{name:"hercules"})-