本文为您介绍创建初始化实例后,通过内网连接 KonisGraph 实例。
准备工作
准备已经初始化的 KonisGraph 实例。
准备好数据库 KonisGraph 实例的账号和密码。
配置云服务器 CVM 安全组出入站规则,允许访问 KonisGraph 的 IP,请参见 安全组。
连接方式
连接图数据库 KonisGraph 的方式有3种:
图数据管理平台,参考 图数据管理。
云服务器 CVM 连接,云服务器 CVM 连接图数据库 KonisGraph 步骤依次为:gremlin-console 连接、图的元数据操作、图数据的读写。
连接的注意事项如下:
内网地址连接:通过内网地址连接图数据库 KonisGraph,使用云服务器 CVM 直接连接云数据库的内网地址,这种连接方式使用内网高速网络,延迟低。
云服务器和数据库须是同一账号,且同一个 VPC 内(保障同一个地域)。
内网地址系统默认提供,可在 KonisGraph 控制台 的实例列表或实例详情页查看。
说明
SDK 连接和操作,参考 SDK 操作参考。
图数据管理平台连接
云服务器连接
下面示例分别如何从云服务器内网连接图数据库 KonisGraph。
步骤1:gremlin-console 连接
2. 解压到任意目录,默认解压目录
apache-tinkerpop-gremlin-console-3.5.1
。3. 进入解压目录,创建连接配置文件
remote-secure-test.yaml
放到 conf
目录下。文件内容如下:# hosts 图数据库 KonisGraph 实例的内网地址 vip,如 10.xx.xx.107hosts: [10.xx.xx.107]# port 图数据库 KonisGraph 实例的 Gremlin 端口,如 8186port: 8186# username/password 图数据库 KonisGraph 实例的账号和密码,如账号:steven,密码:test-pwd-123username: stevenpassword: test-pwd-123connectionPool: {enableSsl: false,sslEnabledProtocols: [TLSv1.2] }# serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1, config: { serializeResultToString: true }}serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: { serializeResultToString: true, useMapperFromGraph: graph }}
4. 使用
bin/gremlin.sh
命令开始连接:\\,,,/(o o)-----oOOo-(3)-oOOo-----plugin activated: tinkerpop.serverplugin activated: tinkerpop.utilitiesplugin activated: tinkerpop.tinkergraphgremlin> :remote connect tinkerpop.server conf/remote-secure-test.yaml==>Configured 10.221.176.107/10.221.176.107:8186gremlin> :remote console==>All scripts will now be sent to Gremlin Server - [10.221.176.107/10.221.176.107:8186] - type ':remote console' to return to local mode
步骤2:图的元数据操作
以 Gremlin-console tutorials 中的人和软件的关系图为示例。
如图所示,整个图包含2类点 person 和 software ,2类边 knows 和 created ,和几类属性 id 、name 、 age 、 lang 、 weight。创建属性
gremlin> s.addP('id', "T_LONG", "0")==>id: 11propertyName: "id"dataType: T_LONGdefaultValue: "0"gremlin> s.addP('name', "T_STRING", "")==>id: 1propertyName: "name"dataType: T_STRINGgremlin> s.addP("age", "T_LONG", "0")==>id: 2propertyName: "age"dataType: T_LONGdefaultValue: "0"gremlin> s.addP("lang", "T_STRING", "")==>id: 3propertyName: "lang"dataType: T_STRINGgremlin> s.addP("weight", "T_DOUBLE", "0.0")==>id: 4propertyName: "weight"dataType: T_DOUBLEdefaultValue: "0.0"
创建点
gremlin> s.addV("person", "id", ["name", "age"])==>id: 7name: "person"primary_key: "id"create_time: 1627894586026properties: 1properties: 2gremlin> s.addV("software", "id", ["name", "lang"])==>id: 8name: "software"primary_key: "id"create_time: 1627894607209properties: 1properties: 3gremlin>
创建边
gremlin> s.addE("knows", "person", "person", ["weight"])==>id: 9name: "knows"src_label_id: 7dst_label_id: 7create_time: 1627894691660properties: 4gremlin> s.addE("created", "person", "software", ["weight"])==>id: 10name: "created"src_label_id: 7dst_label_id: 8create_time: 1627894710659properties: 4gremlin>
步骤3:图数据的读写
写入点数据 person
gremlin> g.addV("person").property("id", 1).property("name", "marko").property("age", 29)==>v[7.1]gremlin> g.addV("person").property("id", 2).property("name", "vadas").property("age", 27)==>v[7.2]gremlin> g.addV("person").property("id", 4).property("name", "josh").property("age", 32)==>v[7.4]gremlin> g.addV("person").property("id", 6).property("name", "peter").property("age", 35)==>v[7.6]gremlin>
写入点数据 software
gremlin> g.addV("software").property("id", 3).property("name", "lop").property("lang", "java")==>v[8.3]gremlin> g.addV("software").property("id", 5).property("name", "ripple").property("lang", "java")==>v[8.5]gremlin>
写入边数据 knows
gremlin> g.addE("knows").from(g.V().has("name", "marko")).to(g.V().has("name", "vadas"))==>e[9.1.2][7.1-knows->7.2]gremlin> g.addE("knows").from(g.V().has("name", "marko")).to(g.V().has("name", "josh"))==>e[9.1.4][7.1-knows->7.4]gremlin>
写入边数据 created
g.addE("created").from(g.V().has("name", "marko")).to(g.V().has("name", "lop")).property("weight", "0.4")==>e[10.1.3][7.1-created->8.3]gremlin> g.addE("created").from(g.V().has("name", "peter")).to(g.V().has("name", "lop")).property("weight", "0.2")==>e[10.6.3][7.6-created->8.3]gremlin> g.addE("created").from(g.V().has("name", "josh")).to(g.V().has("name", "lop")).property("weight", "0.4")==>e[10.4.3][7.4-created->8.3]gremlin> g.addE("created").from(g.V().has("name", "josh")).to(g.V().has("name", "ripple")).property("weight", "1.0")==>e[10.4.5][7.4-created->8.5]gremlin>
批量写入点边数据
批量写入点边数据
图数据库 KonisGraph 推荐使用实时批量写入点、边数据,相比于以上的逐个写入方式,批量写入点、边数据可以降低网络开销,从而大幅度提高图数据库的实时写入速度。
示例如下:
gremlin> g.addV("person").property("id", 1).property("name", "marko").property("age", 29).addV("person").property("id", 2).property("name", "vadas").property("age", 27).addV("person").property("id", 4).property("name", "josh").property("age", 32).addV("person").property("id", 6).property("name", "peter").property("age", 35)gremlin> g.addE("created").from(g.V().has("name", "marko")).to(g.V().has("name", "lop")).property("weight", "0.4").addE("created").from(g.V().has("name", "peter")).to(g.V().has("name", "lop")).property("weight", "0.2").addE("created").from(g.V().has("name", "josh")).to(g.V().has("name", "lop")).property("weight", "0.4").addE("created").from(g.V().has("name", "josh")).to(g.V().has("name", "ripple")).property("weight", "1.0")
查询点边和属性数据
查询点边和属性数据
# 查找所有的边gremlin> g.E()# 查找所有的点gremlin> g.V()==>v[7.1]==>v[7.4]==>v[7.2]==>v[8.5]==>v[7.6]==>v[8.3]gremlin> g.V(1).values('name')==>marko# 按属性 name=marko 过滤所有点gremlin> g.V().has("name","marko")# marko 认识的人gremlin> g.V(1).outE('knows').inV().values('name')==>josh==>vadas# marko 认识的人里谁的年龄超过了30岁gremlin> g.V(1).out('knows').has('age', gt(30)).values('name')==>josh# 哪些人创建了软件 lopgremlin> g.V(3).in('created').values('name')==>peter==>marko==>josh# 查询点4所有入边的起点gremlin> g.V(4).inE().outV()# 查询点4所有出边的终点并展示路径gremlin> g.V(4).outE().inV().path().unfold()# 查询点4的所有一度关系入边的起点gremlin> g.V(4).repeat(inE().outV()).emit().times(1)# 查询点4的所有入边二度关系的起点并展示路径gremlin> g.V(4).repeat(inE().outV()).emit().times(2).path().unfold().dedup()# select查询,展示所有边及起点终点并用别名展示,使用时尽量多加 has 过滤gremlin> g.E().as("edge").bothV().as("vertex").select("edge", "vertex")# repeat使用,查询点1的入边去重,直到入边为0时停止,并展示所有路径gremlin> g.V(1).repeat(inE().outV().dedup()).until(inE().count().is(0)).emit().path().unfold().dedup()# 数值过滤,查询年龄大于18小于60的所有 persongremlin> g.V().hasLabel('person').has('age',gt(18)).has('age',lt(60)).limit(10).valueMap();
SDK 连接和操作
图数据库 KonisGraph 支持 TinkerPop Gremlin 查询语言。用户可以使用 Go、Python 等不同语言的 SDK 通过 Gremlin 来操作图数据库,请参考 SDK 操作参考。