顶点与边 #

一、顶点操作 #

1.1 创建顶点类 #

sql
CREATE CLASS Person EXTENDS V
CREATE CLASS Company EXTENDS V
CREATE CLASS Product EXTENDS V

1.2 添加顶点属性 #

sql
CREATE PROPERTY Person.name STRING (MANDATORY)
CREATE PROPERTY Person.age INTEGER
CREATE PROPERTY Person.email STRING
CREATE PROPERTY Person.createdAt DATETIME DEFAULT sysdate()

1.3 创建顶点 #

使用CREATE VERTEX:

sql
CREATE VERTEX Person SET name = 'Tom', age = 30, email = 'tom@example.com'

使用INSERT:

sql
INSERT INTO Person SET name = 'Tom', age = 30, email = 'tom@example.com'

1.4 创建并返回 #

sql
CREATE VERTEX Person SET name = 'Tom', age = 30 RETURN @rid, name, age

1.5 批量创建顶点 #

sql
CREATE VERTEX Person SET name = 'Person' + $i
FOREACH $i IN RANGE(1, 100)

使用UNWIND:

sql
LET persons = [
    {'name': 'Tom', 'age': 30},
    {'name': 'Jerry', 'age': 25},
    {'name': 'Mike', 'age': 35}
]
FOREACH ($p IN $persons) {
    CREATE VERTEX Person SET name = $p.name, age = $p.age
}

1.6 更新顶点 #

sql
UPDATE Person SET age = 31 WHERE name = 'Tom'
UPDATE #12:0 SET name = 'Tom Hanks', age = 31

1.7 删除顶点 #

sql
DELETE VERTEX Person WHERE name = 'Tom'
DELETE VERTEX #12:0

级联删除:

sql
DELETE VERTEX Person WHERE @rid = #12:0

注意:删除顶点会自动删除关联的边。

二、边操作 #

2.1 创建边类 #

sql
CREATE CLASS KNOWS EXTENDS E
CREATE CLASS WORKS_AT EXTENDS E
CREATE CLASS BOUGHT EXTENDS E

2.2 添加边属性 #

sql
CREATE PROPERTY KNOWS.since INTEGER
CREATE PROPERTY KNOWS.level STRING
CREATE PROPERTY KNOWS.createdAt DATETIME DEFAULT sysdate()

2.3 创建边 #

基本语法:

sql
CREATE EDGE <EdgeClass> 
FROM <sourceVertex> 
TO <targetVertex>
[SET <property> = <value>[,]*]

示例:

sql
CREATE EDGE KNOWS 
FROM (SELECT FROM Person WHERE name = 'Tom') 
TO (SELECT FROM Person WHERE name = 'Jerry')
SET since = 2020, level = 'close'

2.4 使用RID创建边 #

sql
CREATE EDGE KNOWS FROM #12:0 TO #12:1 SET since = 2020

2.5 创建并返回 #

sql
CREATE EDGE KNOWS FROM #12:0 TO #12:1 
SET since = 2020 
RETURN @rid, since, level

2.6 批量创建边 #

sql
CREATE EDGE WORKS_AT 
FROM (SELECT FROM Person WHERE employer IS NULL) 
TO (SELECT FROM Company WHERE name = 'ABC Corp')
SET since = YEAR(sysdate())

2.7 更新边 #

sql
UPDATE KNOWS SET level = 'best_friend' WHERE @rid = #25:0
UPDATE KNOWS SET since = 2021 WHERE out.name = 'Tom' AND in.name = 'Jerry'

2.8 删除边 #

sql
DELETE EDGE KNOWS WHERE @rid = #25:0
DELETE EDGE KNOWS WHERE out.name = 'Tom' AND in.name = 'Jerry'
DELETE EDGE FROM #12:0
DELETE EDGE TO #12:1

三、边方向操作 #

3.1 查询出边 #

sql
SELECT outE() FROM Person WHERE name = 'Tom'
SELECT outE('KNOWS') FROM Person WHERE name = 'Tom'
SELECT outE('KNOWS', 'WORKS_AT') FROM Person WHERE name = 'Tom'

3.2 查询入边 #

sql
SELECT inE() FROM Person WHERE name = 'Jerry'
SELECT inE('KNOWS') FROM Person WHERE name = 'Jerry'

3.3 查询所有边 #

sql
SELECT bothE() FROM Person WHERE name = 'Tom'
SELECT bothE('KNOWS') FROM Person WHERE name = 'Tom'

3.4 查询出边目标顶点 #

sql
SELECT out() FROM Person WHERE name = 'Tom'
SELECT out('KNOWS') FROM Person WHERE name = 'Tom'
SELECT out('KNOWS').name FROM Person WHERE name = 'Tom'

3.5 查询入边源顶点 #

sql
SELECT in() FROM Person WHERE name = 'Jerry'
SELECT in('KNOWS') FROM Person WHERE name = 'Jerry'
SELECT in('KNOWS').name FROM Person WHERE name = 'Jerry'

3.6 查询双向顶点 #

sql
SELECT both() FROM Person WHERE name = 'Tom'
SELECT both('KNOWS') FROM Person WHERE name = 'Tom'

四、边属性操作 #

4.1 查询边属性 #

sql
SELECT outE('KNOWS').since FROM Person WHERE name = 'Tom'
SELECT @rid, out, in, since, level FROM KNOWS WHERE out.name = 'Tom'

4.2 条件过滤边 #

sql
SELECT FROM Person WHERE name = 'Tom'
LET $edges = (SELECT FROM KNOWS WHERE out = @rid AND since > 2020)
SELECT $edges

4.3 边属性聚合 #

sql
SELECT 
    out.name AS fromPerson,
    in.name AS toPerson,
    since
FROM KNOWS
WHERE since > 2020
ORDER BY since DESC

五、关系查询 #

5.1 查询朋友关系 #

sql
SELECT 
    name,
    out('KNOWS').name AS friends
FROM Person
WHERE name = 'Tom'

5.2 查询朋友数量 #

sql
SELECT 
    name,
    SIZE(out('KNOWS')) AS friendCount
FROM Person
ORDER BY friendCount DESC

5.3 查询共同朋友 #

sql
SELECT 
    name,
    intersection(out('KNOWS'), (SELECT out('KNOWS') FROM Person WHERE name = 'Tom')) AS mutualFriends
FROM Person
WHERE name != 'Tom'

5.4 查询路径 #

sql
SELECT 
    name,
    out('KNOWS').name AS friends,
    out('KNOWS').out('KNOWS').name AS friendsOfFriends
FROM Person
WHERE name = 'Tom'

六、高级边操作 #

6.1 唯一性约束 #

sql
CREATE INDEX unique_knows ON KNOWS (out, in) UNIQUE

6.2 防止重复边 #

sql
LET $tom = SELECT FROM Person WHERE name = 'Tom'
LET $jerry = SELECT FROM Person WHERE name = 'Jerry'
IF (SELECT COUNT(*) FROM KNOWS WHERE out = $tom[0].@rid AND in = $jerry[0].@rid = 0) {
    CREATE EDGE KNOWS FROM $tom[0].@rid TO $jerry[0].@rid
}

6.3 边类型约束 #

sql
ALTER CLASS WORKS_AT CUSTOM outVertexClassNames = Person
ALTER CLASS WORKS_AT CUSTOM inVertexClassNames = Company

6.4 批量边操作 #

sql
LET $users = SELECT FROM Person WHERE status = 'active'
LET $company = SELECT FROM Company WHERE name = 'ABC Corp'
CREATE EDGE WORKS_AT FROM $users TO $company

七、图模式匹配 #

7.1 简单模式匹配 #

sql
SELECT 
    a.name AS person1,
    b.name AS person2
FROM Person a
LET $knows = (SELECT FROM KNOWS WHERE out = a.@rid)
LET b = (SELECT FROM Person WHERE @rid IN $knows.in)
WHERE $b.size() > 0

7.2 多跳模式匹配 #

sql
SELECT 
    a.name AS person,
    b.name AS friend,
    c.name AS friendOfFriend
FROM Person a
LET $b = (SELECT out('KNOWS') FROM a)
LET $c = (SELECT out('KNOWS') FROM $b)
WHERE $c.size() > 0

