当前位置: 首页 > 工具软件 > GraphView > 使用案例 >

【GraphView】GraphView用户手册翻译——查询、插入、删除

季阳朔
2023-12-01

查询语句

任何数据库都需要查询语句来操作和查询数据。GraphView的查询语句继承了SQL语法并且为图数据查询进行了扩展。查询语句的功能非常强大,所有的本地存储的图都能够被它所表达。本章主要介绍GraphView的查询语义和语法。

SELECT命令

可以使用SELECT命令来查询SQL数据库中的数据。GraphView扩展了SELECT命令,以方便用户查询各类图数据。在扩展中最核心的,是对MATCH子句的使用,它主要用于描述匹配数据库中图数据的图模式的多条途径。

传统的SELECT命令由SELECT FROM和WHERE组成,还外加了一些其他的子句,比如GROUP-BY ORDERBY和HAVING。FROM语句定义了一个对表的索引的列表,每条索引都定义一个表变量而且绑定了其元组变量。结果集是满足Where语句条件的、由元组变量组成的笛卡儿积。GraphView中的SELECT命令也继承了同样的语义,FROM语句指定了一个指向节点表的索引列表,列表中的每一项都绑定了一个变量,而在节点表中的某一个图节点绑定的是由WHERE字句则用于筛选符合条件的节点绑定的变量。

 

GraphVIew扩展了MATCH子句,用于FROMWHERE之间。MATCH子句用于定义一个或多个路径表达式。如果图节点之间通过特定的路径来连接,则它们会被绑定到符合条件的查询中(被筛选出来)。

对于路径的最小组件就是连接两个节点变量的一条边。边实质上是由源点、边、汇聚点和这样一种组合:<source, edge, sink>。路径表达式就是这样由多个组合收尾相连的一串表达式组合而成。路径表达式的语法如下:

<match_path>::=

(node_table_alias -

‘[’edge_name [ AS edge_alias ] ‘]’ -> ) [ , … n ]

node_name_alias

在语法中,node_table_alias是在FROM子句中定义的节点表的别名。而只要在CREATETABLE语句中被有效的定义为邻接表,edge_name就相当于表中的一列。

下面是一个MATCH查询的示例:

SELECTEn1.Name, En2.Name, Cn.Name

FROMEmployeeNode AS En1, EmployeeNode AS En2, ClientNode AS Cn

MATCH En1-[Colleagues ASCg]->En2-[Clients AS C1]->Cn,

En1-[Clients ASC2]->Cn

WHERE En1.Name = ‘Jane Doe’AND C1.credit >1000

 

FROM子句定义了三张表别名(或节点表),En1、En2和Cn。而MATCH子句(加粗部分)则描述了连接三张表的两条路径表达式:两个emplyee节点被通过Colleagues边连接,两个employee节点都被一个client节点通过Client边连接。在这句路径表达式中,所有的边都有别名,即Cg、C1和C2。边的别名能被其他表达式引用,比如在WHERE命令中使用的“C1.credit > 1000”。就像表格的别名规则一样,边没有使用别名时,它的全称和别名一样使用。两条边不能使用同样的别名,否则会出现异常。

除了MATCH子句之外,GraphView中的 SELECT命令继承了SQL中大部分的操作和功能。列表如下:

l  算术运算

l  比较运算,比如>、<、=

l  IS NULL 或 IS NOT NULL.

l  NOT.

l  BETWEEN … AND …

l  EXISTS 语句

l  IN 语句

l  LIKE 语句

l  由SQL Server支持的标准功能

 

嵌套

带有MATCH子句的SELECT命令定义了GraphView中的SELECT查询块。就像SQL中的SELECT一样,这个查询块能被嵌套在另一个块中,以增强语句功能。

标准的枪套例子是在WHERE中使用EXISTS或者IN。EXISTS/IN的子查询建立了一个新的查询上下文,允许对外部SELECT查询使用半连接。

SELECTEn1.Name, En2.Name

FROMEmployeeNode AS En1, EmployeeNode AS En2,

MATCHEn1-[Colleagues AS Cg]->En2

WHEREEXISTS (

SELECT

FROMClientNode AS Cn

MATCHEn1-[Clients AS C2]->Cn,En2-[Clients AS C1]->Cn

)

上文的查询找到了两个按照colleagues关系连接的employee节点。EXISTS子句保证了两个employee节点之间的连接都连接到client节点。需要注意的是这个语句与之前的语句之间的差异:之前的语句返回了所有的连接两个employee节点的client节点,而这条查询忽视了特定的一些client节点,但保证了两个employee之间至少有一个client是共用的。

 

互操作性

