创建数据 #

一、创建数据概述 #

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