查询数据 #
一、查询概述 #
1.1 查询类型 #
text
查询类型:
├── 基本查询:查询所有数据
├── 条件查询:按条件过滤
├── 关系查询:遍历图关系
├── 聚合查询:统计汇总
└── 路径查询:路径遍历
1.2 查询方式 #
text
查询方式:
├── Gremlin:V(), E(), has(), out(), in()
└── SPARQL:SELECT, WHERE, FILTER
二、Gremlin基本查询 #
2.1 查询顶点 #
gremlin
// 查询所有顶点
g.V()
// 查询指定ID的顶点
g.V('1')
g.V('1', '2', '3')
// 查询指定标签的顶点
g.V().hasLabel('person')
// 查询多个标签
g.V().hasLabel('person', 'employee')
// 限制返回数量
g.V().limit(10)
2.2 查询边 #
gremlin
// 查询所有边
g.E()
// 查询指定ID的边
g.E('e1')
// 查询指定标签的边
g.E().hasLabel('knows')
// 查询顶点的边
g.V('1').outE()
g.V('1').inE()
g.V('1').bothE()
2.3 获取属性 #
gremlin
// 获取单个属性值
g.V('1').values('name')
// 获取多个属性值
g.V('1').values('name', 'age')
// 获取所有属性值
g.V('1').values()
// 获取属性映射
g.V('1').valueMap()
// 获取属性映射(包含ID和标签)
g.V('1').valueMap(true)
// 获取属性键
g.V('1').keys()
// 获取属性对象
g.V('1').properties()
三、Gremlin条件查询 #
3.1 属性过滤 #
gremlin
// 精确匹配
g.V().has('name', 'Tom')
// 比较操作
g.V().has('age', gt(25))
g.V().has('age', gte(25))
g.V().has('age', lt(40))
g.V().has('age', lte(40))
g.V().has('age', neq(30))
// 区间
g.V().has('age', inside(20, 40))
g.V().has('age', outside(20, 40))
// 列表匹配
g.V().has('name', within('Tom', 'Jerry', 'Mike'))
g.V().has('name', without('Tom', 'Jerry'))
3.2 字符串过滤 #
gremlin
// 包含
g.V().has('name', containing('om'))
// 前缀
g.V().has('name', startingWith('T'))
// 后缀
g.V().has('name', endingWith('m'))
// 正则
g.V().has('name', regex('T.*m'))
3.3 标签过滤 #
gremlin
// 单标签
g.V().hasLabel('person')
// 多标签
g.V().hasLabel('person', 'employee')
// 属性存在
g.V().has('email')
g.V().hasNot('email')
3.4 逻辑组合 #
gremlin
// AND
g.V().and(
has('age', gt(25)),
has('name', startingWith('T'))
)
// OR
g.V().or(
has('name', 'Tom'),
has('name', 'Jerry')
)
// NOT
g.V().not(has('status', 'inactive'))
3.5 复杂条件 #
gremlin
// 使用filter
g.V().filter(outE().count().is(gt(0)))
// 使用where
g.V().where(outE().count().is(gt(5)))
// 嵌套条件
g.V().where(
and(
outE().count().is(gt(0)),
inE().count().is(gt(0))
)
)
四、Gremlin关系查询 #
4.1 出边遍历 #
gremlin
// 遍历所有出边顶点
g.V('1').out()
// 遍历指定标签的出边顶点
g.V('1').out('knows')
// 遍历多个标签
g.V('1').out('knows', 'follows')
// 获取出边
g.V('1').outE()
g.V('1').outE('knows')
4.2 入边遍历 #
gremlin
// 遍历所有入边顶点
g.V('1').in()
// 遍历指定标签的入边顶点
g.V('1').in('knows')
// 获取入边
g.V('1').inE()
g.V('1').inE('knows')
4.3 双向遍历 #
gremlin
// 遍历所有边顶点
g.V('1').both()
// 遍历指定标签的双向顶点
g.V('1').both('knows')
// 获取所有边
g.V('1').bothE()
4.4 多跳遍历 #
gremlin
// 两跳
g.V('1').out('knows').out('knows')
// 三跳
g.V('1').out('knows').out('knows').out('knows')
// 混合遍历
g.V('1').out('knows').in('knows')
五、SPARQL基本查询 #
5.1 SELECT查询 #
sparql
# 查询所有三元组
SELECT ?s ?p ?o
WHERE {
?s ?p ?o .
}
# 查询特定属性
SELECT ?name ?age
WHERE {
?person foaf:name ?name .
?person ex:age ?age .
}
# 使用DISTINCT
SELECT DISTINCT ?name
WHERE {
?person foaf:name ?name .
}
5.2 条件过滤 #
sparql
# 比较过滤
SELECT ?name ?age
WHERE {
?person foaf:name ?name .
?person ex:age ?age .
FILTER (?age > 25)
}
# 字符串过滤
SELECT ?name
WHERE {
?person foaf:name ?name .
FILTER (STRSTARTS(?name, "T"))
}
# 正则过滤
SELECT ?name
WHERE {
?person foaf:name ?name .
FILTER (REGEX(?name, "^T.*m$", "i"))
}
5.3 可选属性 #
sparql
# OPTIONAL
SELECT ?name ?email
WHERE {
?person foaf:name ?name .
OPTIONAL { ?person foaf:mbox ?email }
}
六、排序与分页 #
6.1 Gremlin排序 #
gremlin
// 升序排序
g.V().order().by('name')
// 降序排序
g.V().order().by('name', desc)
// 多字段排序
g.V().order().by('status', asc).by('name', asc)
// 按计算值排序
g.V().order().by(outE().count(), desc)
6.2 Gremlin分页 #
gremlin
// 限制数量
g.V().limit(10)
// 跳过前N条
g.V().skip(10)
// 范围
g.V().range(10, 20)
// Tail
g.V().order().by('name').tail(10)
6.3 SPARQL排序分页 #
sparql
# 排序
SELECT ?name ?age
WHERE {
?person foaf:name ?name .
?person ex:age ?age .
}
ORDER BY DESC(?age) ?name
# 分页
SELECT ?name
WHERE {
?person foaf:name ?name .
}
ORDER BY ?name
LIMIT 10
OFFSET 20
七、聚合查询 #
7.1 Gremlin聚合 #
gremlin
// 计数
g.V().count()
// 分组计数
g.V().groupCount().by('status')
// 分组
g.V().group().by('status')
// 求和
g.V().values('age').sum()
// 平均值
g.V().values('age').mean()
// 最大值
g.V().values('age').max()
// 最小值
g.V().values('age').min()
7.2 SPARQL聚合 #
sparql
# 计数
SELECT (COUNT(?person) AS ?count)
WHERE {
?person a ex:Person .
}
# 分组聚合
SELECT ?status (COUNT(?person) AS ?count) (AVG(?age) AS ?avgAge)
WHERE {
?person ex:status ?status .
?person ex:age ?age .
}
GROUP BY ?status
HAVING (AVG(?age) > 30)
八、路径查询 #
8.1 Gremlin路径 #
gremlin
// 获取路径
g.V('1').out('knows').path()
// 路径属性
g.V('1').out('knows').path().by('name')
// 简单路径(无环)
g.V('1').repeat(out()).times(3).simplePath()
// 最短路径
g.V('1').repeat(out().simplePath()).until(hasId('2')).limit(1).path()
8.2 SPARQL路径 #
sparql
# 属性路径
SELECT ?friend
WHERE {
ex:Tom foaf:knows/foaf:knows ?friend .
}
# 重复路径
SELECT ?ancestor
WHERE {
ex:Tom ex:parent* ?ancestor .
}
九、实际应用示例 #
9.1 用户查询 #
gremlin
// 查询活跃用户
g.V().hasLabel('user').
has('status', 'active').
order().by('createdAt', desc).
limit(20).
valueMap('userId', 'name', 'email')
// 查询用户及其好友
g.V().has('userId', 'user_001').as('user').
out('friends').as('friend').
select('user', 'friend').
by(valueMap('name')).
by(valueMap('name'))
9.2 产品查询 #
gremlin
// 查询产品
g.V().hasLabel('product').
has('category', 'Electronics').
has('price', inside(500, 1500)).
has('stock', gt(0)).
order().by('price', asc).
limit(20).
valueMap()
// 查询相关产品
g.V().has('productId', 'prod_001').
out('related').
has('stock', gt(0)).
order().by(outE('purchased').count(), desc).
limit(10)
9.3 订单查询 #
gremlin
// 查询用户订单
g.V().has('userId', 'user_001').
out('placed').
has('status', within('pending', 'processing')).
order().by('createdAt', desc).
project('orderId', 'totalAmount', 'items').
by('orderId').
by('totalAmount').
by(out('contains').count())
// 查询订单详情
g.V().has('orderId', 'order_001').
project('order', 'items', 'user').
by(valueMap()).
by(out('contains').valueMap().fold()).
by(in('placed').valueMap())
十、查询优化 #
10.1 性能优化技巧 #
gremlin
// 使用标签过滤
g.V().hasLabel('person') // 好
g.V() // 避免
// 使用属性索引
g.V().has('userId', 'user_001') // 好
// 限制结果
g.V().limit(100) // 好
// 避免全图扫描
g.V().hasLabel('person').has('name', 'Tom') // 好
10.2 查询计划分析 #
gremlin
// 使用profile分析
g.V().hasLabel('person').out('knows').profile()
十一、总结 #
查询数据要点:
| 操作 | Gremlin | SPARQL |
|---|---|---|
| 基本查询 | V(), E() | SELECT |
| 条件过滤 | has() | FILTER |
| 关系遍历 | out(), in() | 属性路径 |
| 排序 | order().by() | ORDER BY |
| 分页 | limit(), range() | LIMIT, OFFSET |
| 聚合 | count(), group() | COUNT, GROUP BY |
下一步,让我们学习更新数据!
最后更新:2026-03-27