GET SUBGRAPH

你好。我想请问一下,通过GET SUBGRAPH 1 STEPS FROM vid 获取子图只能拿到tag的vid吗? 能拿到tag的属性吗?

WITH PROP 参数加了之后可以拿到属性的哈

GET SUBGRAPH WITH PROP 1 STEPS FROM "player101" OUT serve YIELD VERTICES AS nodes, EDGES AS relationships;

https://docs.nebula-graph.com.cn/2.6.1/3.ngql-guide/16.subgraph-and-path/1.get-subgraph/

1 个赞

这样好像拿不到尾节点的属性

是有的哈

(root@nebula) [basketballplayer]> GET SUBGRAPH WITH PROP 1 STEPS FROM "player101" OUT serve YIELD VERTICES AS nodes, EDGES AS relationships;
+------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| nodes                                                                  | relationships                                                                                                                                  |
+------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| [("player101" :player{age: 36, name: "Tony Parker"})]                  | [[:serve "player101"->"team204" @0 {end_year: 2018, start_year: 1999}], [:serve "player101"->"team215" @0 {end_year: 2019, start_year: 2018}]] |
+------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
| [("team215" :team{name: "Hornets"}), ("team204" :team{name: "Spurs"})] | []                                                                                                                                             |
+------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------+
Got 2 rows (time spent 2564/13078 us)

Fri, 10 Dec 2021 14:16:16 CST
(root@nebula) [basketballplayer]> GET SUBGRAPH WITH PROP 1 STEPS FROM "player101" OUT serve YIELD VERTICES AS nodes | YIELD $-.nodes[-1].name AS tail_node_name;
+----------------+
| tail_node_name |
+----------------+
| "Tony Parker"  |
+----------------+
| "Hornets"      |
+----------------+
Got 2 rows (time spent 2609/147511 us)

nebula版本是2.5的,没有yield语句吗? 每次执行yield就报错

2.5 的话确实 YIELD 不太一样,

https://docs.nebula-graph.com.cn/2.5.1/3.ngql-guide/16.subgraph-and-path/1.get-subgraph/

nebula> GET SUBGRAPH WITH PROP 1 STEPS FROM "player100" OUT serve;
+------------------------------------------------------+-------------------------------------------------------------------------+
| _vertices                                            | _edges                                                                  |
+------------------------------------------------------+-------------------------------------------------------------------------+
| [("player100" :player{age: 42, name: "Tim Duncan"})] | [[:serve "player100"->"team200" @0 {end_year: 2016, start_year: 1997}]] |
+------------------------------------------------------+-------------------------------------------------------------------------+
| [("team200" :team{name: "Warriors"})]                | []                                                                      |
+------------------------------------------------------+-------------------------------------------------------------------------+

那我只能升级nebula的版本了

抱歉哈,2.5 到 2.6 的升级其实比较简单,会有一些收益。

好的,谢谢

如果你觉得 wey 的回复解决了你的问题,记得勾选为解决方案哈,方便后续遇到相似问题的小伙伴可以快速地找到对应答案~ 谢谢 Gavingx

不好意思要再请教一下, 我该怎么取到头节点的VertexID和尾节点的VertexID呢?
返回结果的格式比较抽象。
类似:GET SUBGRAPH WITH PROP 2 STEPS FROM “e_1506” YIELD VERTICES AS nodes, EDGES AS relationships |YIELD $-.nodes[0].name AS head_name, $-.nodes[0].VertexID
AS head_id, $-.nodes[-1].name AS tail_name, $-.nodes[-1].VertexID AS tail_id, $-.relationships[0].name AS rel 这样返回的结果貌似是不正确的

这里是我之前对 subgraph 的结果没理解误导你了,我写的那个取[-1] 的语义是不对的,因为每一行应该是子图上对应了多迈出一个 step 涉及到的点和边(之前走过点还不会重复表示出来)。

