图数据库查询语言

本文介绍图数据库支持的gremlin和Cypher查询语言。

初始化数据#

可使用gremlin api执行

gremlin api#

POST http://localhost:8080/gremlin

Copy
{"gremlin":"这里是语句", "bindings": {}, "language": "gremlin-groovy", "aliases": { "graph": "graphname", "g": "__g_graphname" } }

schema#

Copy
schema = hugegraph.schema() schema.propertyKey("name").asText().ifNotExist().create() schema.propertyKey("age").asInt().ifNotExist().create() schema.propertyKey("time").asInt().ifNotExist().create() schema.propertyKey("reason").asText().ifNotExist().create() schema.propertyKey("type").asText().ifNotExist().create() schema.vertexLabel("character").properties("name", "age", "type").primaryKeys("name").nullableKeys("age").ifNotExist().create() schema.vertexLabel("location").properties("name").primaryKeys("name").ifNotExist().create() schema.edgeLabel("father").link("character", "character").ifNotExist().create() schema.edgeLabel("mother").link("character", "character").ifNotExist().create() schema.edgeLabel("battled").link("character", "character").properties("time").ifNotExist().create() schema.edgeLabel("lives").link("character", "location").properties("reason").nullableKeys("reason").ifNotExist().create() schema.edgeLabel("pet").link("character", "character").ifNotExist().create() schema.edgeLabel("brother").link("character", "character").ifNotExist().create()

插入数据#

Copy
// add vertices Vertex saturn = graph.addVertex(T.label, "character", "name", "saturn", "age", 10000, "type", "titan") Vertex sky = graph.addVertex(T.label, "location", "name", "sky") Vertex sea = graph.addVertex(T.label, "location", "name", "sea") Vertex jupiter = graph.addVertex(T.label, "character", "name", "jupiter", "age", 5000, "type", "god") Vertex neptune = graph.addVertex(T.label, "character", "name", "neptune", "age", 4500, "type", "god") Vertex hercules = graph.addVertex(T.label, "character", "name", "hercules", "age", 30, "type", "demigod") Vertex alcmene = graph.addVertex(T.label, "character", "name", "alcmene", "age", 45, "type", "human") Vertex pluto = graph.addVertex(T.label, "character", "name", "pluto", "age", 4000, "type", "god") Vertex nemean = graph.addVertex(T.label, "character", "name", "nemean", "type", "monster") Vertex hydra = graph.addVertex(T.label, "character", "name", "hydra", "type", "monster") Vertex cerberus = graph.addVertex(T.label, "character", "name", "cerberus", "type", "monster") Vertex tartarus = graph.addVertex(T.label, "location", "name", "tartarus") // add edges jupiter.addEdge("father", saturn) jupiter.addEdge("lives", sky, "reason", "loves fresh breezes") jupiter.addEdge("brother", neptune) jupiter.addEdge("brother", pluto) neptune.addEdge("lives", sea, "reason", "loves waves") neptune.addEdge("brother", jupiter) neptune.addEdge("brother", pluto) hercules.addEdge("father", jupiter) hercules.addEdge("mother", alcmene) hercules.addEdge("battled", nemean, "time", 1) hercules.addEdge("battled", hydra, "time", 2) hercules.addEdge("battled", cerberus, "time", 12) pluto.addEdge("brother", jupiter) pluto.addEdge("brother", neptune) pluto.addEdge("lives", tartarus, "reason", "no fear of death") pluto.addEdge("pet", cerberus) cerberus.addEdge("lives", tartarus)

可视化

创建索引#

创建索引,使用REST API:

POST http://localhost:8080/graphs/hugegraph/schema/indexlabels

Copy
{ "name": "characterAge", "base_type": "VERTEX_LABEL", "base_value": "character", "index_type": "RANGE", "fields": [ "age" ] }

查询#

API 说明#

支持gremlinsparqlCypher api,推荐gremlin和Cypher

cypher api#

Copy
http://127.0.0.1:8080/graphs/hugegraph/cypher?cypher=

eg:

Copy
curl http://127.0.0.1:8080/graphs/hugegraph/cypher?cypher=MATCH%20(n:character)-[:lives]-%3E(location)-[:lives]-(cohabitants)%20where%20n.name=%27pluto%27%20return%20cohabitants.name

gremlin api#

POST http://localhost:8080/gremlin

Copy
{"gremlin":"这里是语句", "bindings": {}, "language": "gremlin-groovy", "aliases": { "graph": "graphname", "g": "__g_graphname" } }

sparql api#

Copy
GET http://127.0.0.1:8080/graphs/hugegraph/sparql?sparql=SELECT%20*%20WHERE%20{%20}

1. 查询hercules的祖父

Copy
g.V().hasLabel('character').has('name','hercules').out('father').out('father')

也可以通过repeat方式:

Copy
g.V().hasLabel('character').has('name','hercules').repeat(__.out('father')).times(2)

cypher

Copy
MATCH (n:character)-[:father]->()-[:father]->(grandfather) where n.name='hercules' return grandfather

2. Find the name of hercules's father

Copy
g.V().hasLabel('character').has('name','hercules').out('father').value('name')

cypher

Copy
MATCH (n:character)-[:father]->(father) where n.name='hercules' return father.name

3. Find the characters with age > 100

Copy
g.V().hasLabel('character').has('age',gt(100))

cypher

Copy
MATCH (n:character) where n.age > 10 return n

4. Find who are pluto's cohabitants

Copy
g.V().hasLabel('character').has('name','pluto').out('lives').in('lives').values('name')

cypher

Copy
MATCH (n:character)-[:lives]->(location)-[:lives]-(cohabitants) where n.name='pluto' return cohabitants.name

5. Find pluto can't be his own cohabitant

Copy
pluto = g.V().hasLabel('character').has('name', 'pluto') g.V(pluto).out('lives').in('lives').where(is(neq(pluto)).values('name') // use 'as' g.V().hasLabel('character').has('name', 'pluto').as('x').out('lives').in('lives').where(neq('x')).values('name')
Copy
cypher> MATCH (src:character{name:"pluto"})-[:lives]->()<-[:lives]-(dst:character) RETURN dst.name

6. Pluto's Brothers

Copy
pluto = g.V().hasLabel('character').has('name', 'pluto').next() // where do pluto's brothers live? g.V(pluto).out('brother').out('lives').values('name') // which brother lives in which place? g.V(pluto).out('brother').as('god').out('lives').as('place').select('god','place') // what is the name of the brother and the name of the place? g.V(pluto).out('brother').as('god').out('lives').as('place').select('god','place').by('name')
Copy
MATCH (src:Character{name:"pluto"})-[:brother]->(bro:Character)-[:lives]->(dst) RETURN bro.name, dst.name

作者:Jadepeng
出处:jqpeng的技术记事本--http://www.cnblogs.com/xiaoqi
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

关注作者

欢迎关注作者微信公众号, 一起交流软件开发:欢迎关注作者微信公众号

posted @   JadePeng  阅读(1127)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2017-11-17 360影视视频下载
点击右上角即可分享
微信分享提示
CONTENTS