【NebulaGraph】变化的多跳查询

【NebulaGraph】变化的多跳查询

  • [1. 需求](#1. 需求)
  • [2. 解决方案](#2. 解决方案)
    • [2.1 确定查询结构](#2.1 确定查询结构)
    • [2.2 构建查询语句](#2.2 构建查询语句)
  • [3. 追加需求:如果增加每一跳都要指定查询某SPACE下的Tag,或者不查询某个Tag怎么办](#3. 追加需求:如果增加每一跳都要指定查询某SPACE下的Tag,或者不查询某个Tag怎么办)

1. 需求

存在多跳请求,其中每一跳是从上一跳查询结果为基础的 。但是 最终查询的结果要包含到每一跳的查询结果。 请求参数比如,给了顶点id是324718然后指定查询某些边,然后这一跳是正向的,然后第二跳在一跳的基础上,再指定查询哪些边,什么方向。 以此类推,最终要获取所有顶点的id,顶点包含Tag的properties还有边的信息。

2. 解决方案

2.1 确定查询结构

假设我们需要进行两跳查询:

  1. 第一跳:从给定的顶点 ID 出发,沿着特定类型的边进行遍历。
  2. 第二跳:从第一跳的结果顶点出发,继续沿着另一类型的边进行遍历,可以是反向。

2.2 构建查询语句

下面是一个示例查询,它演示了如何执行两跳查询,每一跳可以指定不同的边类型和方向:

java 复制代码
GO FROM "player100" OVER follow 
YIELD src(edge) AS src, dst(edge) AS dst, edge AS e1

src(edge):起点id
dst(edge): 终点id
edge:是边



java 复制代码
# 使用第一跳的结果作为第二跳的输入
GO FROM "player100" OVER follow 
YIELD src(edge) AS src, dst(edge) AS dst, edge AS e1 |
GO FROM $-.dst OVER serve REVERSELY
YIELD $-.src AS src1, $-.dst AS dst1, $-.e1 AS e1, src(edge) AS src2, dst(edge) AS dst2, edge AS e2

这里存在问题:在 Nebula Graph 的查询中,如果你使用了管道操作 | 来连接两次 GO 查询,那么整个查询的结果是依赖于所有步骤的。这意味着,如果第二跳没有结果,整个查询可能不会返回任何数据,即使第一跳实际上有结果。这是因为管道操作符 | 将第一跳的输出作为第二跳的输入,如果第二跳的查询基于这些输入没有找到符合条件的结果,则整个查询链被视为没有产生有效输出。

根据这个结论:需要我们每一跳都要收集数据,最后一期汇总,而不能通过一次复杂的nGQL语句查询出所有的结果

3. 追加需求:如果增加每一跳都要指定查询某SPACE下的Tag,或者不查询某个Tag怎么办

  • 步骤一:每1跳的查询都要收集顶点的ID
  • 步骤二:使用FETCH PROP ON获取特定标签的属性

1跳查询的时候:

java 复制代码
GO FROM "player100" OVER follow 
YIELD src(edge) AS src, dst(edge) AS dst, edge AS e1

这个结果可知:相关顶点的id为player101与player125

java 复制代码
# 查询指定的Tag,但是查询到的结果是空的,说明这两个顶点如果指定查询tag:team,则返回为空,并且
# 与其相关的边也要删除掉
FETCH PROP ON team "player101","player125" YIELD properties(vertex),id(vertex);
相关推荐
echome88812 分钟前
JavaScript Promise 与 async/await 实战:5 个高频异步编程场景的优雅解决方案
开发语言·javascript·ecmascript
立莹Sir23 分钟前
Spring Bean生命周期设计思想与源码深度剖析:从表象到本质的全面升级
java·spring·rpc
计算机毕业论文辅导29 分钟前
毕业设计避坑指南:工资信息管理系统的设计与实现(Java+SpringBoot实战)
java·spring boot·课程设计
你不是我我32 分钟前
【Java 开发日记】为什么要有 time _wait 状态,服务端这个状态过多是什么原因?
java·网络·php
User_芊芊君子32 分钟前
别再乱用 ArrayList 了!这 4 个隐藏坑,90% 的 Java 开发者都踩过
android·java·数据库
xcLeigh33 分钟前
JAVA项目实战:用飞算 JavaAI 高效开发电商系统核心功能模块
java·ai编程·电商系统·java开发·飞算javaai炫技赛
xcLeigh34 分钟前
IoTDB Java 原生 API 实战:SessionPool 从入门到精通
java·开发语言·数据库·api·iotdb·sessionpool
qq12_81151751534 分钟前
Java Web 影城会员管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
java·前端·mybatis
杜子不疼.34 分钟前
Java 智能体学习避坑指南:3 个常见误区,新手千万别踩,高效少走弯路
java·开发语言·人工智能·学习
冬天vs不冷35 分钟前
为什么 Java 不让 Lambda 和匿名内部类修改外部变量?final 与等效 final 的真正意义
android·java·开发语言