7.3 三角关系查询 #

sql
SELECT 
    a.name AS person1,
    b.name AS person2,
    c.name AS person3
FROM Person a
LET $b = (SELECT out('KNOWS') FROM a)
LET $c = (SELECT out('KNOWS') FROM $b WHERE @rid != a.@rid)
WHERE $c.out('KNOWS') CONTAINS a.@rid

八、实际应用示例 #

8.1 社交网络 #

sql
CREATE CLASS User EXTENDS V
CREATE PROPERTY User.username STRING
CREATE PROPERTY User.email STRING

CREATE CLASS FOLLOWS EXTENDS E
CREATE PROPERTY FOLLOWS.since DATETIME

CREATE VERTEX User SET username = 'tom', email = 'tom@example.com'
CREATE VERTEX User SET username = 'jerry', email = 'jerry@example.com'

CREATE EDGE FOLLOWS 
FROM (SELECT FROM User WHERE username = 'tom') 
TO (SELECT FROM User WHERE username = 'jerry')
SET since = sysdate()

SELECT 
    u.username,
    SIZE(out('FOLLOWS')) AS following,
    SIZE(in('FOLLOWS')) AS followers
FROM User u

8.2 组织架构 #

sql
CREATE CLASS Employee EXTENDS V
CREATE PROPERTY Employee.name STRING
CREATE PROPERTY Employee.title STRING

CREATE CLASS REPORTS_TO EXTENDS E

CREATE VERTEX Employee SET name = 'CEO', title = 'CEO'
CREATE VERTEX Employee SET name = 'Manager1', title = 'Manager'
CREATE VERTEX Employee SET name = 'Worker1', title = 'Engineer'

CREATE EDGE REPORTS_TO FROM #12:1 TO #12:0
CREATE EDGE REPORTS_TO FROM #12:2 TO #12:1

SELECT 
    name,
    in('REPORTS_TO').name AS reports
FROM Employee

8.3 产品推荐 #

sql
CREATE CLASS Customer EXTENDS V
CREATE CLASS Product EXTENDS V

CREATE CLASS PURCHASED EXTENDS E
CREATE PROPERTY PURCHASED.quantity INTEGER
CREATE PROPERTY PURCHASED.price DECIMAL

SELECT 
    p.name AS product,
    COUNT(*) AS purchaseCount
FROM Product p
LET $purchased = (SELECT FROM PURCHASED WHERE in = p.@rid)
WHERE $purchased.size() > 0
GROUP BY p
ORDER BY purchaseCount DESC
LIMIT 10

8.4 权限管理 #

sql
CREATE CLASS User EXTENDS V
CREATE CLASS Role EXTENDS V
CREATE CLASS Permission EXTENDS V

CREATE CLASS HAS_ROLE EXTENDS E
CREATE CLASS HAS_PERMISSION EXTENDS E

SELECT 
    u.name AS userName,
    out('HAS_ROLE').name AS roles,
    out('HAS_ROLE').out('HAS_PERMISSION').name AS permissions
FROM User u
WHERE u.name = 'tom'

九、性能优化 #

9.1 使用索引 #

sql
CREATE INDEX Person.name UNIQUE
CREATE INDEX KNOWS_out_in ON KNOWS (out, in) NOTUNIQUE

9.2 限制遍历深度 #

sql
SELECT out('KNOWS')[0-2].name FROM Person WHERE name = 'Tom'

9.3 使用RID #

sql
SELECT out('KNOWS') FROM #12:0

9.4 批量操作 #

sql
BEGIN
CREATE EDGE KNOWS FROM #12:0 TO #12:1
CREATE EDGE KNOWS FROM #12:0 TO #12:2
CREATE EDGE KNOWS FROM #12:0 TO #12:3
COMMIT

十、总结 #

顶点与边操作要点:

操作 语法 说明
创建顶点 CREATE VERTEX 创建图顶点
创建边 CREATE EDGE 创建图边
查询出边 out() / outE() 出边查询
查询入边 in() / inE() 入边查询
删除顶点 DELETE VERTEX 删除顶点及边
删除边 DELETE EDGE 删除边

下一步,让我们学习图遍历查询!

最后更新:2026-03-27