TigerGraph笔记(三)gsql基础(2)数据加载和查询

在上一节中,我们介绍了怎么创建一个顶点、边和图,本节我们介绍怎么加载数据和查询数据。进入gsql-shell,执行drop all删除所有东西,也可不删除,只要不重名即可。

在TG安装目录下的 document/examples 目录下提供了一些demo,在 document/examples/gsql_ref/socialNet/Graph 目录下存在一些简单的社交数据,我们会利用这些数据,创建一个简单的社交网络图。

1、数据加载

打开Graph下的persons文件,存在两列数据:姓名和性别。打开friends文件,也是只有两列数据,name和name,即关系双方的名字。我们根据数据来创建顶点、边和图。执行下面语句创建相关的顶点、边和图。

CREATE VERTEX Person(PRIMARY_ID name STRING, name STRING, gender STRING)
CREATE UNDIRECTED EDGE Friendship(FROM Person, TO Person)
CREATE GRAPH SocialNet(Person, Friendship)

执行下面命令创建一个加载job

USE GRAPH SocialNet
BEGIN
CREATE LOADING JOB load_social FOR GRAPH SocialNet {
   DEFINE FILENAME file1="/home/tigergraph/tigergraph/document/examples/gsql_ref/socialNet/Graph/persons";
   DEFINE FILENAME file2="/home/tigergraph/tigergraph/document/examples/gsql_ref/socialNet/Graph/friends";

   LOAD file1 TO VERTEX Person VALUES ($0, $0, $1) USING header="false", separator=",";
   LOAD file2 TO EDGE Friendship VALUES ($0, $1) USING header="false", separator=",";
}
END

USE GRAPH表示使用SocialNet这个图,和SQL中使用某个db类似。BEGIN...END仅仅表示中间的语句一行写不完,只是在gsql shell中使用,如果是gsql文件则不需要添加。不习惯使用shell方式的同学(比如我),可以在linux下建一个gsql脚本,然后在windows下通过FTP打开编辑,保存以后执行gsql命令:gsql filename.gsql也是可以的。紧接着使用 CREATE LOADING JOB 创建一个加载job,里面定义了两个加载文件。在LOAD...TO语句中使用 $0、$1表示第一列、第二列,后面通过USING header="false"指定原始文件中没有列名,即第一行也是数据。如果存在列名 header="true",前面的$0也可以使用 $"name"表示。需要注意的是PRIMARY_ID字段也是需要映射列的。separator指明列分隔符,GSQL可以处理任何单字符分隔符,包括不可见字符,而不仅仅是逗号。在使用不可见字符的时候需要注意格式,比如在Neo4j中支持使用 "\u0003",在TG中使用 "\0003"。

虽然定义完了一个加载job,但是此时数据还没有加载到图中,还需要我们去运行:

RUN LOADING JOB load_social

执行完以后会显示加载结果,包括数据信息和日志信息。

2、查询

数据加载完毕以后,就可以查询了。TG内置了select语句,查询Person信息:
因为TG有严格检查,所以加了limit条件。
执行 select count() from Person 查看Person数量,注意count中不能加 * 。查询结果以json格式返回。
执行 select * from Person where name=="person1" 通过where条件查询,注意where条件是双 =。
执行 select * from Person where primary_id=="person1"  和上一条语句的效果相同。
执行 select count() from Person-(Friendship)->Person 查看边的数量,需要注意的是,我们定义的9条无向边,结果显示18条,因为对于无向边,gsql实际上是创建了两条有向边。

查询边:SELECT * FROM Person-(Friendship)->Person WHERE from_id =="person1"
任意边:SELECT * FROM Person-(ANY)->ANY WHERE from_id =="person1"

内置的select语句虽然使用方便,但是不适合处理逻辑复杂的查询,TG提供了参数化查询 QUERY,可以让用户像写函数一样定义一个查询。

定义一个query,查询某个人的所有相邻顶点,我们也常常称之为一度关系:

BEGIN
CREATE QUERY hello(VERTEX<Person> p) FOR GRAPH SocialNet{
 Start = {p};
 Result = SELECT tgt FROM Start:s-(Friendship:e) ->Person:tgt;
 PRINT Result;
}
END

CREATE QUERY创建查询hello,hello有一个参数VERTEX<Person>,中间通过一个select语句查询p的邻点,不过这里的SELECT语句比内置查询中SELECT强大得多。因为p没有实例化,通过 St = {p} 构造一个包含所指定Person顶点的集合。冒号用来定义别名,用过Neo4j的同学应该很熟悉,不过在Neo4j中,别名在前,label在后。别名不是必须的,比如中间的Friendship我们不关心,就可以不指定别名。

QUERY创建完成以后不能像JOB一样直接运行,需要先安装:

INSTALL QUERY hello

安装需要花一点点时间,因为TG同样需要把它添加到GSQL目录中。
安装完成以后就可以运行了:

RUN QUERY hello("person1")

传入的参数就是一个Person顶点的 PRIMARY_ID,返回结果同样是json。

至此我们体验了在gsql-shell中的数据加载和查询,但是结果都是按照json格式返回的,估计用过Neo4j的同学已经很不耐烦了,因为命令行的返回实在体现不出图数据库的优势,图形化界面才更直观,才是真爱,后面开始介绍TG的Web UI------GraphStudio。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值