From 5c57add031d624c9cccf51c1ede14999b6c89966 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Wed, 1 Dec 2021 17:29:50 +0800 Subject: [PATCH 01/64] loop property (#1284) * loop property * Update 2.graph-modeling.md --- docs-2.0/8.service-tuning/2.graph-modeling.md | 34 ++++++++++++++++++ docs-2.0/8.service-tuning/loop-property.png | Bin 0 -> 55913 bytes 2 files changed, 34 insertions(+) create mode 100644 docs-2.0/8.service-tuning/loop-property.png diff --git a/docs-2.0/8.service-tuning/2.graph-modeling.md b/docs-2.0/8.service-tuning/2.graph-modeling.md index d68ccf9063..e8c2030956 100644 --- a/docs-2.0/8.service-tuning/2.graph-modeling.md +++ b/docs-2.0/8.service-tuning/2.graph-modeling.md @@ -34,6 +34,40 @@ 例如,在一个业务模型中,人的属性是相对固定的,例如“年龄”,“性别”,“姓名”。而“通信好友”,“出入场所”,“交易账号”,“登录设备”等是相对容易改变的。前者适合建模为属性,后者适合建模为点或边。 +### 自环 + +Nebula Graph是强Schema类型系统,使用`ALTER TAG`的开销很大,而且也不支持List类型属性,当用户需要为点添加一些临时属性或者List类型的属性时,可以先创建包含所需属性的边类型,然后为点插入一条或多条指向自身的边。查询时只需要查询指向自己的边属性。如下图所示。 + +![loop property](loop-property.png) + +示例: + +```ngql +//创建边类型并插入自环属性。 +nebula> CREATE EDGE IF NOT EXISTS temp(tmp int); +nebula> INSERT EDGE temp(tmp) VALUES "player100"->"player100"@1:(1); +nebula> INSERT EDGE temp(tmp) VALUES "player100"->"player100"@2:(2); +nebula> INSERT EDGE temp(tmp) VALUES "player100"->"player100"@3:(3); + +//插入数据后,可以通过查询语句查询,例如: +nebula> GO FROM "player100" OVER temp YIELD properties(edge).tmp; ++----------------------+ +| properties(EDGE).tmp | ++----------------------+ +| 1 | +| 2 | +| 3 | ++----------------------+ + +//如果需要返回结果为List,可以通过函数实现,例如: +nebula> MATCH (v1:player)-[e:temp]->() return collect(e.tmp); ++----------------+ +| collect(e.tmp) | ++----------------+ +| [1, 2, 3] | ++----------------+ +``` + ### 广度优先大于深度优先 - Nebula Graph 基于图拓扑结构进行深度图遍历的性能较低,广度优先遍历以及获取属性的性能较好。例如,模型 a 包括姓名、年龄、眼睛颜色三种属性,建议创建一个 Tag`person`,然后为它添加姓名、年龄、眼睛颜色的属性。如果创建一个包含眼睛颜色的 Tag 和一个 Edge type`has`,然后创建一个边用来表示人拥有的眼睛颜色,这种建模方法会降低遍历性能。 diff --git a/docs-2.0/8.service-tuning/loop-property.png b/docs-2.0/8.service-tuning/loop-property.png new file mode 100644 index 0000000000000000000000000000000000000000..467b59f82a78629d4396bdf3872537477037b0fc GIT binary patch literal 55913 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

?S*2_p|IlPxH=<8&$_7|a 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 UaD}Go Date: Wed, 1 Dec 2021 18:32:37 +0800 Subject: [PATCH 02/64] Update 0.FAQ.md (#1280) * Update 0.FAQ.md * Update 0.FAQ.md --- docs-2.0/20.appendix/0.FAQ.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs-2.0/20.appendix/0.FAQ.md b/docs-2.0/20.appendix/0.FAQ.md index 9d67b34e0d..fccb8797b3 100644 --- a/docs-2.0/20.appendix/0.FAQ.md +++ b/docs-2.0/20.appendix/0.FAQ.md @@ -69,6 +69,10 @@ Nebula Graph {{ nebula.release }} 的数据模型中,异常情况下可能会 已知问题,通常需要重试 1-N 次 (N==partition 数量)。原因为 meta client 更新 leader 缓存需要 1-2 个心跳或者通过错误触发强制更新。 +### 如何处理错误信息 `SemanticError: Missing yield clause.` + +从 Nebula Graph 3.0 开始,查询语句`LOOKUP`、`GO`、`FETCH`必须用`YIELD`子句指定输出结果。详情请参见[YIELD](../3.ngql-guide/8.clauses-and-options/yield.md)。 + ### 返回消息中 `time spent` 的含义是什么? 将命令`SHOW SPACES`返回的消息作为示例: From 5a2eabc88411292b64fafc4cb4c60aa4187a2994 Mon Sep 17 00:00:00 2001 From: "henry.tang" <88644421+henry202108@users.noreply.github.com> Date: Fri, 3 Dec 2021 10:26:34 +0800 Subject: [PATCH 03/64] Update 2.deploy-es.md (#1287) --- .../6.deploy-text-based-index/2.deploy-es.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/2.deploy-es.md b/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/2.deploy-es.md index 594fbc40f0..569c637d32 100644 --- a/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/2.deploy-es.md +++ b/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/2.deploy-es.md @@ -12,7 +12,7 @@ Nebula Graph 的全文索引是基于 [Elasticsearch](https://en.wikipedia.org/w 当 Elasticsearch 集群启动时,请添加 Nebula Graph 全文索引的模板文件。关于索引模板的说明请参见 [Elasticsearch 官方文档](https://www.elastic.co/guide/en/elasticsearch/reference/current/index-templates.html)。 -以下面的模板为例: +以下面的模板为例(针对ES 7.0及以上版本): ```json { From 8f877c3175c061424a9398bfdf0453822c3a8f12 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Fri, 3 Dec 2021 15:41:41 +0800 Subject: [PATCH 04/64] Modify default session timeout (#1288) --- .../1.configurations/3.graph-config.md | 4 ++-- .../nebula-dashboard-ent/2.deploy-connect-dashboard-ent.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs-2.0/5.configurations-and-logs/1.configurations/3.graph-config.md b/docs-2.0/5.configurations-and-logs/1.configurations/3.graph-config.md index e62918eb61..0734a86fd2 100644 --- a/docs-2.0/5.configurations-and-logs/1.configurations/3.graph-config.md +++ b/docs-2.0/5.configurations-and-logs/1.configurations/3.graph-config.md @@ -63,8 +63,8 @@ Graph 服务提供了两份初始配置文件`nebula-graphd.conf.default`和`neb | `port` | `9669` | Graph 服务的 RPC 守护进程监听端口。 | |`reuse_port` |`false` | 是否启用 SO_REUSEPORT。 | |`listen_backlog` |`1024` | socket 监听的连接队列最大长度,调整本参数需要同时调整`net.core.somaxconn`。 | -|`client_idle_timeout_secs` |`0` | 空闲连接的超时时间。`0`表示永不超时。单位:秒。 | -|`session_idle_timeout_secs` |`0` | 空闲会话的超时时间。`0`表示永不超时。单位:秒。 | +|`client_idle_timeout_secs` |`28800` | 空闲连接的超时时间。默认 8 小时。`0`表示永不超时。单位:秒。 | +|`session_idle_timeout_secs` |`28800` | 空闲会话的超时时间。取值范围为 1~604800。默认 8 小时。`0`表示永不超时。单位:秒。 | |`num_accept_threads` |`1` | 接受传入连接的线程数。 | |`num_netio_threads` |`0` | 网络 IO 线程数。`0`表示 CPU 核数。 | |`num_worker_threads` |`0` | 执行用户查询的线程数。`0`表示 CPU 核数。 | diff --git a/docs-2.0/nebula-dashboard-ent/2.deploy-connect-dashboard-ent.md b/docs-2.0/nebula-dashboard-ent/2.deploy-connect-dashboard-ent.md index 16152546d9..673e02a7ea 100644 --- a/docs-2.0/nebula-dashboard-ent/2.deploy-connect-dashboard-ent.md +++ b/docs-2.0/nebula-dashboard-ent/2.deploy-connect-dashboard-ent.md @@ -34,7 +34,7 @@ !!! enterpriseonly - Dashboard 仅在企业版提供,点击[定价](https://nebula-graph.com.cn/pricing/) 查看更多。 + Dashboard 仅在企业版提供,点击[定价](https://nebula-graph.com.cn/pricing/)查看更多。 2. 使用`tar -xzvf`解压 tar 包。 From 2e9ce41bc2ffcf6b34a5a4e0c14d2bcdb3f0a10d Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Fri, 3 Dec 2021 15:42:43 +0800 Subject: [PATCH 05/64] Update 2.graph-modeling.md (#1290) --- docs-2.0/8.service-tuning/2.graph-modeling.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs-2.0/8.service-tuning/2.graph-modeling.md b/docs-2.0/8.service-tuning/2.graph-modeling.md index e8c2030956..dd22eacf0d 100644 --- a/docs-2.0/8.service-tuning/2.graph-modeling.md +++ b/docs-2.0/8.service-tuning/2.graph-modeling.md @@ -42,6 +42,8 @@ Nebula Graph是强Schema类型系统,使用`ALTER TAG`的开销很大,而且 示例: +如果要检索点的临时属性,请从自环边中获取。例如: + ```ngql //创建边类型并插入自环属性。 nebula> CREATE EDGE IF NOT EXISTS temp(tmp int); From e649bdc39218f1c26d89b4c01d063eeadfb6080f Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Fri, 3 Dec 2021 15:43:52 +0800 Subject: [PATCH 06/64] Update nebula-algorithm.md (#1291) * Update nebula-algorithm.md * Update nebula-algorithm.md --- docs-2.0/nebula-algorithm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-2.0/nebula-algorithm.md b/docs-2.0/nebula-algorithm.md index 4c5acf8246..415ab95355 100644 --- a/docs-2.0/nebula-algorithm.md +++ b/docs-2.0/nebula-algorithm.md @@ -96,7 +96,7 @@ Nebula Algorithm 实现图计算的流程如下: ``` -2. 传入参数调用算法(以 PageRank 为例)。更多算法请参见[测试用例](https://github.com/vesoft-inc/nebula-algorithm/tree/master/nebula-algorithm/src/test/scala/com/vesoft/nebula/algorithm/lib)。 +2. 传入参数调用算法(以 PageRank 为例)。更多调用示例请参见[示例](https://github.com/vesoft-inc/nebula-algorithm/tree/{{algorithm.branch}}/example/src/main/scala/com/vesoft/nebula/algorithm)。 !!! note From 3ead5ba5aa2b201a6dad3c9b56c6e598b1f9d3f2 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Fri, 3 Dec 2021 15:44:23 +0800 Subject: [PATCH 07/64] add ClusteringCoefficient (#1292) * add ClusteringCoefficient * Update nebula-algorithm.md --- docs-2.0/nebula-algorithm.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs-2.0/nebula-algorithm.md b/docs-2.0/nebula-algorithm.md index 415ab95355..b5b4bc0f39 100644 --- a/docs-2.0/nebula-algorithm.md +++ b/docs-2.0/nebula-algorithm.md @@ -16,7 +16,7 @@ ## 使用限制 -- 点 ID 的数据必须为整数,即点 ID 可以是 INT 类型,或者是 String 类型但数据本身为整数。 +- 直接提交算法包时,点 ID 的数据必须为整数,即点 ID 可以是 INT 类型,或者是 String 类型但数据本身为整数。 - 对于非整数的 String 类型数据,推荐使用调用算法接口的方式,可以使用 SparkSQL 的`dense_rank`函数进行编码,将 String 类型转换为 Long 类型。 @@ -39,6 +39,7 @@ Nebula Algorithm 支持的图计算算法如下。 | GraphTriangleCount | 全图三角形计数 |网络结构及紧密程度分析| | BetweennessCentrality | 介数中心性 |关键节点挖掘,节点影响力计算| | DegreeStatic | 度统计 |图结构分析| + | ClusteringCoefficient | 聚集系数 |推荐、电信诈骗分析| ## 实现方法 @@ -107,6 +108,8 @@ Nebula Algorithm 实现图计算的流程如下: val louvainResult = PageRankAlgo.apply(spark, data, prConfig, false) ``` + 如果用户的节点 ID 是 String 类型,可以参考 PageRank 的[示例](https://github.com/vesoft-inc/nebula-algorithm/blob/{{algorithm.branch}}/example/src/main/scala/com/vesoft/nebula/algorithm/PageRankExample.scala)。示例中进行了 ID 转换,将 String 类型编码为 Long 类型, 并在算法结果中将 Long 类型 ID 解码为原始的 String 类型。 + ### 直接提交算法包 !!! note From bd4118cc62585cf1d2b481279216d4b258b48dd3 Mon Sep 17 00:00:00 2001 From: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> Date: Fri, 3 Dec 2021 15:45:40 +0800 Subject: [PATCH 08/64] Update exchange and connectors 261 (#1286) * Update ex-ug-import-from-mysql.md (#1277) * update Exchange community 261 * Update 261 connectors * Update ex-ug-parameter.md --- .../parameter-reference/ex-ug-parameter.md | 2 ++ .../use-exchange/ex-ug-import-from-maxcompute.md | 3 +++ .../use-exchange/ex-ug-import-from-mysql.md | 8 ++++---- docs-2.0/nebula-flink-connector.md | 2 +- docs-2.0/nebula-spark-connector.md | 8 +++++++- 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/docs-2.0/nebula-exchange/parameter-reference/ex-ug-parameter.md b/docs-2.0/nebula-exchange/parameter-reference/ex-ug-parameter.md index 48b30248a7..024d649078 100644 --- a/docs-2.0/nebula-exchange/parameter-reference/ex-ug-parameter.md +++ b/docs-2.0/nebula-exchange/parameter-reference/ex-ug-parameter.md @@ -50,6 +50,7 @@ |`nebula.pswd`|string|-|是|用户名对应的密码。| |`nebula.space`|string|-|是|需要导入数据的的图空间名称。| |`nebula.ssl.enable.graph`|bool|`false`|是|开启 Exchange 与 Graph 服务之间的 [SSL 加密](https://en.wikipedia.org/wiki/Transport_Layer_Security)传输。当值为`true`时开启,下方的 SSL 相关参数生效。如果 Exchange 运行在多机集群上,在设置以下 SSL 相关路径时,需要在每台机器的相同路径都存储相应的文件。| +|`nebula.ssl.enable.meta`|bool|`false`|是|开启 Exchange 与 Meta 服务之间的 SSL 加密传输。当值为`true`时开启,下方的 SSL 相关参数生效。如果 Exchange 运行在多机集群上,在设置以下 SSL 相关路径时,需要在每台机器的相同路径都存储相应的文件。| |`nebula.ssl.sign`|string|`ca`|是|签名方式,可选值:`ca`(CA 签名)或`self`(自签名)。| |`nebula.ssl.ca.param.caCrtFilePath`|string|`"/path/caCrtFilePath"`|是|`nebula.ssl.sign`的值为`ca`时生效,用于指定 CA 证书的存储路径。| |`nebula.ssl.ca.param.crtFilePath`|string|`"/path/crtFilePath"`|是|`nebula.ssl.sign`的值为`ca`时生效,用于指定 CRT 证书的存储路径。| @@ -116,6 +117,7 @@ |`tags.accessKeyId`|string|-|是|MaxCompute 服务的 accessKeyId。| |`tags.accessKeySecret`|string|-|是|MaxCompute 服务的 accessKeySecret。| |`tags.partitionSpec`|string|-|否|MaxCompute 表的分区描述。| +|`tags.numPartitions`|int|`1`|否|MaxCompute 的 Spark 连接器在读取 MaxCompute 数据时使用的分区数。| |`tags.sentence`|string|-|否|查询数据源的语句。SQL 语句中的表名和上方 table 的值相同。| ### Neo4j 源特有参数 diff --git a/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-maxcompute.md b/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-maxcompute.md index ef449c4e84..c16c1cef83 100644 --- a/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-maxcompute.md +++ b/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-maxcompute.md @@ -162,6 +162,9 @@ # MaxCompute 表的分区描述,该配置可选。 partitionSpec:"dt='partition1'" + # MaxCompute 的 Spark 连接器在读取 MaxCompute 数据时使用的分区数。默认为1,该配置可选。 + numPartitions:100 + # 请确保 SQL 语句中的表名和上方 table 的值相同,该配置可选。 sentence:"select id, name, age, playerid from player where id < 10" diff --git a/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-mysql.md b/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-mysql.md index f9928be0ea..39f33bd0b6 100644 --- a/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-mysql.md +++ b/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-mysql.md @@ -191,7 +191,7 @@ mysql> desc serve; table:"player" user:"test" password:"123456" - sentence:"select playerid, age, name from basketball.player order by playerid;" + sentence:"select playerid, age, name from basketball order by playerid;" # 在 fields 里指定 player 表中的列名称,其对应的 value 会作为 Nebula Graph 中指定属性。 # fields 和 nebula.fields 里的配置必须一一对应。 @@ -224,7 +224,7 @@ mysql> desc serve; table:"team" user:"test" password:"123456" - sentence:"select teamid, name from basketball.team order by teamid;" + sentence:"select teamid, name from basketball order by teamid;" fields: [name] nebula.fields: [name] @@ -259,7 +259,7 @@ mysql> desc serve; table:"follow" user:"test" password:"123456" - sentence:"select src_player,dst_player,degree from basketball.follow order by src_player;" + sentence:"select src_player,dst_player,degree from basketball order by src_player;" # 在 fields 里指定 follow 表中的列名称,其对应的 value 会作为 Nebula Graph 中指定属性。 # fields 和 nebula.fields 里的配置必须一一对应。 @@ -298,7 +298,7 @@ mysql> desc serve; table:"serve" user:"test" password:"123456" - sentence:"select playerid,teamid,start_year,end_year from basketball.serve order by playerid;" + sentence:"select playerid,teamid,start_year,end_year from basketball order by playerid;" fields: [start_year,end_year] nebula.fields: [start_year,end_year] source: { diff --git a/docs-2.0/nebula-flink-connector.md b/docs-2.0/nebula-flink-connector.md index 718ba4dc0c..5784192c90 100644 --- a/docs-2.0/nebula-flink-connector.md +++ b/docs-2.0/nebula-flink-connector.md @@ -16,4 +16,4 @@ Nebula Flink Connector 适用于以下场景: ## 更新说明 -[Release](https://github.com/vesoft-inc/nebula-flink-connector/releases/tag/{{flinkconnector.tag}}) +[Release notes](https://github.com/vesoft-inc/nebula-flink-connector/releases/tag/{{flinkconnector.tag}}) diff --git a/docs-2.0/nebula-spark-connector.md b/docs-2.0/nebula-spark-connector.md index 8619cd7089..fa890c3835 100644 --- a/docs-2.0/nebula-spark-connector.md +++ b/docs-2.0/nebula-spark-connector.md @@ -40,9 +40,11 @@ Nebula Spark Connector {{sparkconnector.release}}版本特性如下: - 支持`insert`、`update`和`delete`三种写入模式。`insert`模式会插入(覆盖)数据,`update`模式仅会更新已存在的数据,`delete`模式只删除数据。 +- 支持与 Nebula Graph 之间的 SSL 加密连接。 + ## 更新说明 -[Release](https://github.com/vesoft-inc/nebula-spark-connector/releases/tag/{{sparkconnector.tag}}) +[Release notes](https://github.com/vesoft-inc/nebula-spark-connector/releases/tag/{{sparkconnector.tag}}) ## 获取 Nebula Spark Connector @@ -252,3 +254,7 @@ df.write.nebula(config, nebulaWriteVertexConfig).writeVertices() |`withPasswd` |否| Nebula Graph 用户名对应的密码。 | |`withBatch` |是| 一次写入的数据行数。默认值为`1000`. | |`withWriteMode`|否|写入模式。可选值为`insert`和`update`。默认为`insert`。| + +### 示例代码 + +详细的使用方式参见 [示例代码](https://github.com/vesoft-inc/nebula-spark-connector/tree/{{sparkconnector.branch}}/example/src/main/scala/com/vesoft/nebula/examples/connector)。 From 5513f3e9373eb61fc760c7cbfeb231d9032f2a48 Mon Sep 17 00:00:00 2001 From: "abby.huang" <78209557+abby-cyber@users.noreply.github.com> Date: Fri, 3 Dec 2021 17:47:29 +0800 Subject: [PATCH 09/64] New docker&k8s configs (#1293) * add sections for docker&k8s config files * Update 1.configurations.md * updates * Update 1.configurations.md * Update 1.configurations.md * updates * Update 1.configurations.md * Update 1.configurations.md --- ...deploy-nebula-graph-with-docker-compose.md | 3 -- .../1.configurations/1.configurations.md | 37 ++++++++++++++++--- .../8.1.custom-conf-parameter.md | 3 +- .../8.2.pv-reclaim.md | 4 +- .../8.3.balance-data-when-scaling-storage.md | 6 ++- 5 files changed, 41 insertions(+), 12 deletions(-) diff --git a/docs-2.0/4.deployment-and-installation/2.compile-and-install-nebula-graph/3.deploy-nebula-graph-with-docker-compose.md b/docs-2.0/4.deployment-and-installation/2.compile-and-install-nebula-graph/3.deploy-nebula-graph-with-docker-compose.md index f4d631a5e9..5cd48f9b9b 100644 --- a/docs-2.0/4.deployment-and-installation/2.compile-and-install-nebula-graph/3.deploy-nebula-graph-with-docker-compose.md +++ b/docs-2.0/4.deployment-and-installation/2.compile-and-install-nebula-graph/3.deploy-nebula-graph-with-docker-compose.md @@ -230,9 +230,6 @@ graphd: 2. 在目录`nebula-docker-compose`内执行命令`docker-compose pull`,更新 Graph 服务、Storage 服务和 Meta 服务的镜像。 - !!! note - 执行`docker-compose pull`命令更新服务镜像前,确保已停止 Nebula Graph。 - 3. 执行命令`docker-compose up -d`启动 Nebula Graph 服务。 4. 通过 Nebula Console 连接 Nebula Graph 后,分别执行命令`SHOW HOSTS GRAPH`、`SHOW HOSTS STORAGE`、`SHOW HOSTS META`查看各服务版本。 diff --git a/docs-2.0/5.configurations-and-logs/1.configurations/1.configurations.md b/docs-2.0/5.configurations-and-logs/1.configurations/1.configurations.md index 16e4102539..f4ed2bb190 100644 --- a/docs-2.0/5.configurations-and-logs/1.configurations/1.configurations.md +++ b/docs-2.0/5.configurations-and-logs/1.configurations/1.configurations.md @@ -1,6 +1,6 @@ # 配置管理 -Nebula Graph 基于 [gflags](https://gflags.github.io/gflags/) 库打造了系统配置,多数配置项都是其中的 flags。Nebula Graph 服务启动时,默认会从[配置文件](#_4) 中获取配置信息,文件中没有的配置项应用默认值。 +Nebula Graph 基于 [gflags](https://gflags.github.io/gflags/) 库打造了系统配置,多数配置项都是其中的 flags。Nebula Graph 服务启动时,默认会从[配置文件](#_4)中获取配置信息。对于文件中没有的配置项,系统使用默认值。 !!! enterpriseonly @@ -63,7 +63,9 @@ curl 127.0.0.1:19779/flags ## 配置文件简介 -Nebula Graph 为每个服务都提供了两份初始配置文件`.conf.default`和`.conf.production`,方便用户在不同场景中使用。文件的默认路径为`/usr/local/nebula/etc/`。 +### 源码、RPM/DEB、TAR 包集群的配置文件 + +Nebula Graph 为每个服务都提供了两份初始配置文件`.conf.default`和`.conf.production`,方便用户在不同场景中使用。使用源码和 RPM/DEB 安装集群的配置文件的默认路径为`/usr/local/nebula/etc/`;使用 TAR 包安装集群的配置文件路径为`//etc`TAR 包的安装路径。 初始配置文件中的配置值仅供参考,使用时可根据实际需求调整。如需使用初始配置文件,从上述两个文件选择其一,删除后缀`.default`或`.production`使其生效。 @@ -83,10 +85,35 @@ Nebula Graph 为每个服务都提供了两份初始配置文件`. !!! caution 不建议修改`local_config`的值为`false`。修改后 Nebula Graph 服务启动后会先尝试从 Meta 服务获取缓存的配置信息,可能导致集群配置不一致,造成未知风险。 +### Docker Compose 集群的配置文件 + +对于使用 Docker Compose 创建的集群,集群的配置文件的默认路径为`/nebula-docker-compose/docker-compose.yaml`。配置文件中的`command`下面的参数为各服务的启动参数。 + +### Nebula Operator 集群的配置文件 + +对于通过 Nebula Operator 使用 Kubectl 方式创建的集群,集群的配置文件的路径为用户创建集群 YAML 文件的路径。用户可通过配置文件中的`spec.{graphd|storaged|metad}.config`参数修改集群各个服务的相关配置。 + +!!! note + + 通过 Helm 部署的集群,暂不支持修改集群服务的相关配置。 + +关于 Nebula Graph 的配置相关的更多信息,参见 [Nebula Config](https://siwei.io/sketches/nebula-config-explained/)。 + ## 修改配置 -默认情况下,所有 Nebula Graph 服务从配置文件获取配置。用户可以按照以下步骤修改配置并使其生效: +默认情况下,所有 Nebula Graph 服务从配置文件获取配置。用户可以按照以下步骤修改配置并使其生效。 + +* 针对使用源码、RPM/DEB、TAR 包安装的集群: + + 1. 使用文本编辑器修改目标服务的配置文件并保存。 + + 2. 选择合适的时间重启**所有** Nebula Graph 服务使修改生效。 -1. 使用文本编辑器修改目标服务的配置文件并保存。 +* 针对使用 Docker Compose 安装的集群: + + 1. 在文件`/nebula-docker-compose/docker-compose.yaml`中,修改服务配置。 + 2. 在目录`nebula-docker-compose`内执行命令`docker-compose up -d`重启涉及配置变化的服务。 -2. 选择合适的时间重启**所有** Nebula Graph 服务使修改生效。 +* 针对使用 Kubectl 方式创建的集群: + + 具体操作,参见[自定义集群的配置参数](../../nebula-operator/8.custom-cluster-configurations/8.1.custom-conf-parameter.md)。 \ No newline at end of file diff --git a/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.1.custom-conf-parameter.md b/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.1.custom-conf-parameter.md index ab8cdcc037..bbaff0146c 100644 --- a/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.1.custom-conf-parameter.md +++ b/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.1.custom-conf-parameter.md @@ -18,7 +18,7 @@ Config map[string]string `json:"config,omitempty"` ## 操作步骤 -以下示例使用名为`nebula`的集群说明如何在 YAML 中为集群的 Graph 服务配置`config`: +以下示例使用名为`nebula`的集群、名为`nebula_cluster.yaml`的 YAML 配置文件,说明如何为集群的 Graph 服务配置`config`: 1. 执行以下命令进入`nebula`集群的编辑页面。 @@ -59,6 +59,7 @@ Config map[string]string `json:"config,omitempty"` 在自定义参数`enable_authorize`和`auth_type`后,Graph 服务对应的 ConfigMap(`nebula-graphd`)中的配置将被覆盖。 +3. 执行`kubectl apply -f nebula_cluster.yaml`使上述更新生效。 ## 更多信息 有关 Meta、Storage、Graph 服务的配置参数的详细介绍,参见[服务配置文件](../../5.configurations-and-logs/1.configurations/1.configurations.md)。 diff --git a/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.2.pv-reclaim.md b/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.2.pv-reclaim.md index 64780af087..18ca789f91 100644 --- a/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.2.pv-reclaim.md +++ b/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.2.pv-reclaim.md @@ -12,7 +12,7 @@ Nebula Operator 使用持久化卷 PV(Persistent Volume)和持久化卷声 ## 操作步骤 -以下示例使用名为`nebula`的集群说明如何设置`enablePVReclaim`: +以下示例使用名为`nebula`的集群、名为`nebula_cluster.yaml`的 YAML 配置文件,说明如何设置`enablePVReclaim`: 1. 执行以下命令进入`nebula`集群的编辑页面。 @@ -96,3 +96,5 @@ Nebula Operator 使用持久化卷 PV(Persistent Volume)和持久化卷声 version: {{nebula.branch}} ... ``` + + 3. 执行`kubectl apply -f nebula_cluster.yaml`使上述更新生效。 diff --git a/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.3.balance-data-when-scaling-storage.md b/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.3.balance-data-when-scaling-storage.md index 22e8f70b91..a432d970dc 100644 --- a/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.3.balance-data-when-scaling-storage.md +++ b/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.3.balance-data-when-scaling-storage.md @@ -12,7 +12,7 @@ Nebula Graph 的 Storage 服务的扩容分为两个阶段,第一个阶段等 ## 操作步骤 -以下示例使用名为`nebula`的集群说明如何设置`enableAutoBalance`: +以下示例使用名为`nebula`的集群、名为`nebula_cluster.yaml`的 YAML 配置文件,说明如何设置`enableAutoBalance`: 1. 执行以下命令进入`nebula`集群的编辑页面。 @@ -101,4 +101,6 @@ Nebula Graph 的 Storage 服务的扩容分为两个阶段,第一个阶段等 - 当设置`enableAutoBalance`的值为`false`时,表示扩容后不会均衡 Storage 数据。 - - 当不设置`enableAutoBalance`参数时,默认扩容 Storage 后系统不会自动均衡 Storage 数据。 \ No newline at end of file + - 当不设置`enableAutoBalance`参数时,默认扩容 Storage 后系统不会自动均衡 Storage 数据。 + +3. 执行`kubectl apply -f nebula_cluster.yaml`使上述更新生效。 \ No newline at end of file From 8e2add58c0a2d589e2999bd3b152447562c6a8b7 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Mon, 6 Dec 2021 09:56:36 +0800 Subject: [PATCH 10/64] Update nebula-algorithm.md (#1294) --- docs-2.0/nebula-algorithm.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs-2.0/nebula-algorithm.md b/docs-2.0/nebula-algorithm.md index b5b4bc0f39..98919848ba 100644 --- a/docs-2.0/nebula-algorithm.md +++ b/docs-2.0/nebula-algorithm.md @@ -97,7 +97,7 @@ Nebula Algorithm 实现图计算的流程如下: ``` -2. 传入参数调用算法(以 PageRank 为例)。更多调用示例请参见[示例](https://github.com/vesoft-inc/nebula-algorithm/tree/{{algorithm.branch}}/example/src/main/scala/com/vesoft/nebula/algorithm)。 +2. 传入参数调用算法(以 PageRank 为例)。更多调用示例请参见[示例](https://github.com/vesoft-inc/nebula-algorithm/tree/master/example/src/main/scala/com/vesoft/nebula/algorithm)。 !!! note @@ -108,7 +108,7 @@ Nebula Algorithm 实现图计算的流程如下: val louvainResult = PageRankAlgo.apply(spark, data, prConfig, false) ``` - 如果用户的节点 ID 是 String 类型,可以参考 PageRank 的[示例](https://github.com/vesoft-inc/nebula-algorithm/blob/{{algorithm.branch}}/example/src/main/scala/com/vesoft/nebula/algorithm/PageRankExample.scala)。示例中进行了 ID 转换,将 String 类型编码为 Long 类型, 并在算法结果中将 Long 类型 ID 解码为原始的 String 类型。 + 如果用户的节点 ID 是 String 类型,可以参考 PageRank 的[示例](https://github.com/vesoft-inc/nebula-algorithm/blob/master/example/src/main/scala/com/vesoft/nebula/algorithm/PageRankExample.scala)。示例中进行了 ID 转换,将 String 类型编码为 Long 类型, 并在算法结果中将 Long 类型 ID 解码为原始的 String 类型。 ### 直接提交算法包 From 17cf542d00e7e46009a4784772b877df26e4b1d9 Mon Sep 17 00:00:00 2001 From: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> Date: Mon, 6 Dec 2021 11:37:32 +0800 Subject: [PATCH 11/64] Change rate_limit to rocksdb_rate_limit (#1295) --- .../1.configurations/4.storage-config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md b/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md index c451f5fb73..c0011d4f55 100644 --- a/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md +++ b/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md @@ -136,7 +136,7 @@ rocksdb options 配置的格式为`{"":""}`,多个 enable_rocksdb_whole_key_filtering rocksdb_filtering_prefix_length num_compaction_threads - rate_limit + rocksdb_rate_limit ``` - `rocksdb_column_family_options` From ef85d9ac8c2771364daa7e6411708eb81cca1ed9 Mon Sep 17 00:00:00 2001 From: "abby.huang" <78209557+abby-cyber@users.noreply.github.com> Date: Mon, 6 Dec 2021 13:35:36 +0800 Subject: [PATCH 12/64] Update 8.1.custom-conf-parameter.md (#1296) --- .../8.1.custom-conf-parameter.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.1.custom-conf-parameter.md b/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.1.custom-conf-parameter.md index bbaff0146c..f4a8115f11 100644 --- a/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.1.custom-conf-parameter.md +++ b/docs-2.0/nebula-operator/8.custom-cluster-configurations/8.1.custom-conf-parameter.md @@ -57,9 +57,10 @@ Config map[string]string `json:"config,omitempty"` ... ``` +3. 执行`kubectl apply -f nebula_cluster.yaml`使上述更新生效。 + 在自定义参数`enable_authorize`和`auth_type`后,Graph 服务对应的 ConfigMap(`nebula-graphd`)中的配置将被覆盖。 -3. 执行`kubectl apply -f nebula_cluster.yaml`使上述更新生效。 ## 更多信息 有关 Meta、Storage、Graph 服务的配置参数的详细介绍,参见[服务配置文件](../../5.configurations-and-logs/1.configurations/1.configurations.md)。 From 5140f683ee53064bd148a2c9e1cbb34b0924a323 Mon Sep 17 00:00:00 2001 From: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> Date: Mon, 6 Dec 2021 14:01:17 +0800 Subject: [PATCH 13/64] Revert "Change rate_limit to rocksdb_rate_limit (#1295)" (#1298) This reverts commit 17cf542d00e7e46009a4784772b877df26e4b1d9. --- .../1.configurations/4.storage-config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md b/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md index c0011d4f55..c451f5fb73 100644 --- a/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md +++ b/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md @@ -136,7 +136,7 @@ rocksdb options 配置的格式为`{"":""}`,多个 enable_rocksdb_whole_key_filtering rocksdb_filtering_prefix_length num_compaction_threads - rocksdb_rate_limit + rate_limit ``` - `rocksdb_column_family_options` From 580d91a2a4512e36b6a335800369a5e6f99102db Mon Sep 17 00:00:00 2001 From: "abby.huang" <78209557+abby-cyber@users.noreply.github.com> Date: Mon, 6 Dec 2021 17:25:25 +0800 Subject: [PATCH 14/64] required step for importing cluster (#1303) --- .../3.create-import-dashboard/2.import-cluster.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/docs-2.0/nebula-dashboard-ent/3.create-import-dashboard/2.import-cluster.md b/docs-2.0/nebula-dashboard-ent/3.create-import-dashboard/2.import-cluster.md index 85f29dd27f..597add5f5f 100644 --- a/docs-2.0/nebula-dashboard-ent/3.create-import-dashboard/2.import-cluster.md +++ b/docs-2.0/nebula-dashboard-ent/3.create-import-dashboard/2.import-cluster.md @@ -9,8 +9,12 @@ - 在同一集群下,服务需要统一版本。不支持在同一集群中导入不同版本的 Nebula Graph 实例。 - Nebula Graph 的安装路径需要为默认安装路径`/usr/local`。 -1. 在集群管理页面,点击 **导入集群** 标签。 -2. 在导入集群页面,输入连接 Nebula Graph 的信息: +1. 在各个服务的配置文件中,将`_server_addrs`和`local_ip`中的IP地址改为本机的IP地址,然后启动服务。 + + 具体步骤,参见[配置管理](../../5.configurations-and-logs/1.configurations/1.configurations.md)和[管理服务](../../4.deployment-and-installation/manage-service.md)。 + +2. 在集群管理页面,点击 **导入集群** 标签。 +3. 在导入集群页面,输入连接 Nebula Graph 的信息: - Graphd Host:<其中一个 Graphd 进程的虚机 IP>:<端口号>。本示例设置为 `192.168.8.157:9669`。 - 用户名:连接 Nebula Graph 的账号,本示例设置为`vesoft`。 - 密码:连接 Nebula Graph 的密码,本示例设置为`nebula`。 @@ -26,9 +30,12 @@ - 输入集群的名称,最大可输入 15 个字符,本示例设置为`create_1027`。 - 对节点进行 **授权**,授权需输入每个节点的 SSH 用户名及密码。 - **批量授权**需要上传 CSV 文件。请根据下载的 CSV 文件,编辑每个节点授权信息,尽量确保节点信息正确,否则容易造成上传失败。 - ![批量授权](../figs/ds-026.png) + + ![批量授权](../figs/ds-026.png) + - 页面中节点状态变为 **已授权**,则该节点授权成功。 - ![授权](../figs/ds-027.png) + + ![授权](../figs/ds-027.png) 4. 确保所有节点都授权成功,点击 **导入集群**。 From 2d12989d74d8bf4effb79ec5924f105549050b58 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Wed, 8 Dec 2021 10:54:21 +0800 Subject: [PATCH 15/64] add yield clause for all ngql (#1299) * add yield clause for all ngql * Update 11.reduce.md * Update 4.schema.md --- docs-2.0/2.quick-start/4.nebula-graph-crud.md | 78 ++++++----- .../10.tag-statements/6.delete-tag.md | 19 +-- .../improve-query-by-tag-index.md | 8 +- .../12.vertex-statements/1.insert-vertex.md | 48 +++---- .../12.vertex-statements/2.update-vertex.md | 12 +- .../12.vertex-statements/3.upsert-vertex.md | 37 ++--- .../13.edge-statements/1.insert-edge.md | 8 +- .../13.edge-statements/3.upsert-edge.md | 4 + .../1.search-with-text-based-index.md | 42 +++--- .../16.subgraph-and-path/1.get-subgraph.md | 4 +- .../16.subgraph-and-path/2.find-path.md | 16 +-- docs-2.0/3.ngql-guide/3.data-types/5.null.md | 12 +- docs-2.0/3.ngql-guide/5.operators/4.pipe.md | 4 +- docs-2.0/3.ngql-guide/5.operators/6.set.md | 26 ++-- .../6.functions-and-expressions/11.reduce.md | 2 +- .../6.functions-and-expressions/4.schema.md | 14 +- .../7.general-query-statements/3.go.md | 29 ++-- .../7.general-query-statements/4.fetch.md | 130 +++++++++--------- .../7.general-query-statements/5.lookup.md | 110 +++++++-------- .../8.clauses-and-options/limit.md | 23 ++-- .../8.clauses-and-options/order-by.md | 16 +-- .../8.clauses-and-options/where.md | 34 ++--- .../8.clauses-and-options/yield.md | 22 +-- .../use-console/st-ug-visualize-subgraph.md | 2 +- .../reuse/source_connect-to-nebula-graph.md | 8 +- 25 files changed, 363 insertions(+), 345 deletions(-) diff --git a/docs-2.0/2.quick-start/4.nebula-graph-crud.md b/docs-2.0/2.quick-start/4.nebula-graph-crud.md index c51e78c9cb..23b0662840 100644 --- a/docs-2.0/2.quick-start/4.nebula-graph-crud.md +++ b/docs-2.0/2.quick-start/4.nebula-graph-crud.md @@ -248,7 +248,7 @@ nebula> CREATE EDGE serve(start_year int, end_year int); GO [[ TO] STEPS ] FROM OVER [{REVERSELY | BIDIRECT}] [ WHERE  ] - [YIELD [DISTINCT] ] + YIELD [DISTINCT] [{SAMPLE | LIMIT }] [| GROUP BY {col_name | expr | position} YIELD ] [| ORDER BY [{ASC | DESC}]] @@ -262,14 +262,14 @@ nebula> CREATE EDGE serve(start_year int, end_year int); ```ngql FETCH PROP ON {[, tag_name ...] | *} [, vid ...] - [YIELD [AS ]]; + YIELD [AS ]; ``` - 查询边属性 ```ngql FETCH PROP ON -> [@] [, -> ...] - [YIELD ]; + YIELD ; ``` - `LOOKUP` @@ -277,7 +277,7 @@ nebula> CREATE EDGE serve(start_year int, end_year int); ```ngql LOOKUP ON { | } [WHERE [AND ...]] - [YIELD [AS ]]; + YIELD [AS ]; ``` - `MATCH` @@ -291,12 +291,13 @@ nebula> CREATE EDGE serve(start_year int, end_year int); - 从 VID 为`player101`的球员开始,沿着边`follow`找到连接的球员。 ```ngql - nebula> GO FROM "player101" OVER follow; + nebula> GO FROM "player101" OVER follow YIELD id($$); +-------------+ - | follow._dst | + | id($$) | +-------------+ | "player100" | | "player102" | + | "player125" | +-------------+ ``` @@ -305,11 +306,12 @@ nebula> CREATE EDGE serve(start_year int, end_year int); ```ngql nebula> GO FROM "player101" OVER follow WHERE properties($$).age >= 35 \ YIELD properties($$).name AS Teammate, properties($$).age AS Age; - +--------------+-----+ - | Teammate | Age | - +--------------+-----+ - | "Tim Duncan" | 42 | - +--------------+-----+ + +-----------------+-----+ + | Teammate | Age | + +-----------------+-----+ + | "Tim Duncan" | 42 | + | "Manu Ginobili" | 41 | + +-----------------+-----+ ``` |子句/符号|说明| @@ -329,7 +331,10 @@ nebula> CREATE EDGE serve(start_year int, end_year int); +-----------------+---------------------+ | Team | Player | +-----------------+---------------------+ + | "Spurs" | "Tim Duncan" | | "Trail Blazers" | "LaMarcus Aldridge" | + | "Spurs" | "LaMarcus Aldridge" | + | "Spurs" | "Manu Ginobili" | +-----------------+---------------------+ ``` @@ -352,7 +357,10 @@ nebula> CREATE EDGE serve(start_year int, end_year int); +-----------------+---------------------+ | Team | Player | +-----------------+---------------------+ + | "Spurs" | "Tim Duncan" | | "Trail Blazers" | "LaMarcus Aldridge" | + | "Spurs" | "LaMarcus Aldridge" | + | "Spurs" | "Manu Ginobili" | +-----------------+---------------------+ ``` @@ -361,12 +369,12 @@ nebula> CREATE EDGE serve(start_year int, end_year int); 查询 VID 为`player100`的球员的属性。 ```ngql -nebula> FETCH PROP ON player "player100"; -+----------------------------------------------------+ -| vertices_ | -+----------------------------------------------------+ -| ("player100" :player{age: 42, name: "Tim Duncan"}) | -+----------------------------------------------------+ +nebula> FETCH PROP ON player "player100" YIELD properties(vertex); ++-------------------------------+ +| properties(VERTEX) | ++-------------------------------+ +| {age: 42, name: "Tim Duncan"} | ++-------------------------------+ ``` !!! Note @@ -413,12 +421,12 @@ nebula> FETCH PROP ON player "player100"; ```ngql nebula> UPDATE VERTEX "player100" SET player.name = "Tim"; - nebula> FETCH PROP ON player "player100"; - +---------------------------------------------+ - | vertices_ | - +---------------------------------------------+ - | ("player100" :player{age: 42, name: "Tim"}) | - +---------------------------------------------+ + nebula> FETCH PROP ON player "player100" YIELD properties(vertex); + +------------------------+ + | properties(VERTEX) | + +------------------------+ + | {age: 42, name: "Tim"} | + +------------------------+ ``` - 用`UPDATE`修改某条边的`degree`属性,然后用`FETCH`检查结果。 @@ -426,12 +434,12 @@ nebula> FETCH PROP ON player "player100"; ```ngql nebula> UPDATE EDGE "player101" -> "player100" OF follow SET degree = 96; - nebula> FETCH PROP ON follow "player101" -> "player100"; - +----------------------------------------------------+ - | edges_ | - +----------------------------------------------------+ - | [:follow "player101"->"player100" @0 {degree: 96}] | - +----------------------------------------------------+ + nebula> FETCH PROP ON follow "player101" -> "player100" YIELD properties(edge); + +------------------+ + | properties(EDGE) | + +------------------+ + | {degree: 96} | + +------------------+ ``` - 用`INSERT`插入一个 VID 为`player111`的点,然后用`UPSERT`更新它。 @@ -517,7 +525,7 @@ nebula> FETCH PROP ON player "player100"; ```nGQL // 为 name 属性创建索引 player_index_1。 -nebula> CREATE TAG INDEX player_index_1 ON player(name(20)); +nebula> CREATE TAG INDEX IF NOT EXISTS player_index_1 ON player(name(20)); // 重建索引确保能对已存在数据生效。 nebula> REBUILD TAG INDEX player_index_1 @@ -530,11 +538,11 @@ nebula> REBUILD TAG INDEX player_index_1 // 使用 LOOKUP 语句检索点的属性。 nebula> LOOKUP ON player WHERE player.name == "Tony Parker" \ YIELD properties(vertex).name AS name, properties(vertex).age AS age; -+-------------+---------------+-----+ -| VertexID | name | age | -+-------------+---------------+-----+ -| "player101" | "Tony Parker" | 36 | -+-------------+---------------+-----+ ++---------------+-----+ +| name | age | ++---------------+-----+ +| "Tony Parker" | 36 | ++---------------+-----+ // 使用 MATCH 语句检索点的属性。 nebula> MATCH (v:player{name:"Tony Parker"}) RETURN v; diff --git a/docs-2.0/3.ngql-guide/10.tag-statements/6.delete-tag.md b/docs-2.0/3.ngql-guide/10.tag-statements/6.delete-tag.md index 546ab020a2..e4eaef7a96 100644 --- a/docs-2.0/3.ngql-guide/10.tag-statements/6.delete-tag.md +++ b/docs-2.0/3.ngql-guide/10.tag-statements/6.delete-tag.md @@ -28,26 +28,27 @@ DELETE TAG FROM ; nebula> CREATE TAG IF NOT EXISTS test1(p1 string, p2 int); nebula> CREATE TAG IF NOT EXISTS test2(p3 string, p4 int); nebula> INSERT VERTEX test1(p1, p2),test2(p3, p4) VALUES "test":("123", 1, "456", 2); -nebula> FETCH PROP ON * "test"; +nebula> FETCH PROP ON * "test" YIELD vertex AS v; +------------------------------------------------------------+ -| vertices_ | +| v | +------------------------------------------------------------+ -| ("test" :test2{p3: "456", p4: 2} :test1{p1: "123", p2: 1}) | +| ("test" :test1{p1: "123", p2: 1} :test2{p3: "456", p4: 2}) | +------------------------------------------------------------+ nebula> DELETE TAG test1 FROM "test"; -nebula> FETCH PROP ON * "test"; +nebula> FETCH PROP ON * "test" YIELD vertex AS v; +-----------------------------------+ -| vertices_ | +| v | +-----------------------------------+ | ("test" :test2{p3: "456", p4: 2}) | +-----------------------------------+ nebula> DELETE TAG * FROM "test"; -nebula> FETCH PROP ON * "test"; -+-----------+ -| vertices_ | -+-----------+ +nebula> FETCH PROP ON * "test" YIELD vertex AS v; ++---+ +| v | ++---+ ++---+ ``` !!! Compatibility diff --git a/docs-2.0/3.ngql-guide/10.tag-statements/improve-query-by-tag-index.md b/docs-2.0/3.ngql-guide/10.tag-statements/improve-query-by-tag-index.md index 9ad2c1c1fd..2db5884460 100644 --- a/docs-2.0/3.ngql-guide/10.tag-statements/improve-query-by-tag-index.md +++ b/docs-2.0/3.ngql-guide/10.tag-statements/improve-query-by-tag-index.md @@ -29,9 +29,9 @@ nebula> MATCH (v:shareholder) RETURN v; | ("player100" :player{age: 42, name: "Tim Duncan"} :shareholder{}) | | ("player101" :player{age: 36, name: "Tony Parker"} :shareholder{}) | +---------------------------------------------------------------------+ -nebula> LOOKUP ON shareholder; +nebula> LOOKUP ON shareholder YIELD id(vertex); +-------------+ -| VertexID | +| id(VERTEX) | +-------------+ | "player100" | | "player101" | @@ -39,9 +39,9 @@ nebula> LOOKUP ON shareholder; //如果 player100 不再是股东 nebula> DELETE TAG shareholder FROM "player100"; -nebula> LOOKUP ON shareholder; +nebula> LOOKUP ON shareholder YIELD id(vertex); +-------------+ -| VertexID | +| id(VERTEX) | +-------------+ | "player101" | +-------------+ diff --git a/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md b/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md index b6ad732c32..3e483ef418 100644 --- a/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md +++ b/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md @@ -78,12 +78,12 @@ nebula> INSERT VERTEX t3 (p1), t4(p2) VALUES "21": (321, "hello"); nebula> INSERT VERTEX t2 (name, age) VALUES "11":("n2", 13); nebula> INSERT VERTEX t2 (name, age) VALUES "11":("n3", 14); nebula> INSERT VERTEX t2 (name, age) VALUES "11":("n4", 15); -nebula> FETCH PROP ON t2 "11"; -+---------------------------------+ -| vertices_ | -+---------------------------------+ -| ("11" :t2{age: 15, name: "n4"}) | -+---------------------------------+ +nebula> FETCH PROP ON t2 "11" YIELD properties(vertex); ++-----------------------+ +| properties(VERTEX) | ++-----------------------+ +| {age: 15, name: "n4"} | ++-----------------------+ ``` ```ngql @@ -96,21 +96,21 @@ nebula> INSERT VERTEX t5(p1, p2, p3) VALUES "002":(NULL, 4, 5); # 属性 p3 为默认值 NULL。 nebula> INSERT VERTEX t5(p1, p2) VALUES "003":("cd", 5); -nebula> FETCH PROP ON t5 "003"; -+--------------------------------------------+ -| vertices_ | -+--------------------------------------------+ -| ("003" :t5{p1: "cd", p2: 5, p3: __NULL__}) | -+--------------------------------------------+ +nebula> FETCH PROP ON t5 "003" YIELD properties(vertex); ++---------------------------------+ +| properties(VERTEX) | ++---------------------------------+ +| {p1: "cd", p2: 5, p3: __NULL__} | ++---------------------------------+ # 属性 p1 最大长度为 5,因此会被截断。 nebula> INSERT VERTEX t5(p1, p2) VALUES "004":("shalalalala", 4); -nebula> FETCH PROP on t5 "004"; -+-----------------------------------------------+ -| vertices_ | -+-----------------------------------------------+ -| ("004" :t5{p1: "shala", p2: 4, p3: __NULL__}) | -+-----------------------------------------------+ +nebula> FETCH PROP on t5 "004" YIELD properties(vertex); ++------------------------------------+ +| properties(VERTEX) | ++------------------------------------+ +| {p1: "shala", p2: 4, p3: __NULL__} | ++------------------------------------+ ``` 使用`IF NOT EXISTS`插入已存在的点时,不会进行修改。 @@ -120,10 +120,10 @@ nebula> FETCH PROP on t5 "004"; nebula> INSERT VERTEX t2 (name, age) VALUES "1":("n2", 13); # 使用 IF NOT EXISTS 修改点 1,因为点 1 已存在,不会进行修改。 nebula> INSERT VERTEX IF NOT EXISTS t2 (name, age) VALUES "1":("n3", 14); -nebula> FETCH PROP ON t2 "1"; -+--------------------------------+ -| vertices_ | -+--------------------------------+ -| ("1" :t2{age: 13, name: "n2"}) | -+--------------------------------+ +nebula> FETCH PROP ON t2 "1" YIELD properties(vertex); ++-----------------------+ +| properties(VERTEX) | ++-----------------------+ +| {age: 13, name: "n2"} | ++-----------------------+ ``` diff --git a/docs-2.0/3.ngql-guide/12.vertex-statements/2.update-vertex.md b/docs-2.0/3.ngql-guide/12.vertex-statements/2.update-vertex.md index a5ed3c1447..2a38b292df 100644 --- a/docs-2.0/3.ngql-guide/12.vertex-statements/2.update-vertex.md +++ b/docs-2.0/3.ngql-guide/12.vertex-statements/2.update-vertex.md @@ -29,12 +29,12 @@ SET ```ngql // 查看点”player101“的属性。 -nebula> FETCH PROP ON player "player101"; -+-----------------------------------------------------+ -| vertices_ | -+-----------------------------------------------------+ -| ("player101" :player{age: 36, name: "Tony Parker"}) | -+-----------------------------------------------------+ +nebula> FETCH PROP ON player "player101" YIELD properties(vertex); ++--------------------------------+ +| properties(VERTEX) | ++--------------------------------+ +| {age: 36, name: "Tony Parker"} | ++--------------------------------+ // 修改属性 age 的值,并返回 name 和新的 age。 nebula> UPDATE VERTEX ON player "player101" \ diff --git a/docs-2.0/3.ngql-guide/12.vertex-statements/3.upsert-vertex.md b/docs-2.0/3.ngql-guide/12.vertex-statements/3.upsert-vertex.md index 05951c2e86..4873fdbaf5 100644 --- a/docs-2.0/3.ngql-guide/12.vertex-statements/3.upsert-vertex.md +++ b/docs-2.0/3.ngql-guide/12.vertex-statements/3.upsert-vertex.md @@ -56,10 +56,11 @@ SET ```ngql // 查看三个点是否存在,结果 “Empty set” 表示顶点不存在。 -nebula> FETCH PROP ON * "player666", "player667", "player668"; -+-----------+ -| vertices_ | -+-----------+ +nebula> FETCH PROP ON * "player666", "player667", "player668" YIELD properties(vertex); ++--------------------+ +| properties(VERTEX) | ++--------------------+ ++--------------------+ Empty set nebula> UPSERT VERTEX ON player "player666" \ @@ -123,12 +124,12 @@ nebula> UPSERT VERTEX ON player_with_default "player101" \ 如果点存在,且满足`WHEN`子句的条件,就会修改点的属性值。 ```ngql -nebula> FETCH PROP ON player "player101"; -+-----------------------------------------------------+ -| vertices_ | -+-----------------------------------------------------+ -| ("player101" :player{age: 42, name: "Tony Parker"}) | -+-----------------------------------------------------+ +nebula> FETCH PROP ON player "player101" YIELD properties(vertex); ++--------------------------------+ +| properties(VERTEX) | ++--------------------------------+ +| {age: 36, name: "Tony Parker"} | ++--------------------------------+ nebula> UPSERT VERTEX ON player "player101" \ SET age = age + 2 \ @@ -137,19 +138,19 @@ nebula> UPSERT VERTEX ON player "player101" \ +---------------+-----+ | Name | Age | +---------------+-----+ -| "Tony Parker" | 44 | +| "Tony Parker" | 38 | +---------------+-----+ ``` 如果点存在,但是不满足`WHEN`子句的条件,修改不会生效。 ```ngql -nebula> FETCH PROP ON player "player101"; -+-----------------------------------------------------+ -| vertices_ | -+-----------------------------------------------------+ -| ("player101" :player{age: 44, name: "Tony Parker"}) | -+-----------------------------------------------------+ +nebula> FETCH PROP ON player "player101" YIELD properties(vertex); ++--------------------------------+ +| properties(VERTEX) | ++--------------------------------+ +| {age: 38, name: "Tony Parker"} | ++--------------------------------+ nebula> UPSERT VERTEX ON player "player101" \ SET age = age + 2 \ @@ -158,6 +159,6 @@ nebula> UPSERT VERTEX ON player "player101" \ +---------------+-----+ | Name | Age | +---------------+-----+ -| "Tony Parker" | 44 | +| "Tony Parker" | 38 | +---------------+-----+ ``` \ No newline at end of file diff --git a/docs-2.0/3.ngql-guide/13.edge-statements/1.insert-edge.md b/docs-2.0/3.ngql-guide/13.edge-statements/1.insert-edge.md index ea99dbff11..6d1cb86a1c 100644 --- a/docs-2.0/3.ngql-guide/13.edge-statements/1.insert-edge.md +++ b/docs-2.0/3.ngql-guide/13.edge-statements/1.insert-edge.md @@ -71,9 +71,9 @@ nebula> INSERT EDGE e2 (name, age) VALUES "11"->"13":("n1", "a13"); nebula> INSERT EDGE e2 (name, age) VALUES "11"->"13":("n1", 12); nebula> INSERT EDGE e2 (name, age) VALUES "11"->"13":("n1", 13); nebula> INSERT EDGE e2 (name, age) VALUES "11"->"13":("n1", 14); -nebula> FETCH PROP ON e2 "11"->"13"; +nebula> FETCH PROP ON e2 "11"->"13" YIELD edge AS e; +-------------------------------------------+ -| edges_ | +| e | +-------------------------------------------+ | [:e2 "11"->"13" @0 {age: 14, name: "n1"}] | +-------------------------------------------+ @@ -86,9 +86,9 @@ nebula> FETCH PROP ON e2 "11"->"13"; nebula> INSERT EDGE e2 (name, age) VALUES "14"->"15"@1:("n1", 12); # 使用 IF NOT EXISTS 修改边,因为边已存在,不会进行修改。 nebula> INSERT EDGE IF NOT EXISTS e2 (name, age) VALUES "14"->"15"@1:("n2", 13); -nebula> FETCH PROP ON e2 "14"->"15"@1; +nebula> FETCH PROP ON e2 "14"->"15"@1 YIELD edge AS e; +-------------------------------------------+ -| edges_ | +| e | +-------------------------------------------+ | [:e2 "14"->"15" @1 {age: 12, name: "n1"}] | +-------------------------------------------+ diff --git a/docs-2.0/3.ngql-guide/13.edge-statements/3.upsert-edge.md b/docs-2.0/3.ngql-guide/13.edge-statements/3.upsert-edge.md index e3ae15a383..0a4e85d7bd 100644 --- a/docs-2.0/3.ngql-guide/13.edge-statements/3.upsert-edge.md +++ b/docs-2.0/3.ngql-guide/13.edge-statements/3.upsert-edge.md @@ -58,6 +58,10 @@ SET nebula> GO FROM "player666", "player667", "player668" \ OVER serve \ YIELD properties(edge).start_year, properties(edge).end_year; ++-----------------------------+---------------------------+ +| properties(EDGE).start_year | properties(EDGE).end_year | ++-----------------------------+---------------------------+ ++-----------------------------+---------------------------+ Empty set nebula> UPSERT EDGE on serve \ diff --git a/docs-2.0/3.ngql-guide/15.full-text-index-statements/1.search-with-text-based-index.md b/docs-2.0/3.ngql-guide/15.full-text-index-statements/1.search-with-text-based-index.md index 0ffb449f8b..9f68ce88cc 100644 --- a/docs-2.0/3.ngql-guide/15.full-text-index-statements/1.search-with-text-based-index.md +++ b/docs-2.0/3.ngql-guide/15.full-text-index-statements/1.search-with-text-based-index.md @@ -123,9 +123,9 @@ nebula> INSERT VERTEX player(name, age) VALUES \ "Blake Griffin": ("Blake Griffin", 30); //测试查询 -nebula> LOOKUP ON player WHERE PREFIX(player.name, "B"); +nebula> LOOKUP ON player WHERE PREFIX(player.name, "B") YIELD id(vertex); +-----------------+ -| _vid | +| id(VERTEX) | +-----------------+ | "Boris Diaw" | | "Ben Simmons" | @@ -133,13 +133,13 @@ nebula> LOOKUP ON player WHERE PREFIX(player.name, "B"); +-----------------+ nebula> LOOKUP ON player WHERE WILDCARD(player.name, "*ri*") YIELD player.name, player.age; -+-----------------+-----------------+-----+ -| _vid | name | age | -+-----------------+-----------------+-----+ -| "Chris Paul" | "Chris Paul" | 33 | -| "Boris Diaw" | "Boris Diaw" | 36 | -| "Blake Griffin" | "Blake Griffin" | 30 | -+-----------------+-----------------+-----+ ++-----------------+-----+ +| name | age | ++-----------------+-----+ +| "Chris Paul" | 33 | +| "Boris Diaw" | 36 | +| "Blake Griffin" | 30 | ++-----------------+-----+ nebula> LOOKUP ON player WHERE WILDCARD(player.name, "*ri*") | YIELD count(*); +----------+ @@ -149,15 +149,15 @@ nebula> LOOKUP ON player WHERE WILDCARD(player.name, "*ri*") | YIELD count(*); +----------+ nebula> LOOKUP ON player WHERE REGEXP(player.name, "R.*") YIELD player.name, player.age; -+---------------------+---------------------+-----+ -| _vid | name | age | -+---------------------+---------------------+-----+ -| "Russell Westbrook" | "Russell Westbrook" | 30 | -+---------------------+---------------------+-----+ ++---------------------+-----+ +| name | age | ++---------------------+-----+ +| "Russell Westbrook" | 30 | ++---------------------+-----+ -nebula> LOOKUP ON player WHERE REGEXP(player.name, ".*"); +nebula> LOOKUP ON player WHERE REGEXP(player.name, ".*") YIELD id(vertex); +---------------------+ -| _vid | +| id(VERTEX) | +---------------------+ | "Danny Green" | | "David West" | @@ -166,11 +166,11 @@ nebula> LOOKUP ON player WHERE REGEXP(player.name, ".*"); ... nebula> LOOKUP ON player WHERE FUZZY(player.name, "Tim Dunncan", AUTO, OR) YIELD player.name; -+--------------+--------------+ -| _vid | name | -+--------------+--------------+ -| "Tim Duncan" | "Tim Duncan" | -+--------------+--------------+ ++--------------+ +| name | ++--------------+ +| "Tim Duncan" | ++--------------+ //删除全文索引。 nebula> DROP FULLTEXT INDEX nebula_index_1; diff --git a/docs-2.0/3.ngql-guide/16.subgraph-and-path/1.get-subgraph.md b/docs-2.0/3.ngql-guide/16.subgraph-and-path/1.get-subgraph.md index f55c083281..00f98d1513 100644 --- a/docs-2.0/3.ngql-guide/16.subgraph-and-path/1.get-subgraph.md +++ b/docs-2.0/3.ngql-guide/16.subgraph-and-path/1.get-subgraph.md @@ -110,9 +110,9 @@ nebula> INSERT EDGE serve(start_year, end_year) VALUES "player101" -> "team204": 如果只是查询满足条件的路径或点,建议使用 [MATCH](../7.general-query-statements/2.match.md) 或 [GO](../7.general-query-statements/3.go.md) 语句。例如: ```ngql -nebula> match p= (v:player) -- (v2) where id(v)=="A" return p; +nebula> MATCH p= (v:player) -- (v2) WHERE id(v)=="A" RETURN p; -nebula> go 1 steps from "A" over follow; +nebula> GO 1 STEPS FROM "A" OVER follow YIELD id(vertex); ``` ### 为什么返回结果中会出现低于`step_count`跳数的关系? diff --git a/docs-2.0/3.ngql-guide/16.subgraph-and-path/2.find-path.md b/docs-2.0/3.ngql-guide/16.subgraph-and-path/2.find-path.md index 2ad7f7bd0e..b45fc5f431 100644 --- a/docs-2.0/3.ngql-guide/16.subgraph-and-path/2.find-path.md +++ b/docs-2.0/3.ngql-guide/16.subgraph-and-path/2.find-path.md @@ -51,27 +51,27 @@ OVER [REVERSELY | BIDIRECT] [] [UPTO STEPS] [ 返回的路径格式类似于`()-[:@]->( FIND SHORTEST PATH FROM "player102" TO "team204" OVER *; +nebula> FIND SHORTEST PATH FROM "player102" TO "team204" OVER * YIELD path AS p; +--------------------------------------------+ -| path | +| p | +--------------------------------------------+ | <("player102")-[:serve@0 {}]->("team204")> | +--------------------------------------------+ ``` ```ngql -nebula> FIND SHORTEST PATH WITH PROP FROM "team204" TO "player100" OVER * REVERSELY; +nebula> FIND SHORTEST PATH WITH PROP FROM "team204" TO "player100" OVER * REVERSELY YIELD path AS p; +--------------------------------------------------------------------------------------------------------------------------------------+ -| path | +| p | +--------------------------------------------------------------------------------------------------------------------------------------+ | <("team204" :team{name: "Spurs"})<-[:serve@0 {end_year: 2016, start_year: 1997}]-("player100" :player{age: 42, name: "Tim Duncan"})> | +--------------------------------------------------------------------------------------------------------------------------------------+ ``` ```ngql -nebula> FIND ALL PATH FROM "player100" TO "team204" OVER * WHERE follow.degree is EMPTY or follow.degree >=0; +nebula> FIND ALL PATH FROM "player100" TO "team204" OVER * WHERE follow.degree is EMPTY or follow.degree >=0 YIELD path AS p; +------------------------------------------------------------------------------+ -| path | +| p | +------------------------------------------------------------------------------+ | <("player100")-[:serve@0 {}]->("team204")> | | <("player100")-[:follow@0 {}]->("player125")-[:serve@0 {}]->("team204")> | @@ -81,9 +81,9 @@ nebula> FIND ALL PATH FROM "player100" TO "team204" OVER * WHERE follow.degree i ``` ```ngql -nebula> FIND NOLOOP PATH FROM "player100" TO "team204" OVER *; +nebula> FIND NOLOOP PATH FROM "player100" TO "team204" OVER * YIELD path AS p; +--------------------------------------------------------------------------------------------------------+ -| path | +| p | +--------------------------------------------------------------------------------------------------------+ | <("player100")-[:serve@0 {}]->("team204")> | | <("player100")-[:follow@0 {}]->("player125")-[:serve@0 {}]->("team204")> | diff --git a/docs-2.0/3.ngql-guide/3.data-types/5.null.md b/docs-2.0/3.ngql-guide/3.data-types/5.null.md index bd9fd384ed..8441951468 100644 --- a/docs-2.0/3.ngql-guide/3.data-types/5.null.md +++ b/docs-2.0/3.ngql-guide/3.data-types/5.null.md @@ -77,10 +77,10 @@ nebula> INSERT VERTEX player(name) VALUES "Kobe":("Kobe"); 查询点`Kobe`,属性`age`为默认值`18`。 ```ngql -nebula> FETCH PROP ON player "Kobe"; -+-----------------------------------------+ -| vertices_ | -+-----------------------------------------+ -| ("Kobe" :player{age: 18, name: "Kobe"}) | -+-----------------------------------------+ +nebula> FETCH PROP ON player "Kobe" YIELD properties(vertex); ++--------------------------+ +| properties(VERTEX) | ++--------------------------+ +| {age: 18, name: "Kobe"} | ++--------------------------+ ``` diff --git a/docs-2.0/3.ngql-guide/5.operators/4.pipe.md b/docs-2.0/3.ngql-guide/5.operators/4.pipe.md index 5de8e6d115..a21ebb17e3 100644 --- a/docs-2.0/3.ngql-guide/5.operators/4.pipe.md +++ b/docs-2.0/3.ngql-guide/5.operators/4.pipe.md @@ -19,10 +19,10 @@ nGQL 和 SQL 之间的一个主要区别是子查询的组成方式。 ```ngql nebula> GO FROM "player100" OVER follow \ YIELD dst(edge) AS dstid, properties($$).name AS Name | \ - GO FROM $-.dstid OVER follow; + GO FROM $-.dstid OVER follow YIELD dst(edge); +-------------+ -| follow._dst | +| dst(EDGE) | +-------------+ | "player100" | | "player102" | diff --git a/docs-2.0/3.ngql-guide/5.operators/6.set.md b/docs-2.0/3.ngql-guide/5.operators/6.set.md index c34c741bcf..b3c0b2c150 100644 --- a/docs-2.0/3.ngql-guide/5.operators/6.set.md +++ b/docs-2.0/3.ngql-guide/5.operators/6.set.md @@ -24,11 +24,11 @@ ```ngql # 返回两个查询结果的并集,不包含重复的元素。 -nebula> GO FROM "player102" OVER follow \ +nebula> GO FROM "player102" OVER follow YIELD dst(edge) \ UNION \ - GO FROM "player100" OVER follow; + GO FROM "player100" OVER follow YIELD dst(edge); +-------------+ -| follow._dst | +| dst(EDGE) | +-------------+ | "player100" | | "player101" | @@ -36,14 +36,15 @@ nebula> GO FROM "player102" OVER follow \ +-------------+ # 返回两个查询结果的并集,包含重复的元素。 -nebula> GO FROM "player102" OVER follow \ +nebula> GO FROM "player102" OVER follow YIELD dst(edge) \ UNION ALL \ - GO FROM "player100" OVER follow; + GO FROM "player100" OVER follow YIELD dst(edge); +-------------+ -| follow._dst | +| dst(EDGE) | +-------------+ | "player100" | | "player101" | +| "player101" | | "player125" | +-------------+ @@ -84,6 +85,7 @@ nebula> GO FROM "player102" OVER follow \ +----+--------+-----+ | id | Degree | Age | +----+--------+-----+ ++----+--------+-----+ ``` ## MINUS @@ -97,20 +99,20 @@ nebula> GO FROM "player102" OVER follow \ ### 示例 ```ngql -nebula> GO FROM "player100" OVER follow \ +nebula> GO FROM "player100" OVER follow YIELD dst(edge) \ MINUS \ - GO FROM "player102" OVER follow; + GO FROM "player102" OVER follow YIELD dst(edge); +-------------+ -| follow._dst | +| dst(EDGE) | +-------------+ | "player125" | +-------------+ -nebula> GO FROM "player102" OVER follow \ +nebula> GO FROM "player102" OVER follow YIELD dst(edge) \ MINUS \ - GO FROM "player100" OVER follow; + GO FROM "player100" OVER follow YIELD dst(edge); +-------------+ -| follow._dst | +| dst(EDGE) | +-------------+ | "player100" | +-------------+ diff --git a/docs-2.0/3.ngql-guide/6.functions-and-expressions/11.reduce.md b/docs-2.0/3.ngql-guide/6.functions-and-expressions/11.reduce.md index 11fcf82589..dbb759418e 100644 --- a/docs-2.0/3.ngql-guide/6.functions-and-expressions/11.reduce.md +++ b/docs-2.0/3.ngql-guide/6.functions-and-expressions/11.reduce.md @@ -55,7 +55,7 @@ nebula> MATCH p = (n:player{name:"LeBron James"})<-[:follow]-(m) \ | 34 | 37 | 171 | +------+------+-----+ -nebula> LOOKUP ON player WHERE player.name == "Tony Parker" \ +nebula> LOOKUP ON player WHERE player.name == "Tony Parker" YIELD id(vertex) AS VertexID \ | GO FROM $-.VertexID over follow \ WHERE properties(edge).degree != reduce(totalNum = 5, n IN range(1, 3) | properties($$).age + totalNum + n) \ YIELD properties($$).name AS id, properties($$).age AS age, properties(edge).degree AS degree; diff --git a/docs-2.0/3.ngql-guide/6.functions-and-expressions/4.schema.md b/docs-2.0/3.ngql-guide/6.functions-and-expressions/4.schema.md index 4938afee29..fd2bf95901 100644 --- a/docs-2.0/3.ngql-guide/6.functions-and-expressions/4.schema.md +++ b/docs-2.0/3.ngql-guide/6.functions-and-expressions/4.schema.md @@ -45,15 +45,15 @@ nebula> GO FROM "player100" OVER follow REVERSELY \ +-------------+ | "player101" | | "player102" | -+-------------+ +... nebula> LOOKUP ON player WHERE player.age > 45 YIELD id(vertex); -+-------------+-------------+ -| VertexID | id(VERTEX) | -+-------------+-------------+ -| "player144" | "player144" | -| "player140" | "player140" | -+-------------+-------------+ ++-------------+ +| id(VERTEX) | ++-------------+ +| "player144" | +| "player140" | ++-------------+ nebula> MATCH (a:player) WHERE id(a) == "player100" \ RETURN tags(a), labels(a), properties(a); diff --git a/docs-2.0/3.ngql-guide/7.general-query-statements/3.go.md b/docs-2.0/3.ngql-guide/7.general-query-statements/3.go.md index 94eab57fa9..4409c2815d 100644 --- a/docs-2.0/3.ngql-guide/7.general-query-statements/3.go.md +++ b/docs-2.0/3.ngql-guide/7.general-query-statements/3.go.md @@ -12,7 +12,7 @@ GO [[ TO] STEPS ] FROM OVER [{REVERSELY | BIDIRECT}] [ WHERE  ] -[YIELD [DISTINCT] ] +YIELD [DISTINCT] [{SAMPLE | LIMIT }] [| GROUP BY {col_name | expr | position} YIELD ] [| ORDER BY [{ASC | DESC}]] @@ -49,7 +49,7 @@ OVER [{REVERSELY | BIDIRECT}] 遍历多个 Edge type 时,`WHERE`子句有一些限制。例如不支持`WHERE edge1.prop1 > edge2.prop2`。 -- `YIELD [DISTINCT] `:定义需要返回的输出。` `建议使用 [Schema 函数](../6.functions-and-expressions/4.schema.md),当前支持`src(edge)`、`dst(edge)`、`type(edge)`、`rank(edge)`、`properties(edge)`、`id(vertex)`、`properties(vertex)`,暂不支持嵌套函数。详情参见 [YIELD](../8.clauses-and-options/yield.md)。如果没有指定,默认返回目的点 ID。 +- `YIELD [DISTINCT] `:定义需要返回的输出。` `建议使用 [Schema 函数](../6.functions-and-expressions/4.schema.md),当前支持`src(edge)`、`dst(edge)`、`type(edge)`等,暂不支持嵌套函数。详情参见 [YIELD](../8.clauses-and-options/yield.md)。 - `SAMPLE `:用于在结果集中取样。详情参见 [SAMPLE](../8.clauses-and-options/sample.md)。 @@ -69,25 +69,27 @@ OVER [{REVERSELY | BIDIRECT}] ```ngql # 返回 player102 所属队伍。 -nebula> GO FROM "player102" OVER serve; -+------------+ -| serve._dst | -+------------+ -| "team203" | -| "team204" | -+------------+ +nebula> GO FROM "player102" OVER serve YIELD dst(edge); ++-----------+ +| dst(EDGE) | ++-----------+ +| "team203" | +| "team204" | ++-----------+ ``` ```ngql # 返回距离 player102 两跳的朋友。 -nebula> GO 2 STEPS FROM "player102" OVER follow; +nebula> GO 2 STEPS FROM "player102" OVER follow YIELD dst(edge); +-------------+ -| follow._dst | +| dst(EDGE) | +-------------+ | "player101" | | "player125" | +| "player100" | +| "player102" | +| "player125" | +-------------+ -... ``` ```ngql @@ -113,6 +115,7 @@ nebula> GO FROM "player100" OVER follow, serve \ | properties(EDGE).degree | properties(EDGE).start_year | +-------------------------+-----------------------------+ | 95 | UNKNOWN_PROP | +| 95 | UNKNOWN_PROP | | UNKNOWN_PROP | 1997 | +-------------------------+-----------------------------+ ``` @@ -126,7 +129,6 @@ nebula> GO FROM "player100" OVER follow REVERSELY \ +-------------+ | "player101" | | "player102" | -+-------------+ ... # 该 MATCH 查询与上一个 GO 查询具有相同的语义。 @@ -137,7 +139,6 @@ nebula> MATCH (v)<-[e:follow]- (v2) WHERE id(v) == 'player100' \ +-------------+ | "player101" | | "player102" | -+-------------+ ... ``` diff --git a/docs-2.0/3.ngql-guide/7.general-query-statements/4.fetch.md b/docs-2.0/3.ngql-guide/7.general-query-statements/4.fetch.md index 73240230be..edd9a833d1 100644 --- a/docs-2.0/3.ngql-guide/7.general-query-statements/4.fetch.md +++ b/docs-2.0/3.ngql-guide/7.general-query-statements/4.fetch.md @@ -1,7 +1,5 @@ # FETCH - - `FETCH`可以获取指定点或边的属性值。 ## openCypher 兼容性 @@ -15,7 +13,7 @@ ```ngql FETCH PROP ON {[, tag_name ...] | *} [, vid ...] -[YIELD [AS ]]; +YIELD [AS ]; ``` |参数|说明| @@ -23,7 +21,7 @@ FETCH PROP ON {[, tag_name ...] | *} |`tag_name`|Tag 名称。| |`*`|表示当前图空间中的所有 Tag。| |`vid`|点 ID。| -|`YIELD`|定义需要返回的输出。除了返回定义的属性,额外返回`VertexID`。详情请参见 [`YIELD`](../8.clauses-and-options/yield.md)。如果没有`YIELD`子句,默认返回`vertices_`,包含点的所有信息。| +|`YIELD`|定义需要返回的输出。详情请参见 [`YIELD`](../8.clauses-and-options/yield.md)。| |`AS`| 设置别名。| ### 基于 Tag 获取点的属性值 @@ -31,12 +29,12 @@ FETCH PROP ON {[, tag_name ...] | *} 在`FETCH`语句中指定 Tag 获取对应点的属性值。 ```ngql -nebula> FETCH PROP ON player "player100"; -+----------------------------------------------------+ -| vertices_ | -+----------------------------------------------------+ -| ("player100" :player{age: 42, name: "Tim Duncan"}) | -+----------------------------------------------------+ +nebula> FETCH PROP ON player "player100" YIELD properties(vertex); ++-------------------------------+ +| properties(VERTEX) | ++-------------------------------+ +| {age: 42, name: "Tim Duncan"} | ++-------------------------------+ ``` ### 获取点的指定属性值 @@ -46,11 +44,11 @@ nebula> FETCH PROP ON player "player100"; ```ngql nebula> FETCH PROP ON player "player100" \ YIELD properties(vertex).name AS name; -+-------------+--------------+ -| VertexID | name | -+-------------+--------------+ -| "player100" | "Tim Duncan" | -+-------------+--------------+ ++--------------+ +| name | ++--------------+ +| "Tim Duncan" | ++--------------+ ``` ### 获取多个点的属性值 @@ -58,14 +56,14 @@ nebula> FETCH PROP ON player "player100" \ 指定多个点 ID 获取多个点的属性值,点之间用英文逗号(,)分隔。 ```ngql -nebula> FETCH PROP ON player "player101", "player102", "player103"; -+-----------------------------------------------------------+ -| vertices_ | -+-----------------------------------------------------------+ -| ("player101" :player{age: 36, name: "Tony Parker"}) | -| ("player102" :player{age: 33, name: "LaMarcus Aldridge"}) | -| ("player103" :player{age: 32, name: "Rudy Gay"}) | -+-----------------------------------------------------------+ +nebula> FETCH PROP ON player "player101", "player102", "player103" YIELD properties(vertex); ++--------------------------------------+ +| properties(VERTEX) | ++--------------------------------------+ +| {age: 33, name: "LaMarcus Aldridge"} | +| {age: 40, name: "Tony Parker"} | +| {age: 32, name: "Rudy Gay"} | ++--------------------------------------+ ``` ### 基于多个 Tag 获取点的属性值 @@ -77,25 +75,25 @@ nebula> FETCH PROP ON player "player101", "player102", "player103"; nebula> CREATE TAG IF NOT EXISTS t1(a string, b int); # 为点 player100 添加 Tag t1。 -nebula> INSERT VERTEX t1(a, b) VALUE "player100":("Hello", 100); +nebula> INSERT VERTEX t1(a, b) VALUES "player100":("Hello", 100); # 基于 Tag player 和 t1 获取点 player100 上的属性值。 -nebula> FETCH PROP ON player, t1 "player100"; +nebula> FETCH PROP ON player, t1 "player100" YIELD vertex AS v; +----------------------------------------------------------------------------+ -| vertices_ | +| v | +----------------------------------------------------------------------------+ -| ("player100" :t1{a: "Hello", b: 100} :player{age: 42, name: "Tim Duncan"}) | +| ("player100" :player{age: 42, name: "Tim Duncan"} :t1{a: "Hello", b: 100}) | +----------------------------------------------------------------------------+ ``` 用户可以在`FETCH`语句中组合多个 Tag 和多个点。 ```ngql -nebula> FETCH PROP ON player, t1 "player100", "player103"; +nebula> FETCH PROP ON player, t1 "player100", "player103" YIELD vertex AS v; +----------------------------------------------------------------------------+ -| vertices_ | +| v | +----------------------------------------------------------------------------+ -| ("player100" :t1{a: "Hello", b: 100} :player{age: 42, name: "Tim Duncan"}) | +| ("player100" :player{age: 42, name: "Tim Duncan"} :t1{a: "Hello", b: 100}) | | ("player103" :player{age: 32, name: "Rudy Gay"}) | +----------------------------------------------------------------------------+ ``` @@ -105,13 +103,13 @@ nebula> FETCH PROP ON player, t1 "player100", "player103"; 在`FETCH`语句中使用`*`获取当前图空间所有标签里,点的属性值。 ```ngql -nebula> FETCH PROP ON * "player100", "player106", "team200"; +nebula> FETCH PROP ON * "player100", "player106", "team200" YIELD vertex AS v; +----------------------------------------------------------------------------+ -| vertices_ | +| v | +----------------------------------------------------------------------------+ +| ("player100" :player{age: 42, name: "Tim Duncan"} :t1{a: "Hello", b: 100}) | | ("player106" :player{age: 25, name: "Kyle Anderson"}) | | ("team200" :team{name: "Warriors"}) | -| ("player100" :t1{a: "Hello", b: 100} :player{age: 42, name: "Tim Duncan"}) | +----------------------------------------------------------------------------+ ``` @@ -121,7 +119,7 @@ nebula> FETCH PROP ON * "player100", "player106", "team200"; ```ngql FETCH PROP ON -> [@] [, -> ...] -[YIELD ] +YIELD ; ``` |参数|说明| @@ -130,18 +128,18 @@ FETCH PROP ON -> [@] [, -> FETCH PROP ON serve "player100" -> "team204"; -+-----------------------------------------------------------------------+ -| edges_ | -+-----------------------------------------------------------------------+ -| [:serve "player100"->"team204" @0 {end_year: 2016, start_year: 1997}] | -+-----------------------------------------------------------------------+ +nebula> FETCH PROP ON serve "player100" -> "team204" YIELD properties(edge); ++------------------------------------+ +| properties(EDGE) | ++------------------------------------+ +| {end_year: 2016, start_year: 1997} | ++------------------------------------+ ``` ### 获取边的指定属性值 @@ -151,11 +149,11 @@ nebula> FETCH PROP ON serve "player100" -> "team204"; ```ngql nebula> FETCH PROP ON serve "player100" -> "team204" \ YIELD properties(edge).start_year; -+-------------+------------+-------------+-----------------------------+ -| serve._src | serve._dst | serve._rank | properties(EDGE).start_year | -+-------------+------------+-------------+-----------------------------+ -| "player100" | "team204" | 0 | 1997 | -+-------------+------------+-------------+-----------------------------+ ++-----------------------------+ +| properties(EDGE).start_year | ++-----------------------------+ +| 1997 | ++-----------------------------+ ``` ### 获取多条边的属性值 @@ -163,9 +161,9 @@ nebula> FETCH PROP ON serve "player100" -> "team204" \ 指定多个边模式 (` -> [@]`) 获取多个边的属性值。模式之间用英文逗号(,)分隔。 ```ngql -nebula> FETCH PROP ON serve "player100" -> "team204", "player133" -> "team202"; +nebula> FETCH PROP ON serve "player100" -> "team204", "player133" -> "team202" YIELD edge AS e; +-----------------------------------------------------------------------+ -| edges_ | +| e | +-----------------------------------------------------------------------+ | [:serve "player100"->"team204" @0 {end_year: 2016, start_year: 1997}] | | [:serve "player133"->"team202" @0 {end_year: 2011, start_year: 2002}] | @@ -185,17 +183,17 @@ nebula> insert edge serve(start_year,end_year) \ values "player100"->"team204"@2:(1990, 2018); # 默认返回 rank 为 0 的边。 -nebula> FETCH PROP ON serve "player100" -> "team204"; +nebula> FETCH PROP ON serve "player100" -> "team204" YIELD edge AS e; +-----------------------------------------------------------------------+ -| edges_ | +| e | +-----------------------------------------------------------------------+ | [:serve "player100"->"team204" @0 {end_year: 2016, start_year: 1997}] | +-----------------------------------------------------------------------+ # 要获取 rank 不为 0 的边,请在 FETCH 语句中设置 rank。 -nebula> FETCH PROP ON serve "player100" -> "team204"@1; +nebula> FETCH PROP ON serve "player100" -> "team204"@1 YIELD edge AS e; +-----------------------------------------------------------------------+ -| edges_ | +| e | +-----------------------------------------------------------------------+ | [:serve "player100"->"team204" @1 {end_year: 2017, start_year: 1998}] | +-----------------------------------------------------------------------+ @@ -211,13 +209,13 @@ nebula> GO FROM "player101" OVER follow \ YIELD src(edge) AS s, dst(edge) AS d \ | FETCH PROP ON follow $-.s -> $-.d \ YIELD properties(edge).degree; -+-------------+-------------+--------------+-------------------------+ -| follow._src | follow._dst | follow._rank | properties(EDGE).degree | -+-------------+-------------+--------------+-------------------------+ -| "player101" | "player100" | 0 | 95 | -| "player101" | "player102" | 0 | 90 | -| "player101" | "player125" | 0 | 95 | -+-------------+-------------+--------------+-------------------------+ ++-------------------------+ +| properties(EDGE).degree | ++-------------------------+ +| 95 | +| 90 | +| 95 | ++-------------------------+ ``` 用户也可以通过自定义变量构建类似的查询。 @@ -227,13 +225,13 @@ nebula> $var = GO FROM "player101" OVER follow \ YIELD src(edge) AS s, dst(edge) AS d; \ FETCH PROP ON follow $var.s -> $var.d \ YIELD properties(edge).degree; -+-------------+-------------+--------------+-------------------------+ -| follow._src | follow._dst | follow._rank | properties(EDGE).degree | -+-------------+-------------+--------------+-------------------------+ -| "player101" | "player100" | 0 | 95 | -| "player101" | "player102" | 0 | 90 | -| "player101" | "player125" | 0 | 95 | -+-------------+-------------+--------------+-------------------------+ ++-------------------------+ +| properties(EDGE).degree | ++-------------------------+ +| 95 | +| 90 | +| 95 | ++-------------------------+ ``` 更多复合语句的详情,请参见[复合查询(子句结构)](../4.variable-and-composite-queries/1.composite-queries.md)。 diff --git a/docs-2.0/3.ngql-guide/7.general-query-statements/5.lookup.md b/docs-2.0/3.ngql-guide/7.general-query-statements/5.lookup.md index a18fd9e54a..c054574976 100644 --- a/docs-2.0/3.ngql-guide/7.general-query-statements/5.lookup.md +++ b/docs-2.0/3.ngql-guide/7.general-query-statements/5.lookup.md @@ -1,7 +1,5 @@ # LOOKUP - - `LOOKUP`根据索引遍历数据。用户可以使用`LOOKUP`实现如下功能: - 根据`WHERE`子句搜索特定数据。 @@ -37,7 +35,7 @@ ```ngql LOOKUP ON { | } [WHERE [AND ...]] -[YIELD [AS ]]; +YIELD [AS ]; [AS ] [, [AS ] ...]; @@ -45,10 +43,7 @@ LOOKUP ON { | } - `WHERE `:指定遍历的过滤条件,还可以结合布尔运算符 AND 和 OR 一起使用。详情请参见 [WHERE](../8.clauses-and-options/where.md)。 -- `YIELD`:定义需要返回的输出。 - - - `LOOKUP`Tag 时,除了返回定义的属性,额外返回`VertexID`。如果没有`YIELD`子句,返回`VertexID`。 - - `LOOKUP`Edge type 时,除了返回定义的属性,额外返回`起始点 ID`、`目的点 ID`和`rank`。如果没有`YIELD`子句,返回`起始点 ID`、`目的点 ID`和`rank`。 +- `YIELD`:定义需要返回的输出。详情请参见 [`YIELD`](../8.clauses-and-options/yield.md)。 - `AS`:设置别名。 @@ -77,45 +72,50 @@ nebula> REBUILD TAG INDEX index_player; +------------+ nebula> LOOKUP ON player \ - WHERE player.name == "Tony Parker"; -+-------------+ -| VertexID | -+-------------+ -| "player101" | -+-------------+ + WHERE player.name == "Tony Parker" \ + YIELD id(vertex); ++---------------+ +| id(VERTEX) | ++---------------+ +| "player101" | ++---------------+ nebula> LOOKUP ON player \ WHERE player.name == "Tony Parker" \ YIELD properties(vertex).name AS name, properties(vertex).age AS age; -+-------------+---------------+-----+ -| VertexID | name | age | -+-------------+---------------+-----+ -| "player101" | "Tony Parker" | 36 | -+-------------+---------------+-----+ ++---------------+-----+ +| name | age | ++---------------+-----+ +| "Tony Parker" | 36 | ++---------------+-----+ nebula> LOOKUP ON player \ - WHERE player.age > 45; + WHERE player.age > 45 \ + YIELD id(vertex); +-------------+ -| VertexID | +| id(VERTEX) | +-------------+ -| "player140" | | "player144" | +| "player140" | +| "player111" | +-------------+ nebula> LOOKUP ON player \ WHERE player.name STARTS WITH "B" \ AND player.age IN [22,30] \ YIELD properties(vertex).name, properties(vertex).age; -+-------------+-------------------------+------------------------+ -| VertexID | properties(VERTEX).name | properties(VERTEX).age | -+-------------+-------------------------+------------------------+ -| "player134" | "Blake Griffin" | 30 | -| "player149" | "Ben Simmons" | 22 | -+-------------+-------------------------+------------------------+ ++-------------------------+------------------------+ +| properties(VERTEX).name | properties(VERTEX).age | ++-------------------------+------------------------+ +| "Blake Griffin" | 30 | +| "Ben Simmons" | 22 | +| "Blake Griffin" | 30 | +| "Ben Simmons" | 22 | ++-------------------------+------------------------+ nebula> LOOKUP ON player \ WHERE player.name == "Kobe Bryant"\ - YIELD properties(vertex).name AS name |\ + YIELD id(vertex) AS VertexID, properties(vertex).name AS name |\ GO FROM $-.VertexID OVER serve \ YIELD $-.name, properties(edge).start_year, properties(edge).end_year, properties($$).name; +---------------+-----------------------------+---------------------------+---------------------+ @@ -140,13 +140,13 @@ nebula> REBUILD EDGE INDEX index_follow; +------------+ nebula> LOOKUP ON follow \ - WHERE follow.degree == 90; -+-------------+-------------+---------+ -| SrcVID | DstVID | Ranking | -+-------------+-------------+---------+ -| "player150" | "player143" | 0 | -| "player150" | "player137" | 0 | -| "player148" | "player136" | 0 | + WHERE follow.degree == 90 YIELD edge AS e; ++----------------------------------------------------+ +| e | ++----------------------------------------------------+ +| [:follow "player109"->"player125" @0 {degree: 90}] | +| [:follow "player118"->"player120" @0 {degree: 90}] | +| [:follow "player118"->"player131" @0 {degree: 90}] | ... nebula> LOOKUP ON follow \ @@ -162,16 +162,16 @@ nebula> LOOKUP ON follow \ nebula> LOOKUP ON follow \ WHERE follow.degree == 60 \ - YIELD properties(edge).degree AS Degree |\ + YIELD dst(edge) AS DstVID, properties(edge).degree AS Degree |\ GO FROM $-.DstVID OVER serve \ YIELD $-.DstVID, properties(edge).start_year, properties(edge).end_year, properties($$).name; -+-------------+------------------------------+---------------------------+---------------------+ -| $-.DstVID | properties(EDGE).start_year | properties(EDGE).end_year | properties($$).name | -+-------------+------------------------------+---------------------------+---------------------+ -| "player105" | 2010 | 2018 | "Spurs" | -| "player105" | 2009 | 2010 | "Cavaliers" | -| "player105" | 2018 | 2019 | "Raptors" | -+-------------+------------------------------+---------------------------+---------------------+ ++-------------+-----------------------------+---------------------------+---------------------+ +| $-.DstVID | properties(EDGE).start_year | properties(EDGE).end_year | properties($$).name | ++-------------+-----------------------------+---------------------------+---------------------+ +| "player105" | 2010 | 2018 | "Spurs" | +| "player105" | 2009 | 2010 | "Cavaliers" | +| "player105" | 2018 | 2019 | "Raptors" | ++-------------+-----------------------------+---------------------------+---------------------+ ``` ## 通过 Tag 列出所有的对应的点/通过 Edge type 列出边 @@ -199,13 +199,13 @@ nebula> LOOKUP ON follow \ # 列出所有的 player。类似于 MATCH (n:player) RETURN id(n) /*, n */。 - nebula> LOOKUP ON player; + nebula> LOOKUP ON player YIELD id(vertex); +-------------+ - | VertexID | + | id(VERTEX) | +-------------+ | "player100" | | "player101" | - +-------------+ + ... ``` - 查找 Edge type 为`follow`的所有边的信息。 @@ -227,12 +227,14 @@ nebula> LOOKUP ON follow \ # 列出所有的 follow 边。类似于 MATCH (s)-[e:follow]->(d) RETURN id(s), rank(e), id(d) /*, type(e) */。 - nebula)> LOOKUP ON follow; - +-------------+-------------+---------+ - | SrcVID | DstVID | Ranking | - +-------------+-------------+---------+ - | "player100" | "player101" | 0 | - +-------------+-------------+---------+ + nebula)> LOOKUP ON follow YIELD edge AS e; + +-----------------------------------------------------+ + | e | + +-----------------------------------------------------+ + | [:follow "player105"->"player100" @0 {degree: 70}] | + | [:follow "player105"->"player116" @0 {degree: 80}] | + | [:follow "player109"->"player100" @0 {degree: 80}] | + ... ``` ## 统计点或边 @@ -240,7 +242,7 @@ nebula> LOOKUP ON follow \ 统计 Tag 为`player`的点和 Edge type 为`follow`的边。 ```ngql -nebula> LOOKUP ON player |\ +nebula> LOOKUP ON player YIELD id(vertex)|\ YIELD COUNT(*) AS Player_Number; +---------------+ | Player_Number | @@ -248,7 +250,7 @@ nebula> LOOKUP ON player |\ | 51 | +---------------+ -nebula> LOOKUP ON follow | \ +nebula> LOOKUP ON follow YIELD edge AS e| \ YIELD COUNT(*) AS Follow_Number; +---------------+ | Follow_Number | diff --git a/docs-2.0/3.ngql-guide/8.clauses-and-options/limit.md b/docs-2.0/3.ngql-guide/8.clauses-and-options/limit.md index dc4962085c..2dab4c77ae 100644 --- a/docs-2.0/3.ngql-guide/8.clauses-and-options/limit.md +++ b/docs-2.0/3.ngql-guide/8.clauses-and-options/limit.md @@ -35,10 +35,10 @@ ```ngql # 从结果中返回最前面的 3 行数据。 -nebula> LOOKUP ON player |\ +nebula> LOOKUP ON player YIELD id(vertex)|\ LIMIT 3; +-------------+ -| VertexID | +| id(VERTEX) | +-------------+ | "player100" | | "player101" | @@ -92,16 +92,17 @@ nebula> GO 3 STEPS FROM "player100" \ | "Manu Ginobili" | 41 | +-----------------+--------------+ -nebula> GO 3 STEPS FROM "player102" \ - OVER * \ +nebula> GO 3 STEPS FROM "player102" OVER * \ + YIELD dst(edge) \ LIMIT [rand32(5),rand32(5),rand32(5)]; -+------------+-------------+ -| serve._dst | follow._dst | -+------------+-------------+ -| "team204" | | -| "team215" | | -| | "player100" | -+------------+-------------+ ++-------------+ +| dst(EDGE) | ++-------------+ +| "team204" | +| "team215" | +| "player100" | +| "player102" | ++-------------+ ``` ## openCypher 兼容语句中的 LIMIT diff --git a/docs-2.0/3.ngql-guide/8.clauses-and-options/order-by.md b/docs-2.0/3.ngql-guide/8.clauses-and-options/order-by.md index 50e6bcff1f..cb292966ad 100644 --- a/docs-2.0/3.ngql-guide/8.clauses-and-options/order-by.md +++ b/docs-2.0/3.ngql-guide/8.clauses-and-options/order-by.md @@ -28,14 +28,14 @@ ORDER BY [ASC | DESC] [, [ASC | DESC] ...]; nebula> FETCH PROP ON player "player100", "player101", "player102", "player103" \ YIELD properties(vertex).age AS age, properties(vertex).name AS name \ | ORDER BY $-.age ASC, $-.name DESC; -+-------------+-----+---------------------+ -| VertexID | age | name | -+-------------+-----+---------------------+ -| "player103" | 32 | "Rudy Gay" | -| "player102" | 33 | "LaMarcus Aldridge" | -| "player101" | 36 | "Tony Parker" | -| "player100" | 42 | "Tim Duncan" | -+-------------+-----+---------------------+ ++-----+---------------------+ +| age | name | ++-----+---------------------+ +| 32 | "Rudy Gay" | +| 33 | "LaMarcus Aldridge" | +| 36 | "Tony Parker" | +| 42 | "Tim Duncan" | ++-----+---------------------+ nebula> $var = GO FROM "player100" OVER follow \ YIELD dst(edge) AS dst; \ diff --git a/docs-2.0/3.ngql-guide/8.clauses-and-options/where.md b/docs-2.0/3.ngql-guide/8.clauses-and-options/where.md index 555b1162c6..49b204699a 100644 --- a/docs-2.0/3.ngql-guide/8.clauses-and-options/where.md +++ b/docs-2.0/3.ngql-guide/8.clauses-and-options/where.md @@ -75,11 +75,11 @@ nebula> GO FROM "player100" \ ``` ```ngql - nebula> GO FROM "player100" \ - OVER follow \ - WHERE $^.player.age >= 42; + nebula> GO FROM "player100" OVER follow \ + WHERE $^.player.age >= 42 \ + YIELD dst(edge); +-------------+ - | follow._dst | + | dst(EDGE) | +-------------+ | "player101" | | "player125" | @@ -105,11 +105,11 @@ nebula> GO FROM "player100" \ ``` ```ngql - nebula> GO FROM "player100" \ - OVER follow \ - WHERE follow.degree > 90; + nebula> GO FROM "player100" OVER follow \ + WHERE follow.degree > 90 \ + YIELD dst(edge); +-------------+ - | follow._dst | + | dst(EDGE) | +-------------+ | "player101" | | "player125" | @@ -305,15 +305,15 @@ nebula> MATCH (v:player) \ nebula> LOOKUP ON player \ WHERE player.age IN [25,28] \ YIELD properties(vertex).name, properties(vertex).age; -+-------------+-------------------------+------------------------+ -| VertexID | properties(VERTEX).name | properties(VERTEX).age | -+-------------+-------------------------+------------------------+ -| "player106" | "Kyle Anderson" | 25 | -| "player135" | "Damian Lillard" | 28 | -| "player130" | "Joel Embiid" | 25 | -| "player131" | "Paul George" | 28 | -| "player123" | "Ricky Rubio" | 28 | -+-------------+-------------------------+------------------------+ ++-------------------------+------------------------+ +| properties(VERTEX).name | properties(VERTEX).age | ++-------------------------+------------------------+ +| "Kyle Anderson" | 25 | +| "Damian Lillard" | 28 | +| "Joel Embiid" | 25 | +| "Paul George" | 28 | +| "Ricky Rubio" | 28 | ++-------------------------+------------------------+ ``` ### 结合 NOT 使用 diff --git a/docs-2.0/3.ngql-guide/8.clauses-and-options/yield.md b/docs-2.0/3.ngql-guide/8.clauses-and-options/yield.md index da41af5ce1..9c33e99694 100644 --- a/docs-2.0/3.ngql-guide/8.clauses-and-options/yield.md +++ b/docs-2.0/3.ngql-guide/8.clauses-and-options/yield.md @@ -4,7 +4,7 @@ `YIELD`可以引导子句或语句: -- `YIELD`子句可以用于原生 nGQL 语句中,例如`GO`、`FETCH`或`LOOKUP`。 +- `YIELD`子句用于原生 nGQL 语句中,例如`GO`、`FETCH`或`LOOKUP`,必须通过`YIELD`子句定义返回结果。 - `YIELD`语句可以在独立查询或复合查询中使用。 @@ -59,11 +59,11 @@ YIELD [DISTINCT] [AS ] [, [AS ] ...]; ```ngql nebula> FETCH PROP ON player "player100" \ YIELD properties(vertex).name; - +-------------+-------------------------+ - | VertexID | properties(VERTEX).name | - +-------------+-------------------------+ - | "player100" | "Tim Duncan" | - +-------------+-------------------------+ + +-------------------------+ + | properties(VERTEX).name | + +-------------------------+ + | "Tim Duncan" | + +-------------------------+ ``` - `LOOKUP`语句中使用`YIELD`: @@ -71,11 +71,11 @@ YIELD [DISTINCT] [AS ] [, [AS ] ...]; ```ngql nebula> LOOKUP ON player WHERE player.name == "Tony Parker" \ YIELD properties(vertex).name, properties(vertex).age; - +-------------+-------------------------+------------------------+ - | VertexID | properties(VERTEX).name | properties(VERTEX).age | - +-------------+-------------------------+------------------------+ - | "player101" | "Tony Parker" | 36 | - +-------------+-------------------------+------------------------+ + +-------------------------+------------------------+ + | properties(VERTEX).name | properties(VERTEX).age | + +-------------------------+------------------------+ + | "Tony Parker" | 36 | + +-------------------------+------------------------+ ``` ## YIELD 语句 diff --git a/docs-2.0/nebula-studio/use-console/st-ug-visualize-subgraph.md b/docs-2.0/nebula-studio/use-console/st-ug-visualize-subgraph.md index c1e63fbd28..84d7108ff8 100644 --- a/docs-2.0/nebula-studio/use-console/st-ug-visualize-subgraph.md +++ b/docs-2.0/nebula-studio/use-console/st-ug-visualize-subgraph.md @@ -33,7 +33,7 @@ Studio v{{ studio.release }} 及以后版本。请更新版本,详细操作参 查询语句示例如下: ```nGQL - nebula> FIND ALL PATH FROM "player114" to "player100" OVER follow; + nebula> FIND ALL PATH FROM "player114" to "player100" OVER follow YIELD path AS p; ``` 查询得到如下图所示路径信息。 diff --git a/docs-2.0/reuse/source_connect-to-nebula-graph.md b/docs-2.0/reuse/source_connect-to-nebula-graph.md index a30247d91e..27bca556eb 100644 --- a/docs-2.0/reuse/source_connect-to-nebula-graph.md +++ b/docs-2.0/reuse/source_connect-to-nebula-graph.md @@ -150,9 +150,9 @@ nebula> :repeat N ```ngql nebula> :repeat 3 -nebula> GO FROM "player100" OVER follow; +nebula> GO FROM "player100" OVER follow YIELD dst(edge); +-------------+ -| follow._dst | +| dst(EDGE) | +-------------+ | "player101" | | "player125" | @@ -162,7 +162,7 @@ Got 2 rows (time spent 2602/3214 us) Fri, 20 Aug 2021 06:36:05 UTC +-------------+ -| follow._dst | +| dst(EDGE) | +-------------+ | "player101" | | "player125" | @@ -172,7 +172,7 @@ Got 2 rows (time spent 583/849 us) Fri, 20 Aug 2021 06:36:05 UTC +-------------+ -| follow._dst | +| dst(EDGE) | +-------------+ | "player101" | | "player125" | From be636e606746cf48bc5236e805e9f46678b290b5 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Wed, 8 Dec 2021 10:54:55 +0800 Subject: [PATCH 16/64] add schema function (#1302) * add schema function * Update docs-2.0/3.ngql-guide/6.functions-and-expressions/4.schema.md * Update 4.schema.md Co-authored-by: abby.huang <78209557+abby-cyber@users.noreply.github.com> --- .../3.ngql-guide/6.functions-and-expressions/4.schema.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs-2.0/3.ngql-guide/6.functions-and-expressions/4.schema.md b/docs-2.0/3.ngql-guide/6.functions-and-expressions/4.schema.md index fd2bf95901..3e8c679a5c 100644 --- a/docs-2.0/3.ngql-guide/6.functions-and-expressions/4.schema.md +++ b/docs-2.0/3.ngql-guide/6.functions-and-expressions/4.schema.md @@ -19,6 +19,15 @@ Nebula Graph 支持以下 Schema 函数。 |src(edge)|返回边的起始点 ID。数据类型和点 ID 的类型保持一致。| |dst(edge)|返回边的目的点 ID。数据类型和点 ID 的类型保持一致。| |int rank(edge) | 返回边的 rank。| +|vertex | 返回点的信息。包括点 ID、Tag、属性和值。| +|edge | 返回边的信息。包括 Edge type、起始点 ID、目的点 ID、rank、属性和值。| +|vertices | 返回子图中的点的信息。详情参见 [GET SUBGRAPH](../16.subgraph-and-path/1.get-subgraph.md)。| +|edges | 返回子图中的边的信息。详情参见 [GET SUBGRAPH](../16.subgraph-and-path/1.get-subgraph.md)。| +|path | 返回路径信息。详情参见 [FIND PATH](../16.subgraph-and-path/2.find-path.md)。| + +!!! note + + 由于 vertex、edge、vertices、edges、path 属于关键字,使用时需要用`AS `设置别名才能正常使用。例如`GO FROM "player100" OVER follow YIELD edge AS e;`。 ## openCypher 兼容语句适用 From 100a1b6a8eae654aab55615552240483c07e739d Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Wed, 8 Dec 2021 10:55:02 +0800 Subject: [PATCH 17/64] Update 4.schema.md (#1307) --- docs-2.0/3.ngql-guide/6.functions-and-expressions/4.schema.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs-2.0/3.ngql-guide/6.functions-and-expressions/4.schema.md b/docs-2.0/3.ngql-guide/6.functions-and-expressions/4.schema.md index 3e8c679a5c..cb26f35b1f 100644 --- a/docs-2.0/3.ngql-guide/6.functions-and-expressions/4.schema.md +++ b/docs-2.0/3.ngql-guide/6.functions-and-expressions/4.schema.md @@ -6,9 +6,7 @@ Nebula Graph 支持以下 Schema 函数。 !!! note - - GO 语句中,WHERE 子句和 YIELD 子句中可以使用如下函数。 - - LOOKUP 语句中,YIELD 子句中可以使用如下函数。 - - FETCH 语句中,YIELD 子句中可以使用如下函数。 + YIELD 和 WHERE 子句中可以使用如下函数。 |函数| 说明 | |:---- | :----| From af5eea59404a4867c286be658b03fa8ad4c4e351 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Thu, 9 Dec 2021 10:39:23 +0800 Subject: [PATCH 18/64] Update 3.graph-config.md (#1312) --- .../1.configurations/3.graph-config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-2.0/5.configurations-and-logs/1.configurations/3.graph-config.md b/docs-2.0/5.configurations-and-logs/1.configurations/3.graph-config.md index 0734a86fd2..9cf67d1ad1 100644 --- a/docs-2.0/5.configurations-and-logs/1.configurations/3.graph-config.md +++ b/docs-2.0/5.configurations-and-logs/1.configurations/3.graph-config.md @@ -64,7 +64,7 @@ Graph 服务提供了两份初始配置文件`nebula-graphd.conf.default`和`neb |`reuse_port` |`false` | 是否启用 SO_REUSEPORT。 | |`listen_backlog` |`1024` | socket 监听的连接队列最大长度,调整本参数需要同时调整`net.core.somaxconn`。 | |`client_idle_timeout_secs` |`28800` | 空闲连接的超时时间。默认 8 小时。`0`表示永不超时。单位:秒。 | -|`session_idle_timeout_secs` |`28800` | 空闲会话的超时时间。取值范围为 1~604800。默认 8 小时。`0`表示永不超时。单位:秒。 | +|`session_idle_timeout_secs` |`28800` | 空闲会话的超时时间。取值范围为 1~604800。默认 8 小时。单位:秒。 | |`num_accept_threads` |`1` | 接受传入连接的线程数。 | |`num_netio_threads` |`0` | 网络 IO 线程数。`0`表示 CPU 核数。 | |`num_worker_threads` |`0` | 执行用户查询的线程数。`0`表示 CPU 核数。 | From eb67d2cccffb6910ce56a84edf5dadfd53c177f7 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Thu, 9 Dec 2021 12:18:08 +0800 Subject: [PATCH 19/64] fix syntax problem for values (#1311) --- docs-2.0/2.quick-start/4.nebula-graph-crud.md | 6 +++--- .../2.quick-start/6.cheatsheet-for-ngql-command.md | 10 +++++----- .../12.vertex-statements/1.insert-vertex.md | 6 +++--- .../3.ngql-guide/13.edge-statements/1.insert-edge.md | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs-2.0/2.quick-start/4.nebula-graph-crud.md b/docs-2.0/2.quick-start/4.nebula-graph-crud.md index 23b0662840..b76d3573e4 100644 --- a/docs-2.0/2.quick-start/4.nebula-graph-crud.md +++ b/docs-2.0/2.quick-start/4.nebula-graph-crud.md @@ -188,7 +188,7 @@ nebula> CREATE EDGE serve(start_year int, end_year int); ```ngql INSERT VERTEX [IF NOT EXISTS] ([, ...]) [, ([, ...]), ...] - {VALUES | VALUE} : ([, ...]) + VALUES : ([, ...]) [, : ([, ...]; ``` @@ -198,7 +198,7 @@ nebula> CREATE EDGE serve(start_year int, end_year int); ```ngql INSERT EDGE [IF NOT EXISTS] ([, ...]) - {VALUES | VALUE} -> [@] : ([, ...]) + VALUES -> [@] : ([, ...]) [, -> [@] : ([, ...]), ...]; ``` @@ -445,7 +445,7 @@ nebula> FETCH PROP ON player "player100" YIELD properties(vertex); - 用`INSERT`插入一个 VID 为`player111`的点,然后用`UPSERT`更新它。 ```ngql - nebula> INSERT VERTEX player(name,age) values "player111":("David West", 38); + nebula> INSERT VERTEX player(name,age) VALUES "player111":("David West", 38); nebula> UPSERT VERTEX "player111" SET player.name = "David", player.age = $^.player.age + 11 \ WHEN $^.player.name == "David West" AND $^.player.age > 20 \ diff --git a/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md b/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md index ef3c87a61f..6f53b1153f 100644 --- a/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md +++ b/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md @@ -234,7 +234,7 @@ ``` LOOKUP ON { | } [WHERE [AND ...]] - [YIELD [AS ]] + YIELD [AS ] ``` | 模式 | 示例 | 说明 | @@ -254,7 +254,7 @@ GO [[ TO] STEPS ] FROM OVER [{REVERSELY | BIDIRECT}] [ WHERE ] - [YIELD [DISTINCT] ] + YIELD [DISTINCT] [| GROUP BY {col_name | expr | position} YIELD ] [| ORDER BY [{ASC | DESC}]] [| LIMIT [,] ] @@ -276,7 +276,7 @@ ``` FETCH PROP ON {[, tag_name ...] | *} [, vid ...] - [YIELD [AS ]] + YIELD [AS ] ``` | 示例 | 说明 | @@ -384,7 +384,7 @@ | 语句 | 语法 | 示例 | 说明 | | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| [INSERT VERTEX](../3.ngql-guide/12.vertex-statements/1.insert-vertex.md) | `INSERT VERTEX [IF NOT EXISTS] () [, (), ...] {VALUES | VALUE} VID: ([, ])` | `INSERT VERTEX t2 (name, age) VALUES "13":("n3", 12), "14":("n4", 8)` | 在 Nebula Graph 实例的指定图空间中插入一个或多个点。 | +| [INSERT VERTEX](../3.ngql-guide/12.vertex-statements/1.insert-vertex.md) | `INSERT VERTEX [IF NOT EXISTS] () [, (), ...] VALUES VID: ([, ])` | `INSERT VERTEX t2 (name, age) VALUES "13":("n3", 12), "14":("n4", 8)` | 在 Nebula Graph 实例的指定图空间中插入一个或多个点。 | | [DELETE VERTEX](../3.ngql-guide/12.vertex-statements/4.delete-vertex.md) | `DELETE VERTEX [, ...]` | `DELETE VERTEX "team1"` | 删除点,以及点关联的出边和入边。 | | [UPDATE VERTEX](../3.ngql-guide/12.vertex-statements/2.update-vertex.md) | `UPDATE VERTEX ON SET [WHEN ] [YIELD ]` | `UPDATE VERTEX ON player "player101" SET age = age + 2 ` | 修改点上 Tag 的属性值。 | | [UPSERT VERTEX](../3.ngql-guide/12.vertex-statements/3.upsert-vertex.md) | `UPSERT VERTEX ON SET [WHEN ] [YIELD ]` | `UPSERT VERTEX ON player "player667" SET age = 31` | 结合`UPDATE`和`INSERT`,如果点存在,会修改点的属性值;如果点不存在,会插入新的点。 | @@ -393,7 +393,7 @@ | 语句 | 语法 | 示例 | 说明 | | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| [INSERT EDGE](../3.ngql-guide/13.edge-statements/1.insert-edge.md) | `INSERT EDGE [IF NOT EXISTS] ( ) {VALUES | VALUE} -> [@] : ( ) [, -> [@] : ( ), ...]` | `INSERT EDGE e2 (name, age) VALUES "11"->"13":("n1", 1)` | 在 Nebula Graph 实例的指定图空间中插入一条或多条边。 | +| [INSERT EDGE](../3.ngql-guide/13.edge-statements/1.insert-edge.md) | `INSERT EDGE [IF NOT EXISTS] ( ) VALUES -> [@] : ( ) [, -> [@] : ( ), ...]` | `INSERT EDGE e2 (name, age) VALUES "11"->"13":("n1", 1)` | 在 Nebula Graph 实例的指定图空间中插入一条或多条边。 | | [DELETE EDGE](../3.ngql-guide/12.vertex-statements/3.upsert-vertex.md) | `DELETE EDGE -> [@] [, -> [@] ...]` | `DELETE EDGE serve "player100" -> "team204"@0` | 删除边。一次可以删除一条或多条边。 | | [UPDATE EDGE](../3.ngql-guide/13.edge-statements/2.update-edge.md) | `UPDATE EDGE ON -> [@] SET [WHEN ] [YIELD ]` | `UPDATE EDGE ON serve "player100" -> "team204"@0 SET start_year = start_year + 1` | 修改边上 Edge type 的属性。 | | [UPSERT EDGE](../3.ngql-guide/12.vertex-statements/3.upsert-vertex.md) | `UPSERT EDGE ON -> [@rank] SET [WHEN ] [YIELD ]` | `UPSERT EDGE on serve "player666" -> "team200"@0 SET end_year = 2021` | 结合`UPDATE`和`INSERT`,如果边存在,会更新边的属性;如果边不存在,会插入新的边。 | diff --git a/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md b/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md index 3e483ef418..50d20f136b 100644 --- a/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md +++ b/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md @@ -9,8 +9,8 @@ ## 语法 ```ngql -INSERT VERTEX [IF NOT EXISTS] () [, (), ...] - {VALUES | VALUE} VID: ([, ]) +INSERT VERTEX [IF NOT EXISTS] () [, (), ...] +VALUES VID: ([, ]) prop_name_list: [prop_name [, prop_name] ...] @@ -49,7 +49,7 @@ prop_value_list: ```ngql # 插入不包含属性的点。 nebula> CREATE TAG IF NOT EXISTS t1(); -nebula> INSERT VERTEX t1() VALUE "10":(); +nebula> INSERT VERTEX t1() VALUES "10":(); ``` ```ngql diff --git a/docs-2.0/3.ngql-guide/13.edge-statements/1.insert-edge.md b/docs-2.0/3.ngql-guide/13.edge-statements/1.insert-edge.md index 6d1cb86a1c..67888bfbbc 100644 --- a/docs-2.0/3.ngql-guide/13.edge-statements/1.insert-edge.md +++ b/docs-2.0/3.ngql-guide/13.edge-statements/1.insert-edge.md @@ -7,7 +7,7 @@ ## 语法 ```ngql -INSERT EDGE [IF NOT EXISTS] ( ) {VALUES | VALUE} +INSERT EDGE [IF NOT EXISTS] ( ) VALUES -> [@] : ( ) [, -> [@] : ( ), ...]; From d56f6798f7a37004bb154dc40f58b09e2b920553 Mon Sep 17 00:00:00 2001 From: "abby.huang" <78209557+abby-cyber@users.noreply.github.com> Date: Thu, 9 Dec 2021 12:18:50 +0800 Subject: [PATCH 20/64] Update 4.storage-service.md (#1309) desc optimization --- .../3.nebula-graph-architecture/4.storage-service.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-2.0/1.introduction/3.nebula-graph-architecture/4.storage-service.md b/docs-2.0/1.introduction/3.nebula-graph-architecture/4.storage-service.md index c0d37f1ae2..06f7faed24 100644 --- a/docs-2.0/1.introduction/3.nebula-graph-architecture/4.storage-service.md +++ b/docs-2.0/1.introduction/3.nebula-graph-architecture/4.storage-service.md @@ -152,7 +152,7 @@ EdgeA_Out 和 EdgeA_In 以方向相反的两条边的形式存在于存储层, 创建图空间时需指定分片数量,分片数量设置后无法修改,建议设置时提前满足业务将来的扩容需求。 -点和边分布在不同的分片,分片分布在不同的机器。分片数量在 CREATE SPACE 语句中指定,此后不可更改。 +多机集群部署时,分片分布在集群内的不同机器上。分片数量在 CREATE SPACE 语句中指定,此后不可更改。 如果需要将某些点放置在相同的分片(例如在一台机器上),可以参考[公式或代码](https://github.com/vesoft-inc/nebula-common/blob/master/src/common/clients/meta/MetaClient.cpp)。 From a20e836303dfd169d3f69f33551553a614f28de4 Mon Sep 17 00:00:00 2001 From: "abby.huang" <78209557+abby-cyber@users.noreply.github.com> Date: Thu, 9 Dec 2021 12:19:12 +0800 Subject: [PATCH 21/64] Update 2.import-cluster.md (#1300) locate the service according to the process name instead of the installation path --- .../3.create-import-dashboard/2.import-cluster.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs-2.0/nebula-dashboard-ent/3.create-import-dashboard/2.import-cluster.md b/docs-2.0/nebula-dashboard-ent/3.create-import-dashboard/2.import-cluster.md index 597add5f5f..5ac4595f35 100644 --- a/docs-2.0/nebula-dashboard-ent/3.create-import-dashboard/2.import-cluster.md +++ b/docs-2.0/nebula-dashboard-ent/3.create-import-dashboard/2.import-cluster.md @@ -6,8 +6,8 @@ !!! caution - - 在同一集群下,服务需要统一版本。不支持在同一集群中导入不同版本的 Nebula Graph 实例。 - - Nebula Graph 的安装路径需要为默认安装路径`/usr/local`。 + 在同一集群下,服务需要统一版本。不支持在同一集群中导入不同版本的 Nebula Graph 实例。 + 1. 在各个服务的配置文件中,将`_server_addrs`和`local_ip`中的IP地址改为本机的IP地址,然后启动服务。 From fdb74dd34554417c55312a0013b50a5b5d581842 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Fri, 10 Dec 2021 09:50:50 +0800 Subject: [PATCH 22/64] schema support Chinese (#1310) * schema support Chinese * Update keywords-and-reserved-words.md * Update 1.create-tag.md * update * Update 1.create-tag.md * Update 1.create-edge.md * Update 1.create-native-index.md * Update 1.create-space.md --- .../1.nGQL-overview/keywords-and-reserved-words.md | 5 ++++- docs-2.0/3.ngql-guide/10.tag-statements/1.create-tag.md | 2 +- .../3.ngql-guide/11.edge-type-statements/1.create-edge.md | 2 +- .../14.native-index-statements/1.create-native-index.md | 2 +- docs-2.0/3.ngql-guide/9.space-statements/1.create-space.md | 4 ++-- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/docs-2.0/3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md b/docs-2.0/3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md index f5a773fb87..51f91912c2 100644 --- a/docs-2.0/3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md +++ b/docs-2.0/3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md @@ -2,7 +2,7 @@ 关键字在 nGQL 中有重要意义,分为保留关键字和非保留关键字。 -非保留关键字作为标识符时可以不使用引号。保留关键字作为标识符时,需要用反引号(\`)将它们括起来,例如 \`AND\`。 +非保留关键字作为标识符时可以不使用引号。保留关键字作为标识符时,需要用反引号(\`)包围,例如 \`AND\`。 !!! Note @@ -17,6 +17,9 @@ Execution succeeded nebula> CREATE TAG SPACE(name string); Execution succeeded + +nebula> CREATE TAG 中文(简体 string); +Execution succeeded ``` - `TAG`是保留关键字,要将`TAG`作为标识符,用户必须使用反引号(\`)括起来。 diff --git a/docs-2.0/3.ngql-guide/10.tag-statements/1.create-tag.md b/docs-2.0/3.ngql-guide/10.tag-statements/1.create-tag.md index 2295bfef21..36275c6fdd 100644 --- a/docs-2.0/3.ngql-guide/10.tag-statements/1.create-tag.md +++ b/docs-2.0/3.ngql-guide/10.tag-statements/1.create-tag.md @@ -31,7 +31,7 @@ CREATE TAG [IF NOT EXISTS] |参数|说明| |:---|:---| |`IF NOT EXISTS`|检测待创建的 Tag 是否存在,只有不存在时,才会创建 Tag。仅检测 Tag 的名称,不会检测具体属性。| -|``|每个图空间内的 Tag 必须是唯一的。Tag 名称设置后无法修改。Tag 名称由大小写英文字母、数字或下划线组成,区分大写小,且不可使用[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| +|``|每个图空间内的 Tag 必须是唯一的。Tag 名称设置后无法修改。Tag 名称支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用保留关键字时,需要用反引号(\`)包围,详情参见[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| |``|属性名称。每个 Tag 中的属性名称必须唯一。属性的命名规则与 Tag 相同。| |``|属性的数据类型,目前支持[数值](../3.data-types/1.numeric.md)、[布尔](../3.data-types/2.boolean.md)、[字符串](../3.data-types/3.string.md)以及[日期与时间](../3.data-types/4.date-and-time.md)。| |`NULL \| NOT NULL`|指定属性值是否支持为`NULL`。默认值为`NULL`。| diff --git a/docs-2.0/3.ngql-guide/11.edge-type-statements/1.create-edge.md b/docs-2.0/3.ngql-guide/11.edge-type-statements/1.create-edge.md index a966ad87df..808cd9ba3c 100644 --- a/docs-2.0/3.ngql-guide/11.edge-type-statements/1.create-edge.md +++ b/docs-2.0/3.ngql-guide/11.edge-type-statements/1.create-edge.md @@ -31,7 +31,7 @@ CREATE EDGE [IF NOT EXISTS] |参数|说明| |:---|:---| |`IF NOT EXISTS`|检测待创建的 Edge type 是否存在,只有不存在时,才会创建 Edge type。仅检测 Edge type 的名称,不会检测具体属性。| -|``|每个图空间内的 Edge type 必须是唯一的。Edge type 名称设置后无法修改。Edge type 名称由大小写英文字母、数字或下划线组成,区分大写小,且不可使用[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| +|``|每个图空间内的 Edge type 必须是唯一的。Edge type 名称设置后无法修改。Edge type 名称支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用保留关键字时,需要用反引号(\`)包围,详情参见[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| |``|属性名称。每个 Edge type 中的属性名称必须唯一。属性的命名规则与 Edge type 相同。| |``|属性的数据类型,目前支持[数值](../3.data-types/1.numeric.md)、[布尔](../3.data-types/2.boolean.md)、[字符串](../3.data-types/3.string.md)以及[日期与时间](../3.data-types/4.date-and-time.md)。| |`NULL \| NOT NULL`|指定属性值是否支持为`NULL`。默认值为`NULL`。| diff --git a/docs-2.0/3.ngql-guide/14.native-index-statements/1.create-native-index.md b/docs-2.0/3.ngql-guide/14.native-index-statements/1.create-native-index.md index 94cd1d72d5..49bd6bb65b 100644 --- a/docs-2.0/3.ngql-guide/14.native-index-statements/1.create-native-index.md +++ b/docs-2.0/3.ngql-guide/14.native-index-statements/1.create-native-index.md @@ -74,7 +74,7 @@ CREATE {TAG | EDGE} INDEX [IF NOT EXISTS] ON { | `|索引名。索引名在一个图空间中必须是唯一的。推荐的命名方式为`i_tagName_propName`。索引名称由大小写英文字母、数字或下划线组成,区分大写小,且不可使用[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| +|``|索引名。索引名在一个图空间中必须是唯一的。推荐的命名方式为`i_tagName_propName`。索引名称支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用保留关键字时,需要用反引号(\`)包围,详情参见[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| |` \| `|指定索引关联的 Tag 或 Edge 名称。| |``|为**变长**字符串属性创建索引时,必须用`prop_name(length)`指定索引长度;为 Tag 或 Edge type 本身创建索引时,忽略``。| |`COMMENT`|索引的描述。最大为 256 字节。默认无描述。| diff --git a/docs-2.0/3.ngql-guide/9.space-statements/1.create-space.md b/docs-2.0/3.ngql-guide/9.space-statements/1.create-space.md index 99f109f2fa..84303e5f14 100644 --- a/docs-2.0/3.ngql-guide/9.space-statements/1.create-space.md +++ b/docs-2.0/3.ngql-guide/9.space-statements/1.create-space.md @@ -23,7 +23,7 @@ CREATE SPACE [IF NOT EXISTS] ( |参数|说明| |:---|:---| |`IF NOT EXISTS`|检测待创建的图空间是否存在,只有不存在时,才会创建图空间。仅检测图空间的名称,不会检测具体属性。| -|``|在 Nebula Graph 实例中唯一标识一个图空间。图空间名称由大小写英文字母、数字或下划线组成,区分大写小,且不可使用[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| +|``|在 Nebula Graph 实例中唯一标识一个图空间。图空间名称支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用保留关键字时,需要用反引号(\`)包围,详情参见[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| |`partition_num`|指定图空间的分片数量。建议设置为 5 倍的集群硬盘数量。例如集群中有 3 个硬盘,建议设置 15 个分片。默认值为 100。| |`replica_factor`|指定每个分片的副本数量。建议在生产环境中设置为 3,在测试环境中设置为 1。由于需要基于多数表决,副本数量必须是**奇数**。默认值为 1。| |`vid_type`|必选参数。指定点 ID 的数据类型。可选值为`FIXED_STRING()`和`INT64`。`INT`等同于`INT64`。`FIXED_STRING()`表示数据类型为字符串,最大长度为`N`,超出长度会报错;`INT64`表示数据类型为整数。| @@ -58,7 +58,7 @@ CREATE SPACE AS ; |参数|说明| |:---|:---| -|``|目标图空间名称。该图空间必须未创建。图空间名称由大小写英文字母、数字或下划线组成,区分大写小,且不可使用[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。创建时会克隆``图空间的 Schema,包括图空间本身参数(分片数量、副本数量等),以及 Tag、Edge type 和原生索引。| +|``|目标图空间名称。该图空间必须未创建。图空间名称支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用保留关键字时,需要用反引号(\`)包围,详情参见[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。创建时会克隆``图空间的 Schema,包括图空间本身参数(分片数量、副本数量等),以及 Tag、Edge type 和原生索引。| |``|原始图空间名称。该图空间必须已存在。| ## 示例 From a0f5f9ebfcbb7517a922ba816b1f15dbc252fe02 Mon Sep 17 00:00:00 2001 From: "abby.huang" <78209557+abby-cyber@users.noreply.github.com> Date: Fri, 10 Dec 2021 11:24:02 +0800 Subject: [PATCH 23/64] Update learning-path.png (#1313) --- docs-2.0/20.appendix/learning-path.png | Bin 64364 -> 122035 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-2.0/20.appendix/learning-path.png b/docs-2.0/20.appendix/learning-path.png index cf504b7edac24b6f45b63916ef85ecddfa6ab147..52b7bff61300b7629d784f4e5fae6114c5477fc6 100644 GIT binary patch literal 122035 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

2r|6tk-tCilhHJXl2^}Fd5 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 literal 64364 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 G5~3@w4Zz4?DEe*-WY^L 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 From 8121666a0056752682e6753151df20c2858877c6 Mon Sep 17 00:00:00 2001 From: "abby.huang" <78209557+abby-cyber@users.noreply.github.com> Date: Fri, 10 Dec 2021 14:00:39 +0800 Subject: [PATCH 24/64] Abby cyber pic fix (#1316) * Update 3.manage-snapshot.md (#1158) Update 3.manage-snapshot.md (#1156) * Update learning-path.png * Update learning-path.png Co-authored-by: Romi --- docs-2.0/20.appendix/learning-path.png | Bin 122035 -> 54376 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs-2.0/20.appendix/learning-path.png b/docs-2.0/20.appendix/learning-path.png index 52b7bff61300b7629d784f4e5fae6114c5477fc6..9eef99cd371096f11ce7de468242a5b6e4741458 100644 GIT binary patch literal 54376 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
=^Pp%&F)-Yv?@OJx5q&*?E5TrP8Pw7 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