GraphView语言的一个独特的优势是它与SQL的互操作性。

 

Interoperability

A unique advantage of GraphView’s language is its interoperabilitywith SQL. In the FROMclause of GraphView’s SELECTstatement, you can alsoinclude regular tables. Once defined, regular tables can be used freelyin theSELECTand WHEREclauses, including joining with node tables. They, however,cannot appear in the MATCHclause. An exception will be thrown if theMATCHclause contains regular tables.

 

 

插入/删除节点

在GraphView中,插入和删除节点使用INSERT NODE和DELETE NODE命令。它们和SQL里的INSERT DELETE子句仅有两点不同:1.当插入节点属性时,强制要求列的列表的定义;2.所有的SELECT子查询被扩展为支持MATCH子句。

INSERTNODE INTO ClientNode (name, regionID) VALUES (‘Jane’, 3)

这条命令向图中插入了一个client节点。这个节点的名字是Jane,它的regionID是3。

将被插入的节点的属性值可以来源于SELECT命令。

INSERTNODE INTO ClientNode (name, region)

SELECTcustomer_name, regionID

FROMSaleRecord

WHERE Time = ‘01/01/2015’

在这个例子里,节点属性由SELECT语句构造,并且这不是一条GraphView SELECT,而是一条标准的SQL SELECT。

 

删除图节点,一般需要使用WHERE子句来定义删除的条件。

DELETENODE FROM ClientNode

WHERE sales< 100

上述查询删掉了sales小于特定值的节点。

下一条查询使用EXISTS来定义定位图上的节点:子查询标识了所有未连接到任何client节点的employee节点。

DELETENODE FROMEmployeeNode

WHERENOT EXISTS (

SELECT*

FROMClientNode AS c

MATCHEmployeeNode-[Clients]->c

)

 

对于DELETE NODE 命令而言,只有没有被边指向的节点会被删除。这是因为如果默默的删除这些节点,将会产生指向的节点不存在的所谓“幽灵”边,而这将会导致图被破坏。因此,当节点被边指向的时候,删除命令将被跳过。需要先使用DELETE EDGE命令删除指向某个节点的所有边,才能安全的删除某个节点。

 

插入/删除边

操作边使用的是INSERT EDGE 和DELETE EDGE 语句。INSERT/DELTE NODE语句很类似于SQL,而边操作语句则有很多不同:首先它们的操作对象不再是表而是列,并且是邻接表中带注释的列。其次,边规范包括了边的属性其中包括了边的源节点和汇节点。源节点和汇节点必须在途中存在而且绑定的是节点变量。

INSERT EDGE语句的语法如下:

<insert_edge>::=

INSERTEDGE INTO node_table_name.edge_name

SELECTsource_alias, sink_alias[, edge_property[, … n ]]

FROM( node_table [ AS alias ] ) [, … n ]

[MATCHmatch_path [, … n ] ]

[ WHERE condition]

 

请注意SELECT子句里的元素列表,列表以FROM子句定义的两个表别名(或节点变量)开始。两个变量分别的绑定给源节点和汇节点。它们绑定的节点的笛卡儿积定义了一个插入邻接表edge_name的边的列表。而接下来的两个变量是边的属性,如果需要的话。

INSERTEDGE INTO EmployeeNode.Clients

SELECTe, c, 99, ‘referred by Alan’

FROMEmployeeNode AS e, ClientNode AS c

WHERE e.WorkId = 156 AND c.ClientId = 22

 

以下是在employee节点和client节点中插入一条Client边的范例。假设WorkId和ClientId是两张节点表的主键(显然通过WHERE语句的查询结果是唯一的)。它们之间的边将被插入邻接表中。SELECT子句也定义了将被插入的边的属性。99(整型)和“referred by Alan”(字符串)。

INSERTEDGE INTO EmployeeNode.Colleagues

SELECTe1, e3

FROMEmployeeNode AS e1, EmployeeNode AS e2, EmployeeNode AS e3

MATCH e1-[Colleagues AS c1]->e2-[ColleaguesAS c2]->e3

以上是一次性插入多条边的范例。这个范例中,源节点和汇节点都是由MATCH子句进一步定义的employee节点。总的来说,这个查询语句插入了新的Colleagues属性边在两跳之间。

DELETE EDGE命令以邻接表中需要删除的边的描述开始。在描述中,源节点、边、和汇节点都使用别名并声明其范围。

DELETEEDGE [e1]-[ColleaguesAS c]->[e2]

From EmployeeNode AS e1, EmployeeNode AS e2

WHEREe1.WorkId = 73 AND e2.WorkId = 16

 类似资料: