在上一节中,我们介绍了怎么创建一个顶点、边和图,本节我们介绍怎么加载数据和查询数据。进入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 count() from Person-(Friendship)->Person 查看边的数量,需要注意的是,我们定义的9条无向边,结果显示18条,因为对于无向边,gsql实际上是创建了两条有向边。
内置的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。