2r|6tk-tCilhHJXl2^}Fd5 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 From c4ee4fc483a6566e0aee941be7ab3d26d6a05e41 Mon Sep 17 00:00:00 2001 From: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> Date: Tue, 14 Dec 2021 12:11:22 +0800 Subject: [PATCH 25/64] Release Exchange-Ent 2.6.1 (#1318) * Release Exchange-Ent 2.6.1 * Update mkdocs.yml * Update mkdocs.yml --- docs-2.0/20.appendix/6.eco-tool-version.md | 2 +- .../about-exchange/ex-ug-what-is-exchange.md | 6 +++--- .../use-exchange/ex-ug-export-from-nebula.md | 4 ---- mkdocs.yml | 4 ++-- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/docs-2.0/20.appendix/6.eco-tool-version.md b/docs-2.0/20.appendix/6.eco-tool-version.md index 9e31c6c8fa..3694efc05f 100644 --- a/docs-2.0/20.appendix/6.eco-tool-version.md +++ b/docs-2.0/20.appendix/6.eco-tool-version.md @@ -81,7 +81,7 @@ Nebula Exchange(简称 Exchange)是一款 Apache Spark™ 应用,用 |Nebula Graph 版本|Exchange 社区版版本(commit id)|Exchange 企业版版本(commit id)| |:---|:---|:--| -| {{ nebula.release }} | {{exchange.release}}(e6d8601) |{{exchange_ent.release}}(9c54c97) | +| {{ nebula.release }} | {{exchange.release}}(e6d8601) |{{exchange_ent.release}}(8712390) | ## Nebula Operator diff --git a/docs-2.0/nebula-exchange/about-exchange/ex-ug-what-is-exchange.md b/docs-2.0/nebula-exchange/about-exchange/ex-ug-what-is-exchange.md index 5b637cfa64..7c6dcc0a7c 100644 --- a/docs-2.0/nebula-exchange/about-exchange/ex-ug-what-is-exchange.md +++ b/docs-2.0/nebula-exchange/about-exchange/ex-ug-what-is-exchange.md @@ -8,7 +8,7 @@ Exchange 由 Reader、Processor 和 Writer 三部分组成。Reader 读取不同 ## 版本系列 -Exchange 有社区版和企业版两个系列。社区版在 [GitHub](https://github.com/vesoft-inc/nebula-exchange) 开源开发,企业版除了支持社区版的功能,还增加了额外的特性,详情参见[版本对比](https://nebula-graph.com.cn/pricing/)。 +Exchange 有社区版和企业版两个系列,二者功能不同。社区版在 [GitHub](https://github.com/vesoft-inc/nebula-exchange) 开源开发,企业版属于 Nebula Graph 企业套餐,详情参见[版本对比](https://nebula-graph.com.cn/pricing/)。 ## 适用场景 @@ -76,9 +76,9 @@ Exchange {{exchange.release}} 支持将以下格式或来源的数据转换为 N - 发布/订阅消息平台:[Apache Pulsar 2.4.5](../use-exchange/ex-ug-import-from-pulsar.md) -除了用 nGQL 语句的形式导入数据,Exchange 还支持将数据源的数据生成 SST 文件,然后通过 Console[导入 SST 文件](../use-exchange/ex-ug-import-from-sst.md)。 +除了用 nGQL 语句的形式导入数据,Exchange 还支持将数据源的数据生成 SST 文件,然后通过 Console [导入 SST 文件](../use-exchange/ex-ug-import-from-sst.md)。 -此外,企业版 Exchange 还支持以 Nebula Graph 为源,将数据[导出到 CSV 文件](../use-exchange/ex-ug-export-from-nebula.md)。 +此外,企业版 Exchange 支持以 Nebula Graph 为源,将数据[导出到 CSV 文件](../use-exchange/ex-ug-export-from-nebula.md)。 ## 更新说明 diff --git a/docs-2.0/nebula-exchange/use-exchange/ex-ug-export-from-nebula.md b/docs-2.0/nebula-exchange/use-exchange/ex-ug-export-from-nebula.md index e21c69675e..bc8078550a 100644 --- a/docs-2.0/nebula-exchange/use-exchange/ex-ug-export-from-nebula.md +++ b/docs-2.0/nebula-exchange/use-exchange/ex-ug-export-from-nebula.md @@ -6,10 +6,6 @@ 仅企业版 Exchange 支持导出 Nebula Graph 数据到 CSV 文件。 -!!! note - - 导出 Nebula Graph 数据时不支持 SSL 加密传输。 - ## 环境准备 本示例在 Linux 系统的虚拟机环境下完成,导出数据前准备的软硬件信息如下。 diff --git a/mkdocs.yml b/mkdocs.yml index 85167f8ec9..559a557a83 100755 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -63,8 +63,8 @@ extra: base100: 1.0.0 release: 2.1.0 exchange_ent: - release: 2.6.0 - branch: v2.6 + release: 2.6.1 + branch: v2.6.1 exchange: release: 2.6.1 branch: v2.6 From 8cae8aa8aaa35ee6b60da762aff9c423befd00f2 Mon Sep 17 00:00:00 2001 From: Steam Date: Wed, 15 Dec 2021 11:48:52 +0800 Subject: [PATCH 26/64] mod: modify company case (#1325) --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 559a557a83..7e8573e582 100755 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -531,7 +531,7 @@ plugins: # - '.*\.(tmp|bin|tar)$' - with-pdf: - copyright: 2021 Vesoft Inc. + copyright: 2021 vesoft Inc. cover_subtitle: master sinnce 2.6.1 author: 吴敏,周瑶,梁振亚,杨怡璇,黄凤仙 cover: true From 835f430143de80e30aa2bbe6d774cde19f556136 Mon Sep 17 00:00:00 2001 From: "min.wu" <50101159+whitewum@users.noreply.github.com> Date: Wed, 15 Dec 2021 12:32:45 +0800 Subject: [PATCH 27/64] Update 2.graph-modeling.md --- docs-2.0/8.service-tuning/2.graph-modeling.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs-2.0/8.service-tuning/2.graph-modeling.md b/docs-2.0/8.service-tuning/2.graph-modeling.md index dd22eacf0d..dd2a2ec7e5 100644 --- a/docs-2.0/8.service-tuning/2.graph-modeling.md +++ b/docs-2.0/8.service-tuning/2.graph-modeling.md @@ -104,11 +104,11 @@ nebula> MATCH (v1:player)-[e:temp]->() return collect(e.tmp); 为边创建属性时请勿使用长文本:这些属性会被[存储 2 份](../1.introduction/3.nebula-graph-architecture/4.storage-service.md),导致写入放大问题(write amplification)。此时建议将长文本放在 HBase/ES 中,将其地址存放在 Nebula Graph 中。 -## 不能支持动态图(时序图) +## 关于支持动态图(时序图) 在某些场景下,图需要同时带有时序信息,以描述整个图的结构随着时间变化的情况 [^twitter]。 -Nebula Graph {{ nebula.release }} 的边可以使用 Rank 字段存放时间信息 (int64),但是点上没有字段可以存放时间信息(存放在属性会被新写入覆盖)。因此不能支持动态时序图。 +Nebula Graph {{ nebula.release }} 的边可以使用 Rank 字段存放时间信息 (int64),但是点上没有字段可以存放时间信息(存放在属性会被新写入覆盖)。一个折中的办法是在点上设计自己指向自己的自环,并将时间信息放置在自环上。但 Rank 字段目前缺少 `next()` 语法功能,需要取得全部的 Rank 然后应用程序自己拼接。 ![image](sequence.png) From cace639baf27ee846c618c75fe97841c06f7f41b Mon Sep 17 00:00:00 2001 From: "min.wu" <50101159+whitewum@users.noreply.github.com> Date: Wed, 15 Dec 2021 12:35:00 +0800 Subject: [PATCH 28/64] Update 2.graph-modeling.md --- docs-2.0/8.service-tuning/2.graph-modeling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-2.0/8.service-tuning/2.graph-modeling.md b/docs-2.0/8.service-tuning/2.graph-modeling.md index dd2a2ec7e5..3d9645a4c0 100644 --- a/docs-2.0/8.service-tuning/2.graph-modeling.md +++ b/docs-2.0/8.service-tuning/2.graph-modeling.md @@ -108,7 +108,7 @@ nebula> MATCH (v1:player)-[e:temp]->() return collect(e.tmp); 在某些场景下,图需要同时带有时序信息,以描述整个图的结构随着时间变化的情况 [^twitter]。 -Nebula Graph {{ nebula.release }} 的边可以使用 Rank 字段存放时间信息 (int64),但是点上没有字段可以存放时间信息(存放在属性会被新写入覆盖)。一个折中的办法是在点上设计自己指向自己的自环,并将时间信息放置在自环上。但 Rank 字段目前缺少 `next()` 语法功能,需要取得全部的 Rank 然后应用程序自己拼接。 +Nebula Graph {{ nebula.release }} 的边可以使用 Rank 字段存放时间信息 (int64),但是点上没有字段可以存放时间信息(存放在属性会被新写入覆盖)。一个折中的办法是在点上设计自己指向自己的自环,并将时间信息放置在自环上。但 Rank 字段目前缺少 `next(), pre(), head(), tail(), max(), min(), lessThan(), moreThan()` 等语法功能,需要取得全部的 Rank 然后应用程序自己拼接。 ![image](sequence.png) From 5c5525bc6c6b43bddba5833ca897fb5e549a12dc Mon Sep 17 00:00:00 2001 From: "min.wu" <50101159+whitewum@users.noreply.github.com> Date: Wed, 15 Dec 2021 12:36:18 +0800 Subject: [PATCH 29/64] Update 2.graph-modeling.md --- docs-2.0/8.service-tuning/2.graph-modeling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-2.0/8.service-tuning/2.graph-modeling.md b/docs-2.0/8.service-tuning/2.graph-modeling.md index 3d9645a4c0..0f63401767 100644 --- a/docs-2.0/8.service-tuning/2.graph-modeling.md +++ b/docs-2.0/8.service-tuning/2.graph-modeling.md @@ -108,7 +108,7 @@ nebula> MATCH (v1:player)-[e:temp]->() return collect(e.tmp); 在某些场景下,图需要同时带有时序信息,以描述整个图的结构随着时间变化的情况 [^twitter]。 -Nebula Graph {{ nebula.release }} 的边可以使用 Rank 字段存放时间信息 (int64),但是点上没有字段可以存放时间信息(存放在属性会被新写入覆盖)。一个折中的办法是在点上设计自己指向自己的自环,并将时间信息放置在自环上。但 Rank 字段目前缺少 `next(), pre(), head(), tail(), max(), min(), lessThan(), moreThan()` 等语法功能,需要取得全部的 Rank 然后应用程序自己拼接。 +Nebula Graph {{ nebula.release }} 的边可以使用 Rank 字段存放时间信息 (int64),但是点上没有字段可以存放时间信息(存放在属性会被新写入覆盖)。一个折中的办法是在点上设计自己指向自己的自环,并将时间信息放置在自环上。但 Rank 字段目前缺少 `next(), pre(), head(), tail(), max(), min(), lessThan(), moreThan()` 等语法功能(也不能创建索引加速),需要取得全部的 Rank 然后应用程序自己拼接。 ![image](sequence.png) From c61a39bbed1703eb0eb68498d410bdb4ee517b85 Mon Sep 17 00:00:00 2001 From: "min.wu" <50101159+whitewum@users.noreply.github.com> Date: Wed, 15 Dec 2021 12:48:33 +0800 Subject: [PATCH 30/64] Update 2.graph-modeling.md --- docs-2.0/8.service-tuning/2.graph-modeling.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs-2.0/8.service-tuning/2.graph-modeling.md b/docs-2.0/8.service-tuning/2.graph-modeling.md index 0f63401767..0d0951654c 100644 --- a/docs-2.0/8.service-tuning/2.graph-modeling.md +++ b/docs-2.0/8.service-tuning/2.graph-modeling.md @@ -70,6 +70,8 @@ nebula> MATCH (v1:player)-[e:temp]->() return collect(e.tmp); +----------------+ ``` +对于自环的操作没有封装任何的语法糖,操作方式与普通的边无异。 + ### 广度优先大于深度优先 - Nebula Graph 基于图拓扑结构进行深度图遍历的性能较低,广度优先遍历以及获取属性的性能较好。例如,模型 a 包括姓名、年龄、眼睛颜色三种属性,建议创建一个 Tag`person`,然后为它添加姓名、年龄、眼睛颜色的属性。如果创建一个包含眼睛颜色的 Tag 和一个 Edge type`has`,然后创建一个边用来表示人拥有的眼睛颜色,这种建模方法会降低遍历性能。 From 84e452c40c7817470280cdbb3795106c3d132e62 Mon Sep 17 00:00:00 2001 From: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> Date: Thu, 16 Dec 2021 17:16:05 +0800 Subject: [PATCH 31/64] Update withBatch limit and default (#1322) * Update withBatch limit and default * Update nebula-spark-connector.md * Update nebula-spark-connector.md --- docs-2.0/nebula-spark-connector.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs-2.0/nebula-spark-connector.md b/docs-2.0/nebula-spark-connector.md index fa890c3835..733c3e187b 100644 --- a/docs-2.0/nebula-spark-connector.md +++ b/docs-2.0/nebula-spark-connector.md @@ -171,7 +171,7 @@ val nebulaWriteVertexConfig: WriteNebulaVertexConfig = WriteNebulaVertexConfig .withVidAsProp(true) .withUser("root") .withPasswd("nebula") - .withBatch(1000) + .withBatch(512) .build() df.write.nebula(config, nebulaWriteVertexConfig).writeVertices() @@ -189,7 +189,7 @@ val nebulaWriteEdgeConfig: WriteNebulaEdgeConfig = WriteNebulaEdgeConfig .withRankAsProperty(true) .withUser("root") .withPasswd("nebula") - .withBatch(1000) + .withBatch(512) .build() df.write.nebula(config, nebulaWriteEdgeConfig).writeEdges() ``` @@ -208,7 +208,7 @@ val nebulaWriteVertexConfig = WriteNebulaVertexConfig .withTag("person") .withVidField("id") .withVidAsProp(true) - .withBatch(1000) + .withBatch(512) .withWriteMode(WriteMode.UPDATE) .build() df.write.nebula(config, nebulaWriteVertexConfig).writeVertices() @@ -233,7 +233,7 @@ df.write.nebula(config, nebulaWriteVertexConfig).writeVertices() |`withVidAsProp` |否| DataFrame 中作为点 ID 的列是否也作为属性写入。默认值为`false`。如果配置为`true`,请确保 Tag 中有和`VidField`相同的属性名。 | |`withUser` |否| Nebula Graph 用户名。若未开启[身份验证](7.data-security/1.authentication/1.authentication.md),无需配置用户名和密码。 | |`withPasswd` |否| Nebula Graph 用户名对应的密码。 | - |`withBatch` |是| 一次写入的数据行数。默认值为`1000`. | + |`withBatch` |是| 一次写入的数据行数,默认值为`512`。当`withWriteMode`为`update`时,该参数的最大值为`512`。 | |`withWriteMode`|否|写入模式。可选值为`insert`和`update`。默认为`insert`。| - `WriteNebulaEdgeConfig`是写入边的配置,说明如下。 @@ -252,7 +252,7 @@ df.write.nebula(config, nebulaWriteVertexConfig).writeVertices() |`withRankAsProperty` |否| DataFrame 中作为 rank 的列是否也作为属性写入。默认值为`false`。如果配置为`true`,请确保 Edge type 中有和`RankField`相同的属性名。 | |`withUser` |否| Nebula Graph 用户名。若未开启[身份验证](7.data-security/1.authentication/1.authentication.md),无需配置用户名和密码。 | |`withPasswd` |否| Nebula Graph 用户名对应的密码。 | - |`withBatch` |是| 一次写入的数据行数。默认值为`1000`. | + |`withBatch` |是| 一次写入的数据行数,默认值为`512`。当`withWriteMode`为`update`时,该参数的最大值为`512`。 | |`withWriteMode`|否|写入模式。可选值为`insert`和`update`。默认为`insert`。| ### 示例代码 From 031a4a20b26d7b5921f16b1a082357e48f86f4a6 Mon Sep 17 00:00:00 2001 From: "abby.huang" <78209557+abby-cyber@users.noreply.github.com> Date: Thu, 16 Dec 2021 17:18:29 +0800 Subject: [PATCH 32/64] Update 8.faq.md (#1324) --- docs-2.0/nebula-dashboard-ent/8.faq.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs-2.0/nebula-dashboard-ent/8.faq.md b/docs-2.0/nebula-dashboard-ent/8.faq.md index dae8adb236..d49a25541a 100644 --- a/docs-2.0/nebula-dashboard-ent/8.faq.md +++ b/docs-2.0/nebula-dashboard-ent/8.faq.md @@ -44,3 +44,8 @@ Meta 服务主要存储 Nebula Graph 数据库中的元数据。一旦 Meta 服 ## 是否可以手动添加 Nebula Graph 安装包? Dashboard 支持手动添加安装包,可以点击[如何获取 Nebula Graph](https://nebula-graph.com.cn/download/) 下载所需系统和版本的 RPM 包或 DEB 包,添加到`dashboard/download/nebula-graph`路径下。在创建、扩容集群时,可选择添加的包进行部署。 + + +## 为什么导入集群时,提示“权限不足”? + +导入集群的时候,需要访问服务安装的路径。如果操作服务的账号没有访问权限的话,无法成功导入集群。用户可授予操作账号访问服务的权限,然后使用操作账号重启服务。 \ No newline at end of file From 5f1ecb3d566fd9a5c4b0f692c3e9e81c19b0ea42 Mon Sep 17 00:00:00 2001 From: Steam Date: Thu, 16 Dec 2021 17:21:05 +0800 Subject: [PATCH 33/64] add: add exchange faq tips (#1327) * add: add exchange faq tips * Update docs-2.0/nebula-exchange/ex-ug-FAQ.md Co-authored-by: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> * Update docs-2.0/nebula-exchange/ex-ug-FAQ.md Co-authored-by: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> * Update docs-2.0/nebula-exchange/ex-ug-FAQ.md Co-authored-by: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> * mod: modify format * mod: modify exchange faq format * Update ex-ug-FAQ.md Co-authored-by: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> --- docs-2.0/nebula-exchange/ex-ug-FAQ.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs-2.0/nebula-exchange/ex-ug-FAQ.md b/docs-2.0/nebula-exchange/ex-ug-FAQ.md index df8f2bc4f1..40867bfd3c 100644 --- a/docs-2.0/nebula-exchange/ex-ug-FAQ.md +++ b/docs-2.0/nebula-exchange/ex-ug-FAQ.md @@ -116,6 +116,31 @@ nebula-exchange-2.0.0.jar \ -c application.conf ``` +### Q:Hive 数据导入时提示 schema 版本不一致 + +Spark 日志提示 `Hive Schema version 1.2.0 does not match metastore's schema version 2.1.0 Metastore is not upgraded or corrupt` 的原因是 Hive 环境中配置的 metastore schema 版本和 Spark 使用的 metastore 版本不一致。 + +解决方法: + +1. 将 Hive 环境中存储 Hive metastore 信息的 MySQL version 信息更新为 Spark 中使用的 metastore 版本。 + + 假设 Hive 在 MySQL 中存储 metastore 的数据库是`hive`,需要按如下方式修改 `hive.VERSION` 表中的 `version` 字段: + + ``` + update hive.VERSION set SCHEMA_VERSION="2.1.0" where VER_ID=1 + ``` + +2. 在 Hive 环境的 `hive-site.xml` 文件中增加如下配置: + + ``` + + hive.metastore.schema.verification + false + + ``` + +3. 重启 Hive。 + ## 配置问题 ### Q:哪些配置项影响导入性能? From 3112441ecfddf8c64d6d258605440cc338ff2edd Mon Sep 17 00:00:00 2001 From: Anqi Date: Thu, 16 Dec 2021 17:22:09 +0800 Subject: [PATCH 34/64] Update ex-ug-import-from-sst.md (#1328) --- .../nebula-exchange/use-exchange/ex-ug-import-from-sst.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-sst.md b/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-sst.md index b7aa1e0cb9..8160c66674 100644 --- a/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-sst.md +++ b/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-sst.md @@ -443,12 +443,12 @@ SST 文件是一个内部包含了任意长度的有序键值对集合的文件 运行如下命令将 CSV 源文件生成为 SST 文件。关于参数的说明,请参见[命令参数](../parameter-reference/ex-ug-para-import-command.md)。 ```bash -${SPARK_HOME}/bin/spark-submit --master "local" --conf spark.sql.shuffle.partition= --class com.vesoft.nebula.exchange.Exchange -c +${SPARK_HOME}/bin/spark-submit --master "local" --conf spark.sql.shuffle.partitions= --class com.vesoft.nebula.exchange.Exchange -c ``` !!! note - 生成 SST 文件时,会涉及到 Spark 的 shuffle 操作,请注意在提交命令中增加`spark.sql.shuffle.partition`的配置。 + 生成 SST 文件时,会涉及到 Spark 的 shuffle 操作,请注意在提交命令中增加`spark.sql.shuffle.partitions`的配置。 !!! note @@ -457,7 +457,7 @@ ${SPARK_HOME}/bin/spark-submit --master "local" --conf spark.sql.shuffle.partiti 示例: ```bash -${SPARK_HOME}/bin/spark-submit --master "local" --conf spark.sql.shuffle.partition=200 --class com.vesoft.nebula.exchange.Exchange /root/nebula-exchange/nebula-exchange/target/nebula-exchange-{{exchange.release}}.jar -c /root/nebula-exchange/nebula-exchange/target/classes/sst_application.conf +${SPARK_HOME}/bin/spark-submit --master "local" --conf spark.sql.shuffle.partitions=200 --class com.vesoft.nebula.exchange.Exchange /root/nebula-exchange/nebula-exchange/target/nebula-exchange-{{exchange.release}}.jar -c /root/nebula-exchange/nebula-exchange/target/classes/sst_application.conf ``` 任务执行完成后,可以在 HDFS 上的`/sst`目录(`nebula.path.remote`参数指定)内查看到生成的 SST 文件。 From 2c792945202e6a7b16464011396162c224310111 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Fri, 17 Dec 2021 10:20:47 +0800 Subject: [PATCH 35/64] bison datetime parser (#1330) --- docs-2.0/3.ngql-guide/3.data-types/4.date-and-time.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs-2.0/3.ngql-guide/3.data-types/4.date-and-time.md b/docs-2.0/3.ngql-guide/3.data-types/4.date-and-time.md index 78e371df10..073b538b1c 100644 --- a/docs-2.0/3.ngql-guide/3.data-types/4.date-and-time.md +++ b/docs-2.0/3.ngql-guide/3.data-types/4.date-and-time.md @@ -12,14 +12,18 @@ - 函数`date()`、`time()`和`datetime()`可以用属性名称获取自身的某一个具体属性值,例如`date().month`获取当前月份、`time("02:59:40").minute`获取传入时间的分钟数。 +- 函数`date()`、`time()`和`datetime()`可以指定时区进行转换,例如`datetime("2017-03-04 22:30:40.003000+08:00")`或`datetime("2017-03-04T22:30:40.003000[Asia/Shanghai]")`。 + ## openCypher 兼容性 -- 支持年、月、日、时、分、秒,不支持毫秒。 +- 支持年、月、日、时、分、秒、毫秒、微秒,不支持纳秒。 - 不支持函数`localdatetime()`和`duration()`。 - 不支持大部分字符串时间格式,支持`YYYY-MM-DDThh:mm:ss`和`YYYY-MM-DD hh:mm:ss`。 +- 支持单个数字的字符串时间格式,例如`time("1:1:1")`。 + ## DATE `DATE`包含日期,但是不包含时间。Nebula Graph 检索和显示`DATE`的格式为`YYYY-MM-DD`。支持的范围是`-32768-01-01`到`32767-12-31`。 @@ -83,7 +87,7 @@ 2. 插入点,名称为`test1`。 ```ngql - nebula> INSERT VERTEX date1(p1, p2, p3) VALUES "test1":(date("2021-03-17"), time("17:53:59"), datetime("2021-03-17T17:53:59")); + nebula> INSERT VERTEX date1(p1, p2, p3) VALUES "test1":(date("2021-03-17"), time("17:53:59"), datetime("2017-03-04T22:30:40.003000[Asia/Shanghai]")); ``` 3. 获取`test1`的属性`p1`的月份。 From 1d91af4a596ce128657d0f82c7409e577c3ebe84 Mon Sep 17 00:00:00 2001 From: foesa <35463247+foesa-yang@users.noreply.github.com> Date: Fri, 17 Dec 2021 10:21:00 +0800 Subject: [PATCH 36/64] Update st-ug-create-schema.md (#1331) --- .../quick-start/st-ug-create-schema.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs-2.0/nebula-studio/quick-start/st-ug-create-schema.md b/docs-2.0/nebula-studio/quick-start/st-ug-create-schema.md index 938e797ff2..d3b1e13290 100644 --- a/docs-2.0/nebula-studio/quick-start/st-ug-create-schema.md +++ b/docs-2.0/nebula-studio/quick-start/st-ug-create-schema.md @@ -43,29 +43,29 @@ 3. 在命令行中,依次输入以下语句,并点击 ![表示运行的图标](../figs/st-ug-008.png "Run 图标") 图标。 ```nGQL - -- 创建 Tag player,带有 2 个属性 + // 创建 Tag player,带有 2 个属性 CREATE TAG player(name string, age int); - -- 创建 Tag team,带有 1 个属性 + // 创建 Tag team,带有 1 个属性 CREATE TAG team(name string); - -- 创建 Edge type follow,带有 1 个属性 + // 创建 Edge type follow,带有 1 个属性 CREATE EDGE follow(degree int); - -- 创建 Edge type serve,带有 2 个属性 + // 创建 Edge type serve,带有 2 个属性 CREATE EDGE serve(start_year int, end_year int); ``` 至此,用户已经完成了 Schema 创建。用户可以运行以下语句查看 Tag 与 Edge type 的定义是否正确、完整。 ```nGQL --- 列出当前图空间中所有 Tag +// 列出当前图空间中所有 Tag SHOW TAGS; --- 列出当前图空间中所有 Edge type +// 列出当前图空间中所有 Edge type SHOW EDGES; --- 查看每种 Tag 和 Edge type 的结构是否正确 +// 查看每种 Tag 和 Edge type 的结构是否正确 DESCRIBE TAG player; DESCRIBE TAG team; DESCRIBE EDGE follow; From edd47a180b9b6424fd821dae411260b4f680203c Mon Sep 17 00:00:00 2001 From: "abby.huang" <78209557+abby-cyber@users.noreply.github.com> Date: Wed, 22 Dec 2021 14:02:17 +0800 Subject: [PATCH 37/64] Access changed to license (#1334) * license access change * Update ex-ug-deploy.md * update * Update docs-2.0/nebula-explorer/deploy-connect/ex-ug-deploy.md * Update docs-2.0/nebula-explorer/deploy-connect/ex-ug-deploy.md --- .../2.deploy-connect-dashboard-ent.md | 2 +- .../deploy-connect/ex-ug-deploy.md | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/docs-2.0/nebula-dashboard-ent/2.deploy-connect-dashboard-ent.md b/docs-2.0/nebula-dashboard-ent/2.deploy-connect-dashboard-ent.md index 673e02a7ea..9b9a602563 100644 --- a/docs-2.0/nebula-dashboard-ent/2.deploy-connect-dashboard-ent.md +++ b/docs-2.0/nebula-dashboard-ent/2.deploy-connect-dashboard-ent.md @@ -26,7 +26,7 @@ !!! enterpriseonly - License 仅在企业版提供,请发送邮件至 inquiry@vesoft.com。 + License 仅在企业版提供,申请 License 需填写 [Nebula Dashboard 试用申请](https://wj.qq.com/s2/9437467/b3b1)。 ## 安装及启动 diff --git a/docs-2.0/nebula-explorer/deploy-connect/ex-ug-deploy.md b/docs-2.0/nebula-explorer/deploy-connect/ex-ug-deploy.md index 0d6e0bebe2..f65ee2de77 100644 --- a/docs-2.0/nebula-explorer/deploy-connect/ex-ug-deploy.md +++ b/docs-2.0/nebula-explorer/deploy-connect/ex-ug-deploy.md @@ -33,6 +33,11 @@ - 使用的 Linux 发行版为 CentOS。 - 安装有版本为 1.13 及以上的 Go。 +- 准备 License。 + + !!! enterpriseonly + + License 仅在企业版提供,申请 License 需填写 [Nebula Explorer 试用申请](https://wj.qq.com/s2/9414111/81f4)。 ### 安装 @@ -66,10 +71,6 @@ $ cp -r nebula.license /usr/local/nebula-explorer ``` - !!! enterpriseonly - - License 仅在企业版提供,请发送邮件至 inquiry@vesoft.com。 - 4. 添加 License 后需要使用以下命令停止并重启服务。 ```bash @@ -119,6 +120,11 @@ $ sudo rpm -e nebula-explorer-.x86_64 - 使用的 Linux 发行版为 CentOS。 - 安装有版本为 1.13 及以上的 Go。 +- 准备 License。 + + !!! enterpriseonly + + License 仅在企业版提供,申请 License 需填写 [Nebula Explorer 试用申请](https://wj.qq.com/s2/9414111/81f4)。 ### 安装及部署 @@ -145,10 +151,6 @@ $ sudo rpm -e nebula-explorer-.x86_64 $ cp -r nebula.license /usr/local/nebula-explorer ``` - !!! enterpriseonly - - License 仅在企业版提供,请发送邮件至 inquiry@vesoft.com。 - 4. 进入`nebula-explorer`文件夹,启动 explorer。 ```bash From 78942947424d90f750d8958afd2cd01d54b8d4e8 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Wed, 22 Dec 2021 14:31:34 +0800 Subject: [PATCH 38/64] add duration (#1335) * add duration * Update 4.date-and-time.md * Update docs-2.0/3.ngql-guide/3.data-types/4.date-and-time.md Co-authored-by: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> Co-authored-by: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> --- .../3.data-types/4.date-and-time.md | 38 ++++++++++++++----- .../3.date-and-time.md | 13 ++----- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/docs-2.0/3.ngql-guide/3.data-types/4.date-and-time.md b/docs-2.0/3.ngql-guide/3.data-types/4.date-and-time.md index 073b538b1c..d322200385 100644 --- a/docs-2.0/3.ngql-guide/3.data-types/4.date-and-time.md +++ b/docs-2.0/3.ngql-guide/3.data-types/4.date-and-time.md @@ -1,24 +1,26 @@ # 日期和时间类型 -本文介绍日期和时间的类型,包括`DATE`、`TIME`、`DATETIME`和`TIMESTAMP`。 +本文介绍日期和时间的类型,包括`DATE`、`TIME`、`DATETIME`、`TIMESTAMP`和`DURATION`。 -在插入时间类型的属性值时,Nebula Graph 会根据[配置文件](../../5.configurations-and-logs/1.configurations/1.configurations.md)中`timezone_name`参数指定的时区,将该时间值(`TIMESTAMP`类型例外)转换成相应的世界协调时间(UTC)时间。在查询中返回的时间类型值为 UTC 时间。 +## 注意事项 -!!! Note +- 在插入时间类型的属性值时,Nebula Graph 会根据[配置文件](../../5.configurations-and-logs/1.configurations/1.configurations.md)中`timezone_name`参数指定的时区,将该`DATE`、`TIME`、`DATETIME`转换成相应的世界协调时间(UTC)时间。 - 如需修改当前时区,请同时修改所有服务的配置文件中的`timezone_name`参数。 + !!! Note -- 函数`date()`、`time()`、`datetime()`和`timestamp()`可以用空值获取当前的日期或时间。 - -- 函数`date()`、`time()`和`datetime()`可以用属性名称获取自身的某一个具体属性值,例如`date().month`获取当前月份、`time("02:59:40").minute`获取传入时间的分钟数。 + 如需修改当前时区,请同时修改所有服务的配置文件中的`timezone_name`参数。 - 函数`date()`、`time()`和`datetime()`可以指定时区进行转换,例如`datetime("2017-03-04 22:30:40.003000+08:00")`或`datetime("2017-03-04T22:30:40.003000[Asia/Shanghai]")`。 +- 函数`date()`、`time()`、`datetime()`和`timestamp()`可以用空值获取当前的日期或时间。 + +- 函数`date()`、`time()`、`datetime()`和`duration()`可以用属性名称获取自身的某一个具体属性值,例如`date().month`获取当前月份、`time("02:59:40").minute`获取传入时间的分钟数。 + ## openCypher 兼容性 - 支持年、月、日、时、分、秒、毫秒、微秒,不支持纳秒。 -- 不支持函数`localdatetime()`和`duration()`。 +- 不支持函数`localdatetime()`。 - 不支持大部分字符串时间格式,支持`YYYY-MM-DDThh:mm:ss`和`YYYY-MM-DD hh:mm:ss`。 @@ -76,6 +78,16 @@ - 底层存储的数据格式为** 64 位 int**。 +## DURATION + +`DURATION`是一段连续的时间,由`years`、`months`、`days`、`hours`、`minutes`、`seconds`六个Key自由组合成的Map类型数据表示。例如`duration({years: 12, months: 5, days: 14, hours: 16, minutes: 12, seconds: 70})`。 + +`DURATION`还有以下特点: + +- 不支持为`DURATION`类型数据创建索引。 + +- 可以用于对指定时间进行计算。 + ## 示例 1. 创建 Tag,名称为`date1`,包含`DATE`、`TIME`和`DATETIME`三种类型。 @@ -129,7 +141,7 @@ nebula> INSERT VERTEX school(name, found_time) VALUES "dut":("dut", timestamp()); ``` -还可以使用`WITH`语句设置具体日期和时间,例如: +还可以使用`WITH`语句设置具体日期时间或进行计算,例如: ```ngql nebula> WITH time({hour: 12, minute: 31, second: 14, millisecond:111, microsecond: 222}) AS d RETURN d; @@ -145,4 +157,12 @@ nebula> WITH date({year: 1984, month: 10, day: 11}) AS x RETURN x + 1; +------------+ | 1984-10-12 | +------------+ + +nebula> WITH date('1984-10-11') as x, duration({years: 12, days: 14, hours: 99, minutes: 12}) as d \ + RETURN x + d AS sum, x - d AS diff; ++------------+------------+ +| sum | diff | ++------------+------------+ +| 1996-10-29 | 1972-09-23 | ++------------+------------+ ``` diff --git a/docs-2.0/3.ngql-guide/6.functions-and-expressions/3.date-and-time.md b/docs-2.0/3.ngql-guide/6.functions-and-expressions/3.date-and-time.md index da74903728..73dd0e3128 100644 --- a/docs-2.0/3.ngql-guide/6.functions-and-expressions/3.date-and-time.md +++ b/docs-2.0/3.ngql-guide/6.functions-and-expressions/3.date-and-time.md @@ -9,22 +9,17 @@ Nebula Graph 支持以下内置日期时间函数。 |date date() | 根据当前系统返回当前日期(UTC 时间)。 | |time time() | 根据当前系统返回当前时间(UTC 时间)。 | |datetime datetime() | 根据当前系统返回当前日期和时间(UTC 时间)。 | +|map duration() | 持续时间。可以用于对指定时间进行计算。 | -`date()`、`time()`和`datetime()`函数除了传入空值获取当前时间或日期,还接受 string 和 map 类型的参数。`timestamp()`函数除了传入空值获取当前时区的时间戳,还接受 string 类型的参数。 - -## openCypher 兼容性 - -- 在 openCypher 中,时间精确到毫秒。 - -- 在 nGQL 中,时间精确到毫秒。微秒数显示为`000`。 +详细信息参见[日期和时间类型](../3.data-types/4.date-and-time.md)。 ## 示例 ```ngql -> RETURN now(), timestamp(), date(), time(), datetime(); +nebula> RETURN now(), timestamp(), date(), time(), datetime(); +------------+-------------+------------+-----------------+----------------------------+ | now() | timestamp() | date() | time() | datetime() | +------------+-------------+------------+-----------------+----------------------------+ -| 1625470028 | 1625470028 | 2021-07-05 | 07:27:07.944000 | 2021-07-05T07:27:07.944000 | +| 1640057560 | 1640057560 | 2021-12-21 | 03:32:40.351000 | 2021-12-21T03:32:40.351000 | +------------+-------------+------------+-----------------+----------------------------+ ``` From a7162c3f66cb8330627e1248953780fcbf9b8760 Mon Sep 17 00:00:00 2001 From: "max.zhu@vesoft.com" <86282370+izhuxiaoqing@users.noreply.github.com> Date: Wed, 22 Dec 2021 14:45:12 +0800 Subject: [PATCH 39/64] Update 6.cheatsheet-for-ngql-command.md (#1337) --- docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md b/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md index 6f53b1153f..26dae8b073 100644 --- a/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md +++ b/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md @@ -15,7 +15,7 @@ | double hypot(double x, double y) | 返回直角三角形(直角边长为 x 和 y)的斜边长。 | | double pow(double x, double y) | 返回$x^y$的值。 | | double exp(double x) | 返回$e^x$的值。 | - | double exp2(double x) | 返回$2^x2$的值。 | + | double exp2(double x) | 返回$2^x$的值。 | | double log(double x) | 返回以自然数 e 为底 x 的对数。 | | double log2(double x) | 返回以 2 为底 x 的对数。 | | double log10(double x) | 返回以 10 为底 x 的对数。 | From 88f9089c1e922ac74b02335cf443eca189091964 Mon Sep 17 00:00:00 2001 From: "abby.huang" <78209557+abby-cyber@users.noreply.github.com> Date: Fri, 24 Dec 2021 13:52:28 +0800 Subject: [PATCH 40/64] Update deploy-license.md (#1341) --- .../4.deployment-and-installation/deploy-license.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs-2.0/4.deployment-and-installation/deploy-license.md b/docs-2.0/4.deployment-and-installation/deploy-license.md index 4d993cd1db..e2f3d75714 100644 --- a/docs-2.0/4.deployment-and-installation/deploy-license.md +++ b/docs-2.0/4.deployment-and-installation/deploy-license.md @@ -1,4 +1,4 @@ -# 设置企业版 License +# 设置 Nebula Graph 企业版 License Nebula Graph 企业版需要用户设置 License 才可以正常启动并使用企业版功能,本文介绍如何设置企业版的 License 文件。 @@ -14,13 +14,13 @@ Nebula Graph 企业版需要用户设置 License 才可以正常启动并使用 - License 快过期时,请及时发送邮件至`inquiry@vesoft.com`申请续期。 -- License 的过期缓冲为 3 天: +- License 的过期缓冲为 7 天: - - 过期 7 天前和过期当天,服务启动时会打印日志进行提醒。 + - 过期 3 天前和过期当天,服务启动时会打印日志进行提醒。 - - 过期后仍可继续使用 3 天。 + - 过期后仍可继续使用 7 天。 - - 过期 3 天后,服务无法启动,并会打印日志进行提醒。 + - 过期 7 天后,服务无法启动,并会打印日志进行提醒。 ## License 说明 From 2ed848b1db27db97f6795dd70991d28da0c0b194 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Tue, 28 Dec 2021 11:36:49 +0800 Subject: [PATCH 41/64] add cypher parameter (#1342) * add cypher parameter * update * update * Update docs-2.0/nebula-console.md Co-authored-by: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> * Update docs-2.0/nebula-console.md Co-authored-by: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> * Update docs-2.0/3.ngql-guide/1.nGQL-overview/1.overview.md Co-authored-by: abby.huang <78209557+abby-cyber@users.noreply.github.com> * Update docs-2.0/nebula-console.md Co-authored-by: abby.huang <78209557+abby-cyber@users.noreply.github.com> * Update nebula-console.md * Update nebula-console.md Co-authored-by: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> Co-authored-by: abby.huang <78209557+abby-cyber@users.noreply.github.com> --- .../1.nGQL-overview/1.overview.md | 2 +- docs-2.0/nebula-console.md | 167 ++++++++++++++++++ .../reuse/source_connect-to-nebula-graph.md | 131 -------------- mkdocs.yml | 2 + 4 files changed, 170 insertions(+), 132 deletions(-) create mode 100644 docs-2.0/nebula-console.md diff --git a/docs-2.0/3.ngql-guide/1.nGQL-overview/1.overview.md b/docs-2.0/3.ngql-guide/1.nGQL-overview/1.overview.md index 4ea2605b33..c702b46414 100644 --- a/docs-2.0/3.ngql-guide/1.nGQL-overview/1.overview.md +++ b/docs-2.0/3.ngql-guide/1.nGQL-overview/1.overview.md @@ -100,7 +100,7 @@ nebula> CREATE TAG IF NOT EXISTS player(name string, age int); |语句|-|不支持 openCypher 9 的所有 DML 语句(如`CREATE`、`MERGE`等),不支持所有的 DCL, 和支持部分 `MATCH` 语法和函数(不支持`OPTIONAL MATCH`,不支持多`MATCH`,不支持 `WHERE` 中使用图 pattern)。 | |语句文本换行 | 换行符 | `\` + 换行符 | |Label 与 Tag 是不同的概念| Label 用于寻找点(点的索引)。 | Tag 用于定义点的一种类型及相应的属性,无索引功能。 | -| 预编译与参数化查询 | 支持 | 不支持 | +| 预编译与参数化查询 | 支持 | 仅支持参数化查询。 | !!! compatibility diff --git a/docs-2.0/nebula-console.md b/docs-2.0/nebula-console.md new file mode 100644 index 0000000000..d5d3018e69 --- /dev/null +++ b/docs-2.0/nebula-console.md @@ -0,0 +1,167 @@ +# Nebula Console + +Nebula Console 是 Nebula Graph 的原生命令行客户端,用于连接 Nebula Graph 集群并执行查询,同时支持管理参数、导出命令的执行结果、导入测试数据集等。 + +使用 Nebula Console 连接 Nebula Graph 请参见[步骤 3:连接 Nebula Graph](2.quick-start/3.connect-to-nebula-graph.md)。 + +!!! note + + 命令不区分大小写。 + +## 管理参数 + +可以保存参数,用于参数化查询。 + +!!! note + + - VID 不支持参数化查询。 + + - `SAMPLE`子句中不支持参数化查询。 + + - 会话释放后,参数不会保留。 + +保存参数命令如下: + +```ngql +nebula> :param => ; +``` + +示例: + +```ngql +nebula> :param p1 => "Tim Duncan"; +nebula> MATCH (v:player{name:$p1})-[:follow]->(n) RETURN v,n; ++----------------------------------------------------+-------------------------------------------------------+ +| v | n | ++----------------------------------------------------+-------------------------------------------------------+ +| ("player100" :player{age: 42, name: "Tim Duncan"}) | ("player125" :player{age: 41, name: "Manu Ginobili"}) | +| ("player100" :player{age: 42, name: "Tim Duncan"}) | ("player101" :player{age: 36, name: "Tony Parker"}) | ++----------------------------------------------------+-------------------------------------------------------+ + +nebula> :param p2 => {"a":3,"b":false,"c":"Tim Duncan"}; +nebula> RETURN $p2.b AS b; ++-------+ +| b | ++-------+ +| false | ++-------+ +``` + +查看当前保存的参数命令如下: + +```ngql +nebula> :params; +``` + +## 导出执行结果 + +导出命令执行的返回结果,可以保存为 CSV 文件或 DOT 文件。 + +!!! note + + - 文件保存在当前工作目录中,即 Linux 命令`pwd`显示的目录。 + + - 命令只对下一条查询语句生效。 + + - DOT 文件的内容可以复制后在 [GraphvizOnline](https://dreampuf.github.io/GraphvizOnline/) 网页中粘贴,生成可视化的执行计划图。 + +- 导出 CSV 文件命令如下: + + ```ngql + nebula> :CSV ; + ``` + +- 导出 DOT 文件命令如下: + + ```ngql + nebula> :dot ; + ``` + + 示例: + + ```ngql + nebula> :dot a.dot; + nebula> PROFILE FORMAT="dot" GO FROM "player100" OVER follow; + ``` + +## 加载测试数据集 + +测试数据集名称为 nba,详细 Schema 信息和数据信息请使用相关`SHOW`命令查看。 + +加载测试数据集命令如下: + +```ngql +nebula> :play nba; +``` + +## 重复执行 + +重复执行下一个命令 N 次,然后打印平均执行时间。命令如下: + +```ngql +nebula> :repeat N; +``` + +示例: + +```ngql +nebula> :repeat 3; +nebula> GO FROM "player100" OVER follow YIELD dst(edge); ++-------------+ +| dst(EDGE) | ++-------------+ +| "player101" | +| "player125" | ++-------------+ +Got 2 rows (time spent 2602/3214 us) + +Fri, 20 Aug 2021 06:36:05 UTC + ++-------------+ +| dst(EDGE) | ++-------------+ +| "player101" | +| "player125" | ++-------------+ +Got 2 rows (time spent 583/849 us) + +Fri, 20 Aug 2021 06:36:05 UTC + ++-------------+ +| dst(EDGE) | ++-------------+ +| "player101" | +| "player125" | ++-------------+ +Got 2 rows (time spent 496/671 us) + +Fri, 20 Aug 2021 06:36:05 UTC + +Executed 3 times, (total time spent 3681/4734 us), (average time spent 1227/1578 us) +``` + +## 睡眠 + +睡眠 N 秒。常用于修改 Schema 的操作中,因为修改 Schema 是异步实现的,需要在下一个心跳周期才同步数据。命令如下: + +```ngql +nebula> :sleep N; +``` + +## 断开连接 + +用户可以使用`:EXIT`或者`:QUIT`从 Nebula Graph 断开连接。为方便使用,Nebula Console 支持使用不带冒号(:)的小写命令,例如`quit`。 + +示例: + +```ngql +nebula> :QUIT; + +Bye root! +``` + +## 常见问题 + +### 如何通过源码安装 Nebula Console? + +下载和编译 Nebula Console 的最新源码,请参见 [GitHub nebula console](https://github.com/vesoft-inc/nebula-console#build-nebula-graph-console) 页面的说明。 diff --git a/docs-2.0/reuse/source_connect-to-nebula-graph.md b/docs-2.0/reuse/source_connect-to-nebula-graph.md index 27bca556eb..cc4d111fb0 100644 --- a/docs-2.0/reuse/source_connect-to-nebula-graph.md +++ b/docs-2.0/reuse/source_connect-to-nebula-graph.md @@ -78,134 +78,3 @@ Nebula Graph 支持多种类型客户端,包括 CLI 客户端、GUI 客户端 | `-f/-file` | 设置存储 nGQL 语句的文件的路径。连接成功后会执行该文件内的 nGQL 语句并返回结果,执行完毕后自动断开连接。 | 用户可以使用`./nebula-console --help`命令获取所有参数的说明,也可以在[项目仓库](https://github.com/vesoft-inc/nebula-console/tree/{{console.branch}})找到更多说明。 - -## Nebula Console 命令 - -Nebula Console 提供部分命令,可以导出 CSV 文件、导出 DOT 文件、导入测试数据集等。 - -!!! note - - 命令不区分大小写。 - -### 导出 CSV 文件 - -CSV 文件用于保存命令执行的返回结果。 - -!!! note - - - CSV 文件保存在当前工作目录中,即 Linux 命令`pwd`显示的目录。 - - - 命令只对下一条查询语句生效。 - -导出 CSV 文件命令如下: - -```ngql -nebula> :CSV -``` - -### 导出 DOT 文件 - -DOT 文件同样用于保存命令执行的返回结果,其保存的结果信息和 CSV 文件不同。 - -!!! Note - - - DOT 文件保存在当前工作目录中,即 Linux 命令`pwd`显示的目录。 - - - DOT 文件的内容可以复制后在 [GraphvizOnline](https://dreampuf.github.io/GraphvizOnline/) 网页中粘贴,生成可视化的执行计划图。 - - - 命令只对下一条查询语句生效。 - -导出 DOT 文件命令如下: - -```ngql -nebula> :dot -``` - -示例: - -```ngql -nebula> :dot a.dot -nebula> PROFILE FORMAT="dot" GO FROM "player100" OVER follow; -``` - -### 加载测试数据集 - -测试数据集名称为 nba,详细 Schema 信息和数据信息请使用相关`SHOW`命令查看。 - -加载测试数据集命令如下: - -```ngql -nebula> :play nba -``` - -### 重复执行 - -重复执行下一个命令 N 次,然后打印平均执行时间。命令如下: - -```ngql -nebula> :repeat N -``` - -示例: - -```ngql -nebula> :repeat 3 -nebula> GO FROM "player100" OVER follow YIELD dst(edge); -+-------------+ -| dst(EDGE) | -+-------------+ -| "player101" | -| "player125" | -+-------------+ -Got 2 rows (time spent 2602/3214 us) - -Fri, 20 Aug 2021 06:36:05 UTC - -+-------------+ -| dst(EDGE) | -+-------------+ -| "player101" | -| "player125" | -+-------------+ -Got 2 rows (time spent 583/849 us) - -Fri, 20 Aug 2021 06:36:05 UTC - -+-------------+ -| dst(EDGE) | -+-------------+ -| "player101" | -| "player125" | -+-------------+ -Got 2 rows (time spent 496/671 us) - -Fri, 20 Aug 2021 06:36:05 UTC - -Executed 3 times, (total time spent 3681/4734 us), (average time spent 1227/1578 us) -``` - -### 睡眠 - -睡眠 N 秒。常用于修改 Schema 的操作中,因为修改 Schema 是异步实现的,需要在下一个心跳周期才同步数据。命令如下: - -```ngql -nebula> :sleep N -``` - -### 断开连接 - -用户可以使用`:EXIT`或者`:QUIT`从 Nebula Graph 断开连接。为方便使用,Nebula Console 支持使用不带冒号(:)的小写命令,例如`quit`。 - -示例: - -```ngql -nebula> :QUIT - -Bye root! -``` - -## 常见问题 - -### 如何通过源码安装 Nebula Console? - -下载和编译 Nebula Console 的最新源码,请参见 [GitHub nebula console](https://github.com/vesoft-inc/nebula-console#build-nebula-graph-console) 页面的说明。 diff --git a/mkdocs.yml b/mkdocs.yml index 7e8573e582..3c1d8d8cad 100755 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -354,6 +354,8 @@ nav: - Nebula Python: 14.client/5.nebula-python-client.md - Nebula Go: 14.client/6.nebula-go-client.md + - Nebula Console: nebula-console.md + - Nebula Graph Studio: - Studio 版本更新说明: nebula-studio/about-studio/st-ug-release-note.md - 认识 Nebula Graph Studio: From 672cfb5b0a2b1a94d3d2d629cf620dece0c193ef Mon Sep 17 00:00:00 2001 From: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> Date: Tue, 28 Dec 2021 13:43:08 +0800 Subject: [PATCH 42/64] Update kafka value parser (#1336) * Update kafka value parser * Update ex-ug-import-from-kafka.md * Update ex-ug-import-from-kafka.md * Update ex-ug-import-from-kafka.md * Update ex-ug-import-from-kafka.md * Update ex-ug-import-from-kafka.md * Update ex-ug-import-from-kafka.md --- .../use-exchange/ex-ug-import-from-kafka.md | 34 ++++++++----------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-kafka.md b/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-kafka.md index aefbbb6f85..52685d35b5 100644 --- a/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-kafka.md +++ b/docs-2.0/nebula-exchange/use-exchange/ex-ug-import-from-kafka.md @@ -76,10 +76,6 @@ ### 步骤 2:修改配置文件 -!!! note - - 如果部分数据存储在 Kafka 的 value 域内,需要自行修改源码,从 Kafka 中获取 value 域,将 value 通过 from_json 函数解析,然后作为 Dataframe 返回。 - 编译 Exchange 后,复制`target/classes/application.conf`文件设置 Kafka 数据源相关的配置。在本示例中,复制的文件名为`kafka_application.conf`。各个配置项的详细说明请参见[配置说明](../parameter-reference/ex-ug-parameter.md)。 ```conf @@ -145,16 +141,15 @@ # 消息类别。 topic: "topic_name1" - # Kafka 数据有固定的域名称:key、value、topic、partition、offset、timestamp、timestampType。 - # Spark 读取为 DataFrame 后,如果需要指定多个字段,用英文逗号(,)隔开。 - # 在 fields 里指定字段名称,例如用 key 对应 Nebula 中的 name, value 对应 Nebula 中的 age,示例如下: - fields: [key,value] - nebula.fields: [name,age] + # 在 fields 里指定 Kafka value 中的字段名称,多个字段用英文逗号(,)隔开。Spark Structured Streaming 读取 Kafka 数据后会将其以 JSON 格式存储于 value 字段中,而这里的 fields 要配置 JSON 的 key 名。示例如下: + fields: [personName, personAge] + # 设置与 fields 中的 key 对应的 Nebula Graph 属性名,key 的 value 将保存为相应的属性值。下方设置会将 personName 的 value 保存到 Nebula Graph 中的 name 属性,personAge 的 value 则保存到 age 属性。 + nebula.fields: [name, age] # 指定表中某一列数据为 Nebula Graph 中点 VID 的来源。 # 这里的值 key 和上面的 key 重复,表示 key 既作为 VID,也作为属性 name。 vertex:{ - field:key + field:personId } # 单批次写入 Nebula Graph 的数据条数。 @@ -177,7 +172,7 @@ fields: [key] nebula.fields: [name] vertex:{ - field:key + field:teamId } batch: 10 partition: 10 @@ -207,20 +202,19 @@ # 消息类别。 topic: "topic_name3" - # Kafka 数据有固定的域名称:key、value、topic、partition、offset、timestamp、timestampType。 - # Spark 读取为 DataFrame 后,如果需要指定多个字段,用英文逗号(,)隔开。 - # 在 fields 里指定字段名称,例如用 key 对应 Nebula 中的 degree,示例如下: - fields: [key] + # 在 fields 里指定 Kafka value 中的字段名称,多个字段用英文逗号(,)隔开。Spark Structured Streaming 读取 Kafka 数据后会将其以 JSON 格式存储于 value 字段中,而这里的 fields 要配置 JSON 的 key 名。示例如下: + fields: [degree] + # 设置与 fields 中的 key 对应的 Nebula Graph 属性名,key 的 value 将保存为相应的属性值。下方设置会将 degree 的 value 保存到 Nebula Graph 中的 degree 属性。 nebula.fields: [degree] # 在 source 里,将 topic 中某一列作为边的起始点数据源。 # 在 target 里,将 topic 中某一列作为边的目的点数据源。 source:{ - field:timestamp + field:srcPersonId } target:{ - field:offset + field:dstPersonId } # 单批次写入 Nebula Graph 的数据条数。 @@ -243,14 +237,14 @@ service: "127.0.0.1:9092" topic: "topic_name4" - fields: [timestamp,offset] + fields: [startYear,endYear] nebula.fields: [start_year,end_year] source:{ - field:key + field:personId } target:{ - field:value + field:teamId } batch: 10 From 7b59c45959bafd90197a4e8a86cda7979657119a Mon Sep 17 00:00:00 2001 From: "abby.huang" <78209557+abby-cyber@users.noreply.github.com> Date: Tue, 28 Dec 2021 18:55:49 +0800 Subject: [PATCH 43/64] add license FAQ (#1343) * add license FAQ * Update 0.FAQ.md * Update 0.FAQ.md * Update 0.FAQ.md --- docs-2.0/20.appendix/0.FAQ.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/docs-2.0/20.appendix/0.FAQ.md b/docs-2.0/20.appendix/0.FAQ.md index fccb8797b3..62eb5bd6a3 100644 --- a/docs-2.0/20.appendix/0.FAQ.md +++ b/docs-2.0/20.appendix/0.FAQ.md @@ -326,7 +326,7 @@ storaged 扩缩容之后,还需要运行 [Balance Data 和 Balance Leader 命 ## 关于连接 -### 防火墙中需要开放哪些端口 +### 防火墙中需要开放哪些端口? 如果没有修改过[配置文件](../5.configurations-and-logs/1.configurations/1.configurations.md) 中预设的端口,请在防火墙中开放如下端口: @@ -340,7 +340,7 @@ storaged 扩缩容之后,还需要运行 [Balance Data 和 Balance Leader 命 周边工具各自使用不用的端口,请参考各工具文档。 -### 如何测试端口是否已开放 +### 如何测试端口是否已开放? 用户可以使用如下 telnet 命令检查端口状态: @@ -366,3 +366,16 @@ $ telnet 192.168.1.10 9777 Trying 192.168.1.10... telnet: connect to address 192.168.1.10: Connection refused ``` + +## 关于 License + +### License 过期前后,是否有信息提示?License 过期后如何续期? + +在License 过期前的 3 天内和过期后的 7 天内,用户会收到系统发出的 License 过期告警提示。 + +| License 使用时间 | 产品使用状态 | 消息提示及续费方式 | +| ---------------- | ------------------ | ------------------------------------------------------------ | +| 未到生效期 | 不可登录且无法使用 | 您的 License 还未到生效时间,请于有效期范围内使用。 | +| 过期前 3 天内 | 可以登录并继续使用 | 您的 License 证书有效时间还剩 <3|2|1|0> 天,过期7天后无法使用,请及时联系销售([inqury@vesoft.com](mailto:inqury@vesoft.com))购买并更换新的证书。 | +| 过期后 7 天内 | 可以登录并继续使用 | 您的 License 证书已过期 <0|1|2|3|4|5|6|7> 天,过期7天后无法使用,请及时联系销售([inqury@vesoft.com](mailto:inqury@vesoft.com))购买并更换新的证书。 | +| 过期后 7 天以上 | 不可登录且无法使用 | 您的 License 已过期 7 天以上,产品无法正常使用,请及时联系销售([inqury@vesoft.com](mailto:inqury@vesoft.com))购买并更换新的证书。 | \ No newline at end of file From ca468ff3c5c4b0bc5b952cbb0a913319270b1fc0 Mon Sep 17 00:00:00 2001 From: "abby.huang" <78209557+abby-cyber@users.noreply.github.com> Date: Wed, 29 Dec 2021 14:37:05 +0800 Subject: [PATCH 44/64] escape character display error (#1346) --- docs-2.0/20.appendix/0.FAQ.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs-2.0/20.appendix/0.FAQ.md b/docs-2.0/20.appendix/0.FAQ.md index 62eb5bd6a3..782a4a24e1 100644 --- a/docs-2.0/20.appendix/0.FAQ.md +++ b/docs-2.0/20.appendix/0.FAQ.md @@ -376,6 +376,6 @@ telnet: connect to address 192.168.1.10: Connection refused | License 使用时间 | 产品使用状态 | 消息提示及续费方式 | | ---------------- | ------------------ | ------------------------------------------------------------ | | 未到生效期 | 不可登录且无法使用 | 您的 License 还未到生效时间,请于有效期范围内使用。 | -| 过期前 3 天内 | 可以登录并继续使用 | 您的 License 证书有效时间还剩 <3|2|1|0> 天,过期7天后无法使用,请及时联系销售([inqury@vesoft.com](mailto:inqury@vesoft.com))购买并更换新的证书。 | -| 过期后 7 天内 | 可以登录并继续使用 | 您的 License 证书已过期 <0|1|2|3|4|5|6|7> 天,过期7天后无法使用,请及时联系销售([inqury@vesoft.com](mailto:inqury@vesoft.com))购买并更换新的证书。 | +| 过期前 3 天内 | 可以登录并继续使用 | 您的 License 证书有效时间还剩 <3\|2\|1\|0> 天,过期7天后无法使用,请及时联系销售([inqury@vesoft.com](mailto:inqury@vesoft.com))购买并更换新的证书。 | +| 过期后 7 天内 | 可以登录并继续使用 | 您的 License 证书已过期 <0\|1\|2\|3\|4\|5\|6\|7> 天,过期7天后无法使用,请及时联系销售([inqury@vesoft.com](mailto:inqury@vesoft.com))购买并更换新的证书。 | | 过期后 7 天以上 | 不可登录且无法使用 | 您的 License 已过期 7 天以上,产品无法正常使用,请及时联系销售([inqury@vesoft.com](mailto:inqury@vesoft.com))购买并更换新的证书。 | \ No newline at end of file From 7cbb1ae473ac10ea7f91a50b46150eb541803d1c Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Wed, 29 Dec 2021 17:53:30 +0800 Subject: [PATCH 45/64] add show local session command (#1345) --- .../6.show/17.show-sessions.md | 12 +++++++----- .../6.show/18.show-queries.md | 12 ++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/docs-2.0/3.ngql-guide/7.general-query-statements/6.show/17.show-sessions.md b/docs-2.0/3.ngql-guide/7.general-query-statements/6.show/17.show-sessions.md index be49d01360..1e98f7862a 100644 --- a/docs-2.0/3.ngql-guide/7.general-query-statements/6.show/17.show-sessions.md +++ b/docs-2.0/3.ngql-guide/7.general-query-statements/6.show/17.show-sessions.md @@ -1,19 +1,21 @@ # SHOW SESSIONS -`SHOW SESSIONS`语句显示所有会话信息,也可以指定会话 ID 进行查看。 +登录 Nebula Graph 数据库时,会创建对应会话,用户可以查询会话信息。 ## 注意事项 -使用 Nebula Console 登录数据库时,会创建一个会话,操作结束执行`exit`退出登录时,客户端会调用 API `release`,释放会话并清除会话信息。 +- 执行`exit`退出登录时,客户端会调用 API `release`,释放会话并清除会话信息。如果没有正常退出,且没有在配置文件 [nebula-graphd.conf](../../../5.configurations-and-logs/1.configurations/3.graph-config.md) 设置空闲会话超时时间(`session_idle_timeout_secs`),会话不会自动释放。对于未自动释放的会话,需要手动删除指定会话 (TODO: coding)。 -如果没有正常退出,且没有在配置文件 [nebula-graphd.conf](../../../5.configurations-and-logs/1.configurations/3.graph-config.md) 设置空闲会话超时时间(`session_idle_timeout_secs`),会话不会自动释放。 +- `SHOW SESSIONS`查询所有 Graph 服务上的会话信息。 -对于未自动释放的会话,需要手动删除指定会话 (TODO: coding)。 +- `SHOW LOCAL SESSIONS`从当前连接的 Graph 服务获取会话信息,不会查询其他 Graph 服务上的会话信息。 + +- `SHOW SESSION `查询指定 Session ID 的会话信息。 ## 语法 ```ngql -SHOW SESSIONS; +SHOW [LOCAL] SESSIONS; SHOW SESSION ; ``` diff --git a/docs-2.0/3.ngql-guide/7.general-query-statements/6.show/18.show-queries.md b/docs-2.0/3.ngql-guide/7.general-query-statements/6.show/18.show-queries.md index 3b6374e44f..48707c24f7 100644 --- a/docs-2.0/3.ngql-guide/7.general-query-statements/6.show/18.show-queries.md +++ b/docs-2.0/3.ngql-guide/7.general-query-statements/6.show/18.show-queries.md @@ -8,27 +8,27 @@ ## 注意事项 -- `SHOW QUERIES`从本地缓存获取当前 Session 中查询的状态,几乎没有延迟。 +- `SHOW LOCAL QUERIES`从本地缓存获取当前 Session 中查询的状态,几乎没有延迟。 -- `SHOW ALL QUERIES`从 Meta 服务获取所有 Session 中的查询信息。这些信息会根据参数`session_reclaim_interval_secs`定义的周期同步到 Meta 服务,因此在客户端获取到的信息可能属于上个同步周期。 +- `SHOW QUERIES`从 Meta 服务获取所有 Session 中的查询信息。这些信息会根据参数`session_reclaim_interval_secs`定义的周期同步到 Meta 服务,因此在客户端获取到的信息可能属于上个同步周期。 ## 语法 ```ngql -SHOW [ALL] QUERIES; +SHOW [LOCAL] QUERIES; ``` ## 示例 ```ngql -nebula> SHOW QUERIES; +nebula> SHOW LOCAL QUERIES; +------------------+-----------------+--------+----------------------+----------------------------+----------------+-----------+-----------------+ | SessionID | ExecutionPlanID | User | Host | StartTime | DurationInUSec | Status | Query | +------------------+-----------------+--------+----------------------+----------------------------+----------------+-----------+-----------------+ | 1625463842921750 | 46 | "root" | ""192.168.x.x":9669" | 2021-07-05T05:44:19.502903 | 0 | "RUNNING" | "SHOW QUERIES;" | +------------------+-----------------+--------+----------------------+----------------------------+----------------+-----------+-----------------+ -nebula> SHOW ALL QUERIES; +nebula> SHOW QUERIES; +------------------+-----------------+---------+----------------------+----------------------------+----------------+-----------+---------------------------------------------------------+ | SessionID | ExecutionPlanID | User | Host | StartTime | DurationInUSec | Status | Query | +------------------+-----------------+---------+----------------------+----------------------------+----------------+-----------+---------------------------------------------------------+ @@ -36,7 +36,7 @@ nebula> SHOW ALL QUERIES; +------------------+-----------------+---------+----------------------+----------------------------+----------------+-----------+---------------------------------------------------------+ # 返回耗时 TOP 10 的查询。 -nebula> SHOW ALL QUERIES | ORDER BY $-.DurationInUSec DESC | LIMIT 10; +nebula> SHOW QUERIES | ORDER BY $-.DurationInUSec DESC | LIMIT 10; +------------------+-----------------+---------+----------------------+----------------------------+----------------+-----------+-------------------------------------------------------+ | SessionID | ExecutionPlanID | User | Host | StartTime | DurationInUSec | Status | Query | +------------------+-----------------+---------+----------------------+----------------------------+----------------+-----------+-------------------------------------------------------+ From df6de2898795a139f4c3f8ad9d130c3c2a0de5d1 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Wed, 29 Dec 2021 17:53:50 +0800 Subject: [PATCH 46/64] Detecting schema change (#1339) --- docs-2.0/2.quick-start/4.nebula-graph-crud.md | 8 +------- .../3.ngql-guide/10.tag-statements/1.create-tag.md | 8 +------- docs-2.0/3.ngql-guide/10.tag-statements/3.alter-tag.md | 8 +------- .../11.edge-type-statements/3.alter-edge.md | 8 +------- .../1.create-native-index.md | 6 +----- .../3.ngql-guide/9.space-statements/1.create-space.md | 10 +--------- 6 files changed, 6 insertions(+), 42 deletions(-) diff --git a/docs-2.0/2.quick-start/4.nebula-graph-crud.md b/docs-2.0/2.quick-start/4.nebula-graph-crud.md index b76d3573e4..ee44a2fac5 100644 --- a/docs-2.0/2.quick-start/4.nebula-graph-crud.md +++ b/docs-2.0/2.quick-start/4.nebula-graph-crud.md @@ -49,7 +49,7 @@ nebula> SHOW HOSTS; !!! caution - Nebula Graph 中执行如下创建和修改操作,是异步实现的。要在**下一个**心跳周期之后才能生效;否则访问会报错。 + Nebula Graph 中执行如下创建和修改操作,是异步实现的。要在**下一个**心跳周期之后才能生效,否则访问会报错。为确保数据同步,后续操作能顺利进行,请等待 2 个心跳周期(20 秒)。 - `CREATE SPACE` - `CREATE TAG` @@ -63,12 +63,6 @@ nebula> SHOW HOSTS; 默认心跳周期是 10 秒。修改心跳周期参数`heartbeat_interval_secs`,请参见[配置简介](../5.configurations-and-logs/1.configurations/1.configurations.md)。 -为确保数据同步,后续操作能顺利进行,可采取以下方法之一: - -- 执行`SHOW`或`DESCRIBE`命令检查相应对象的状态,确保创建或修改已完成。如果没有完成,请等待几秒重试。 - -- 等待 2 个心跳周期(20 秒)。 - ## 创建和选择图空间 ### nGQL 语法 diff --git a/docs-2.0/3.ngql-guide/10.tag-statements/1.create-tag.md b/docs-2.0/3.ngql-guide/10.tag-statements/1.create-tag.md index 36275c6fdd..4c923005ef 100644 --- a/docs-2.0/3.ngql-guide/10.tag-statements/1.create-tag.md +++ b/docs-2.0/3.ngql-guide/10.tag-statements/1.create-tag.md @@ -59,12 +59,6 @@ nebula> CREATE TAG IF NOT EXISTS woman(name string, age int, \ ## 创建 Tag 说明 -尝试使用新创建的 Tag 可能会失败,因为创建是异步实现的。 - -Nebula Graph 将在下一个心跳周期内完成 Tag 的创建,为了确保创建成功,可以使用如下方法之一: - -- 在 [`SHOW TAGS`](4.show-tags.md) 语句的结果中查找新的 Tag,如果找不到,请等待几秒重试。 - -- 等待两个心跳周期,例如 20 秒。 +尝试使用新创建的 Tag 可能会失败,因为创建是异步实现的。为确保数据同步,后续操作能顺利进行,请等待 2 个心跳周期(20 秒)。 如果需要修改心跳间隔,请为[所有配置文件](../../5.configurations-and-logs/1.configurations/1.configurations.md)修改参数`heartbeat_interval_secs`。 diff --git a/docs-2.0/3.ngql-guide/10.tag-statements/3.alter-tag.md b/docs-2.0/3.ngql-guide/10.tag-statements/3.alter-tag.md index 7cb673ba2c..ee55d93f31 100644 --- a/docs-2.0/3.ngql-guide/10.tag-statements/3.alter-tag.md +++ b/docs-2.0/3.ngql-guide/10.tag-statements/3.alter-tag.md @@ -40,12 +40,6 @@ nebula> ALTER TAG t1 COMMENT = 'test1'; ## 修改 Tag 说明 -尝试使用刚修改的 Tag 可能会失败,因为修改是异步实现的。 - -Nebula Graph 将在下一个心跳周期内完成 Tag 的修改,为了确保修改成功,可以使用如下方法之一: - -- 在 [`DESCRIBE TAG`](5.describe-tag.md) 语句的结果中查看 Tag 信息,确认修改成功。如果没有修改成功,请等待几秒重试。 - -- 等待两个心跳周期,例如 20 秒。 +尝试使用刚修改的 Tag 可能会失败,因为修改是异步实现的。为确保数据同步,后续操作能顺利进行,请等待 2 个心跳周期(20 秒)。 如果需要修改心跳间隔,请为[所有配置文件](../../5.configurations-and-logs/1.configurations/1.configurations.md)修改参数`heartbeat_interval_secs`。 diff --git a/docs-2.0/3.ngql-guide/11.edge-type-statements/3.alter-edge.md b/docs-2.0/3.ngql-guide/11.edge-type-statements/3.alter-edge.md index e7575eee34..a52ee12d09 100644 --- a/docs-2.0/3.ngql-guide/11.edge-type-statements/3.alter-edge.md +++ b/docs-2.0/3.ngql-guide/11.edge-type-statements/3.alter-edge.md @@ -40,12 +40,6 @@ nebula> ALTER EDGE e1 COMMENT = 'edge1'; ## 修改 Edge type 说明 -尝试使用刚修改的 Edge type 可能会失败,因为修改是异步实现的。 - -Nebula Graph 将在下一个心跳周期内完成 Edge type 的修改,为了确保修改成功,可以使用如下方法之一: - -- 在 [`DESCRIBE EDGE`](5.describe-edge.md) 语句的结果中查看 Edge type 信息,确认修改成功。如果没有修改成功,请等待几秒重试。 - -- 等待两个心跳周期,例如 20 秒。 +尝试使用刚修改的 Edge type 可能会失败,因为修改是异步实现的。为确保数据同步,后续操作能顺利进行,请等待 2 个心跳周期(20 秒)。 如果需要修改心跳间隔,请为[所有配置文件](../../5.configurations-and-logs/1.configurations/1.configurations.md)修改参数`heartbeat_interval_secs`。 \ No newline at end of file diff --git a/docs-2.0/3.ngql-guide/14.native-index-statements/1.create-native-index.md b/docs-2.0/3.ngql-guide/14.native-index-statements/1.create-native-index.md index 49bd6bb65b..7b0949d901 100644 --- a/docs-2.0/3.ngql-guide/14.native-index-statements/1.create-native-index.md +++ b/docs-2.0/3.ngql-guide/14.native-index-statements/1.create-native-index.md @@ -54,11 +54,7 @@ 日常增量写入时保持 `--disable_auto_compaction = false`。 - 新创建的索引并不会立刻生效。创建新的索引并尝试立刻使用(例如`LOOKUP`或者`REBUILD INDEX`) 通常会失败(报错`can't find xxx in the space`)。因为创建步骤是异步实现的,Nebula Graph 要在下一个心跳周期才能完成索引的创建。可以使用如下方法之一: - - - 在 [`SHOW TAG/EDGE INDEXES`](2.show-native-indexes.md) 语句的结果中查找到新的索引。或者, - - - 等待两个心跳周期,例如 20 秒。如果需要修改心跳间隔,请为[所有配置文件](../../5.configurations-and-logs/1.configurations/1.configurations.md)修改参数`heartbeat_interval_secs`。 + 新创建的索引并不会立刻生效。创建新的索引并尝试立刻使用(例如`LOOKUP`或者`REBUILD INDEX`) 通常会失败(报错`can't find xxx in the space`)。因为创建步骤是异步实现的,Nebula Graph 要在下一个心跳周期才能完成索引的创建。为确保数据同步,后续操作能顺利进行,请等待 2 个心跳周期(20 秒)。如果需要修改心跳间隔,请为[所有配置文件](../../5.configurations-and-logs/1.configurations/1.configurations.md)修改参数`heartbeat_interval_secs`。 !!! danger diff --git a/docs-2.0/3.ngql-guide/9.space-statements/1.create-space.md b/docs-2.0/3.ngql-guide/9.space-statements/1.create-space.md index 84303e5f14..1b0a77536a 100644 --- a/docs-2.0/3.ngql-guide/9.space-statements/1.create-space.md +++ b/docs-2.0/3.ngql-guide/9.space-statements/1.create-space.md @@ -87,15 +87,7 @@ nebula> SHOW CREATE SPACE my_space_4; !!! caution - 立刻尝试使用刚创建的图空间可能会失败,因为创建是异步实现的。 - -Nebula Graph 将在下一个心跳周期内完成图空间的创建,为了确保创建成功,可以使用如下方法之一: - -- 在 [`SHOW SPACES`](3.show-spaces.md) 或 [`DESCRIBE SPACE`](4.describe-space.md) 语句的结果中查找新的图空间,如果找不到,请等待几秒重试。 - -- 等待两个心跳周期,例如 20 秒。 - -如果需要修改心跳间隔,请为[所有配置文件](../../5.configurations-and-logs/1.configurations/1.configurations.md)修改参数`heartbeat_interval_secs`。但过短的心跳周期(<5 秒)可能会导致分布式系统中的机器误判对端失联。 + 立刻尝试使用刚创建的图空间可能会失败,因为创建是异步实现的。为确保数据同步,后续操作能顺利进行,请等待 2 个心跳周期(20 秒)。如果需要修改心跳间隔,请为[所有配置文件](../../5.configurations-and-logs/1.configurations/1.configurations.md)修改参数`heartbeat_interval_secs`。但过短的心跳周期(<5 秒)可能会导致分布式系统中的机器误判对端失联。 ## 检查分片分布情况 From 4d682b0c0ec1f3385209666cb45ab73ac7a1b102 Mon Sep 17 00:00:00 2001 From: "abby.huang" <78209557+abby-cyber@users.noreply.github.com> Date: Thu, 30 Dec 2021 18:59:43 +0800 Subject: [PATCH 47/64] clear disk space after compaction (#1347) * Update 5.drop-space.md * clear disk space after compaction * Update 5.drop-space.md * Update docs-2.0/3.ngql-guide/9.space-statements/5.drop-space.md --- docs-2.0/3.ngql-guide/9.space-statements/5.drop-space.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-2.0/3.ngql-guide/9.space-statements/5.drop-space.md b/docs-2.0/3.ngql-guide/9.space-statements/5.drop-space.md index 89fee8f9b7..f8e16bc83e 100644 --- a/docs-2.0/3.ngql-guide/9.space-statements/5.drop-space.md +++ b/docs-2.0/3.ngql-guide/9.space-statements/5.drop-space.md @@ -14,7 +14,7 @@ DROP SPACE [IF EXISTS] ; `IF EXISTS`关键字可以检测待删除的图空间是否存在,只有存在时,才会删除图空间。 -`DROP SPACE`语句不会立刻删除硬盘上对应图空间的目录和文件,请使用`USE`语句指定其他任意图空间,然后执行`SUBMIT JOB COMPACT`。 +`DROP SPACE`语句不会删除硬盘上对应图空间的目录和文件。如需删除无效空间的目录和文件,在 Storage 服务的配置文件中设置`auto_remove_invalid_space=true`。关于 Storage 服务的配置文件的路径,参见 [Storage 服务配置](../../5.configurations-and-logs/1.configurations/4.storage-config.md)。 !!! caution From f9e515e0bdf80badee587329d6d50de44decab0f Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Fri, 31 Dec 2021 10:06:53 +0800 Subject: [PATCH 48/64] enhance param command (#1344) * enhance param command * update --- docs-2.0/nebula-console.md | 66 ++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/docs-2.0/nebula-console.md b/docs-2.0/nebula-console.md index d5d3018e69..484d740bb2 100644 --- a/docs-2.0/nebula-console.md +++ b/docs-2.0/nebula-console.md @@ -20,38 +20,50 @@ Nebula Console 是 Nebula Graph 的原生命令行客户端,用于连接 Nebul - 会话释放后,参数不会保留。 -保存参数命令如下: +- 保存参数命令如下: -```ngql -nebula> :param => ; -``` + ```ngql + nebula> :param => ; + ``` -示例: + 示例: -```ngql -nebula> :param p1 => "Tim Duncan"; -nebula> MATCH (v:player{name:$p1})-[:follow]->(n) RETURN v,n; -+----------------------------------------------------+-------------------------------------------------------+ -| v | n | -+----------------------------------------------------+-------------------------------------------------------+ -| ("player100" :player{age: 42, name: "Tim Duncan"}) | ("player125" :player{age: 41, name: "Manu Ginobili"}) | -| ("player100" :player{age: 42, name: "Tim Duncan"}) | ("player101" :player{age: 36, name: "Tony Parker"}) | -+----------------------------------------------------+-------------------------------------------------------+ - -nebula> :param p2 => {"a":3,"b":false,"c":"Tim Duncan"}; -nebula> RETURN $p2.b AS b; -+-------+ -| b | -+-------+ -| false | -+-------+ -``` + ```ngql + nebula> :param p1 => "Tim Duncan"; + nebula> MATCH (v:player{name:$p1})-[:follow]->(n) RETURN v,n; + +----------------------------------------------------+-------------------------------------------------------+ + | v | n | + +----------------------------------------------------+-------------------------------------------------------+ + | ("player100" :player{age: 42, name: "Tim Duncan"}) | ("player125" :player{age: 41, name: "Manu Ginobili"}) | + | ("player100" :player{age: 42, name: "Tim Duncan"}) | ("player101" :player{age: 36, name: "Tony Parker"}) | + +----------------------------------------------------+-------------------------------------------------------+ + + nebula> :param p2 => {"a":3,"b":false,"c":"Tim Duncan"}; + nebula> RETURN $p2.b AS b; + +-------+ + | b | + +-------+ + | false | + +-------+ + ``` -查看当前保存的参数命令如下: +- 查看当前保存的所有参数,命令如下: -```ngql -nebula> :params; -``` + ```ngql + nebula> :params; + ``` + +- 查看指定参数,命令如下: + + ```ngql + nebula> :params ; + ``` + +- 删除指定参数,命令如下: + + ```ngql + nebula> :param =>; + ``` ## 导出执行结果 From 8361024852c3f2a67c468e964aac3826166ca553 Mon Sep 17 00:00:00 2001 From: "abby.huang" <78209557+abby-cyber@users.noreply.github.com> Date: Fri, 31 Dec 2021 15:15:47 +0800 Subject: [PATCH 49/64] add utilization rate note & version compatibility (#1333) * add utilization note * update * Update docs-2.0/nebula-dashboard/6.monitor-parameter.md * Update docs-2.0/nebula-dashboard/1.what-is-dashboard.md * Update docs-2.0/nebula-dashboard-ent/7.monitor-parameter.md * Update docs-2.0/nebula-dashboard/6.monitor-parameter.md * Update 6.monitor-parameter.md * Update 7.monitor-parameter.md * Update 7.monitor-parameter.md * Update 6.monitor-parameter.md --- .../nebula-dashboard-ent/1.what-is-dashboard-ent.md | 10 ++++++++++ .../2.deploy-connect-dashboard-ent.md | 6 +----- docs-2.0/nebula-dashboard-ent/7.monitor-parameter.md | 9 +++++---- docs-2.0/nebula-dashboard/1.what-is-dashboard.md | 8 ++++++++ docs-2.0/nebula-dashboard/2.deploy-dashboard.md | 8 -------- docs-2.0/nebula-dashboard/6.monitor-parameter.md | 9 ++++++--- 6 files changed, 30 insertions(+), 20 deletions(-) diff --git a/docs-2.0/nebula-dashboard-ent/1.what-is-dashboard-ent.md b/docs-2.0/nebula-dashboard-ent/1.what-is-dashboard-ent.md index 53b8adef08..b47db1947c 100644 --- a/docs-2.0/nebula-dashboard-ent/1.what-is-dashboard-ent.md +++ b/docs-2.0/nebula-dashboard-ent/1.what-is-dashboard-ent.md @@ -31,3 +31,13 @@ Nebula Dashboard(简称 Dashboard)是一款用于监控和管理 Nebula Grap !!! note 监控服务由 prometheus 提供,更新频率和保留时间等都可以自行修改。详情请参见 [prometheus 官方文档](https://prometheus.io/docs/prometheus/latest/configuration/configuration/)。 + +## 版本兼容性 + +Nebula Graph 的版本和 Dashboard 企业版的版本对应关系如下。 + +|Nebula Graph 版本|Dashboard 版本| +|:---|:---| +|2.0.1~2.6.1|1.0.2| +|2.0.1~2.6.1|1.0.1| +|2.0.1~2.6.1|1.0.0| diff --git a/docs-2.0/nebula-dashboard-ent/2.deploy-connect-dashboard-ent.md b/docs-2.0/nebula-dashboard-ent/2.deploy-connect-dashboard-ent.md index 9b9a602563..004b2f1459 100644 --- a/docs-2.0/nebula-dashboard-ent/2.deploy-connect-dashboard-ent.md +++ b/docs-2.0/nebula-dashboard-ent/2.deploy-connect-dashboard-ent.md @@ -6,11 +6,7 @@ 在部署 Dashboard 之前,用户需要确认以下信息: -- 选择并下载符合版本的 Dashboard,Dashboard 版本和 Nebula Graph 的版本对应关系如下。 - - | Dashboard 版本 | Nebula Graph 版本 | - | :-------------------------- | :--------------- | - | {{ dashboard_ent.release }} | 2.x | +- 选择并下载符合版本的 Dashboard。关于 Dashboard 版本和 Nebula Graph 的版本对应关系,参见[版本兼容性](1.what-is-dashboard-ent.md)。 - 准备版本为 5.7 以上的 [MySQL](https://www.mysql.com/cn/) 环境,创建名称为`dashboard`的数据库。 - 确保在安装开始前,以下端口处于未被使用状态。 diff --git a/docs-2.0/nebula-dashboard-ent/7.monitor-parameter.md b/docs-2.0/nebula-dashboard-ent/7.monitor-parameter.md index 937122969b..89ba9accc3 100644 --- a/docs-2.0/nebula-dashboard-ent/7.monitor-parameter.md +++ b/docs-2.0/nebula-dashboard-ent/7.monitor-parameter.md @@ -2,12 +2,13 @@ 本文介绍 Dashboard 中展示的 Nebula Graph 监控指标。 -!!! note - - 磁盘容量和流量的默认单位为字节(Byte),页面显示时单位会随着数据量级而变化,例如流量低于 1 KB/s 时单位为 Bytes/s。 - ## 机器 +!!! note + + - 以下机器指标适用于 Linux 操作系统。 + - 磁盘容量和流量的默认单位为字节(Byte),页面显示时单位会随着数据量级而变化,例如流量低于 1 KB/s 时单位为 Bytes/s。 + - 对于所有版本的企业版 Dashboard,机器的 Buff 和 Cache 所占的内存没有被计算在内存使用率中。 ### CPU |参数|说明| diff --git a/docs-2.0/nebula-dashboard/1.what-is-dashboard.md b/docs-2.0/nebula-dashboard/1.what-is-dashboard.md index 0fefb5630b..cf78d052d4 100644 --- a/docs-2.0/nebula-dashboard/1.what-is-dashboard.md +++ b/docs-2.0/nebula-dashboard/1.what-is-dashboard.md @@ -34,6 +34,14 @@ Nebula Dashboard(简称 Dashboard)是一款用于监控 Nebula Graph 集群 监控服务由 prometheus 提供,更新频率和保留时间等都可以自行修改。详情请参见 [prometheus 官方文档](https://prometheus.io/docs/prometheus/latest/configuration/configuration/)。 +## 版本兼容性 + +Nebula Graph 的版本和 Dashboard 社区版的版本对应关系如下。 + +|Nebula Graph 版本|Dashboard 版本| +|:---|:---| +|2.0.1~2.5.1|1.0.2| +|2.0.1~2.5.1|1.0.1| ## 更新说明 [Release](https://github.com/vesoft-inc/nebula-dashboard/releases/tag/{{dashboard.branch}}) diff --git a/docs-2.0/nebula-dashboard/2.deploy-dashboard.md b/docs-2.0/nebula-dashboard/2.deploy-dashboard.md index c80a712419..47f940a396 100644 --- a/docs-2.0/nebula-dashboard/2.deploy-dashboard.md +++ b/docs-2.0/nebula-dashboard/2.deploy-dashboard.md @@ -2,14 +2,6 @@ 安装部署 Dashboard 涉及 5 种服务,本文将详细介绍如何通过 tar 包安装部署。下载和编译 Nebula Dashboard 的最新源码,请参见 [GitHub nebula dashboard](https://github.com/vesoft-inc/nebula-dashboard#readme) 页面的说明。 -## Nebula Graph 版本 - -Dashboard 版本和 Nebula Graph 的版本对应关系如下。 - -|Dashboard 版本|Nebula Graph 版本| -|:---|:---| -|{{ dashboard.release }}|2.x| - ## 前提条件 在部署 Dashboard 之前,用户需要确认以下信息: diff --git a/docs-2.0/nebula-dashboard/6.monitor-parameter.md b/docs-2.0/nebula-dashboard/6.monitor-parameter.md index 34854bba09..7f2e38c4ff 100644 --- a/docs-2.0/nebula-dashboard/6.monitor-parameter.md +++ b/docs-2.0/nebula-dashboard/6.monitor-parameter.md @@ -2,11 +2,13 @@ 本文介绍 Dashboard 中展示的 Nebula Graph 监控指标。 -!!! note +## 机器 - 磁盘容量和流量的默认单位为字节(Byte),页面显示时单位会随着数据量级而变化,例如流量低于 1 KB/s 时单位为 Bytes/s。 +!!! note -## 机器 + - 以下机器指标适用于 Linux 操作系统。 + - 磁盘容量和流量的默认单位为字节(Byte),页面显示时单位会随着数据量级而变化,例如流量低于 1 KB/s 时单位为 Bytes/s。 + - 对于高于 v1.0.2 版本的社区版 Dashboard,机器的 Buff 和 Cache 所占的内存没有被计算在内存使用率中。 ### CPU @@ -27,6 +29,7 @@ |`memory_actual_used`| 实际使用内存(不包括缓存)| |`memory_free`| 空闲内存| + ### 负载 |参数|说明| From ef1e9a283f7269c9c6d80d99cb8336bee7765eca Mon Sep 17 00:00:00 2001 From: "max.zhu@vesoft.com" <86282370+izhuxiaoqing@users.noreply.github.com> Date: Fri, 31 Dec 2021 15:16:08 +0800 Subject: [PATCH 50/64] Update ex-ug-what-is-explorer.md (#1350) --- .../nebula-explorer/about-explorer/ex-ug-what-is-explorer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-2.0/nebula-explorer/about-explorer/ex-ug-what-is-explorer.md b/docs-2.0/nebula-explorer/about-explorer/ex-ug-what-is-explorer.md index 630c2252f4..1007b2b150 100644 --- a/docs-2.0/nebula-explorer/about-explorer/ex-ug-what-is-explorer.md +++ b/docs-2.0/nebula-explorer/about-explorer/ex-ug-what-is-explorer.md @@ -1,6 +1,6 @@ # 什么是 Nebula Explorer -Nebula Explorer (简称 Explorer)是一款可以通过 Web 访问的图探索可视化工具,搭配 Nebula Graph 内核使用,用于与图数据进行可视化交互。即使没有图数据操作经验,用户也可以快速成为图专家。 +Nebula Explorer (简称 Explorer)是一款可以通过 Web 访问的可视化图探索工具,搭配 Nebula Graph 内核使用,用于与图数据进行可视化交互。即使没有图数据操作经验,用户也可以快速成为图专家。 ![Explorer](../figs/explorer.png) From 2462273256927f73a94482b5dae3646d9bb2a8f6 Mon Sep 17 00:00:00 2001 From: "max.zhu@vesoft.com" <86282370+izhuxiaoqing@users.noreply.github.com> Date: Fri, 31 Dec 2021 15:16:21 +0800 Subject: [PATCH 51/64] Update st-ug-what-is-graph-studio.md (#1349) --- .../nebula-studio/about-studio/st-ug-what-is-graph-studio.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-2.0/nebula-studio/about-studio/st-ug-what-is-graph-studio.md b/docs-2.0/nebula-studio/about-studio/st-ug-what-is-graph-studio.md index b956ef5941..517be590e8 100644 --- a/docs-2.0/nebula-studio/about-studio/st-ug-what-is-graph-studio.md +++ b/docs-2.0/nebula-studio/about-studio/st-ug-what-is-graph-studio.md @@ -1,6 +1,6 @@ # 什么是 Nebula Graph Studio -Nebula Graph Studio(简称 Studio)是一款可以通过 Web 访问的图数据库开源可视化工具,搭配 [Nebula Graph](../../README.md) 内核使用,提供构图、数据导入、编写 nGQL 查询、图探索等一站式服务。用户可以在 Nebula Graph GitHub 仓库中查看最新源码,详情参见 [nebula-studio](https://github.com/vesoft-inc/nebula-studio)。 +Nebula Graph Studio(简称 Studio)是一款可以通过 Web 访问的开源图数据库可视化工具,搭配 [Nebula Graph](../../README.md) 内核使用,提供构图、数据导入、编写 nGQL 查询、图探索等一站式服务。用户可以在 Nebula Graph GitHub 仓库中查看最新源码,详情参见 [nebula-studio](https://github.com/vesoft-inc/nebula-studio)。 ## 发行版本 From 01cdac7e746e3c402239e4639b564a14e76c3918 Mon Sep 17 00:00:00 2001 From: "max.zhu@vesoft.com" <86282370+izhuxiaoqing@users.noreply.github.com> Date: Fri, 31 Dec 2021 15:16:40 +0800 Subject: [PATCH 52/64] Update 1.what-is-nebula-graph.md (#1348) --- docs-2.0/1.introduction/1.what-is-nebula-graph.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-2.0/1.introduction/1.what-is-nebula-graph.md b/docs-2.0/1.introduction/1.what-is-nebula-graph.md index df746f7afc..e9fd4024f9 100644 --- a/docs-2.0/1.introduction/1.what-is-nebula-graph.md +++ b/docs-2.0/1.introduction/1.what-is-nebula-graph.md @@ -1,6 +1,6 @@ # 什么是 Nebula Graph -Nebula Graph 是一款开源的、分布式的、易扩展的原生图数据库,能够承载数千亿个点和数万亿条边的超大规模数据集,并且提供毫秒级查询。 +Nebula Graph 是一款开源的、分布式的、易扩展的原生图数据库,能够承载包含数千亿个点和数万亿条边的超大规模数据集,并且提供毫秒级查询。 ![Nebula Graph 鸟瞰图](nebula-birdview.png) From 368c19e02bd4afa5e3f9bc4f06bf9588b3125239 Mon Sep 17 00:00:00 2001 From: monchickey <75814968+monchickey@users.noreply.github.com> Date: Fri, 31 Dec 2021 16:01:02 +0800 Subject: [PATCH 53/64] Update 3.graph-config.md And 4.storage-config.md (#1351) * Update 3.graph-config.md Fix service name Meta to Graph. * Update 4.storage-config.md Fix the service name is Storage. * Update docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md Co-authored-by: abby.huang <78209557+abby-cyber@users.noreply.github.com> --- .../1.configurations/3.graph-config.md | 4 ++-- .../1.configurations/4.storage-config.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs-2.0/5.configurations-and-logs/1.configurations/3.graph-config.md b/docs-2.0/5.configurations-and-logs/1.configurations/3.graph-config.md index 9cf67d1ad1..608d18e148 100644 --- a/docs-2.0/5.configurations-and-logs/1.configurations/3.graph-config.md +++ b/docs-2.0/5.configurations-and-logs/1.configurations/3.graph-config.md @@ -9,11 +9,11 @@ Graph 服务提供了两份初始配置文件`nebula-graphd.conf.default`和`neb ## 配置文件使用方式 -如需使用初始配置文件,从上述两个文件选择其一,删除后缀`.default`或`.production`,Meta 服务才能将其识别为配置文件并从中获取配置信息。 +如需使用初始配置文件,从上述两个文件选择其一,删除后缀`.default`或`.production`,Graph 服务才能将其识别为配置文件并从中获取配置信息。 ## 配置文件参数值说明 -配置文件内没有设置某个参数表示参数使用的是默认值。文件内只预设了部分参数的值,而且两份初始配置文件内的参数值也略有不同,本文的预设值以`nebula-metad.conf.default`为准。 +配置文件内没有设置某个参数表示参数使用的是默认值。文件内只预设了部分参数的值,而且两份初始配置文件内的参数值也略有不同,本文的预设值以`nebula-graphd.conf.default`为准。 如需查看所有的参数及其当前值,参见[配置管理](1.configurations.md)。 diff --git a/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md b/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md index c451f5fb73..9f33a87d81 100644 --- a/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md +++ b/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md @@ -4,16 +4,16 @@ Storage 服务提供了两份初始配置文件`nebula-storaged.conf.default`和 !!! caution - * 不建议修改`local_config`的值为`false`。修改后 Nebula Graph 服务启动后会先尝试从 Meta 服务获取缓存的配置信息,可能导致集群配置不一致,造成未知风险。 + * 不建议修改`local_config`的值为`false`。修改配置并重启 Storage 服务,会先尝试从 Meta 服务获取缓存的配置信息,可能导致集群配置不一致,造成未知风险。 * 不建议修改文档未介绍的配置项,除非已经熟悉源代码并完全了解配置项的作用。 ## 配置文件使用方式 -如需使用初始配置文件,从上述两个文件选择其一,删除后缀`.default`或`.production`,Meta 服务才能将其识别为配置文件并从中获取配置信息。 +如需使用初始配置文件,从上述两个文件选择其一,删除后缀`.default`或`.production`,Storage 服务才能将其识别为配置文件并从中获取配置信息。 ## 配置文件参数值说明 -配置文件内没有设置某个参数表示参数使用的是默认值。文件内只预设了部分参数的值,而且两份初始配置文件内的参数值也略有不同,本文的预设值以`nebula-metad.conf.default`文件为准,其中没有的参数则以`nebula-storaged.conf.production`文件为准。 +配置文件内没有设置某个参数表示参数使用的是默认值。文件内只预设了部分参数的值,而且两份初始配置文件内的参数值也略有不同,本文的预设值以`nebula-storaged.conf.default`文件为准,其中没有的参数则以`nebula-storaged.conf.production`文件为准。 !!! Note From fe0bf6b169956ff862709590649a3dbec54d81bb Mon Sep 17 00:00:00 2001 From: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> Date: Wed, 5 Jan 2022 13:43:56 +0800 Subject: [PATCH 54/64] Add exchange spark compatibility (#1354) * Add exchange spark compatibility * add note for jar version --- .../about-exchange/ex-ug-limitations.md | 29 +++++++++++++++---- .../parameter-reference/ex-ug-parameter.md | 2 +- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/docs-2.0/nebula-exchange/about-exchange/ex-ug-limitations.md b/docs-2.0/nebula-exchange/about-exchange/ex-ug-limitations.md index e74887ba82..92547dc7ae 100644 --- a/docs-2.0/nebula-exchange/about-exchange/ex-ug-limitations.md +++ b/docs-2.0/nebula-exchange/about-exchange/ex-ug-limitations.md @@ -31,11 +31,30 @@ Exchange 2.x 支持以下操作系统: 为保证 Exchange 正常工作,请确认机器上已经安装如下软件: -- Apache Spark:2.4.x - -- Java:1.8 - -- Scala:2.10.7、2.11.12 或 2.12.10 +- Java 1.8 版本 + +- Scala 2.10.7、2.11.12 或 2.12.10 版本 + +- Apache Spark。使用 Exchange 从不同数据源导出数据对 Spark 版本的要求如下: + + !!! note + 使用 Exchange 时,需根据 Spark 版本选择相应的 JAR 文件。例如,当 Spark 版本为 2.4 时,选择 nebula-exchange_spark_2.4-{{exchange.release}}.jar。 + + | 数据源 | Spark 2.2 | Spark 2.4 | Spark 3 | + | - | - | - | - | + | CSV 文件 | 支持 | 支持 | 支持 | + | JSON 文件 | 支持 | 支持 | 支持 | + | ORC 文件 | 支持 | 支持 | 支持 | + | Parquet 文件 | 支持 | 支持 | 支持 | + | HBase | 支持 | 支持 | 支持 | + | MySQL | 支持 | 支持 | 支持 | + | ClickHouse | 支持 | 支持 | 支持 | + | Neo4j | 不支持 | 支持 | 不支持 | + | Hive | 支持 | 支持 | 支持 | + | MaxCompute | 不支持 | 支持 | 不支持 | + | Pulsar | 不支持 | 支持 | 未测试 | + | Kafka | 不支持 | 支持 | 未测试 | + | Nebula Graph | 不支持 | 支持 | 不支持 | 在以下使用场景,还需要部署 Hadoop Distributed File System (HDFS): diff --git a/docs-2.0/nebula-exchange/parameter-reference/ex-ug-parameter.md b/docs-2.0/nebula-exchange/parameter-reference/ex-ug-parameter.md index 024d649078..e280626477 100644 --- a/docs-2.0/nebula-exchange/parameter-reference/ex-ug-parameter.md +++ b/docs-2.0/nebula-exchange/parameter-reference/ex-ug-parameter.md @@ -179,7 +179,7 @@ |`tags.topic`|string|-|是|消息类别。| |`tags.interval.seconds`|int|`10`|是|读取消息的间隔。单位:秒。| -### SST 源特有参数 +### 生成 SST 时的特有参数 |参数|数据类型|默认值|是否必须|说明| |:---|:---|:---|:---|:---| From 174207912c4d006995e195f569c853aca695ac14 Mon Sep 17 00:00:00 2001 From: Wey Gu <1651790+wey-gu@users.noreply.github.com> Date: Wed, 5 Jan 2022 15:31:29 +0800 Subject: [PATCH 55/64] Update 1.resource-preparations.md (#1353) to enable a smooth first time build attempt --- .../4.deployment-and-installation/1.resource-preparations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs-2.0/4.deployment-and-installation/1.resource-preparations.md b/docs-2.0/4.deployment-and-installation/1.resource-preparations.md index 51e82119d2..68d12f9c23 100644 --- a/docs-2.0/4.deployment-and-installation/1.resource-preparations.md +++ b/docs-2.0/4.deployment-and-installation/1.resource-preparations.md @@ -148,7 +148,7 @@ $ ./third-party/install-gcc.sh --prefix=/opt // 启用 GCC。 - $ source /opt/vesoft/toolset/gcc/7.5.0/enable + $ source /opt/vesoft/toolset/gcc/9.3.0/enable ``` 3. 执行脚本`install-third-party.sh`。 From c13167a7f52d75b9ba26414f3fa226521d1c2dae Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Wed, 5 Jan 2022 15:37:52 +0800 Subject: [PATCH 56/64] Schema support mixed Chinese and English (#1357) --- .../1.nGQL-overview/keywords-and-reserved-words.md | 9 ++++----- docs-2.0/3.ngql-guide/10.tag-statements/1.create-tag.md | 2 +- .../11.edge-type-statements/1.create-edge.md | 2 +- .../14.native-index-statements/1.create-native-index.md | 2 +- .../3.ngql-guide/9.space-statements/1.create-space.md | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/docs-2.0/3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md b/docs-2.0/3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md index 51f91912c2..d13eca7117 100644 --- a/docs-2.0/3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md +++ b/docs-2.0/3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md @@ -2,7 +2,7 @@ 关键字在 nGQL 中有重要意义,分为保留关键字和非保留关键字。 -非保留关键字作为标识符时可以不使用引号。保留关键字作为标识符时,需要用反引号(\`)包围,例如 \`AND\`。 +非保留关键字作为标识符时可以不使用引号。保留关键字或特殊字符作为标识符时,需要用反引号(\`)包围,例如 \`AND\`。 !!! Note @@ -20,11 +20,10 @@ Execution succeeded nebula> CREATE TAG 中文(简体 string); Execution succeeded -``` - -- `TAG`是保留关键字,要将`TAG`作为标识符,用户必须使用反引号(\`)括起来。 -- `SPACE`是非保留关键字,可以直接作为标识符使用。 +nebula> CREATE TAG `¥%特殊 字符&*+-*/` (`q~!()= wer` string); +Execution succeeded +``` ## 保留关键字 diff --git a/docs-2.0/3.ngql-guide/10.tag-statements/1.create-tag.md b/docs-2.0/3.ngql-guide/10.tag-statements/1.create-tag.md index 4c923005ef..cd79ce64cd 100644 --- a/docs-2.0/3.ngql-guide/10.tag-statements/1.create-tag.md +++ b/docs-2.0/3.ngql-guide/10.tag-statements/1.create-tag.md @@ -31,7 +31,7 @@ CREATE TAG [IF NOT EXISTS] |参数|说明| |:---|:---| |`IF NOT EXISTS`|检测待创建的 Tag 是否存在,只有不存在时,才会创建 Tag。仅检测 Tag 的名称,不会检测具体属性。| -|``|每个图空间内的 Tag 必须是唯一的。Tag 名称设置后无法修改。Tag 名称支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用保留关键字时,需要用反引号(\`)包围,详情参见[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| +|``|每个图空间内的 Tag 必须是唯一的。Tag 名称设置后无法修改。Tag 名称支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用特殊字符或保留关键字时,需要用反引号(\`)包围,详情参见[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| |``|属性名称。每个 Tag 中的属性名称必须唯一。属性的命名规则与 Tag 相同。| |``|属性的数据类型,目前支持[数值](../3.data-types/1.numeric.md)、[布尔](../3.data-types/2.boolean.md)、[字符串](../3.data-types/3.string.md)以及[日期与时间](../3.data-types/4.date-and-time.md)。| |`NULL \| NOT NULL`|指定属性值是否支持为`NULL`。默认值为`NULL`。| diff --git a/docs-2.0/3.ngql-guide/11.edge-type-statements/1.create-edge.md b/docs-2.0/3.ngql-guide/11.edge-type-statements/1.create-edge.md index 808cd9ba3c..2800e143b5 100644 --- a/docs-2.0/3.ngql-guide/11.edge-type-statements/1.create-edge.md +++ b/docs-2.0/3.ngql-guide/11.edge-type-statements/1.create-edge.md @@ -31,7 +31,7 @@ CREATE EDGE [IF NOT EXISTS] |参数|说明| |:---|:---| |`IF NOT EXISTS`|检测待创建的 Edge type 是否存在,只有不存在时,才会创建 Edge type。仅检测 Edge type 的名称,不会检测具体属性。| -|``|每个图空间内的 Edge type 必须是唯一的。Edge type 名称设置后无法修改。Edge type 名称支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用保留关键字时,需要用反引号(\`)包围,详情参见[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| +|``|每个图空间内的 Edge type 必须是唯一的。Edge type 名称设置后无法修改。Edge type 名称支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用特殊字符或保留关键字时,需要用反引号(\`)包围,详情参见[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| |``|属性名称。每个 Edge type 中的属性名称必须唯一。属性的命名规则与 Edge type 相同。| |``|属性的数据类型,目前支持[数值](../3.data-types/1.numeric.md)、[布尔](../3.data-types/2.boolean.md)、[字符串](../3.data-types/3.string.md)以及[日期与时间](../3.data-types/4.date-and-time.md)。| |`NULL \| NOT NULL`|指定属性值是否支持为`NULL`。默认值为`NULL`。| diff --git a/docs-2.0/3.ngql-guide/14.native-index-statements/1.create-native-index.md b/docs-2.0/3.ngql-guide/14.native-index-statements/1.create-native-index.md index 7b0949d901..3d51a2afca 100644 --- a/docs-2.0/3.ngql-guide/14.native-index-statements/1.create-native-index.md +++ b/docs-2.0/3.ngql-guide/14.native-index-statements/1.create-native-index.md @@ -70,7 +70,7 @@ CREATE {TAG | EDGE} INDEX [IF NOT EXISTS] ON { | `|索引名。索引名在一个图空间中必须是唯一的。推荐的命名方式为`i_tagName_propName`。索引名称支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用保留关键字时,需要用反引号(\`)包围,详情参见[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| +|``|索引名。索引名在一个图空间中必须是唯一的。推荐的命名方式为`i_tagName_propName`。索引名称支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用特殊字符或保留关键字时,需要用反引号(\`)包围,详情参见[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| |` \| `|指定索引关联的 Tag 或 Edge 名称。| |``|为**变长**字符串属性创建索引时,必须用`prop_name(length)`指定索引长度;为 Tag 或 Edge type 本身创建索引时,忽略``。| |`COMMENT`|索引的描述。最大为 256 字节。默认无描述。| diff --git a/docs-2.0/3.ngql-guide/9.space-statements/1.create-space.md b/docs-2.0/3.ngql-guide/9.space-statements/1.create-space.md index 1b0a77536a..c046c528d7 100644 --- a/docs-2.0/3.ngql-guide/9.space-statements/1.create-space.md +++ b/docs-2.0/3.ngql-guide/9.space-statements/1.create-space.md @@ -23,7 +23,7 @@ CREATE SPACE [IF NOT EXISTS] ( |参数|说明| |:---|:---| |`IF NOT EXISTS`|检测待创建的图空间是否存在,只有不存在时,才会创建图空间。仅检测图空间的名称,不会检测具体属性。| -|``|在 Nebula Graph 实例中唯一标识一个图空间。图空间名称支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用保留关键字时,需要用反引号(\`)包围,详情参见[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| +|``|在 Nebula Graph 实例中唯一标识一个图空间。图空间名称支持 1~4 字节的 UTF-8 编码字符,包括英文字母(区分大小写)、数字、中文等,但是不包括除下划线外的特殊字符。使用特殊字符或保留关键字时,需要用反引号(\`)包围,详情参见[关键字和保留字](../../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。| |`partition_num`|指定图空间的分片数量。建议设置为 5 倍的集群硬盘数量。例如集群中有 3 个硬盘,建议设置 15 个分片。默认值为 100。| |`replica_factor`|指定每个分片的副本数量。建议在生产环境中设置为 3,在测试环境中设置为 1。由于需要基于多数表决,副本数量必须是**奇数**。默认值为 1。| |`vid_type`|必选参数。指定点 ID 的数据类型。可选值为`FIXED_STRING()`和`INT64`。`INT`等同于`INT64`。`FIXED_STRING()`表示数据类型为字符串,最大长度为`N`,超出长度会报错;`INT64`表示数据类型为整数。| From b09f69f5d7753c62b085036db5d477e3bdabb262 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Wed, 5 Jan 2022 17:42:40 +0800 Subject: [PATCH 57/64] Add constraints on invalid password attempts (#1356) * Add constraints on invalid password attempts * update * update --- .../7.data-security/1.authentication/1.authentication.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs-2.0/7.data-security/1.authentication/1.authentication.md b/docs-2.0/7.data-security/1.authentication/1.authentication.md index 0c0865b998..1a7f9eccbb 100644 --- a/docs-2.0/7.data-security/1.authentication/1.authentication.md +++ b/docs-2.0/7.data-security/1.authentication/1.authentication.md @@ -16,7 +16,13 @@ Nebula Graph 支持两种身份验证方式:本地身份验证和 LDAP 验证 ### 启用本地身份验证 -1. 编辑配置文件`nebula-graphd.conf`(默认目录为`/usr/local/nebula/etc/`),设置`--enable_authorize=true`并保存退出。 +1. 编辑配置文件`nebula-graphd.conf`(默认目录为`/usr/local/nebula/etc/`),设置如下参数: + + - `--enable_authorize`:是否启用身份验证,可选值:`true`、`false`。 + + - `--failed_login_attempts`:可选项,需要手动添加该参数。单个 Graph 节点允许连续输入错误密码的次数。超过该次数时,账户会被锁定。如果有多个 Graph 节点,允许的次数为`节点数 * 次数`。 + + - `--password_lock_time_in_secs`:可选项,需要手动添加该参数。多次输入错误密码后,账户被锁定的时间。单位:秒。 2. 重启 Nebula Graph 服务。 From b476e7eac0ef7f3575ff7006c593a3a0976345e9 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Thu, 6 Jan 2022 09:59:40 +0800 Subject: [PATCH 58/64] round the float/double (#1358) * round the float/double * Update 1.numeric.md --- .../12.vertex-statements/1.insert-vertex.md | 2 +- docs-2.0/3.ngql-guide/3.data-types/1.numeric.md | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md b/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md index 50d20f136b..5ea1d4ad16 100644 --- a/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md +++ b/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md @@ -32,7 +32,7 @@ prop_value_list: - `VID`:点 ID。在 Nebula Graph 2.0 中支持字符串和整数,需要在创建图空间时设置,详情请参见 [CREATE SPACE](../9.space-statements/1.create-space.md)。 -- `prop_value_list`:根据`prop_name_list`填写属性值。如果属性值和 Tag 中的数据类型不匹配,会返回错误。如果没有填写属性值,而 Tag 中对应的属性设置为`NOT NULL`,也会返回错误。详情请参见 [CREATE TAG](../10.tag-statements/1.create-tag.md)。 +- `prop_value_list`:根据`prop_name_list`填写属性值。如果没有填写属性值,而 Tag 中对应的属性设置为`NOT NULL`,会返回错误。详情请参见 [CREATE TAG](../10.tag-statements/1.create-tag.md)。 !!! caution diff --git a/docs-2.0/3.ngql-guide/3.data-types/1.numeric.md b/docs-2.0/3.ngql-guide/3.data-types/1.numeric.md index cdd6a87cfc..791dce6cd1 100644 --- a/docs-2.0/3.ngql-guide/3.data-types/1.numeric.md +++ b/docs-2.0/3.ngql-guide/3.data-types/1.numeric.md @@ -43,12 +43,14 @@ nGQL 支持科学计数法,例如`1e2`、`1.1e2`、`.3e4`、`1.e4`、`-1234E-1 例如,nGQL 不支持设置 INT8 类型的 [VID](../../1.introduction/3.vid.md),但支持将 [TAG](../10.tag-statements/1.create-tag.md) 或 [Edge type](../11.edge-type-statements/1.create-edge.md) 的某个属性类型设置为 INT8。当使用 nGQL 语句读取 INT8 类型的属性时,获取到的值的类型为 INT64。 -同时,Nebula Graph 支持写入多种进制的数值: +- Nebula Graph 支持写入多种进制的数值: -- 十进制,例如`123456`。 -- 十六进制,例如`0x1e240`。 -- 八进制,例如`0361100`。 + - 十进制,例如`123456`。 + - 十六进制,例如`0x1e240`。 + - 八进制,例如`0361100`。 -但 Nebula Graph 会将写入的非十进制数值解析为十进制的值保存。读取到的值为十进制。 + 但 Nebula Graph 会将写入的非十进制数值解析为十进制的值保存。读取到的值为十进制。 -例如,属性`score`的类型为`INT`,通过 INSERT 语句为其赋值`0xb`,使用 FETCH 等语句查询该属性值获取到的结果是`11`,即将十六进制的`0xb`转换为十进制后的值。 + 例如,属性`score`的类型为`INT`,通过 INSERT 语句为其赋值`0xb`,使用 FETCH 等语句查询该属性值获取到的结果是`11`,即将十六进制的`0xb`转换为十进制后的值。 + +- 将 FLOAT/DOUBLE 类型的数值插入 INT 类型的列,会将数值四舍五入取整。 From 34d91ce721f978cc78055cd894dc12365ef09141 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Thu, 6 Jan 2022 10:27:54 +0800 Subject: [PATCH 59/64] Implement the multi query parts of openCypher (#1355) * Implement the multi query parts of openCypher * update * Update 2.match.md --- .../6.cheatsheet-for-ngql-command.md | 2 +- .../1.nGQL-overview/1.overview.md | 2 +- .../1.nGQL-overview/3.graph-patterns.md | 4 - .../3.ngql-guide/5.operators/1.comparison.md | 4 +- .../7.general-query-statements/2.match.md | 122 +++++++++++++++--- .../optional-match.md | 39 ++++++ .../unwind.md} | 12 +- mkdocs.yml | 3 +- 8 files changed, 151 insertions(+), 37 deletions(-) create mode 100644 docs-2.0/3.ngql-guide/7.general-query-statements/optional-match.md rename docs-2.0/3.ngql-guide/{7.general-query-statements/7.unwind.md => 8.clauses-and-options/unwind.md} (71%) diff --git a/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md b/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md index 26dae8b073..8aa5151460 100644 --- a/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md +++ b/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md @@ -296,7 +296,7 @@ -* [UNWIND](../3.ngql-guide/7.general-query-statements/7.unwind.md) +* [UNWIND](../3.ngql-guide/8.clauses-and-options/unwind.md) ``` UNWIND AS diff --git a/docs-2.0/3.ngql-guide/1.nGQL-overview/1.overview.md b/docs-2.0/3.ngql-guide/1.nGQL-overview/1.overview.md index c702b46414..385b560055 100644 --- a/docs-2.0/3.ngql-guide/1.nGQL-overview/1.overview.md +++ b/docs-2.0/3.ngql-guide/1.nGQL-overview/1.overview.md @@ -97,7 +97,7 @@ nebula> CREATE TAG IF NOT EXISTS player(name string, age int); |相等运算符| `=` | `==` | |数学求幂| `^` | 使用`pow(x, y)`替代`^`。 | |边 Rank| 无此概念 | 用`@rank`设置。 | -|语句|-|不支持 openCypher 9 的所有 DML 语句(如`CREATE`、`MERGE`等),不支持所有的 DCL, 和支持部分 `MATCH` 语法和函数(不支持`OPTIONAL MATCH`,不支持多`MATCH`,不支持 `WHERE` 中使用图 pattern)。 | +|语句|-|不支持 openCypher 9 的所有 DML 语句(如`CREATE`、`MERGE`等),不支持所有的 DCL, 和支持部分 `MATCH` 语法和函数(不支持 `WHERE` 中使用图 pattern)。 | |语句文本换行 | 换行符 | `\` + 换行符 | |Label 与 Tag 是不同的概念| Label 用于寻找点(点的索引)。 | Tag 用于定义点的一种类型及相应的属性,无索引功能。 | | 预编译与参数化查询 | 支持 | 仅支持参数化查询。 | diff --git a/docs-2.0/3.ngql-guide/1.nGQL-overview/3.graph-patterns.md b/docs-2.0/3.ngql-guide/1.nGQL-overview/3.graph-patterns.md index 2686ced70a..e6298b81c0 100644 --- a/docs-2.0/3.ngql-guide/1.nGQL-overview/3.graph-patterns.md +++ b/docs-2.0/3.ngql-guide/1.nGQL-overview/3.graph-patterns.md @@ -54,10 +54,6 @@ (a:User:Admin)-[]->(b) ``` -!!! compatibility "openCypher 兼容性" - - nGQL 中的`MATCH`语句不支持用`(a:User:Admin)`匹配多个标签。如需匹配多标签可使用过滤条件,如`WHERE "User" IN tags(n) AND "Admin" IN tags(n)`。 - ## 属性模式 点和边是图的基本结构。nGQL 在这两种结构上都可以增加属性,方便实现更丰富的模型。 diff --git a/docs-2.0/3.ngql-guide/5.operators/1.comparison.md b/docs-2.0/3.ngql-guide/5.operators/1.comparison.md index 1fbde4143f..6dba8771d1 100644 --- a/docs-2.0/3.ngql-guide/5.operators/1.comparison.md +++ b/docs-2.0/3.ngql-guide/5.operators/1.comparison.md @@ -32,9 +32,7 @@ Nebula Graph 支持的比较符如下。 ## OpenCypher 兼容性 -- `NULL`的比较操作和 openCypher 不同,行为也可能会改变。在 openCypher 中,`IS [NOT] NULL`通常与`OPTIONAL MATCH`一起使用,但是 nGQL 不支持`OPTIONAL MATCH`。 - -- openCypher 中没有`EMPTY`,因此不支持在 MATCH 语句中使用`EMPTY`。 +openCypher 中没有`EMPTY`,因此不支持在 MATCH 语句中使用`EMPTY`。 ## 示例 diff --git a/docs-2.0/3.ngql-guide/7.general-query-statements/2.match.md b/docs-2.0/3.ngql-guide/7.general-query-statements/2.match.md index d4890d8dac..e5df90846a 100644 --- a/docs-2.0/3.ngql-guide/7.general-query-statements/2.match.md +++ b/docs-2.0/3.ngql-guide/7.general-query-statements/2.match.md @@ -2,7 +2,7 @@ `MATCH`语句提供基于模式(pattern)匹配的搜索功能。 -一个`MATCH`语句定义了一个[搜索模式](../1.nGQL-overview/3.graph-patterns.md),用该模式匹配存储在 Nebula Graph 中的数据,然后用`RETURN`子句检索数据。 +一个`MATCH`语句定义了一个搜索模式,用该模式匹配存储在 Nebula Graph 中的数据,然后用`RETURN`子句检索数据。 本文示例使用测试数据集 [basketballplayer](../1.nGQL-overview/1.overview.md#basketballplayer) 进行演示。 @@ -11,9 +11,21 @@ 与`GO`或`LOOKUP`等其他查询语句相比,`MATCH`的语法更灵活。`MATCH`语法可以概括如下: ```ngql -MATCH [] RETURN ; +MATCH [] RETURN []; ``` +- `pattern`:pattern 的详细说明请参见[模式](../1.nGQL-overview/3.graph-patterns.md)。`MATCH`语句支持匹配一个或多个模式,多个模式之间用英文逗号(,)分隔。例如`(a)-[]->(b),(c)-[]->(d)`。 + +- `clause_1`:支持`WHERE`、`WITH`、`UNWIND`、`OPTIONAL MATCH`子句,也可以使用`MATCH`作为子句。 + +- `output`:定义需要返回的输出。可以使用`AS`设置输出的别名。 + + !!! compatibility "历史版本兼容性" + + 从3.0版本开始,`pattern`支持同时匹配多个 Tag,所以返回属性时,需要额外指定 Tag 名称。即从`RETURN 变量名.属性名`改为`RETURN 变量名.Tag.属性名`。 + +- `clause_2`:支持`ORDER BY`、`LIMIT`子句。 + ## MATCH 工作流程 1. `MATCH`语句使用原生索引查找起始点或边,起始点或边可以在模式的任何位置。即一个有效的`MATCH`语句,**必须有一个属性、Tag 或 Edge type 已经创建索引,或者在`WHERE`子句中用 id() 函数指定了特定点的 VID**。如何创建索引,请参见[创建原生索引](../14.native-index-statements/1.create-native-index.md)。 @@ -108,6 +120,21 @@ nebula> MATCH (v:player) \ ... ``` +需要匹配拥有多个 Tag 的点,可以用英文冒号(:)。 + +```ngql +nebula> CREATE TAG actor (name string, age int); +nebula> INSERT VERTEX actor(name, age) VALUES "player100":("Tim Duncan", 42); +nebula> MATCH (v:player:actor) \ + RETURN v \ + LIMIT 10; ++----------------------------------------------------------------------------------------+ +| v | ++----------------------------------------------------------------------------------------+ +| ("player100" :actor{age: 42, name: "Tim Duncan"} :player{age: 42, name: "Tim Duncan"}) | ++----------------------------------------------------------------------------------------+ +``` + ### 匹配点的属性 !!! Note @@ -131,7 +158,7 @@ nebula> MATCH (v:player{name:"Tim Duncan"}) \ ```ngql nebula> MATCH (v:player) \ - WHERE v.name == "Tim Duncan" \ + WHERE v.player.name == "Tim Duncan" \ RETURN v; +----------------------------------------------------+ | v | @@ -169,6 +196,7 @@ nebula> MATCH (v:player { name: 'Tim Duncan' })--(v2) \ | v2 | +-----------------------------------------------------------+ | ("player101" :player{age: 36, name: "Tony Parker"}) | +| ("player101" :player{age: 36, name: "Tony Parker"}) | | ("player102" :player{age: 33, name: "LaMarcus Aldridge"}) | +-----------------------------------------------------------+ ``` @@ -182,15 +210,14 @@ nebula> MATCH (v:player { name: 'Tim Duncan' })--(v2) \ 在 nGQL 1.x 中,`--`符号用于行内注释,在 nGQL 2.x 中,`--`符号表示出边或入边,不再用于注释。 ```ngql -nebula> MATCH (v:player{name:"Tim Duncan"})--(v2) \ - RETURN v2.name AS Name; +nebula> MATCH (v:player{name:"Tim Duncan"})--(v2:player) \ + RETURN v2.player.name AS Name; +---------------------+ | Name | +---------------------+ -| "Spurs" | -| "Tony Parker" | -| "LaMarcus Aldridge" | -| "Marco Belinelli" | +| "Manu Ginobili" | +| "Manu Ginobili" | +| "Dejounte Murray" | ... ``` @@ -198,22 +225,41 @@ nebula> MATCH (v:player{name:"Tim Duncan"})--(v2) \ ```ngql # -->表示边从 v 开始,指向 v2。对于点 v 来说是出边,对于点 v2 来说是入边。 -nebula> MATCH (v:player{name:"Tim Duncan"})-->(v2) \ - RETURN v2.name AS Name; +nebula> MATCH (v:player{name:"Tim Duncan"})-->(v2:player) \ + RETURN v2.player.name AS Name; +-----------------+ | Name | +-----------------+ -| "Spurs" | | "Tony Parker" | | "Manu Ginobili" | +-----------------+ ``` +如果需要判断目标点,可以使用`CASE`表达式。 + +```ngql +nebula> MATCH (v:player{name:"Tim Duncan"})--(v2) \ + RETURN \ + CASE WHEN v2.team.name IS NOT NULL \ + THEN v2.team.name \ + WHEN v2.player.name IS NOT NULL \ + THEN v2.player.name END AS Name; + ++---------------------+ +| Name | ++---------------------+ +| "Manu Ginobili" | +| "Manu Ginobili" | +| "Spurs" | +| "Dejounte Murray" | +... +``` + 如果需要扩展模式,可以增加更多点和边。 ```ngql nebula> MATCH (v:player{name:"Tim Duncan"})-->(v2)<--(v3) \ - RETURN v3.name AS Name; + RETURN v3.player.name AS Name; +---------------------+ | Name | +---------------------+ @@ -227,7 +273,7 @@ nebula> MATCH (v:player{name:"Tim Duncan"})-->(v2)<--(v3) \ ```ngql nebula> MATCH (v:player{name:"Tim Duncan"})-->()<--(v3) \ - RETURN v3.name AS Name; + RETURN v3.player.name AS Name; +---------------------+ | Name | +---------------------+ @@ -441,6 +487,20 @@ nebula> MATCH p=(v:player{name:"Tim Duncan"})-[e:follow|serve*2]->(v2) \ +-----------------------------------------------------------+ ``` +### 匹配多个模式 + +用户可以用英文逗号(,)分隔多个模式。 + +``` +nebula> MATCH (v1:player{name:"Tim Duncan"}), (v2:team{name:"Spurs"}) \ + RETURN v1,v2; ++----------------------------------------------------+----------------------------------+ +| v1 | v2 | ++----------------------------------------------------+----------------------------------+ +| ("player100" :player{age: 42, name: "Tim Duncan"}) | ("team204" :team{name: "Spurs"}) | ++----------------------------------------------------+----------------------------------+ +``` + ## 常用检索操作 ### 检索点或边的信息 @@ -513,19 +573,19 @@ nebula> MATCH (v:player{name:"Tim Duncan"}) \ ```ngql nebula> MATCH (v:player{name:"Tim Duncan"}) \ - RETURN v.age; -+-------+ -| v.age | -+-------+ -| 42 | -+-------+ + RETURN v.player.age; ++--------------+ +| v.player.age | ++--------------+ +| 42 | ++--------------+ ``` 使用`AS`设置属性的别名。 ```ngql nebula> MATCH (v:player{name:"Tim Duncan"}) \ - RETURN v.age AS Age; + RETURN v.player.age AS Age; +-----+ | Age | +-----+ @@ -636,6 +696,26 @@ nebula> MATCH p=(v:player{name:"Tim Duncan"})-[*..2]->(v2) \ +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+ ``` +### 多MATCH检索 + +不同的模式有不同的筛选条件时,可以使用多`MATCH`,会返回模式完全匹配的行。 + +```ngql +nebula> MATCH (m)-[]->(n) WHERE id(m)=="player100" \ + MATCH (n)-[]->(l) WHERE id(n)=="player125" \ + RETURN id(m),id(n),id(l); ++-------------+-------------+-------------+ +| id(m) | id(n) | id(l) | ++-------------+-------------+-------------+ +| "player100" | "player125" | "team204" | +| "player100" | "player125" | "player100" | ++-------------+-------------+-------------+ +``` + +### OPTIONAL MATCH检索 + +参见[OPTIONAL MATCH](optional-match.md)。 + !!! Performance Nebula Graph 中`MATCH`语句的性能和资源占用得到了优化,但对性能要求较高时,仍建议使用 `GO`, `LOOKUP`, `|` 和 `FETCH` 等来替代`MATCH`。 diff --git a/docs-2.0/3.ngql-guide/7.general-query-statements/optional-match.md b/docs-2.0/3.ngql-guide/7.general-query-statements/optional-match.md new file mode 100644 index 0000000000..0f7db7446f --- /dev/null +++ b/docs-2.0/3.ngql-guide/7.general-query-statements/optional-match.md @@ -0,0 +1,39 @@ +# OPTIONAL MATCH + +`OPTIONAL MATCH`通常用于`MATCH`语句中,作为`MATCH`语句的可选项去匹配图数据库中的模式,如果图数据库中没有对应的模式,对应的列返回`NULL`。 + +## openCypher 兼容性 + +本文操作仅适用于 nGQL 中的 openCypher 方式。 + +## 示例 + +`MATCH`语句中使用`OPTIONAL MATCH`的示例如下: + +```ngql +nebula> MATCH (m)-[]->(n) WHERE id(m)=="player100" \ + OPTIONAL MATCH (n)-[]->(l) WHERE id(n)=="player125" \ + RETURN id(m),id(n),id(l); ++-------------+-------------+-------------+ +| id(m) | id(n) | id(l) | ++-------------+-------------+-------------+ +| "player100" | "team204" | __NULL__ | +| "player100" | "player101" | __NULL__ | +| "player100" | "player125" | "team204" | +| "player100" | "player125" | "player100" | ++-------------+-------------+-------------+ +``` + +而使用多`MATCH`,不使用`OPTIONAL MATCH`时,会返回模式完全匹配的行。示例如下: + +```ngql +nebula> MATCH (m)-[]->(n) WHERE id(m)=="player100" \ + MATCH (n)-[]->(l) WHERE id(n)=="player125" \ + RETURN id(m),id(n),id(l); ++-------------+-------------+-------------+ +| id(m) | id(n) | id(l) | ++-------------+-------------+-------------+ +| "player100" | "player125" | "team204" | +| "player100" | "player125" | "player100" | ++-------------+-------------+-------------+ +``` diff --git a/docs-2.0/3.ngql-guide/7.general-query-statements/7.unwind.md b/docs-2.0/3.ngql-guide/8.clauses-and-options/unwind.md similarity index 71% rename from docs-2.0/3.ngql-guide/7.general-query-statements/7.unwind.md rename to docs-2.0/3.ngql-guide/8.clauses-and-options/unwind.md index 2f2c2268e7..954034442c 100644 --- a/docs-2.0/3.ngql-guide/7.general-query-statements/7.unwind.md +++ b/docs-2.0/3.ngql-guide/8.clauses-and-options/unwind.md @@ -63,11 +63,11 @@ nebula> MATCH p=(v:player{name:"Tim Duncan"})--(v2) \ +----------------------------------------------------------------------------------------------------------------------+ | collect(r) | +----------------------------------------------------------------------------------------------------------------------+ -| [("player100" :player{age: 42, name: "Tim Duncan"}), ("player101" :player{age: 36, name: "Tony Parker"}), -("team204" :team{name: "Spurs"}), ("player102" :player{age: 33, name: "LaMarcus Aldridge"}), -("player125" :player{age: 41, name: "Manu Ginobili"}), ("player104" :player{age: 32, name: "Marco Belinelli"}), -("player144" :player{age: 47, name: "Shaquile O'Neal"}), ("player105" :player{age: 31, name: "Danny Green"}), -("player113" :player{age: 29, name: "Dejounte Murray"}), ("player107" :player{age: 32, name: "Aron Baynes"}), -("player109" :player{age: 34, name: "Tiago Splitter"}), ("player108" :player{age: 36, name: "Boris Diaw"})] | +| [("player100" :player{age: 42, name: "Tim Duncan"}), ("player101" :player{age: 36, name: "Tony Parker"}), | +|("team204" :team{name: "Spurs"}), ("player102" :player{age: 33, name: "LaMarcus Aldridge"}), | +|("player125" :player{age: 41, name: "Manu Ginobili"}), ("player104" :player{age: 32, name: "Marco Belinelli"}), | +|("player144" :player{age: 47, name: "Shaquile O'Neal"}), ("player105" :player{age: 31, name: "Danny Green"}), | +|("player113" :player{age: 29, name: "Dejounte Murray"}), ("player107" :player{age: 32, name: "Aron Baynes"}), | +|("player109" :player{age: 34, name: "Tiago Splitter"}), ("player108" :player{age: 36, name: "Boris Diaw"})] | +----------------------------------------------------------------------------------------------------------------------+ ``` diff --git a/mkdocs.yml b/mkdocs.yml index 3c1d8d8cad..ffc81c39d3 100755 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -194,10 +194,10 @@ nav: - 通用查询语句: - MATCH: 3.ngql-guide/7.general-query-statements/2.match.md + - OPTIONAL MATCH: 3.ngql-guide/7.general-query-statements/optional-match.md - LOOKUP: 3.ngql-guide/7.general-query-statements/5.lookup.md - GO: 3.ngql-guide/7.general-query-statements/3.go.md - FETCH: 3.ngql-guide/7.general-query-statements/4.fetch.md - - UNWIND: 3.ngql-guide/7.general-query-statements/7.unwind.md - SHOW: - SHOW CHARSET: 3.ngql-guide/7.general-query-statements/6.show/1.show-charset.md - SHOW COLLATION: 3.ngql-guide/7.general-query-statements/6.show/2.show-collation.md @@ -227,6 +227,7 @@ nav: - WHERE: 3.ngql-guide/8.clauses-and-options/where.md - YIELD: 3.ngql-guide/8.clauses-and-options/yield.md - WITH: 3.ngql-guide/8.clauses-and-options/with.md + - UNWIND: 3.ngql-guide/8.clauses-and-options/unwind.md - 图空间语句: - CREATE SPACE: 3.ngql-guide/9.space-statements/1.create-space.md From ee37a0ebfc43c58a24af5502ce9f0d8042518dd7 Mon Sep 17 00:00:00 2001 From: Steam Date: Thu, 6 Jan 2022 17:51:50 +0800 Subject: [PATCH 60/64] Update how-to-contribute.md (#1362) modify case and format --- docs-2.0/15.contribution/how-to-contribute.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs-2.0/15.contribution/how-to-contribute.md b/docs-2.0/15.contribution/how-to-contribute.md index f681a7e280..d294da3b46 100644 --- a/docs-2.0/15.contribution/how-to-contribute.md +++ b/docs-2.0/15.contribution/how-to-contribute.md @@ -2,9 +2,9 @@ ## 开始之前 -### github 或社区提交问题 +### GitHub 或社区提交问题 -欢迎为项目贡献任何代码或文档,但是建议先在 [github](https://github.com/vesoft-inc/nebula) 或[社区](https://discuss.nebula-graph.io/)上提交一个问题,和大家共同讨论。 +欢迎为项目贡献任何代码或文档,但是建议先在 [GitHub](https://github.com/vesoft-inc/nebula) 或[社区](https://discuss.nebula-graph.io/)上提交一个问题,和大家共同讨论。 ### 签署贡献者许可协议(CLA) @@ -12,7 +12,7 @@ 签署协议链接:[vesoft inc. Contributor License Agreement](https://cla-assistant.io/vesoft-inc/) -单击按钮** Sign in with GitHub to agree **签署协议。 +单击按钮 **Sign in with GitHub to agree** 签署协议。 如果有任何问题,请发送邮件至`info@vesoft.com`。 @@ -124,7 +124,7 @@ Nebula Graph 项目有很多[仓库](https://github.com/vesoft-inc),以 [nebul - 代码风格 - **Nebula Graph **采用`cpplint`来确保代码符合 Google 的代码风格指南。检查器将在提交代码之前执行。 + **Nebula Graph** 采用`cpplint`来确保代码符合 Google 的代码风格指南。检查器将在提交代码之前执行。 - 单元测试要求 @@ -193,13 +193,13 @@ pull request 创建后,至少需要两人审查。审查人员将进行彻底 ### Step 1:确认项目捐赠 -通过邮件、微信、Slack 等方式联络 Nebula Graph 官方人员,确认捐赠项目一事。项目将被捐赠至 Nebula Contrib 组织下。 +通过邮件、微信、Slack 等方式联络 Nebula Graph 官方人员,确认捐赠项目一事。项目将被捐赠至 [Nebula Contrib](https://github.com/nebula-contrib) 组织下。 -邮件地址:info@vesoft.com +* 邮件地址:info@vesoft.com -微信:NebulaGraphbot +* 微信:NebulaGraphbot -Slack:[Join Slack](https://join.slack.com/t/nebulagraph/shared_invite/zt-7ybejuqa-NCZBroh~PCh66d9kOQj45g) +* Slack:[Join Slack](https://join.slack.com/t/nebulagraph/shared_invite/zt-7ybejuqa-NCZBroh~PCh66d9kOQj45g) ### Step 2:获取项目接收人信息 @@ -207,6 +207,6 @@ Slack:[Join Slack](https://join.slack.com/t/nebulagraph/shared_invite/zt-7ybej ### Step 3:捐赠项目 -由您将项目转移至本次捐赠的项目接受人,并由项目接收者将该项目转移至 Nebula Contrib 组织下。捐赠后,您将以 Maintain 角色继续主导社区项目的发展。 +由您将项目转移至本次捐赠的项目接受人,并由项目接收者将该项目转移至 [Nebula Contrib](https://github.com/nebula-contrib) 组织下。捐赠后,您将以 Maintain 角色继续主导社区项目的发展。 GitHub 上转移仓库的操作,请参见 [Transferring a repository owned by your user account](https://docs.github.com/en/enterprise-server@3.0/github/administering-a-repository/managing-repository-settings/transferring-a-repository#transferring-a-repository-owned-by-your-user-account)。 From 0f5c990af2d5347396e4f156949b425f07eb7bc0 Mon Sep 17 00:00:00 2001 From: foesa <35463247+foesa-yang@users.noreply.github.com> Date: Fri, 7 Jan 2022 13:35:43 +0800 Subject: [PATCH 61/64] Insert vertex and tag (#1360) * insert vertex and tag * Update 4.delete-vertex.md * Update 0.FAQ.md * Update 0.FAQ.md * update * update * update * Update 1.insert-vertex.md * Update 1.insert-vertex.md * update-0107 --- docs-2.0/1.introduction/2.data-model.md | 6 +++- docs-2.0/2.quick-start/4.nebula-graph-crud.md | 7 ++--- .../6.cheatsheet-for-ngql-command.md | 2 +- docs-2.0/20.appendix/0.FAQ.md | 10 ++----- .../10.tag-statements/6.delete-tag.md | 6 ---- .../improve-query-by-tag-index.md | 4 --- .../12.vertex-statements/1.insert-vertex.md | 28 +++++++++++++------ .../12.vertex-statements/4.delete-vertex.md | 24 ++++++++++++---- 8 files changed, 50 insertions(+), 37 deletions(-) diff --git a/docs-2.0/1.introduction/2.data-model.md b/docs-2.0/1.introduction/2.data-model.md index 2ab75d26e6..2318359cac 100644 --- a/docs-2.0/1.introduction/2.data-model.md +++ b/docs-2.0/1.introduction/2.data-model.md @@ -15,7 +15,11 @@ Nebula Graph 数据模型使用 6 种基本的数据模型: 点用来保存实体对象,特点如下: - 点是用点标识符(`VID`)标识的。`VID`在同一图空间中唯一。VID 是一个 int64,或者 fixed_string(N)。 - - 点必须有至少一个 Tag,也可以有多个 Tag。但不能没有 Tag。 + - 点可以有 0 到多个 Tag。 + + !!! Compatibility + + Nebula Graph 2.x 的点不能没有 Tag。Nebula Graph {{nebula.release}} 的点可以没有 Tag。 - 边(Edge) diff --git a/docs-2.0/2.quick-start/4.nebula-graph-crud.md b/docs-2.0/2.quick-start/4.nebula-graph-crud.md index ee44a2fac5..9a00a30a17 100644 --- a/docs-2.0/2.quick-start/4.nebula-graph-crud.md +++ b/docs-2.0/2.quick-start/4.nebula-graph-crud.md @@ -14,7 +14,7 @@ | 组成部分 | 说明| | :--- | :--- | -| 点(Vertex) | 表示现实世界中的实体。一个点可以有一个或多个标签。 | +| 点(Vertex) | 表示现实世界中的实体。一个点可以有 0 到多个标签。 | | 标签(Tag) | 点的类型,定义了一组描述点类型的属性。 | | 边(Edge) | 表示两个点之间**有方向**的关系。| | 边类型(Edge type) | 边的类型,定义了一组描述边的类型的属性。 | @@ -180,10 +180,9 @@ nebula> CREATE EDGE serve(start_year int, end_year int); - 插入点 ```ngql - INSERT VERTEX [IF NOT EXISTS] ([, ...]) + INSERT VERTEX [IF NOT EXISTS] [ (] [, ...]) [, ([, ...]), ...] - VALUES : ([, ...]) - [, : ([, ...]; + VALUES : ([[, ...]]); ``` `VID`是 Vertex ID 的缩写,`VID`在一个图空间中是唯一的。参数详情请参见 [INSERT VERTEX](../3.ngql-guide/12.vertex-statements/1.insert-vertex.md)。 diff --git a/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md b/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md index 8aa5151460..d0a7217451 100644 --- a/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md +++ b/docs-2.0/2.quick-start/6.cheatsheet-for-ngql-command.md @@ -384,7 +384,7 @@ | 语句 | 语法 | 示例 | 说明 | | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| [INSERT VERTEX](../3.ngql-guide/12.vertex-statements/1.insert-vertex.md) | `INSERT VERTEX [IF NOT EXISTS] () [, (), ...] VALUES VID: ([, ])` | `INSERT VERTEX t2 (name, age) VALUES "13":("n3", 12), "14":("n4", 8)` | 在 Nebula Graph 实例的指定图空间中插入一个或多个点。 | +| [INSERT VERTEX](../3.ngql-guide/12.vertex-statements/1.insert-vertex.md) | `INSERT VERTEX [IF NOT EXISTS] [tag_props, [tag_props] ...] VALUES VID: ([prop_value_list])
tag_props: tag_name ([prop_name_list])
prop_name_list: [prop_name [, prop_name] ...]
prop_value_list: [prop_value [, prop_value] ...] ` | `INSERT VERTEX t2 (name, age) VALUES "13":("n3", 12), "14":("n4", 8)` | 在 Nebula Graph 实例的指定图空间中插入一个或多个点。 | | [DELETE VERTEX](../3.ngql-guide/12.vertex-statements/4.delete-vertex.md) | `DELETE VERTEX [, ...]` | `DELETE VERTEX "team1"` | 删除点,以及点关联的出边和入边。 | | [UPDATE VERTEX](../3.ngql-guide/12.vertex-statements/2.update-vertex.md) | `UPDATE VERTEX ON SET [WHEN ] [YIELD ]` | `UPDATE VERTEX ON player "player101" SET age = age + 2 ` | 修改点上 Tag 的属性值。 | | [UPSERT VERTEX](../3.ngql-guide/12.vertex-statements/3.upsert-vertex.md) | `UPSERT VERTEX ON SET [WHEN ] [YIELD ]` | `UPSERT VERTEX ON player "player667" SET age = 31` | 结合`UPDATE`和`INSERT`,如果点存在,会修改点的属性值;如果点不存在,会插入新的点。 | diff --git a/docs-2.0/20.appendix/0.FAQ.md b/docs-2.0/20.appendix/0.FAQ.md index 782a4a24e1..e35672cf3e 100644 --- a/docs-2.0/20.appendix/0.FAQ.md +++ b/docs-2.0/20.appendix/0.FAQ.md @@ -40,7 +40,7 @@ Nebula Graph 一直在持续开发,功能或操作的行为可能会有变化 悬挂边 (Dangling edge) 是指一条边的起点或者终点在数据库中不存在。 -Nebula Graph {{ nebula.release }} 的数据模型中,异常情况下可能会存在"悬挂边";也没有 openCypher 中的 MERGE 语句。对于悬挂边的保证完全依赖应用层面。详见 [INSERT VERTEX](../3.ngql-guide/12.vertex-statements/1.insert-vertex.md), [DELETE VERTEX](../3.ngql-guide/12.vertex-statements/4.delete-vertex.md), [INSERT EDGE](../3.ngql-guide/13.edge-statements/1.insert-edge.md), [DELETE EDGE](../3.ngql-guide/13.edge-statements/4.delete-edge.md)。 +Nebula Graph {{ nebula.release }} 的数据模型中,由于设计允许图中存在“悬挂边”;没有 openCypher 中的 MERGE 语句。对于悬挂边的保证完全依赖应用层面。详见 [INSERT VERTEX](../3.ngql-guide/12.vertex-statements/1.insert-vertex.md), [DELETE VERTEX](../3.ngql-guide/12.vertex-statements/4.delete-vertex.md), [INSERT EDGE](../3.ngql-guide/13.edge-statements/1.insert-edge.md), [DELETE EDGE](../3.ngql-guide/13.edge-statements/4.delete-edge.md)。 ### 如何处理错误信息 `[ERROR (-1005)]: Used memory hits the high watermark(0.800000) of total system memory.` @@ -236,11 +236,7 @@ Storage 服务在毫秒级时间内多次收到插入或者更新同一点或边 ### 能不能用中文字符做标识符,比如图空间、Tag、Edge type、属性、索引的名称? -不能。 - -图空间、Tag、Edge type、属性以及索引的名称都需由大小写英文字母、数字或下划线组成,暂不支持使用中文字符。 - -同时,上述标识符区分大小写,且不可使用[关键字和保留字](../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。 +能,详情参见[关键字和保留字](../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。 ### 获取指定点的出度(或者入度)? @@ -378,4 +374,4 @@ telnet: connect to address 192.168.1.10: Connection refused | 未到生效期 | 不可登录且无法使用 | 您的 License 还未到生效时间,请于有效期范围内使用。 | | 过期前 3 天内 | 可以登录并继续使用 | 您的 License 证书有效时间还剩 <3\|2\|1\|0> 天,过期7天后无法使用,请及时联系销售([inqury@vesoft.com](mailto:inqury@vesoft.com))购买并更换新的证书。 | | 过期后 7 天内 | 可以登录并继续使用 | 您的 License 证书已过期 <0\|1\|2\|3\|4\|5\|6\|7> 天,过期7天后无法使用,请及时联系销售([inqury@vesoft.com](mailto:inqury@vesoft.com))购买并更换新的证书。 | -| 过期后 7 天以上 | 不可登录且无法使用 | 您的 License 已过期 7 天以上,产品无法正常使用,请及时联系销售([inqury@vesoft.com](mailto:inqury@vesoft.com))购买并更换新的证书。 | \ No newline at end of file +| 过期后 7 天以上 | 不可登录且无法使用 | 您的 License 已过期 7 天以上,产品无法正常使用,请及时联系销售([inqury@vesoft.com](mailto:inqury@vesoft.com))购买并更换新的证书。 | diff --git a/docs-2.0/3.ngql-guide/10.tag-statements/6.delete-tag.md b/docs-2.0/3.ngql-guide/10.tag-statements/6.delete-tag.md index e4eaef7a96..c2ae2e9ae6 100644 --- a/docs-2.0/3.ngql-guide/10.tag-statements/6.delete-tag.md +++ b/docs-2.0/3.ngql-guide/10.tag-statements/6.delete-tag.md @@ -2,12 +2,6 @@ `DELETE TAG`语句可以删除指定点上的指定 Tag。 -点可以有一个或多个 Tag。 - -- 如果某个点只有一个 Tag,删除这个点上的 Tag 后,用户就**无法访问**这个点,下次 Compaction 操作时会删除该点,但点上的边仍然存在。 - -- 如果某个点有多个 Tag,删除其中一个 Tag,仍然可以访问这个点,但是**无法访问**这个点上已删除 Tag 所定义的所有属性。 - ## 前提条件 登录的用户必须拥有对应权限才能执行`DELETE TAG`语句。详情请参见[内置角色权限](../../7.data-security/1.authentication/3.role-list.md)。 diff --git a/docs-2.0/3.ngql-guide/10.tag-statements/improve-query-by-tag-index.md b/docs-2.0/3.ngql-guide/10.tag-statements/improve-query-by-tag-index.md index 2db5884460..2a94deb14f 100644 --- a/docs-2.0/3.ngql-guide/10.tag-statements/improve-query-by-tag-index.md +++ b/docs-2.0/3.ngql-guide/10.tag-statements/improve-query-by-tag-index.md @@ -4,10 +4,6 @@ 在 Nebula Graph 中,可以通过 Tag 变相实现相同操作,创建 Tag 并将 Tag 插入到已有的点上,就可以根据 Tag 名称快速查找点,也可以通过`DELETE TAG`删除某些点上不再需要的 Tag。 -!!! caution - - 请确保点上已经有另一个 Tag,否则删除点上最后一个 Tag 时,会导致点也被删除。 - ## 示例 例如在 basketballplayer 数据集中,部分篮球运动员同时也是球队股东,可以为股东 Tag`shareholder`创建索引,方便快速查找。如果不再是股东,可以通过`DELETE TAG`语句删除相应运动员的股东 Tag。 diff --git a/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md b/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md index 5ea1d4ad16..4c5bf8930d 100644 --- a/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md +++ b/docs-2.0/3.ngql-guide/12.vertex-statements/1.insert-vertex.md @@ -9,14 +9,18 @@ ## 语法 ```ngql -INSERT VERTEX [IF NOT EXISTS] () [, (), ...] -VALUES VID: ([, ]) + +INSERT VERTEX [IF NOT EXISTS] [tag_props, [tag_props] ...] +VALUES VID: ([prop_value_list]) + +tag_props: + tag_name ([prop_name_list]) prop_name_list: - [prop_name [, prop_name] ...] + [prop_name [, prop_name] ...] prop_value_list: - [prop_value [, prop_value] ...] + [prop_value [, prop_value] ...] ``` - `IF NOT EXISTS`:用户可以使用`IF NOT EXISTS`关键字检测待插入的 VID 是否存在,只有不存在时,才会插入,如果已经存在,不会进行修改。 @@ -26,13 +30,17 @@ prop_value_list: - `IF NOT EXISTS` 仅检测 VID + Tag 的值是否相同,不会检测属性值。 - `IF NOT EXISTS` 会先读取一次数据是否存在,因此对性能会有明显影响。 -- `tag_name`:点关联的 Tag(点类型)。Tag 必须提前创建,详情请参见 [CREATE TAG](../10.tag-statements/1.create-tag.md)。 +- `tag_name`:点关联的 Tag(点类型)。Tag 的创建,详情请参见 [CREATE TAG](../10.tag-statements/1.create-tag.md)。 + + !!! caution -- `prop_name_list`:需要设置的属性名称列表。 + Nebula Graph {{ nebula.release }} 中支持插入无 Tag 的点。 -- `VID`:点 ID。在 Nebula Graph 2.0 中支持字符串和整数,需要在创建图空间时设置,详情请参见 [CREATE SPACE](../9.space-statements/1.create-space.md)。 +- `property_name`:需要设置的属性名称。 -- `prop_value_list`:根据`prop_name_list`填写属性值。如果没有填写属性值,而 Tag 中对应的属性设置为`NOT NULL`,会返回错误。详情请参见 [CREATE TAG](../10.tag-statements/1.create-tag.md)。 +- `vid`:点 ID。在 Nebula Graph {{ nebula.release }} 中支持字符串和整数,需要在创建图空间时设置,详情请参见 [CREATE SPACE](../9.space-statements/1.create-space.md)。 + +- `property_value`:根据`prop_name_list`填写属性值。如果没有填写属性值,而 Tag 中对应的属性设置为`NOT NULL`,会返回错误。详情请参见 [CREATE TAG](../10.tag-statements/1.create-tag.md)。 !!! caution @@ -47,6 +55,9 @@ prop_value_list: ## 示例 ```ngql +# 插入不包含 Tag 的点。 +nebula> INSERT VERTEX VALUES "1":(); + # 插入不包含属性的点。 nebula> CREATE TAG IF NOT EXISTS t1(); nebula> INSERT VERTEX t1() VALUES "10":(); @@ -118,6 +129,7 @@ nebula> FETCH PROP on t5 "004" YIELD properties(vertex); ```ngql # 插入点 1。 nebula> INSERT VERTEX t2 (name, age) VALUES "1":("n2", 13); + # 使用 IF NOT EXISTS 修改点 1,因为点 1 已存在,不会进行修改。 nebula> INSERT VERTEX IF NOT EXISTS t2 (name, age) VALUES "1":("n3", 14); nebula> FETCH PROP ON t2 "1" YIELD properties(vertex); diff --git a/docs-2.0/3.ngql-guide/12.vertex-statements/4.delete-vertex.md b/docs-2.0/3.ngql-guide/12.vertex-statements/4.delete-vertex.md index b831f80461..7edbcfcbb2 100644 --- a/docs-2.0/3.ngql-guide/12.vertex-statements/4.delete-vertex.md +++ b/docs-2.0/3.ngql-guide/12.vertex-statements/4.delete-vertex.md @@ -1,25 +1,37 @@ # DELETE VERTEX -`DELETE VERTEX`语句可以删除点,以及点关联的出边和入边。 +`DELETE VERTEX`语句可以删除点,但是默认不删除该点关联的出边和入边。 + +!!! Compatibility + + Nebula Graph 2.x 默认删除点及关联该点的出边和入,Nebula Graph {{nebula.release}} 默认只删除点,不删除该点关联的出边和入边,此时将默认存在悬挂边。 `DELETE VERTEX`语句一次可以删除一个或多个点。用户可以结合管道符一起使用,详情请参见[管道符](../5.operators/4.pipe.md)。 !!! note - - `DELETE VERTEX`是直接删除点和关联的边。 + - `DELETE VERTEX`是直接删除点,不删除关联的边。 - - `DELETE TAG`是删除指定点上的指定 Tag。当点上只有一个 Tag 时,执行`DELETE TAG`会删除点,但是不会删除关联的边。 + - `DELETE TAG`是删除指定点上的指定 Tag。 ## 语法 ```ngql -DELETE VERTEX [, ...]; +DELETE VERTEX [ , ... ] [WITH EDGE]; ``` +- `WITH EDGE`: 删除该点关联的出边和入边。 + + ## 示例 ```ngql +# 删除 VID 为 `team1` 的点,不删除该点关联的出边和入边。 nebula> DELETE VERTEX "team1"; + +# 删除 VID 为 `team1` 的点,并删除该点关联的出边和入边。 +nebula> DELETE VERTEX "team1" WITH EDGE; + ``` ```ngql @@ -27,9 +39,9 @@ nebula> DELETE VERTEX "team1"; nebula> GO FROM "player100" OVER serve WHERE properties(edge).start_year == "2021" YIELD dst(edge) AS id | DELETE VERTEX $-.id; ``` -## 删除过程与删除邻边 +## 删除过程 -Nebula Graph 先找到并删除目标点的所有邻边(出边和入边),然后删除目标点。 +Nebula Graph 找到目标点并删除,该目标点的所有邻边(出边和入边)将成为悬挂边。 !!! caution From cb85074fbb8777bd5a8c3ec8baf1b98e5563a637 Mon Sep 17 00:00:00 2001 From: randomJoe211 <69501902+randomJoe211@users.noreply.github.com> Date: Fri, 7 Jan 2022 15:14:01 +0800 Subject: [PATCH 62/64] Update exchange compilation steps (#1364) --- docs-2.0/nebula-exchange/ex-ug-compile.md | 72 +++++++++++------------ 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/docs-2.0/nebula-exchange/ex-ug-compile.md b/docs-2.0/nebula-exchange/ex-ug-compile.md index 9e2b153815..566bbf330b 100644 --- a/docs-2.0/nebula-exchange/ex-ug-compile.md +++ b/docs-2.0/nebula-exchange/ex-ug-compile.md @@ -4,7 +4,7 @@ ## 直接下载 JAR 文件 -社区版 Exchange 的 JAR 文件可以直接[下载](https://repo1.maven.org/maven2/com/vesoft/nebula-exchange/)。 +社区版 Exchange 的 JAR 文件可以直接[下载](https://github.com/vesoft-inc/nebula-exchange/releases)。 要下载企业版 Exchange,需先[获取 Nebula Graph 企业版套餐](https://nebula-graph.com.cn/pricing/)。 @@ -19,52 +19,46 @@ ### 前提条件 - 安装 [Maven](https://maven.apache.org/download.cgi)。 - - -- 下载 [pulsar-spark-connector_2.11](https://oss-cdn.nebula-graph.com.cn/jar-packages/pulsar-spark-connector_2.11.zip),解压到本地 Maven 库的目录`io/streamnative/connectors`中。 +- 根据数据源安装需要的 Spark 版本,从各数据源导出数据支持的 Spark 版本参见[软件依赖](about-exchange/ex-ug-limitations.md)。 ### 操作步骤 1. 在根目录克隆仓库`nebula-exchange`。 - ```bash - git clone -b {{exchange.branch}} https://github.com/vesoft-inc/nebula-exchange.git - ``` + ```bash + git clone -b {{exchange.branch}} https://github.com/vesoft-inc/nebula-exchange.git + ``` 2. 切换到目录`nebula-exchange`。 - ```bash - cd nebula-exchange/nebula-exchange - ``` - -3. 打包 Nebula Exchange。 - - ```bash - mvn clean package -Dmaven.test.skip=true -Dgpg.skip -Dmaven.javadoc.skip=true - ``` - -编译成功后,用户可以在当前目录里查看到类似如下目录结构。 - -```text -. -├── README-CN.md -├── README.md -├── pom.xml -├── src -│   ├── main -│   └── test -└── target - ├── classes - ├── classes.timestamp - ├── maven-archiver - ├── nebula-exchange-2.x.y-javadoc.jar - ├── nebula-exchange-2.x.y-sources.jar - ├── nebula-exchange-2.x.y.jar - ├── original-nebula-exchange-2.x.y.jar - └── site -``` - -在`target`目录下,用户可以找到`exchange-2.x.y.jar`文件。 + ```bash + cd nebula-exchange + ``` + +3. 根据 Exchange 使用环境中的 Spark 版本打包 Exchange。 + + - Spark 2.2: + + ```bash + mvn clean package -Dmaven.test.skip=true -Dgpg.skip -Dmaven.javadoc.skip=true \ + -pl nebula-exchange_spark_2.2 -am -Pscala-2.11 -Pspark-2.2 + ``` + + - Spark 2.4: + + ```bash + mvn clean package -Dmaven.test.skip=true -Dgpg.skip -Dmaven.javadoc.skip=true \ + -pl nebula-exchange_spark_2.4 -am -Pscala-2.11 -Pspark-2.4 + ``` + + - Spark 3.0: + + ```bash + mvn clean package -Dmaven.test.skip=true -Dgpg.skip -Dmaven.javadoc.skip=true \ + -pl nebula-exchange_spark_3.0 -am -Pscala-2.12 -Pspark-3.0 + ``` + +编译成功后,可以在`nebula-exchange_spark_x.x/target/`目录里找到`nebula-exchange_spark_x.x-{{exchange.branch}}.jar`文件。`x.x`代表 Spark 版本,例如`2.4`。 !!! note JAR 文件版本号会因 Nebula Java Client 的发布版本而变化。用户可以在 [Releases 页面](https://github.com/vesoft-inc/nebula-java/releases)查看最新版本。 From 596929a4681f241f21ecfa6bf9ee2c3fabffb354 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Fri, 7 Jan 2022 15:14:45 +0800 Subject: [PATCH 63/64] key-value separation support of RocksDB (#1363) * key-value separation support of RocksDB * Update 4.storage-config.md --- .../1.configurations/4.storage-config.md | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md b/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md index 9f33a87d81..65092b71cd 100644 --- a/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md +++ b/docs-2.0/5.configurations-and-logs/1.configurations/4.storage-config.md @@ -40,8 +40,8 @@ Storage 服务提供了两份初始配置文件`nebula-storaged.conf.default`和 | 名称 | 预设值 | 说明 | | :------------- | :------------------------ | :------------------------------------------------ | | `log_dir` | `logs` | 存放 Storage 服务日志的目录,建议和数据保存在不同硬盘。 | -| `minloglevel` | `0` | 最小日志级别,即不会记录低于这个级别的日志。可选值为`0`(INFO)、`1`(WARNING)、`2`(ERROR)、`3`(FATAL)。建议在调试时设置为`0`,生产环境中设置为`1`。如果设置为`4`,Nebula Graph 不会记录任何日志。 | -| `v` | `0` | 日志详细级别,值越大,日志记录越详细。可选值为`0`、`1`、`2`、`3`。 | +| `minloglevel` | `0` | 最小日志级别,即不会记录低于这个级别的日志。可选值:`0`(INFO)、`1`(WARNING)、`2`(ERROR)、`3`(FATAL)。建议在调试时设置为`0`,生产环境中设置为`1`。如果设置为`4`,Nebula Graph 不会记录任何日志。 | +| `v` | `0` | 日志详细级别,值越大,日志记录越详细。可选值:`0`、`1`、`2`、`3`。 | | `logbufsecs` | `0` | 缓冲日志的最大时间,超时后输出到日志文件。`0`表示实时输出。单位:秒。 | |`redirect_stdout`|`true` |是否将标准输出和标准错误重定向到单独的输出文件。 | |`stdout_log_file` |`storaged-stdout.log` | 标准输出日志文件名称。 | @@ -77,19 +77,28 @@ Storage 服务提供了两份初始配置文件`nebula-storaged.conf.default`和 | 名称 | 预设值 | 说明 | | :--------------------------| :-------------- | :------------------------ | |`data_path` | `data/storage` | 数据存储路径,多个路径用英文逗号(,)分隔。一个 RocksDB 实例对应一个路径。 | -|`minimum_reserved_bytes`|`268435456`|每个数据存储路径的剩余空间最小值,低于该值时,可能会导致集群数据写入失败。单位:字节。默认为`1073741824`,即 1GB。| +|`minimum_reserved_bytes`|`268435456`|每个数据存储路径的剩余空间最小值,低于该值时,可能会导致集群数据写入失败。单位:字节。| |`rocksdb_batch_size` | `4096` | 批量操作的缓存大小。单位:字节。 | |`rocksdb_block_cache` | `4` | BlockBasedTable 的默认块缓存大小。单位:兆(MB)。 | |`engine_type` | `rocksdb` | 存储引擎类型。 | -|`rocksdb_compression` | `lz4` | 压缩算法,可选值为`no`、`snappy`、`lz4`、`lz4hc`、`zlib`、`bzip2`和`zstd`。 | +|`rocksdb_compression` | `lz4` | 压缩算法,可选值:`no`、`snappy`、`lz4`、`lz4hc`、`zlib`、`bzip2`、`zstd`。 | |`rocksdb_compression_per_level` | - | 为不同级别设置不同的压缩算法。 | |`enable_rocksdb_statistics` | `false` | 是否启用 RocksDB 的数据统计。 | -|`rocksdb_stats_level` | `kExceptHistogramOrTimers` | RocksDB 的数据统计级别。可选值为`kExceptHistogramOrTimers`(禁用计时器统计,跳过柱状图统计)、`kExceptTimers`(跳过计时器统计)、`kExceptDetailedTimers`(收集除互斥锁和压缩花费时间之外的所有统计数据)、`kExceptTimeForMutex`收集除互斥锁花费时间之外的所有统计数据)和`kAll`(收集所有统计数据)。 | +|`rocksdb_stats_level` | `kExceptHistogramOrTimers` | RocksDB 的数据统计级别。可选值:`kExceptHistogramOrTimers`(禁用计时器统计,跳过柱状图统计)、`kExceptTimers`(跳过计时器统计)、`kExceptDetailedTimers`(收集除互斥锁和压缩花费时间之外的所有统计数据)、`kExceptTimeForMutex`收集除互斥锁花费时间之外的所有统计数据)、`kAll`(收集所有统计数据)。 | |`enable_rocksdb_prefix_filtering` | `true` | 是否启用 prefix bloom filter,启用时可以提升图遍历速度,但是会增加内存消耗。 | |`enable_rocksdb_whole_key_filtering` | `false` | 是否启用 whole key bloom filter。 | -|`rocksdb_filtering_prefix_length` | `12` | 每个 key 的 prefix 长度。可选值为`12`(分片 ID+点 ID)和`16`(分片 ID+点 ID+TagID/Edge typeID)。单位:字节。 | +|`rocksdb_filtering_prefix_length` | `12` | 每个 key 的 prefix 长度。可选值:`12`(分片 ID+点 ID)、`16`(分片 ID+点 ID+TagID/Edge typeID)。单位:字节。 | |`enable_partitioned_index_filter`|- |设置为`true`可以降低 bloom 过滤器占用的内存大小,但是在某些随机寻道(random-seek)的情况下,可能会降低读取性能。| +## Key-Value separation 配置 + +| 名称 | 预设值 | 说明 | +| :------------------| :------------------------| :------------------------------- | +| `rocksdb_enable_kv_separation` | `false` | 是否启用 BlobDB KV 分离存储功能。开启后可以提高查询性能。 | +| `rocksdb_kv_separation_threshold` | `100` | RocksDB KV 分离的阈值,在 flush 或 compaction 期间,大于或等于该阈值的值将被写入blob文件。单位:字节。 | +| `rocksdb_blob_compression` | `lz4` | BlobDB 的压缩算法,可选值:`no`、`snappy`、`lz4`、`lz4hc`、`zlib`、`bzip2`、`zstd`。 | +| `rocksdb_enable_blob_garbage_collection` | `true` | 在 compaction 过程中是否对 BlobDB 进行垃圾收集。 | + ## misc 配置 !!! caution From bb07fc03df55bd93005e106b895bbbd234c8949e Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Fri, 7 Jan 2022 15:15:45 +0800 Subject: [PATCH 64/64] add nebula plato (#1329) * add nebula plato * update * update * update * update * update * update * Update docs-2.0/nebula-plato.md Co-authored-by: abby.huang <78209557+abby-cyber@users.noreply.github.com> * update Co-authored-by: abby.huang <78209557+abby-cyber@users.noreply.github.com> --- docs-2.0/20.appendix/6.eco-tool-version.md | 8 + docs-2.0/nebula-plato.md | 230 +++++++++++++++++++++ mkdocs.yml | 5 + 3 files changed, 243 insertions(+) create mode 100644 docs-2.0/nebula-plato.md diff --git a/docs-2.0/20.appendix/6.eco-tool-version.md b/docs-2.0/20.appendix/6.eco-tool-version.md index 3694efc05f..14f2916aba 100644 --- a/docs-2.0/20.appendix/6.eco-tool-version.md +++ b/docs-2.0/20.appendix/6.eco-tool-version.md @@ -123,6 +123,14 @@ Nebula Algorithm(简称 Algorithm)是一款基于 [GraphX](https://spark.apa |:---|:---| | {{ nebula.release }} | {{algorithm.release}}(2c61ca5) | +## Nebula Plato + +Nebula Plato 是一款集成了开源高性能图计算框架 Plato 的应用程序,支持利用 Plato 对 Nebula Graph 数据库中的数据执行图计算。详情请参见[什么是 Nebula Plato](../nebula-plato.md)。 + +|Nebula Graph 版本|Plato 版本(commit id)| +|:---|:---| +| {{ nebula.release }} | {{plato.release}}(d895634) | + ## Nebula Console Nebula Console 是 Nebula Graph 的原生 CLI 客户端。如何使用请参见[连接 Nebula Graph](../2.quick-start/3.connect-to-nebula-graph.md)。 diff --git a/docs-2.0/nebula-plato.md b/docs-2.0/nebula-plato.md new file mode 100644 index 0000000000..6f3612a1c0 --- /dev/null +++ b/docs-2.0/nebula-plato.md @@ -0,0 +1,230 @@ +# Nebula Plato + +[Nebula Plato](https://github.com/vesoft-inc/nebula-algorithm) 是一款集成了开源高性能图计算框架 [Plato](https://github.com/tencent/plato) 的应用程序,支持利用 Plato 对 Nebula Graph 数据库中的数据执行图计算。 + +!!! enterpriseonly + + 仅企业版支持本功能。 + +## 适用场景 + +支持将数据源为 Nebula Graph 集群、HDFS 上的 CSV 文件或本地 CSV 文件中的数据导入 Nebula Plato,并将图计算结果输出至 Nebula Graph 集群、HDFS 上的 CSV 文件或本地 CSV 文件。 + +## 使用限制 + +输入和输出均为 Nebula Graph 集群时,图计算结果只能输出到数据源所在的图空间。 + +## 版本兼容性 + +Nebula Plato 版本和 Nebula Graph 内核的版本对应关系如下。 + +|Plato client 版本|Nebula Graph 版本| +|:---|:---| +|{{plato.release}}|{{nebula.release}}| + +## 支持算法 + +Nebula Plato 支持的图计算算法如下。 + +| 算法名 |说明 |分类 | +|:----------------------|:----------------|:-----------| +| APSP | 全图最短路径 | 路径 | +| SSSP | 单源最短路径 | 路径 | +| BFS | 广度优先遍历 | 路径 | +| PageRank | 页面排序 | 节点重要度 | +| KCore | K核 | 节点重要度 | +| DegreeCentrality | 度中心性 | 节点重要度 | +| TriangleCount | 三角计数 | 图特征 | +| LPA | 标签传播 | 社区发现 | +| WCC | 联通分量 | 社区发现 | +| LOUVAIN | 社区发现 | 社区发现 | +| HANP | 跳衰减和节点偏好 | 社区发现 | +| Clustering Coefficient| 聚集系数 | 聚类 | + +## 安装 Nebula Plato + +在多个机器安装多个 Nebula Plato 服务构成集群时,需要安装路径相同,并设置节点间 SSH 免密登录。 + +### RPM包安装 + +```bash +sudo rpm -i nebula-plato-1.0-centos.x86_64.rpm --prefix /home/xxx/nebula-plato +``` + +### 编译安装 + +编译安装 Nebula Plato 的准备工作和编译 Nebula Graph 类似,详情参见[准备资源](4.deployment-and-installation/1.resource-preparations.md)。 + +1. 克隆仓库`plato`。 + + ```bash + $ git clone -b {{plato.branch}} https://github.com/vesoft-inc/plato.t + ``` + +2. 进入目录`plato`。 + + ```bash + $ cd plato + ``` + +3. 执行脚本安装编译依赖。 + + ```bash + $ sudo ./docker/install-dependencies.sh + ``` + +4. 下载并编译静态链接库。 + + ```bash + $ ./3rdtools.sh distclean && ./3rdtools.sh install + ``` + +5. 编译 Nebula Plato。 + + ```bash + $ ./build.sh + ``` + +## 使用方法 + +安装完成后,用户可以设置不同算法的参数,然后执行脚本,即可获得算法的结果,并导出为指定格式。 + +1. 选择 Nebula Plato 集群的任一节点,进入目录`scripts`。 + + ```bash + $ cd scripts + ``` + +2. 确认数据源和输出路径。配置方法如下: + + - 数据源为 Nebula Graph 集群 + + 1. 修改配置文件`nebula.conf`,设置 Nebula Graph 集群相关信息。 + + ```bash + # 连接 Nebula Graph 时的重试次数。 + --retry=3 + # 要读取或写入的图空间名称。 + --space=baskeyballplayer + + # 读取 Nebula Graph 设置 + # Nebula Graph 的 metad 服务地址。 + --meta_server_addrs=192.168.8.100:9559, 192.168.8.101:9559, 192.168.8.102:9559 + # 要读取的边的名称。 + --edges=LIKES + # 要读取的作为边的权重属性的名称。可以是属性名,也可以是 _rank。 + #--edge_data_fields + # 每次扫描读取的行数。 + --read_batch_size=10000 + + # 写回 Nebula Graph 设置 + # Nebula Graph 的 graphd 服务地址。 + --graph_server_addrs=192.168.8.100:9669 + # Nebula Graph 的登录用户名。 + --user=root + # Nebula Graph 的登录密码。 + --password=nebula + # 写回 Nebula Graph 时采用的模式: insert 和 update。 + --mode=insert + # 写回到 Nebula Graph 的 Tag 名称。 + --tag=pagerank + # 写回到 Nebula Graph 的 Tag 对应的属性名称。 + --prop=pr + # 写回到 Nebula Graph 的 Tag 对应的属性的类型。 + --type=double + # 写回时,每次写入的行数。 + --write_batch_size=1000 + # 写回失败的数据所存储的文件。 + --err_file=/home/jie.wang/plato/err.txt + ``` + + 2. 修改需要使用的算法脚本,例如`run_pagerank.sh`,设置相关参数。 + + ```bash + # 集群所有机器所运行的进程数之和,推荐每台机器为 1 或者 NUMA 架构的 node 数。 + WNUM=3 + # 每个进程的线程数,推荐最大设置为机器的硬件线程数。 + WCORES=4 + # 数据源路径 + # 可以通过文件 nebula.conf 设置从 Nebula Graph 读取: + INPUT=${INPUT:="nebula:$PROJECT/scripts/nebula.conf"} + # 也可以通过本地或 HDFS 上的 CSV 文件读取: + # #INPUT=${INPUT:="$PROJECT/data/graph/v100_e2150_ua_c3.csv"} + + # 图计算结果输出路径 + # 可以输出至 Nebula Graph 集群,如果数据源也为 Nebula Graph,结果会输出至 nebula.conf 指定的图空间。 + OUTPUT=${OUTPUT:="nebula:$PROJECT/scripts/nebula.conf"} + # 也可以输出至本地或 HDFS 上的 CSV 文件: + # OUTPUT=${OUTPUT:='hdfs://192.168.8.100:9000/_test/output'} + + # true 为有向图,false 为无向图。 + IS_DIRECTED=${IS_DIRECTED:=true} + # 是否进行 ID 编码 + NEED_ENCODE=${NEED_ENCODE:=true} + # 数据源的点 ID 类型,例如:string、int32、int64。 + VTYPE=${VTYPE:=int32} + # 编码类型。distributed 为分布式点ID编码,single 为单机点 ID 编码。 + ENCODER=${ENCODER:="distributed"} + # PageRank 算法的参数。不同算法的参数不同。 + EPS=${EPS:=0.0001} + DAMPING=${DAMPING:=0.85} + # 迭代次数 + ITERATIONS=${ITERATIONS:=100} + ``` + + - 数据源为本地或 HDFS 上的 CSV 文件 + + 修改需要使用的算法脚本,例如`run_pagerank.sh`,设置相关参数。 + + ```bash + # 集群所有机器所运行的进程数之和,推荐每台机器为 1 或者 NUMA 架构的 node 数。 + WNUM=3 + # 每个进程的线程数,推荐最大设置为机器的硬件线程数。 + WCORES=4 + # 数据源路径 + # 可以通过文件 nebula.conf 设置从 Nebula Graph 读取: + # INPUT=${INPUT:="nebula:$PROJECT/scripts/nebula.conf"} + # 也可以通过本地或 HDFS 上的 CSV 文件读取: + INPUT=${INPUT:="$PROJECT/data/graph/v100_e2150_ua_c3.csv"} + + # 图计算结果输出路径 + # 可以输出至 Nebula Graph 集群,如果数据源也为 Nebula Graph,结果会输出至 nebula.conf 指定的图空间。 + # OUTPUT=${OUTPUT:="nebula:$PROJECT/scripts/nebula.conf"} + # 也可以输出至本地或 HDFS 上的 CSV 文件: + OUTPUT=${OUTPUT:='hdfs://192.168.8.100:9000/_test/output'} + + # true 为有向图,false 为无向图。 + IS_DIRECTED=${IS_DIRECTED:=true} + # 是否进行 ID 编码 + NEED_ENCODE=${NEED_ENCODE:=true} + # 数据源的点 ID 类型,例如:string、int32、int64。 + VTYPE=${VTYPE:=int32} + # 编码类型。distributed 为分布式点ID编码,single 为单机点 ID 编码。 + ENCODER=${ENCODER:="distributed"} + # PageRank 算法的参数。不同算法的参数不同。 + EPS=${EPS:=0.0001} + DAMPING=${DAMPING:=0.85} + # 迭代次数 + ITERATIONS=${ITERATIONS:=100} + ``` + +3. 修改配置文件`cluster`,设置执行算法的 Nebula Plato 集群节点和任务分配权重。 + + ```bash + # Nebula Plato 集群节点 IP 地址:任务分配权重 + 192.168.8.200:1 + 192.168.8.201:1 + 192.168.8.202:1 + ``` + +4. 执行算法脚本。例如: + + ```bash + ./run_pagerank.sh + ``` + +5. 在输出路径查看计算结果。 + + - 输出至 Nebula Graph 集群,请根据`nebula.conf`的设置查看计算结果。 + + - 输出至 HDFS 上的 CSV 文件或本地 CSV 文件,请根据图计算脚本内的`OUTPUT`设置查看计算结果,计算结果为`.gz`格式的压缩文件。 \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index ffc81c39d3..22d717d4ca 100755 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -75,6 +75,9 @@ extra: algorithm: release: 2.5.1 branch: v2.5 + plato: + release: 1.0.0 + branch: v1.0.0 sparkconnector: release: 2.6.1 branch: v2.6 @@ -477,6 +480,8 @@ nav: - Nebula Algorithm: nebula-algorithm.md + - Nebula Plato: nebula-plato.md + - Nebula Spark Connector: nebula-spark-connector.md - Nebula Flink Connector: nebula-flink-connector.md