查询数据 #

一、查询概述 #

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