(root@nebula) [basketballplayer]> GET SUBGRAPH 4 STEPS FROM "player100" OUT follow YIELD VERTICES AS nodes, EDGES AS relationships;
+----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| nodes                                              | relationships                                                                                                                                                            |
+----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| [("player100" :player{})]                          | [[:follow "player100"->"player101" @0 {}], [:follow "player100"->"player125" @0 {}]]                                                                                     |
+----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| [("player101" :player{}), ("player125" :player{})] | [[:follow "player101"->"player100" @0 {}], [:follow "player101"->"player102" @0 {}], [:follow "player101"->"player125" @0 {}], [:follow "player125"->"player100" @0 {}]] |
+----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| [("player102" :player{})]                          | [[:follow "player102"->"player100" @0 {}], [:follow "player102"->"player101" @0 {}]]                                                                                     |
+----------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Got 3 rows (time spent 2780/39725 us)

所以,子图查询是面向最终渲染的(我指的是,拓展多跳之后,有些已经遍历过的点还可以被认为是多跳之后的终点,但是不会在子图结果里,因为它是去重的,如果我们希望获得这个结果,就不能用子图查询,而是go/match),如果想要每一种 n step 的路径的最后一跳的点或者路径的话应该用 go 或者

(root@nebula) [basketballplayer]> match (v0)-[e:follow*3]->(v1) WHERE id(v0) in ['player100'] return v1,id(v1)
+-------------------------------------------------------+-------------+
| v1                                                    | id(v1)      |
+-------------------------------------------------------+-------------+
| ("player100" :player{age: 42, name: "Tim Duncan"})    | "player100" |
+-------------------------------------------------------+-------------+
| ("player101" :player{age: 36, name: "Tony Parker"})   | "player101" |
+-------------------------------------------------------+-------------+
| ("player125" :player{age: 41, name: "Manu Ginobili"}) | "player125" |
+-------------------------------------------------------+-------------+
| ("player101" :player{age: 36, name: "Tony Parker"})   | "player101" |
+-------------------------------------------------------+-------------+
| ("player100" :player{age: 42, name: "Tim Duncan"})    | "player100" |
+-------------------------------------------------------+-------------+
Got 5 rows (time spent 5872/42821 us)

Mon, 13 Dec 2021 15:32:24 CST

(root@nebula) [basketballplayer]> GO 3 STEPS FROM "player100" OVER follow
+-------------+
| follow._dst |
+-------------+
| "player101" |
+-------------+
| "player125" |
+-------------+
| "player100" |
+-------------+
| "player101" |
+-------------+
| "player100" |
+-------------+
Got 5 rows (time spent 4609/105244 us)

Mon, 13 Dec 2021 15:32:48 CST

带上路径信息可以看到player100经过 3跳follow回到自己的不同走法。

