创建数据 #
一、创建数据概述 #
1.1 创建操作类型 #
text
创建操作:
├── 创建顶点(Vertex)
├── 创建边(Edge)
├── 创建属性(Property)
└── 批量创建
1.2 创建方式 #
text
创建方式:
├── Gremlin:addV(), addE(), property()
└── SPARQL:INSERT DATA, INSERT
二、Gremlin创建顶点 #
2.1 基本创建 #
gremlin
// 创建空顶点
g.addV()
// 创建带标签的顶点
g.addV('person')
// 创建带属性的顶点
g.addV('person').property('name', 'Tom')
// 创建完整顶点
g.addV('person').
property('name', 'Tom').
property('age', 30).
property('email', 'tom@example.com')
// 获取创建的顶点
g.addV('person').property('name', 'Tom').next()
2.2 设置ID #
gremlin
// Neptune支持自定义ID
g.addV('person').
property(T.id, 'user_001').
property('name', 'Tom')
// 使用字符串ID
g.addV('person').
property(T.id, 'person:tom').
property('name', 'Tom')
2.3 多标签顶点 #
gremlin
// Neptune多标签方式
g.addV('person').property('~label', 'person:employee:manager')
// 查询多标签顶点
g.V().hasLabel('person') // 匹配
g.V().hasLabel('employee') // 匹配
g.V().hasLabel('manager') // 匹配
2.4 多值属性 #
gremlin
// 列表属性
g.addV('person').
property(list, 'phone', '123-456-7890').
property(list, 'phone', '098-765-4321')
// 集合属性
g.addV('person').
property(set, 'tag', 'important').
property(set, 'tag', 'urgent')
// 单值属性
g.addV('person').
property(single, 'name', 'Tom')
2.5 批量创建顶点 #
gremlin
// 方法1:多个addV
g.addV('person').property('name', 'Tom').
addV('person').property('name', 'Jerry').
addV('person').property('name', 'Mike')
// 方法2:使用inject
g.inject(['Tom', 'Jerry', 'Mike']).
unfold().
addV('person').
property('name', identity)
// 方法3:使用列表
g.inject([
['name': 'Tom', 'age': 30],
['name': 'Jerry', 'age': 25],
['name': 'Mike', 'age': 35]
]).unfold().as('data').
addV('person').
property('name', select('data').select('name')).
property('age', select('data').select('age'))
2.6 从文件创建 #
python
# Python示例
import csv
from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection
from gremlin_python.process.anonymous_traversal import traversal
connection = DriverRemoteConnection('wss://endpoint:8182/gremlin', 'g')
g = traversal().withRemote(connection)
# 从CSV创建
with open('users.csv', 'r') as f:
reader = csv.DictReader(f)
for row in reader:
g.addV('user').
property('userId', row['id']).
property('name', row['name']).
property('email', row['email']).
iterate()
connection.close()
三、Gremlin创建边 #
3.1 基本创建 #
gremlin
// 创建边
g.addE('knows').from(V('1')).to(V('2'))
// 创建带属性的边
g.addE('knows').
from(V('1')).
to(V('2')).
property('since', 2020).
property('weight', 0.8)
// 获取创建的边
g.addE('knows').from(V('1')).to(V('2')).next()
3.2 从遍历创建 #
gremlin
// 从顶点创建出边
g.V('1').addE('knows').to(V('2'))
// 从顶点创建入边
g.V('2').addE('knows').from(V('1'))
// 使用as标记
g.V('1').as('a').V('2').as('b').
addE('knows').from('a').to('b')
3.3 批量创建边 #
gremlin
// 方法1:多个addE
g.addE('knows').from(V('1')).to(V('2')).
addE('knows').from(V('1')).to(V('3')).
addE('knows').from(V('1')).to(V('4'))
// 方法2:从列表创建
g.V('1').as('a').
V('2', '3', '4').as('b').
addE('knows').from('a').to('b')
// 方法3:条件创建
g.V().hasLabel('person').as('p1').
V().hasLabel('person').where(neq('p1')).as('p2').
addE('knows').from('p1').to('p2')
3.4 创建自环边 #
gremlin
// 创建自环边
g.V('1').addE('self').to(V('1'))
四、SPARQL创建数据 #
4.1 INSERT DATA #
sparql
PREFIX ex: <http://example.org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
INSERT DATA {
ex:Tom a ex:Person ;
foaf:name "Tom" ;
ex:age 30 ;
foaf:mbox <mailto:tom@example.com> ;
ex:createdAt "2024-01-01"^^xsd:date .
}
4.2 带类型的数据 #
sparql
PREFIX ex: <http://example.org/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
INSERT DATA {
ex:product001 ex:price "99.99"^^xsd:decimal .
ex:product001 ex:stock "100"^^xsd:integer .
ex:product001 ex:active "true"^^xsd:boolean .
ex:product001 ex:releaseDate "2024-01-15"^^xsd:date .
}
4.3 创建关系 #
sparql
PREFIX ex: <http://example.org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
INSERT DATA {
ex:Tom foaf:knows ex:Jerry .
ex:Tom ex:worksAt ex:ACME .
ex:ACME a ex:Company ;
foaf:name "ACME Inc." .
}
4.4 条件插入 #
sparql
PREFIX ex: <http://example.org/>
INSERT {
?person ex:ageGroup "young" .
}
WHERE {
?person ex:age ?age .
FILTER (?age < 30) .
}
4.5 批量插入 #
sparql
PREFIX ex: <http://example.org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
INSERT DATA {
ex:Tom foaf:name "Tom" .
ex:Jerry foaf:name "Jerry" .
ex:Mike foaf:name "Mike" .
ex:Tom foaf:knows ex:Jerry .
ex:Tom foaf:knows ex:Mike .
ex:Jerry foaf:knows ex:Mike .
}
五、创建属性 #
5.1 Gremlin添加属性 #
gremlin
// 添加单个属性
g.V('1').property('age', 30)
// 添加多个属性
g.V('1').
property('age', 30).
property('email', 'tom@example.com').
property('phone', '123-456-7890')
// 添加多值属性
g.V('1').
property(list, 'tag', 'important').
property(list, 'tag', 'urgent')
// 添加边属性
g.E('e1').property('weight', 0.8)
5.2 SPARQL添加属性 #
sparql
PREFIX ex: <http://example.org/>
INSERT DATA {
ex:Tom ex:age 30 .
ex:Tom ex:email "tom@example.com" .
}
六、MERGE操作 #
6.1 什么是MERGE #
MERGE是"存在则匹配,不存在则创建"的操作。
gremlin
// Gremlin使用coalesce实现MERGE
g.V().hasLabel('person').has('userId', 'user_001').
fold().
coalesce(
unfold(),
addV('person').property('userId', 'user_001')
)
// 带属性初始化
g.V().hasLabel('person').has('userId', 'user_001').
fold().
coalesce(
unfold(),
addV('person').
property('userId', 'user_001').
property('createdAt', datetime())
).
property('updatedAt', datetime())
6.2 MERGE边 #
gremlin
// MERGE边
g.V('1').outE('knows').where(inV().hasId('2')).
fold().
coalesce(
unfold(),
addE('knows').from(V('1')).to(V('2'))
)
七、实际应用示例 #
7.1 创建用户 #
gremlin
// 创建用户顶点
g.addV('user').
property(T.id, 'user_001').
property('userId', 'user_001').
property('username', 'tom_hanks').
property('email', 'tom@example.com').
property('password', 'hashed_password').
property('createdAt', datetime()).
property('status', 'active').
property(list, 'roles', 'user').
property(list, 'roles', 'admin')
// SPARQL方式
PREFIX ex: <http://example.org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
INSERT DATA {
ex:user001 a ex:User ;
ex:userId "user_001" ;
foaf:name "tom_hanks" ;
foaf:mbox <mailto:tom@example.com> ;
ex:createdAt "2024-01-01T00:00:00"^^xsd:dateTime ;
ex:status "active" .
}
7.2 创建产品 #
gremlin
// 创建产品顶点
g.addV('product').
property(T.id, 'prod_001').
property('productId', 'prod_001').
property('name', 'iPhone 15').
property('description', 'Latest iPhone').
property('price', 999.99).
property('category', 'Electronics').
property('stock', 100).
property(set, 'tags', 'phone').
property(set, 'tags', 'apple').
property(set, 'tags', 'smartphone').
property('createdAt', datetime())
// 创建产品关系
g.addE('belongs_to').
from(V('prod_001')).
to(V().hasLabel('category').has('name', 'Electronics')).
property('primary', true)
7.3 创建订单 #
gremlin
// 创建订单
g.addV('order').
property(T.id, 'order_001').
property('orderId', 'order_001').
property('userId', 'user_001').
property('totalAmount', 1999.98).
property('status', 'pending').
property('createdAt', datetime())
// 创建订单项
g.addV('orderItem').
property('productId', 'prod_001').
property('quantity', 2).
property('unitPrice', 999.99)
// 创建关系
g.addE('placed_by').from(V('order_001')).to(V('user_001'))
g.addE('contains').from(V('order_001')).to(V('orderItem_001'))
g.addE('references').from(V('orderItem_001')).to(V('prod_001'))
7.4 创建社交关系 #
gremlin
// 创建用户
g.addV('user').property('name', 'Tom').as('tom').
addV('user').property('name', 'Jerry').as('jerry').
addV('user').property('name', 'Mike').as('mike')
// 创建关注关系
g.addE('follows').from('tom').to('jerry').
property('since', datetime()).
property('type', 'friend')
// 创建好友关系(双向)
g.addE('friends').from('tom').to('jerry').
property('since', datetime())
g.addE('friends').from('jerry').to('tom').
property('since', datetime())
八、最佳实践 #
8.1 性能优化 #
text
性能优化建议:
├── 批量创建优于单条创建
├── 使用iterate()避免返回大量数据
├── 合理使用事务
├── 避免重复创建
└── 使用MERGE处理重复
8.2 数据完整性 #
text
数据完整性建议:
├── 使用唯一标识符
├── 设置必要属性
├── 验证数据类型
├── 处理缺失值
└── 记录创建时间
8.3 错误处理 #
python
# Python错误处理示例
try:
result = g.addV('person').property('name', 'Tom').next()
except Exception as e:
print(f"Error creating vertex: {e}")
九、总结 #
创建数据要点:
| 操作 | Gremlin | SPARQL |
|---|---|---|
| 创建顶点 | addV() | INSERT DATA |
| 创建边 | addE() | INSERT DATA |
| 创建属性 | property() | INSERT DATA |
| 批量创建 | inject/unfold | 多三元组 |
| MERGE | coalesce() | INSERT WHERE |
下一步,让我们学习查询数据!
最后更新:2026-03-27