MATCH
MATCH
语句提供基于模式(pattern)匹配的搜索功能。
一个MATCH
语句定义了一个搜索模式,用该模式匹配存储在Nebula Graph中的数据,然后用RETURN
子句检索数据。
本文示例使用测试数据集basketballplayer进行演示。
语法
与GO
或LOOKUP
等其他查询语句相比,MATCH
的语法更灵活。MATCH
语法可以概括如下:
MATCH <pattern> [<WHERE clause>] RETURN <output>
MATCH工作流程
MATCH
语句使用原生索引查找起始点或边,起始点或边可以在模式的任何位置。即一个有效的MATCH
语句,必须有一个属性、Tag或Edge type已经创建索引,或者在WHERE
子句中用id()函数指定了特定点的VID。如何创建索引,请参见创建原生索引。MATCH
语句在模式中搜索,寻找匹配的边或点。Note
MATCH
语句采用的路径类型是trail
,即遍历时只有点可以重复,边不可以重复。详情请参见路径。MATCH
语句根据RETURN
子句检索数据。
openCypher兼容性
nGQL不支持遍历所有点和边,例如
MATCH (v) RETURN v
。但是,建立相应Tag的索引后,可以遍历对应Tag的所有点,例如MATCH (v:T1) RETURN v
。WHERE子句内不支持图模式。
使用模式(pattern)
前提条件
请确保MATCH
语句有至少一个索引可用,或者其中指定了VID。如果需要创建索引,但是已经有相关的点、边或属性,用户必须在创建索引后重建索引,索引才能生效。
Caution
索引会导致写性能大幅降低(降低90%甚至更多)。请不要随意在生产环境中使用索引,除非很清楚使用索引对业务的影响。
# 在Tag player的name属性和Edge type follow上创建索引。
nebula> CREATE TAG INDEX name ON player(name(20));
nebula> CREATE EDGE INDEX follow_index on follow();
# 重建索引使其生效。
nebula> REBUILD TAG INDEX name;
+------------+
| New Job Id |
+------------+
| 121 |
+------------+
nebula> REBUILD EDGE INDEX follow_index
+------------+
| New Job Id |
+------------+
| 122 |
+------------+
# 确认重建索引成功。
nebula> SHOW JOB 121;
+----------------+---------------------+------------+-------------------------+-------------------------+
| Job Id(TaskId) | Command(Dest) | Status | Start Time | Stop Time |
+----------------+---------------------+------------+-------------------------+-------------------------+
| 121 | "REBUILD_TAG_INDEX" | "FINISHED" | 2021-05-27T02:18:02.000 | 2021-05-27T02:18:02.000 |
+----------------+---------------------+------------+-------------------------+-------------------------+
| 0 | "storaged1" | "FINISHED" | 2021-05-27T02:18:02.000 | 2021-05-27T02:18:02.000 |
+----------------+---------------------+------------+-------------------------+-------------------------+
| 1 | "storaged0" | "FINISHED" | 2021-05-27T02:18:02.000 | 2021-05-27T02:18:02.000 |
+----------------+---------------------+------------+-------------------------+-------------------------+
| 2 | "storaged2" | "FINISHED" | 2021-05-27T02:18:02.000 | 2021-05-27T02:18:02.000 |
+----------------+---------------------+------------+-------------------------+-------------------------+
nebula> SHOW JOB 122;
+----------------+----------------------+------------+-------------------------+-------------------------+
| Job Id(TaskId) | Command(Dest) | Status | Start Time | Stop Time |
+----------------+----------------------+------------+-------------------------+-------------------------+
| 122 | "REBUILD_EDGE_INDEX" | "FINISHED" | 2021-05-27T02:18:11.000 | 2021-05-27T02:18:11.000 |
+----------------+----------------------+------------+-------------------------+-------------------------+
| 0 | "storaged1" | "FINISHED" | 2021-05-27T02:18:11.000 | 2021-05-27T02:18:21.000 |
+----------------+----------------------+------------+-------------------------+-------------------------+
| 1 | "storaged0" | "FINISHED" | 2021-05-27T02:18:11.000 | 2021-05-27T02:18:21.000 |
+----------------+----------------------+------------+-------------------------+-------------------------+
| 2 | "storaged2" | "FINISHED" | 2021-05-27T02:18:11.000 | 2021-05-27T02:18:21.000 |
+----------------+----------------------+------------+-------------------------+-------------------------+
匹配点
用户可以在一对括号中使用自定义变量来表示模式中的点。例如(v)
。
匹配 Tag
Note
匹配 Tag 的前提是 Tag 本身有索引或者 Tag 的某个属性有索引,否则,用户无法基于该 Tag 执行 MATCH
语句。
用户可以在点的右侧用:<tag_name>
表示模式中的Tag。
nebula> MATCH (v:player) RETURN v;
+---------------------------------------------------------------+
| v |
+---------------------------------------------------------------+
| ("player102" :player{age: 33, name: "LaMarcus Aldridge"}) |
+---------------------------------------------------------------+
| ("player106" :player{age: 25, name: "Kyle Anderson"}) |
+---------------------------------------------------------------+
| ("player115" :player{age: 40, name: "Kobe Bryant"}) |
+---------------------------------------------------------------+
...
匹配点的属性
Note
匹配点的属性的前提是 Tag 本身有对应属性的索引,否则,用户无法执行 MATCH
语句匹配该属性。
用户可以在Tag的右侧用{<prop_name>: <prop_value>}
表示模式中点的属性。
# 使用属性name搜索匹配的点。
nebula> MATCH (v:player{name:"Tim Duncan"}) RETURN v;
+----------------------------------------------------+
| v |
+----------------------------------------------------+
| ("player100" :player{name: "Tim Duncan", age: 42}) |
+----------------------------------------------------+
使用WHERE
子句也可以实现相同的操作:
nebula> MATCH (v:player) WHERE v.name == "Tim Duncan" RETURN v;
+----------------------------------------------------+
| v |
+----------------------------------------------------+
| ("player100" :player{name: "Tim Duncan", age: 42}) |
+----------------------------------------------------+
openCypher兼容性
在openCypher 9中,=
是相等运算符,在nGQL中,==
是相等运算符,=
是赋值运算符。
匹配点ID
用户可以使用点ID去匹配点。id()
函数可以检索点的ID。
nebula> MATCH (v) WHERE id(v) == 'player101' RETURN v;
+-----------------------------------------------------+
| v |
+-----------------------------------------------------+
| ("player101" :player{age: 36, name: "Tony Parker"}) |
+-----------------------------------------------------+
要匹配多个点的ID,可以用WHERE id(v) IN [vid_list]
。
nebula> MATCH (v:player { name: 'Tim Duncan' })--(v2) \
WHERE id(v2) IN ["player101", "player102"] RETURN v2;
+-----------------------------------------------------------+
| v2 |
+-----------------------------------------------------------+
| ("player101" :player{name: "Tony Parker", age: 36}) |
+-----------------------------------------------------------+
| ("player102" :player{name: "LaMarcus Aldridge", age: 33}) |
+-----------------------------------------------------------+
| ("player101" :player{name: "Tony Parker", age: 36}) |
+-----------------------------------------------------------+
匹配连接的点
用户可以使用--
符号表示两个方向的边,并匹配这些边连接的点。
历史版本兼容性
在nGQL 1.x中,--
符号用于行内注释,在nGQL 2.x中,--
符号表示出边或入边,不再用于注释。
nebula> MATCH (v:player{name:"Tim Duncan"})--(v2) \
RETURN v2.name AS Name;
+---------------------+
| Name |
+---------------------+
| "Tony Parker" |
+---------------------+
| "LaMarcus Aldridge" |
+---------------------+
| "Marco Belinelli" |
+---------------------+
| "Danny Green" |
+---------------------+
| "Aron Baynes" |
+---------------------+
...
用户可以在--
符号上增加<
或>
符号指定边的方向。
# -->表示边从v开始,指向v2。对于点v来说是出边,对于点v2来说是入边。
nebula> MATCH (v:player{name:"Tim Duncan"})-->(v2) \
RETURN v2.name AS Name;
+-----------------+
| Name |
+-----------------+
| "Spurs" |
+-----------------+
| "Tony Parker" |
+-----------------+
| "Manu Ginobili" |
+-----------------+
如果需要扩展模式,可以增加更多点和边。
nebula> MATCH (v:player{name:"Tim Duncan"})-->(v2)<--(v3) \
RETURN v3.name AS Name;
+---------------------+
| Name |
+---------------------+
| "Tony Parker" |
+---------------------+
| "Tiago Splitter" |
+---------------------+
| "Dejounte Murray" |
+---------------------+
| "Tony Parker" |
+---------------------+
| "LaMarcus Aldridge" |
+---------------------+
...
如果不需要引用点,可以省略括号中表示点的变量。
nebula> MATCH (v:player{name:"Tim Duncan"})-->()<--(v3) \
RETURN v3.name AS Name;
+---------------------+
| Name |
+---------------------+
| "Tony Parker" |
+---------------------+
| "LaMarcus Aldridge" |
+---------------------+
| "Rudy Gay" |
+---------------------+
| "Danny Green" |
+---------------------+
| "Kyle Anderson" |
+---------------------+
...
匹配路径
连接起来的点和边构成了路径。用户可以使用自定义变量命名路径。
nebula> MATCH p=(v:player{name:"Tim Duncan"})-->(v2) \
RETURN p;
+-------------------------------------------+
| p |
+-------------------------------------------+
| <("player100" :player{age: 42, name: "Tim Duncan"})-[:follow@0 {degree: 95}]->("player101" :player{age: 36, name: "Tony Parker"})> |
+-------------------------------------------+
| <("player100" :player{age: 42, name: "Tim Duncan"})-[:follow@0 {degree: 95}]->("player125" :player{age: 41, name: "Manu Ginobili"})> |
+-------------------------------------------+
| <("player100" :player{age: 42, name: "Tim Duncan"})-[:serve@0 {end_year: 2016, start_year: 1997}]->("team204" :team{name: "Spurs"})> |
+-------------------------------------------+
openCypher兼容性
在nGQL中,@
符号表示边的rank,在openCypher中,没有rank概念。
匹配边
除了用--
、-->
、<--
表示未命名的边之外,用户还可以在方括号中使用自定义变量命名边。例如-[e]-
。
nebula> MATCH (v:player{name:"Tim Duncan"})-[e]-(v2) \
RETURN e;
+---------------------------------------------------------------------------+
| e |
+---------------------------------------------------------------------------+
| [:follow "player101"->"player100" @0 {degree: 95}] |
+---------------------------------------------------------------------------+
| [:follow "player102"->"player100" @0 {degree: 75}] |
+---------------------------------------------------------------------------+
| [:serve "player100"->"team204" @0 {end_year: 2016, start_year: 1997}] |
+---------------------------------------------------------------------------+
...
匹配Edge type
和点一样,用户可以用:<edge_type>
表示模式中的Edge type,例如-[e:follow]-
。
nebula> MATCH ()-[e:follow]-() \
RETURN e;
+-----------------------------------------------------+
| e |
+-----------------------------------------------------+
| [:follow "player113"->"player119" @0 {degree: 99}] |
+-----------------------------------------------------+
| [:follow "player130"->"player149" @0 {degree: 80}] |
+-----------------------------------------------------+
| [:follow "player149"->"player130" @0 {degree: 80}] |
+-----------------------------------------------------+
| [:follow "player136"->"player117" @0 {degree: 90}] |
+-----------------------------------------------------+
| [:follow "player142"->"player117" @0 {degree: 90}] |
+-----------------------------------------------------+
...
匹配边的属性
Note
匹配边的属性的前提是 Edge type 本身有对应属性的索引,否则,用户无法执行 MATCH
语句匹配该属性。
用户可以用{<prop_name>: <prop_value>}
表示模式中Edge type的属性,例如[e:follow{likeness:95}]
。
nebula> MATCH (v:player{name:"Tim Duncan"})-[e:follow{degree:95}]->(v2) \
RETURN e;
+--------------------------------------------------------+
| e |
+--------------------------------------------------------+
| [:follow "player100"->"player101" @0 {degree: 95}] |
+--------------------------------------------------------+
| [:follow "player100"->"player125" @0 {degree: 95}] |
+--------------------------------------------------------+
匹配多个Edge type
使用|
可以匹配多个Edge type,例如[e:follow|:serve]
。第一个Edge type前的英文冒号(:)不可省略,后续Edge type前的英文冒号可以省略,例如[e:follow|serve]
。
nebula> MATCH (v:player{name:"Tim Duncan"})-[e:follow|:serve]->(v2) \
RETURN e;
+---------------------------------------------------------------------------+
| e |
+---------------------------------------------------------------------------+
| [:follow "player100"->"player101" @0 {degree: 95}] |
+---------------------------------------------------------------------------+
| [:follow "player100"->"player125" @0 {degree: 95}] |
+---------------------------------------------------------------------------+
| [:serve "player100"->"team204" @0 {end_year: 2016, start_year: 1997}] |
+---------------------------------------------------------------------------+
匹配多条边
用户可以扩展模式,匹配路径中的多条边。
nebula> MATCH (v:player{name:"Tim Duncan"})-[]->(v2)<-[e:serve]-(v3) \
RETURN v2, v3;
+------------------------------------+-----------------------------------------------------------+
| v2 | v3 |
+------------------------------------+-----------------------------------------------------------+
| ("player204" :team{name: "Spurs"}) | ("player101" :player{name: "Tony Parker", age: 36}) |
+------------------------------------+-----------------------------------------------------------+
| ("player204" :team{name: "Spurs"}) | ("player102" :player{name: "LaMarcus Aldridge", age: 33}) |
+------------------------------------+-----------------------------------------------------------+
| ("player204" :team{name: "Spurs"}) | ("player103" :player{age: 32, name: "Rudy Gay"}) |
+------------------------------------+-----------------------------------------------------------+
...
匹配定长路径
用户可以在模式中使用:<edge_type>*<hop>
匹配定长路径。hop
必须是一个非负整数。
nebula> MATCH p=(v:player{name:"Tim Duncan"})-[e:follow*2]->(v2) \
RETURN DISTINCT v2 AS Friends;
+-----------------------------------------------------------+
| Friends |
+-----------------------------------------------------------+
| ("player100" :player{name: "Tim Duncan", age: 42}) |
+-----------------------------------------------------------+
| ("player102" :player{name: "LaMarcus Aldridge", age: 33}) |
+-----------------------------------------------------------+
| ("player125" :player{name: "Manu Ginobili", age: 41}) |
+-----------------------------------------------------------+
如果hop
为0,模式会匹配路径上的起始点。
nebula> MATCH (v:player{name:"Tim Duncan"}) -[*0]-> (v2) \
RETURN v2;
+----------------------------------------------------+
| v2 |
+----------------------------------------------------+
| ("player100" :player{age: 42, name: "Tim Duncan"}) |
+----------------------------------------------------+
匹配变长路径
用户可以在模式中使用:<edge_type>*[minHop]..<maxHop>
匹配变长路径。
参数 | 说明 |
---|---|
minHop | 可选项。表示路径的最小长度。minHop 必须是一个非负整数,默认值为1。 |
maxHop | 必选项。表示路径的最大长度。maxHop 必须是一个非负整数,没有默认值。 |
openCypher兼容性
在openCypher中,maxHop
是可选项,默认为无穷大。当没有设置时,..
可以省略。在nGQL中,maxHop
是必选项,而且..
不可以省略。
nebula> MATCH p=(v:player{name:"Tim Duncan"})-[e:follow*1..3]->(v2) \
RETURN v2 AS Friends;
+-----------------------------------------------------------+
| Friends |
+-----------------------------------------------------------+
| ("player100" :player{age: 42, name: "Tim Duncan"}) |
+-----------------------------------------------------------+
| ("player101" :player{age: 36, name: "Tony Parker"}) |
+-----------------------------------------------------------+
| ("player125" :player{age: 41, name: "Manu Ginobili"}) |
+-----------------------------------------------------------+
| ("player102" :player{age: 33, name: "LaMarcus Aldridge"}) |
+-----------------------------------------------------------+
用户可以使用DISTINCT
关键字聚合重复结果。
nebula> MATCH p=(v:player{name:"Tim Duncan"})-[e:follow*1..3]->(v2:player) \
RETURN DISTINCT v2 AS Friends, count(v2);
+-----------------------------------------------------------+-----------+
| Friends | count(v2) |
+-----------------------------------------------------------+-----------+
| ("player125" :player{age: 41, name: "Manu Ginobili"}) | 3 |
+-----------------------------------------------------------+-----------+
| ("player102" :player{age: 33, name: "LaMarcus Aldridge"}) | 1 |
+-----------------------------------------------------------+-----------+
| ("player100" :player{age: 42, name: "Tim Duncan"}) | 4 |
+-----------------------------------------------------------+-----------+
| ("player101" :player{age: 36, name: "Tony Parker"}) | 3 |
+-----------------------------------------------------------+-----------+
如果minHop
为0
,模式会匹配路径上的起始点。与上个示例相比,下面的示例设置minHop
为0
,因为它是起始点,所以结果集中"Tim Duncan"
比上个示例多计算一次。
nebula> MATCH p=(v:player{name:"Tim Duncan"})-[e:follow*0..3]->(v2:player) \
RETURN DISTINCT v2 AS Friends, count(v2);
+-----------------------------------------------------------+-----------+
| Friends | count(v2) |
+-----------------------------------------------------------+-----------+
| ("player125" :player{age: 41, name: "Manu Ginobili"}) | 3 |
+-----------------------------------------------------------+-----------+
| ("player101" :player{age: 36, name: "Tony Parker"}) | 3 |
+-----------------------------------------------------------+-----------+
| ("player102" :player{age: 33, name: "LaMarcus Aldridge"}) | 1 |
+-----------------------------------------------------------+-----------+
| ("player100" :player{age: 42, name: "Tim Duncan"}) | 5 |
+-----------------------------------------------------------+-----------+
匹配多个Edge type的变长路径
用户可以在变长或定长模式中指定多个Edge type。hop
、minHop
和maxHop
对所有Edge type都生效。
nebula> MATCH p=(v:player{name:"Tim Duncan"})-[e:follow|serve*2]->(v2) \
RETURN DISTINCT v2;
+-----------------------------------------------------------+
| v2 |
+-----------------------------------------------------------+
| ("player100" :player{name: "Tim Duncan", age: 42}) |
+-----------------------------------------------------------+
| ("player102" :player{name: "LaMarcus Aldridge", age: 33}) |
+-----------------------------------------------------------+
| ("player125" :player{name: "Manu Ginobili", age: 41}) |
+-----------------------------------------------------------+
| ("player204" :team{name: "Spurs"}) |
+-----------------------------------------------------------+
| ("player215" :team{name: "Hornets"}) |
+-----------------------------------------------------------+
常用检索操作
检索点或边的信息
使用RETURN {<vertex_name> | <edge_name>}
检索点或边的所有信息。
nebula> MATCH (v:player{name:"Tim Duncan"}) \
RETURN v;
+----------------------------------------------------+
| v |
+----------------------------------------------------+
| ("player100" :player{name: "Tim Duncan", age: 42}) |
+----------------------------------------------------+
nebula> MATCH (v:player{name:"Tim Duncan"})-[e]->(v2) \
RETURN e;
+---------------------------------------------------------------------------+
| e |
+---------------------------------------------------------------------------+
| [:follow "player100"->"player101" @0 {degree: 95}] |
+---------------------------------------------------------------------------+
| [:follow "player100"->"player125" @0 {degree: 95}] |
+---------------------------------------------------------------------------+
| [:serve "player100"->"team204" @0 {end_year: 2016, start_year: 1997}] |
+---------------------------------------------------------------------------+
检索点ID
使用id()
函数检索点ID。
nebula> MATCH (v:player{name:"Tim Duncan"}) \
RETURN id(v);
+-------------+
| id(v) |
+-------------+
| "player100" |
+-------------+
检索Tag
使用labels()
函数检索点上的Tag列表。
nebula> MATCH (v:player{name:"Tim Duncan"}) \
RETURN labels(v);
+------------+
| labels(v) |
+------------+
| ["player"] |
+------------+
检索列表labels(v)
中的第N个元素,可以使用labels(v)[n-1]
。例如下面示例使用labels(v)[0]
检索第一个元素。
nebula> MATCH (v:player{name:"Tim Duncan"}) \
RETURN labels(v)[0];
+--------------+
| labels(v)[0] |
+--------------+
| "player" |
+--------------+
检索点或边的单个属性
使用RETURN {<vertex_name> | <edge_name>}.<property>
检索单个属性。
nebula> MATCH (v:player{name:"Tim Duncan"}) \
RETURN v.age;
+-------+
| v.age |
+-------+
| 42 |
+-------+
使用AS
设置属性的别名。
nebula> MATCH (v:player{name:"Tim Duncan"}) \
RETURN v.age AS Age;
+-----+
| Age |
+-----+
| 42 |
+-----+
检索点或边的所有属性
使用properties()
函数检索点或边的所有属性。
nebula> MATCH p=(v:player{name:"Tim Duncan"})-[]->(v2) \
RETURN properties(v2);
+------------------------------------+
| properties(v2) |
+------------------------------------+
| {"name":"Spurs"} |
+------------------------------------+
| {"name":"Tony Parker", "age":36} |
+------------------------------------+
| {"age":41, "name":"Manu Ginobili"} |
+------------------------------------+
检索Edge type
使用type()
函数检索匹配的Edge type。
nebula> MATCH p=(v:player{name:"Tim Duncan"})-[e]->() \
RETURN DISTINCT type(e);
+----------+
| type(e) |
+----------+
| "follow" |
+----------+
| "serve" |
+----------+
检索路径
使用RETURN <path_name>
检索匹配路径的所有信息。
nebula> MATCH p=(v:player{name:"Tim Duncan"})-[*3]->() \
RETURN p;
+-------------------------------------------------------------------------------------------------+
| p |
+-------------------------------------------------------------------------------------------------+
| <("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"})-[:serve@0 {end_year: 2019, start_year: 2015}]->("team204" :team{name: "Spurs"})> |
+-------------------------------------------------------------------------------------------------+
| <("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"})-[:serve@0 {end_year: 2015, start_year: 2006}]->("team203" :team{name: "Trail Blazers"})> |
+-------------------------------------------------------------------------------------------------+
| <("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"})> |
+-------------------------------------------------------------------------------------------------+
...
检索路径中的点
使用nodes()
函数检索路径中的所有点。
nebula> MATCH p=(v:player{name:"Tim Duncan"})-[]->(v2) \
RETURN nodes(p);
+---------------------------------------------------------------------------------------------------------------------+
| nodes(p) |
+---------------------------------------------------------------------------------------------------------------------+
| [("player100" :star{} :player{age: 42, name: "Tim Duncan"}), ("player204" :team{name: "Spurs"})] |
+---------------------------------------------------------------------------------------------------------------------+
| [("player100" :star{} :player{age: 42, name: "Tim Duncan"}), ("player101" :player{name: "Tony Parker", age: 36})] |
+---------------------------------------------------------------------------------------------------------------------+
| [("player100" :star{} :player{age: 42, name: "Tim Duncan"}), ("player125" :player{name: "Manu Ginobili", age: 41})] |
+---------------------------------------------------------------------------------------------------------------------+
检索路径中的边
使用relationships()
函数检索路径中的所有边。
nebula> MATCH p=(v:player{name:"Tim Duncan"})-[]->(v2) \
RETURN relationships(p);
+-----------------------------------------------------------------------------+
| relationships(p) |
+-----------------------------------------------------------------------------+
| [[:follow "player100"->"player101" @0 {degree: 95}]] |
+-----------------------------------------------------------------------------+
| [[:follow "player100"->"player125" @0 {degree: 95}]] |
+-----------------------------------------------------------------------------+
| [[:serve "player100"->"team204" @0 {end_year: 2016, start_year: 1997}]] |
+-----------------------------------------------------------------------------+
检索路径长度
使用length()
函数检索路径的长度。
nebula> MATCH p=(v:player{name:"Tim Duncan"})-[*..2]->(v2) \
RETURN p AS Paths, length(p) AS Length;
+----------------------------------------------------------------------+--------+
| Paths | Length |
+----------------------------------------------------------------------+--------+
| <("player100" :player{age: 42, name: "Tim Duncan"})-[:follow@0 {degree: 95}]->("player125" :player{age: 41, name: "Manu Ginobili"})-[:serve@0 {end_year: 2018, start_year: 2002}]->("team204" :team{name: "Spurs"})> | 2 |
+----------------------------------------------------------------------+--------+
| <("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"})> | 2 |
+----------------------------------------------------------------------+--------+
| <("player100" :player{age: 42, name: "Tim Duncan"})-[:follow@0 {degree: 95}]->("player101" :player{age: 36, name: "Tony Parker"})-[:serve@0 {end_year: 2019, start_year: 2018}]->("team215" :team{name: "Hornets"})> | 2 |
+----------------------------------------------------------------------+--------+
| <("player100" :player{age: 42, name: "Tim Duncan"})-[:follow@0 {degree: 95}]->("player101" :player{age: 36, name: "Tony Parker"})-[:serve@0 {end_year: 2018, start_year: 1999}]->("team204" :team{name: "Spurs"})> | 2 |
+----------------------------------------------------------------------+--------+
| <("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"})> | 2 |
+----------------------------------------------------------------------+--------+
| <("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"})> | 2 |
+----------------------------------------------------------------------+--------+
| <("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"})> | 2 |
+----------------------------------------------------------------------+--------+
| <("player100" :player{age: 42, name: "Tim Duncan"})-[:serve@0 {end_year: 2016, start_year: 1997}]->("team204" :team{name: "Spurs"})> | 1 |
+----------------------------------------------------------------------+--------+
| <("player100" :player{age: 42, name: "Tim Duncan"})-[:follow@0 {degree: 95}]->("player125" :player{age: 41, name: "Manu Ginobili"})> | 1 |
+----------------------------------------------------------------------+--------+
Performance
Nebula Graph 2.5.1 中 MATCH
语句对性能和资源占用进行了初步优化。
较简单的逻辑可以使用 GO
, LOOKUP
, |
和 FETCH
等来替代。
最后更新: August 25, 2021