学习Gremlin - 6.查询路径path

6.查询路径path

6.1、说明

在使用Gremlin对图进行分析时,关注点有时并不仅仅在最终到达的顶点、边或者属性上,通过什么样的路径到达最终的顶点、边和属性同样重要。此时可以借助path()来获取经过的路径信息。

path()返回当前遍历过的所有路径。有时需要对路径进行过滤,只选择没有环路的路径或者选择包含环路的路径,Gremlin针对这种需求提供了两种过滤路径的step:simplePath()和cyclicPath()。

6.2、实例讲解

6.2.1、path(),获取当前遍历过的所有路径
// “JanusGraph”顶点到与其有直接关联的顶点的路径(仅包含顶点)
g.V().hasLabel('software').has('name','HugeGraph').both().path()

如果想要同时获得经过的边的信息,可以用bothE().otherV()替换both()

// “JanusGraph”顶点到与其有直接关联的顶点的路径(包含顶点和边)
g.V().hasLabel('software')
    .has('name','HugeGraph')
    .bothE()
    .otherV()
    .path()

输出路径的时候,通过by(property)语句可以指定对象的某个属性代替对象,且连续的多个by()是循环应用到路径中的对象,例如路径中有3个对象[A, B, C],by(X).by(Y)语句指定两个属性[X Y],代表用“用A的X属性代表A,用B的Y属性代表B,用C的X属性代表C”,具体可参考如下例子:

// “HugeGraph”顶点到与其有直接关联的顶点的路径(包含顶点和边)
// 用“name”属性代表person和software顶点,用“weight”属性代表边
g.V().hasLabel('software')
    .has('name','HugeGraph')
    .bothE()
    .otherV()
    .path()
    .by('name')
    .by('weight')

路径分为两种:有环路径和无环路径。

  • 有环路径是指路径中至少有一个对象出现的次数大于等于两次。
  • 无环路径是指路径中所有的对象只出现一次。

path()返回所有路径,包含有环路径和无环路径,例如:

// “HugeGraph”顶点到与其有两层关系的顶点的所有路径(只包含顶点)
g.V().hasLabel('software')
    .has('name','HugeGraph')
    .both()
    .both()
    .path()
6.2.2、simplePath(),过滤掉路径中含有环路的对象,只保留路径中不含有环路的对象
// “HugeGraph”顶点到与其有两层关系的顶点的不含环路的路径(只包含顶点)
g.V().hasLabel('software')
    .has('name','HugeGraph')
    .both()
    .both()
    .simplePath()
    .path()
6.2.3、cyclicPath(),过滤掉路径中不含有环路的对象,只保留路径中含有环路的对象
// “HugeGraph”顶点到与其有两层关系的顶点的包含环路的路径(只包含顶点)
g.V().hasLabel('software')
    .has('name','HugeGraph')
    .both()
    .both()
    .cyclicPath()
    .path()