(root@nebula) [basketballplayer]> match p=(v0)-[e:follow*3]->(v1) WHERE id(v0) in ['player100'] return v1,id(v1),p
+-------------------------------------------------------+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| v1                                                    | id(v1)      | p                                                                                                                                                                                                                                                                                                    |
+-------------------------------------------------------+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ("player100" :player{age: 42, name: "Tim Duncan"})    | "player100" | <("player100" :player{age: 42, name: "Tim Duncan"})-[:follow@0 {degree: 95}]->("player101" :player{age: 36, name: "Tony Parker"})-[:follow@0 {degree: 90}]->("player102" :player{age: 33, name: "LaMarcus Aldridge"})-[:follow@0 {degree: 75}]->("player100" :player{age: 42, name: "Tim Duncan"})>  |
+-------------------------------------------------------+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ("player125" :player{age: 41, name: "Manu Ginobili"}) | "player125" | <("player100" :player{age: 42, name: "Tim Duncan"})-[:follow@0 {degree: 95}]->("player101" :player{age: 36, name: "Tony Parker"})-[:follow@0 {degree: 95}]->("player100" :player{age: 42, name: "Tim Duncan"})-[:follow@0 {degree: 95}]->("player125" :player{age: 41, name: "Manu Ginobili"})>      |
+-------------------------------------------------------+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ("player101" :player{age: 36, name: "Tony Parker"})   | "player101" | <("player100" :player{age: 42, name: "Tim Duncan"})-[:follow@0 {degree: 95}]->("player101" :player{age: 36, name: "Tony Parker"})-[:follow@0 {degree: 90}]->("player102" :player{age: 33, name: "LaMarcus Aldridge"})-[:follow@0 {degree: 75}]->("player101" :player{age: 36, name: "Tony Parker"})> |
+-------------------------------------------------------+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ("player100" :player{age: 42, name: "Tim Duncan"})    | "player100" | <("player100" :player{age: 42, name: "Tim Duncan"})-[:follow@0 {degree: 95}]->("player101" :player{age: 36, name: "Tony Parker"})-[:follow@0 {degree: 95}]->("player125" :player{age: 41, name: "Manu Ginobili"})-[:follow@0 {degree: 90}]->("player100" :player{age: 42, name: "Tim Duncan"})>      |
+-------------------------------------------------------+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ("player101" :player{age: 36, name: "Tony Parker"})   | "player101" | <("player100" :player{age: 42, name: "Tim Duncan"})-[:follow@0 {degree: 95}]->("player125" :player{age: 41, name: "Manu Ginobili"})-[:follow@0 {degree: 90}]->("player100" :player{age: 42, name: "Tim Duncan"})-[:follow@0 {degree: 95}]->("player101" :player{age: 36, name: "Tony Parker"})>      |
+-------------------------------------------------------+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Got 5 rows (time spent 6054/43328 us)

https://nebula-graph.com.cn/posts/nebula-graph-subgraph-introduction/

1.可以在match前使用lookup吗? 我使用了:
LOOKUP ON ingredient | limit 1 | match p=(v0)-[e*1]-(v1) WHERE id(v0) in [$-.VertexID] RETURN v0.name AS head_name, id(v0) AS head_id,e AS rel, v1.name AS tail_name, id(v1) AS tail_id,报错:

SemanticError: Can't solve the start vids from the sentence: MATCH p = (v0)-[e*1]-(v1) WHERE (id(v0) IN [$-.VertexID]) RETURN v0.name AS head_name,id(v0) AS head_id,e AS rel,v1.name AS tail_name,id(v1) AS tail_id
(我想随机返回一个节点,然后以这个节点为起始点找到对应深度的尾节点和关系的名称)

1.对于子图查询的解释还是不太明白。就是说子图查询获得的图最终会成为一个环,如果跳数多于环的节点数,最终只会返回不重复的节点的最后一个节点吗?(比如:A→B→C→A,1跳会返回B,2跳会返回C,3跳也返回C?)

子图的总体结果的信息的意思还是比较直接的,但是它的结果默认输出为两列的表的情况的含义为:

  • 每一行表示更进一步的结果(如上边的例子里第一列是点,第二列是边,第一行的边是 100–>101, 100–> 125,两条)
  • 上一步的终点会出现在下一步的起点里,但是会按照历史走过的点去重

这样的结果对比如可视化渲染子图结果的话是够用的,但是如果你关心子图里所有 3 跳路径的终点的话,应该会因为去重没法拿到一些结果。

可以参考这个

(root@nebula) [basketballplayer]> LOOKUP ON player | limit 1 | GO FROM $-.VertexID OVER * YIELD properties($^).name as headName, $-.VertexID as headID, type(edge) as rel
+--------------+-------------+----------+
| headName     | headID      | rel      |
+--------------+-------------+----------+
| "Tim Duncan" | "player100" | "serve"  |
+--------------+-------------+----------+
| "Tim Duncan" | "player100" | "follow" |
+--------------+-------------+----------+
| "Tim Duncan" | "player100" | "follow" |
+--------------+-------------+----------+
Got 3 rows (time spent 2577/38320 us)

赞!

1 个赞

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