抱歉,我试了下发现 像这样 看起来这么写,第二步并不是串行的从上一步的 LIMIT 边 c 作为起点 @Shylock-Hg 咱们有可能增加优化把这个变成 第二个 MATCH 起点从第一个 LIMIT 结果里往下走吗?
MATCH ()-[c:log]->()
WITH c LIMIT 1000
MATCH (v:device)-[c:log]-(b:device) WHERE v.device.ipAddress != b.device.ipAddress
RETURN v, c, b LIMIT 5
@zou79189747 你可以用 LOOKUP LIMIT去做
LOOKUP on log YIELD id(vertex) AS v | LIMIT 100 | \
GO FROM $-.v OVER log WHERE $^.device.ipAddress != $$.device.ipAddress YIELD $^ AS v, $$ AS b | LIMIT 5
(root@nebula) [basketballplayer]> explain LOOKUP on player YIELD id(vertex) AS v | LIMIT 100 | GO FROM $-.v OVER follow YIELD $^ AS v, $$ AS b | LIMIT 5
Execution succeeded (time spent 846/58085 us)
Execution Plan (optimize time 328 us)
-----+------------------+--------------+----------------+------------------------------------
| id | name | dependencies | profiling data | operator info |
-----+------------------+--------------+----------------+------------------------------------
| 22 | Project | 20 | | outputVar: { |
| | | | | "colNames": [ |
| | | | | "v", |
| | | | | "b" |
| | | | | ], |
| | | | | "type": "DATASET", |
| | | | | "name": "__DataCollect_14" |
| | | | | } |
| | | | | inputVar: __Limit_20 |
| | | | | columns: [ |
| | | | | "$^ AS v", |
| | | | | "$$ AS b" |
| | | | | ] |
-----+------------------+--------------+----------------+------------------------------------
| 20 | Limit | 11 | | outputVar: { |
| | | | | "colNames": [ |
| | | | | "$^", |
| | | | | "_vid", |
| | | | | "JOIN_DST_VID", |
| | | | | "$$", |
| | | | | "DST_VID", |
| | | | | "v" |
| | | | | ], |
| | | | | "type": "DATASET", |
| | | | | "name": "__Limit_20" |
| | | | | } |
| | | | | inputVar: __InnerJoin_11 |
| | | | | offset: 0 |
| | | | | count: 5 |
-----+------------------+--------------+----------------+------------------------------------
| 11 | InnerJoin | 10 | | outputVar: { |
| | | | | "colNames": [ |
| | | | | "$^", |
| | | | | "_vid", |
| | | | | "JOIN_DST_VID", |
| | | | | "$$", |
| | | | | "DST_VID", |
| | | | | "v" |
| | | | | ], |
| | | | | "type": "DATASET", |
| | | | | "name": "__InnerJoin_11" |
| | | | | } |
| | | | | inputVar: { |
| | | | | "rightVar": { |
| | | | | "__Limit_3": "0" |
| | | | | }, |
| | | | | "leftVar": { |
| | | | | "__LeftJoin_10": "0" |
| | | | | } |
| | | | | } |
| | | | | hashKeys: [ |
| | | | | "$__LeftJoin_10._vid" |
| | | | | ] |
| | | | | probeKeys: [ |
| | | | | "$-.v" |
| | | | | ] |
| | | | | kind: InnerJoin |
-----+------------------+--------------+----------------+------------------------------------
| 10 | LeftJoin | 9 | | outputVar: { |
| | | | | "colNames": [ |
| | | | | "$^", |
| | | | | "_vid", |
| | | | | "JOIN_DST_VID", |
| | | | | "$$", |
| | | | | "DST_VID" |
| | | | | ], |
| | | | | "type": "DATASET", |
| | | | | "name": "__LeftJoin_10" |
| | | | | } |
| | | | | inputVar: { |
| | | | | "rightVar": { |
| | | | | "__Project_9": "0" |
| | | | | }, |
| | | | | "leftVar": { |
| | | | | "__Project_7": "0" |
| | | | | } |
| | | | | } |
| | | | | hashKeys: [ |
| | | | | "COLUMN[-1]" |
| | | | | ] |
| | | | | probeKeys: [ |
| | | | | "COLUMN[-1]" |
| | | | | ] |
| | | | | kind: LeftJoin |
-----+------------------+--------------+----------------+------------------------------------
| 9 | Project | 8 | | outputVar: { |
| | | | | "colNames": [ |
| | | | | "$$", |
| | | | | "DST_VID" |
| | | | | ], |
| | | | | "type": "DATASET", |
| | | | | "name": "__Project_9" |
| | | | | } |
| | | | | inputVar: __GetVertices_8 |
| | | | | columns: [ |
| | | | | "$$ AS $$", |
| | | | | "COLUMN[0] AS DST_VID" |
| | | | | ] |
-----+------------------+--------------+----------------+------------------------------------
| 8 | GetVertices | 7 | | outputVar: { |
| | | | | "colNames": [], |
| | | | | "type": "DATASET", |
| | | | | "name": "__GetVertices_8" |
| | | | | } |
| | | | | inputVar: __Project_7 |
| | | | | space: 2 |
| | | | | dedup: true |
| | | | | limit: 9223372036854775807 |
| | | | | filter: |
| | | | | orderBy: [] |
| | | | | src: COLUMN[-1] |
| | | | | props: [ |
| | | | | { |
| | | | | "props": [ |
| | | | | "_tag", |
| | | | | "name" |
| | | | | ], |
| | | | | "tagId": 4 |
| | | | | }, |
| | | | | { |
| | | | | "props": [ |
| | | | | "_tag", |
| | | | | "age", |
| | | | | "name" |
| | | | | ], |
| | | | | "tagId": 3 |
| | | | | } |
| | | | | ] |
| | | | | exprs: |
-----+------------------+--------------+----------------+------------------------------------
| 7 | Project | 17 | | outputVar: { |
| | | | | "colNames": [ |
| | | | | "$^", |
| | | | | "_vid", |
| | | | | "JOIN_DST_VID" |
| | | | | ], |
| | | | | "type": "DATASET", |
| | | | | "name": "__Project_7" |
| | | | | } |
| | | | | inputVar: __GetNeighbors_6 |
| | | | | columns: [ |
| | | | | "$^ AS $^", |
| | | | | "COLUMN[0] AS _vid", |
| | | | | "*._dst AS JOIN_DST_VID" |
| | | | | ] |
-----+------------------+--------------+----------------+------------------------------------
| 17 | GetNeighbors | 19 | | outputVar: { |
| | | | | "colNames": [], |
| | | | | "type": "DATASET", |
| | | | | "name": "__GetNeighbors_6" |
| | | | | } |
| | | | | inputVar: __Limit_3 |
| | | | | space: 2 |
| | | | | dedup: true |
| | | | | limit: -1 |
| | | | | filter: |
| | | | | orderBy: [] |
| | | | | src: $-.v |
| | | | | edgeTypes: [] |
| | | | | edgeDirection: OUT_EDGE |
| | | | | vertexProps: [ |
| | | | | { |
| | | | | "props": [ |
| | | | | "_tag", |
| | | | | "name" |
| | | | | ], |
| | | | | "tagId": 4 |
| | | | | }, |
| | | | | { |
| | | | | "props": [ |
| | | | | "_tag", |
| | | | | "age", |
| | | | | "name" |
| | | | | ], |
| | | | | "tagId": 3 |
| | | | | } |
| | | | | ] |
| | | | | edgeProps: [ |
| | | | | { |
| | | | | "props": [ |
| | | | | "_dst" |
| | | | | ], |
| | | | | "type": "6" |
| | | | | } |
| | | | | ] |
| | | | | statProps: |
| | | | | exprs: |
| | | | | random: false |
-----+------------------+--------------+----------------+------------------------------------
| 19 | Project | 23 | | outputVar: { |
| | | | | "colNames": [ |
| | | | | "v" |
| | | | | ], |
| | | | | "type": "DATASET", |
| | | | | "name": "__Limit_3" |
| | | | | } |
| | | | | inputVar: __Limit_18 |
| | | | | columns: [ |
| | | | | "id(VERTEX) AS v" |
| | | | | ] |
-----+------------------+--------------+----------------+------------------------------------
| 23 | Limit | 24 | | outputVar: { |
| | | | | "colNames": [ |
| | | | | "_vid", |
| | | | | "player._tag", |
| | | | | "player.age", |
| | | | | "player.name" |
| | | | | ], |
| | | | | "type": "DATASET", |
| | | | | "name": "__Limit_18" |
| | | | | } |
| | | | | inputVar: __TagIndexFullScan_24 |
| | | | | offset: 0 |
| | | | | count: 100 |
-----+------------------+--------------+----------------+------------------------------------
| 24 | TagIndexFullScan | 0 | | outputVar: { | # 这里有 limit 下推,不用数据全扫描
| | | | | "colNames": [ |
| | | | | "_vid", |
| | | | | "player._tag", |
| | | | | "player.age", |
| | | | | "player.name" |
| | | | | ], |
| | | | | "type": "DATASET", |
| | | | | "name": "__TagIndexFullScan_24" |
| | | | | } |
| | | | | inputVar: |
| | | | | space: 2 |
| | | | | dedup: false |
| | | | | limit: 100 |
| | | | | filter: |
| | | | | orderBy: [] |
| | | | | schemaId: 3 |
| | | | | isEdge: false |
| | | | | returnCols: [ |
| | | | | "_vid", |
| | | | | "_tag", |
| | | | | "age", |
| | | | | "name" |
| | | | | ] |
| | | | | indexCtx: [ |
| | | | | { |
| | | | | "columnHints": [], |
| | | | | "filter": "", |
| | | | | "index_id": 7 |
| | | | | } |
| | | | | ] |
-----+------------------+--------------+----------------+------------------------------------
| 0 | Start | | | outputVar: { |
| | | | | "colNames": [], |
| | | | | "type": "DATASET", |
| | | | | "name": "__Start_0" |
| | | | | } |
-----+------------------+--------------+----------------+------------------------------------