<think>嗯,用户这次明确要求详细解释Gremlin,结合引用的资料来看,ta应该是在研究图数据库技术。从引用[1]提到“没有统一的图查询语言标准”和引用[2]的Amazon Neptune支持Gremlin来看,用户可能正在评估不同图查询语言的适用性。 用户的上次提问是关于在线工具的推荐,这次突然转向技术性很强的Gremlin,这种跳跃说明ta可能是开发者或技术决策者,需要快速掌握工具核心概念。考虑到引用[3]提到“命令式方法”,而Gremlin正是典型的命令式查询语言,这个连接点需要重点展开。 准备从四个维度构建回答:首先是语言定位(补充引用[1]中“主流图查询语言”的背景),然后解析其基于图的特性(呼应引用[2]的“高度连接数据集”),接着用具体语法示例说明命令式特点(关联引用[3]的查询策略分类),最后带出实际应用场景(扩展引用[2]的社交网络分析案例)。特别注意要区分Gremlin和声明式语言(如SPARQL)的根本差异,这点在引用[3]的“声明性方法”里埋了伏笔。 数学公式方面需要处理路径查找的复杂度计算,比如最短路径算法的时间复杂度$O(V+E)$要用$$独立成段。代码示例选择最经典的顶点遍历g.V().has(),既展示step-by-step特性又避免过于复杂。 用户没有要求对比其他语言,但引用[1]提到“多种图查询语言”,所以在衍生问题里埋了Cypher的对比点,这样既保持焦点又提供延伸阅读线索。最后的应用场景特意关联推荐系统,直接扣回引用[2]的案例。</think>Gremlin 是一种**基于图的遍历语言**(Graph Traversal Language),专为图数据库查询设计。它采用**命令式语法**,允许用户通过组合多个步骤(step-by-step)精确描述如何遍历图中的顶点(Vertex)和边(Edge),实现复杂关系的查询与分析。以下是其核心解析: --- ### 一、Gremlin 的核心特性 1. **图遍历语言** 以图结构(顶点、边、属性)为操作对象,通过路径导航获取数据。 **示例**:查找用户A的朋友的朋友(二度人脉): ```gremlin g.V().has('user','name','A') // 定位顶点A .out('friend') // 遍历A的"friend"出边 .out('friend') // 遍历朋友节点的"friend"出边 .values('name') // 提取最终节点的名字 ``` 2. **命令式语法** 用户需明确指定遍历路径的每一步操作(类似编程逻辑),与声明式语言(如SQL)形成对比。 **对比**: - SQL(声明式):`SELECT name FROM user WHERE age > 30` - Gremlin(命令式):`g.V().has('age', gt(30)).values('name')` 3. **多模型支持** 兼容主流图数据库(如 **Amazon Neptune**[^2]、JanusGraph、Cosmos DB),支持属性图(Property Graph)和RDF图模型。 --- ### 二、核心概念与用途 #### 1. **基本操作单元** | 组件 | 说明 | 示例 | |-------------|-----------------------|--------------------------| | **顶点 (Vertex)** | 实体(如用户、商品) | `v = g.addV('user').property('name','Alice')` | | **边 (Edge)** | 关系(如关注、购买) | `e = v.addE('follow').to(targetUser)` | | **属性 (Property)** | 顶点/边的附加数据 | `v.property('age', 25)` | #### 2. **典型应用场景** - **社交网络分析** 查询多层关系(如“共同好友”): ```gremlin g.V(userA).both('friend') // A的所有好友 .both('friend') // 好友的好友 .where(neq(userA)) // 排除A自己 .dedup() // 去重 ``` - **推荐系统** 基于共同行为生成推荐(如“购买相同商品的人还喜欢”): ```gremlin g.V(targetProduct).in('bought') // 购买该商品的用户 .out('bought') // 这些用户购买的其他商品 .where(neq(targetProduct)) // 排除原商品 .groupCount().by('name') // 统计商品出现次数 ``` - **欺诈检测** 识别异常关系环(如循环转账): ```gremlin g.V(user).repeat(out('transfer')).times(3) // 3层转账路径 .emit(loops().is(3)) // 捕获第3层路径 .path().by('id') // 输出完整路径ID ``` --- ### 三、Gremlin 执行流程示例 以**“查找30岁以上用户购买过的商品”** 为例: ```gremlin g.V() // 遍历所有顶点 .hasLabel('user') // 筛选标签为"user" .has('age', gt(30)) // 筛选年龄>30 .out('bought') // 遍历"bought"出边 .values('product_name') // 提取商品名称 ``` **执行步骤**: 1. 定位所有顶点 → 2. 过滤用户顶点 → 3. 过滤年龄 → 4. 遍历购买关系 → 5. 提取商品名 --- ### 四、优势与局限 | **优势** | **局限** | |-----------------------------------|------------------------------| | 灵活表达复杂路径查询 | 学习曲线陡峭(需理解步骤组合) | | 实时分析深度关联数据 | 性能依赖图数据库优化能力[^2] | | 兼容主流图数据库(如Neptune[^2])| 无统一语法标准[^1] | > 注:Gremlin 由 Apache TinkerPop 项目维护,是图计算领域的事实标准之一[^1]。 --- ### 附:Gremlin 运算符示例 | 运算符 | 作用 | 示例 | |--------------|--------------------|--------------------------| | `out()` | 遍历出边 | `g.V().out('knows')` | | `in()` | 遍历入边 | `g.V().in('created')` | | `has()` | 属性过滤 | `.has('age', gt(20))` | | `groupCount()`| 分组计数 | `.groupCount().by('type')`| | `path()` | 返回完整遍历路径 | `.path().by('name')` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值