关于交集的nGQL语法实现问题

  • nebula 版本:2.0.1
  • 问题的具体描述
    我们需要对两条路径查询结果求交集,同时要输出第一条路径里的一个边属性值,请问下有什么实现方法吗?比如第一条路径查询结果里有字段dst和p,第二条路径查询结果里有字段dst,有什么方法可以求得交集,同时带着p值吗?

能描述一下您的 “两天路经查询结果求交集” 指具体的定义么?比如用 query 语句去描述一下?

nGQL 的交集 集合运算符 - Nebula Graph Database 手册
要求在 INTERSECT 两边,的确,它查询的输出项需要一致, INTERSECT 和管道能不能实现?有可能不能,想等您的详细需求场景信息再看看,如果不行的话我会去提 issue。

go from v over edge1 yield edge1._dst as dst, edge.p as p
go from v over edge2 yield edge2._dst as dst
对这两条的结构按dst求交集,同时能得到dst和p值,就类似inner join

go 语言没有路径的概念,所以是不支持的。

描述一下你的需求:同时满足两种路径 pattern (你例子里边是只要求 dst 相同),需要用到多 pattern, 但是 多 pattern 我们目前还没支持,暂时想不到别的办法。

MATCH 语句实现如下:

MATCH p1=(v)-[e1:edge1]-(dst)
WHERE exists((v)-[:edge2]-(dst))
RETURN p1,dst
1 个赞

@RJx @kyle

我写了一个拧巴的方式实现,不知道行不行?(这里follow2 相当于 edge2, follow 相当于 edge)

本来觉得想先 GO edge2,然后再 FETCH EDGE 结果 FETCH EDGE 还不支持变量引用,就用 FIND PATH了:

GO FROM "player101" over follow2 YIELD follow2._dst AS dst, follow2.degree AS d | \
FIND ALL PATH WITH PROP FROM "player101" TO $-.dst OVER follow UPTO 1 STEPS| \
YIELD nodes($-.path) AS v, relationships($-.path) AS e| \
YIELD $-.v[1].name AS dst, $-.e[0].degree AS p
(root@nebula) [basketballplayer]> GO FROM "player101" over follow2 YIELD follow2._dst AS dst, follow2.degree AS d | \
                               -> FIND ALL PATH WITH PROP FROM "player101" TO $-.dst OVER follow UPTO 1 STEPS| \
                               -> YIELD nodes($-.path) AS v, relationships($-.path) AS e| \
                               -> YIELD $-.v[1].name AS dst, $-.e[0].degree AS p
+---------------------+----+
| dst                 | p  |
+---------------------+----+
| "Tim Duncan"        | 95 |
+---------------------+----+
| "LaMarcus Aldridge" | 90 |
+---------------------+----+
| "Manu Ginobili"     | 95 |
+---------------------+----+
Got 3 rows (time spent 5126427/5239649 us)

ref: 在 basketballplayer 引入 follow2模拟 edge2

create edge follow2(degree int);
insert edge follow2(degree) values "player100"->"player101":(295);
insert edge follow2(degree) values "player100"->"player125":(295);
insert edge follow2(degree) values "player101"->"player100":(295);
insert edge follow2(degree) values "player101"->"player125":(295);
insert edge follow2(degree) values "player101"->"player102":(290);
insert edge follow2(degree) values "player125"->"player100":(290);
insert edge follow2(degree) values "player102"->"player101":(275);
insert edge follow2(degree) values "player102"->"player100":(275);
insert edge follow2(degree) values "player103"->"player102":(270);
insert edge follow2(degree) values "player104"->"player101":(250);
insert edge follow2(degree) values "player104"->"player100":(255);

可以麻烦看下下面的问题吗?应该怎么改啊?

MATCH (v1:node{id:'v1'})-[e1:node_edge]->(v2)-[e2:node_edge]->(dst) 
WHERE exists((v1)-[:node_edge]->(dst))
RETURN dst
[ERROR (-7)]: SyntaxError: syntax error near `:node_ed'

这个 目前还不支持诶,可以关注一下后续版本

想到另一种写法

$v = GO FROM vertex OVER edge YIELD edge._dst INTERSECT GO ...; 
GO FROM vertex OVER edge YIELD edge WHERE edge._dst IN [xx,xxx]

如果这里的 [xx,xxx] 可以用变量$v代替的话也能解决问题了,但是好像没有办法实现对吗,只是想确认下。

应该不行,$var 限制还挺多的,比如必须 from 之后才能 yield


(czp@nebula) [nba]> $var=go from "Tim Duncan" over like yield like._dst AS dst;$var=go from "Tim Duncan" over like yield $var.dst
[ERROR (-1009)]: SemanticError: A variable must be referred in FROM before used in WHERE or YIELD

而且 go 语句路径是允许点边重复的,如果你要做类似这样的 pattern (v1:node{id:'v1'})-[e1:node_edge]->(v2)-[e2:node_edge]->(dst) ,match 和 go 语句还是不一样的

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