如何精确匹配子图?

Nebula版本:3.2.0

问题背景

目前遇到的问题是给定一个子图结构和子图结构中某个点的VID,需要在Nebula中精确匹配出所有满足子图结构的数据,并且在子图结构上配置一些图指标。如计算个人3这个点在Nebula数据图中共匹配到了多少个。

举例来说,如下图所示


此处定义了子图结构,并且给定了个人1(对应B点)的VID 为 B1。需要精确匹配图中子图结构,并且B1对应子图中B点。

查看文档

翻阅了官方文档,查看了子图,GO和Find Path,Nebula提供的这几个查询语句功能都得提前定义跳数,没看到有精确指定子图结构的地方(如果有,请告诉我)。

目前做法

目前我们的做法是将子图拆分为以起始点为出发点,将子图拆分为多条路径(多条路径合并后能覆盖整个子图结构),然后根据多条路径查找出的具体数据路径做"交集"完成。

如上图,会拆分为三个路径。



查找匹配单条路径结构数据

每条路径都会从起始点B出发在Nebula 利用MATCH语句For 循环寻找满足路径结构的数据。

以路径1为例
如B为B1.则利用MATCH 语句,从B1点出发,寻找到一批A点集合A1。再遍历A1走Match语句得到D点集合D。如此类推得到满足路径结构的数据。

路径数据取“交集"

路径1得到的路径数据和路径2得到的路径数据对应点取交集。
举例子来说。

若路径1得到了两条数据路径。
B1->A1<-D1->E1
B1->A2<-D2->E2
路径1点集合为
B:[B1]
A:[A1,A2]
D:[D1,D2]
E:[E1,E2]

路径2得到了一条数据路径。
B1->A1<-D1->E1
则路径1点集合为
B:[B1]
D:[D1]
E:[E1]
对路径1和路径2对应点的集合取交集,并且记录不在交集里的点,将这些点所在的数据路径上的所有点从结果交集中删除。
对应到上面的两个集合操作就是。

  • 1.取交集。
    得到
    B:[B1]
    A:[A1,A2]
    D:[D1]
    E:[E1]
  • 2.因为E2或者D2都没在交集里,所以会将E2,D2所在的所有点删除。也就删除A2

得到最后结果为
B:[B1]
A:[A1]
D:[D1]
E:[E1]

所以此时满足两条路径结构的数据就完成查找,以此类推,将所有的拆分路径循环做以上操作即可完成匹配满足子图结构的所有数据。

总结提问

  1. 希望可以一个子图结构和子图结构中某个点的VID,需要在Nebula中精确匹配出所有满足子图结构的数据。

  2. 如果做不到精确匹配子图结构,目前我们是通过循环Match语句匹配路径,希望nebula中有语句可以支持匹配路径,将匹配路径这个操作下推到Nebula数据库。

试下match语句, 类似于 match (e)–(d)–(a)–(b)–(c) where (d)–(b) return b

1 个赞

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。