顶点与边 #
一、顶点操作 #
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