From 10fd5fd62a7aa9775830d22ec5f840498302a927 Mon Sep 17 00:00:00 2001 From: cooper-lzy <78672629+cooper-lzy@users.noreply.github.com> Date: Mon, 6 Sep 2021 15:36:23 +0800 Subject: [PATCH] Merge 2.5.0 to book (#931) * Update 4.storage-service.md * Update source_install-nebula-graph-by-rpm-or-deb.md * Update st-ug-crud-tag.md * fix faq * Update 3.graph-config.md * Update 3.graph-config.md * Update 3.deploy-listener.md * fix * Update st-ug-import-data.md * math * Update 1.configurations.md * Update source_install-nebula-graph-by-rpm-or-deb.md * Update 1.configurations.md * Update source_connect-to-nebula-graph.md * Update source_install-nebula-graph-by-rpm-or-deb.md * Update source_manage-service.md * Update source_install-nebula-graph-by-rpm-or-deb.md * Update 3.vid.md Co-authored-by: foesa <35463247+foesa-yang@users.noreply.github.com> Co-authored-by: min.wu <50101159+whitewum@users.noreply.github.com> Co-authored-by: abby.huang <78209557+abby-cyber@users.noreply.github.com> Co-authored-by: max.zhu@vesoft.com <86282370+izhuxiaoqing@users.noreply.github.com> --- .github/workflows/deploy.yaml | 8 +- docs-2.0/0.foreground/0-graph.md | 460 +++++++++--------- docs-2.0/0.foreground/1-graph-database.md | 5 +- docs-2.0/1.introduction/3.vid.md | 3 +- docs-2.0/20.appendix/0.FAQ.md | 127 ++--- docs-2.0/20.appendix/1.relates.md | 76 +++ docs-2.0/20.appendix/20.history.md | 2 +- docs-2.0/20.appendix/6.eco-tool-version.md | 1 + .../12.vertex-statements/1.insert-vertex.md | 4 +- .../1.resource-preparations.md | 2 +- ...deploy-nebula-graph-with-docker-compose.md | 2 +- .../3.deploy-listener.md | 6 +- .../1.configurations/1.configurations.md | 4 + .../1.configurations/3.graph-config.md | 2 +- .../manage-schema/st-ug-crud-tag.md | 17 +- .../quick-start/st-ug-import-data.md | 2 +- .../reuse/source_connect-to-nebula-graph.md | 4 +- ...urce_install-nebula-graph-by-rpm-or-deb.md | 6 +- docs-2.0/reuse/source_manage-service.md | 10 +- mkdocs.yml | 211 +++----- 20 files changed, 495 insertions(+), 457 deletions(-) create mode 100644 docs-2.0/20.appendix/1.relates.md diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 0f06a8505d..7410771160 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -6,7 +6,7 @@ on: jobs: deploy: - runs-on: ubuntu-20.04 + runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v2 with: @@ -64,4 +64,8 @@ jobs: script: | mkdir -p /usr/web/nebula-docs/ tar -xzf /usr/web/book.tar.gz -C /usr/web/nebula-docs/ - \ No newline at end of file + # - name: Deploy + # uses: peaceiris/actions-gh-pages@v3 + # with: + # github_token: ${{ secrets.DEPLOY_TOKEN }} + # publish_dir: ./site diff --git a/docs-2.0/0.foreground/0-graph.md b/docs-2.0/0.foreground/0-graph.md index 38d1469a20..87d952ac0c 100644 --- a/docs-2.0/0.foreground/0-graph.md +++ b/docs-2.0/0.foreground/0-graph.md @@ -1,230 +1,230 @@ -# 图 - -当前,从计算机行业巨头(例如 Amazon 和 Facebook)到小型研究团队,都投入了大量的资源探索图数据库在解决各种数据关系问题上的潜力。当然你也可以选择像他们这样进行尝试,现在可供选择的数据库有很多。那么图数据库究竟是什么?它可以做些什么?作为一类数据库,它在数据库领域里处于什么位置呢?要回答这些问题,我们首先得了解图。 - -图是计算机科学研究的主要领域之一。图能够高效地解决目前存在的诸多问题。本章将从图说起,继而说明图数据库的优点及其在现代应用程序开发中的巨大潜力,然后介绍分布式图数据库的区别和几种其他类型的数据库。 - -## 图、图片与图论 - -图无处不在。当听到图这个词时,很多人都会想到条形图或折线图,因为有时候我们确实会把它们称作图。从传统意义上来说,图是用来展示两个或多个数据系统之间的联系的。最简单的例子如下图,下图展示了 Nebula Graph GitHub 仓库星星数量随时间推移的变化。 - -![image](https://user-images.githubusercontent.com/42762957/91426247-d3861000-e88e-11ea-8e17-e3d7d7069bd1.png "这不是本书所说的图") - -这是相对比较简单的一种图,横轴为时间,纵轴为星星数量。可以看到,星星数量是随着时间推移而上升的。这种类型的图通常称为折线图。折线图可以显示随时间(根据常用比例设置)而变化的连续数据。此处我们只给出了折线图的例子。当然图的形式有多种,比如饼图、条形图等。 - -还有一种“图”在日常口语中会更多的被提及,例如,“图像识别”,“美图秀”,“修图”等。例如下“图”的左边。 - -![image](https://docs-cdn.nebula-graph.com.cn/books/images/image.png "这也不是本书所说的图") - -但是——总会有但是——我们在本书中讨论的图是另外一个概念——“图论”中的图。 - -在数学的分支图论中,图是基本研究对象,用于表示实体与实体之间的关系。一张图由一些小圆点(称为顶点或节点,即 Vertex)和连接这些圆点的直线或曲线(称为边,即 Edge)组成。“图(Graph)”这一名词最早由西尔维斯特在 1878 年提出。 - -通常,在英文中,为了区分这两种不同的图,前者会称为 Image,后者称为 Graph。在中文中,前者会强调为“图片”,后者会强调为“拓扑图”、“网络图”等。 - -![Image](https://docs-cdn.nebula-graph.com.cn/books/images/undirectedgraph.png) - - 这才是本书所说的图。 - -简单来说,图论就是研究图的学问。图论始于 18 世纪初期的柯尼斯堡七桥问题。柯尼斯堡当时是普鲁士的城市(现在属于俄罗斯,更名为加里宁格勒)。普雷格尔河穿过柯尼斯堡,不仅把柯尼斯堡分成了两部分,而且还在河中间形成了两个小岛。这就将整个城市分割成了四个区域,各区域由七座桥连接。当时有一个与柯尼斯堡相关的小游戏,即如何只穿过每座桥一次,浏览整个城市的四个区域。下图为柯尼斯堡七座桥的简化图。 有兴趣的话可以试试寻找这个小游戏的答案[^171]。 - -![image](https://user-images.githubusercontent.com/42762957/91536940-1526c180-e948-11ea-8fe8-90f40ce28171.png) - -[^171]: 图片来源 https://medium.freecodecamp.org/i-dont-understand-graph-theory-1c96572a1401. - -大数学家欧拉为了解决了这一问题。通过将城市的四个区域抽象成点,将连接城市的七座桥抽象成连接点的边,欧拉证明了这一问题是无法解决的。简化的抽象图如下[^063]: - -![image](https://user-images.githubusercontent.com/42762957/91538126-e578b900-e949-11ea-980c-5704254e8063.png) - -[^063]: 图片来源 https://medium.freecodecamp.org/i-dont-understand-graph-theory-1c96572a1401 - -图中四个点代表柯尼斯堡的四个区域,点之间的线代表连接四个区域的七座桥。从图中不难看出,偶数座桥连接的区域可以轻松通过,因为来去可以选择不同的路线。奇数座桥连接的区域只能作为起点或者终点,因为同样的路线只能走一次。和节点相关联的边的条数称为节点度。现在可以证明,只有两个节点有奇数度,另外节点有偶数度时,也即两个区域必须有偶数座桥,剩下的区域有奇数座桥时,柯尼斯堡问题才能解决。然而由上图得知,柯尼斯堡的任何区域都没有偶数座桥,所以这个谜题无解。 - -## 属性图 - -从数学角度来说,图论是研究建模对象之间关系结构的学科。但是从工业界使用的角度,通常会对基础的图模型进行扩展,称为**属性图模型**。属性图通常由以下几部分组成: - -- 节点,即对象或实体。在本书中,通常简称为点(Vertex)。 -- 节点之间的关系,在本书中,通常简称为边(Edge)。通常边是有方向或者无方向的,以表示两个实体之间有持续的关系。 - -![image](https://docs-cdn.nebula-graph.com.cn/books/images/un-directed.png) - -- 此外,在节点和边上,还可以有属性(properties)。 - -在现实生活中,有很多属性图的例子。 - -例如企查查或者 BOSS 直聘这类的公司,用图来建模商业股权关系网络。这个网络中,点通常是一个自然人或者是一家企业,边通常是某自然人与某企业之间的股权关系。点上的属性可以是自然人姓名、年龄、身份证号等。边上的属性可以是投资金额、投资时间、董监高等职位关系。 - -![image](https://docs-cdn.nebula-graph.com.cn/books/images/enterprise-relations.png) - -在一个股票市场里面,点可以是一家上市公司,边可以是上市公司之间的相关性。点的属性可以为股票代码、简称、市值、板块等;边的属性可以为股价的时间序列相关性系数[^T01]。 - -![image](https://docs-cdn.nebula-graph.com.cn/books/images/JGraphT01.png) - -[^T01]: https://nebula-graph.com.cn/posts/stock-interrelation-analysis-jgrapht-nebula-graph/ - -图关系还可以是类似《权力的游戏》这样电视剧中的人物关系网[^s-01]:点为人物,边为人物之间的互动关系;点的属性为人物姓名、年龄、阵营等,边的属性(距离)为两个人物之间的互动次数,互动越频繁距离越近。 - -![image](https://docs-cdn.nebula-graph.com.cn/books/images/game-of-thrones-01.png) - -[^s-01]: https://nebula-graph.com.cn/posts/game-of-thrones-relationship-networkx-gephi-nebula-graph/ - -图也可以用于 IT 系统内部的治理。例如,对于像微众银行这样的公司,通常有着非常庞大的数据仓库,以及相应的数仓管理工具。这些管理工具记录了数仓内 Hive 表之间通过 Job 实现的 ETL 关系[^ware],这样的 ETL 关系,可以非常方便的用图的形式呈现和管理,当出现问题时也可以非常方便地追溯根源。 - -![image](https://docs-cdn.nebula-graph.com.cn/books/images/dataware.png) -![image](https://docs-cdn.nebula-graph.com.cn/books/images/dataware2.png) - -[^ware]: https://nebula-graph.com.cn/posts/practicing-nebula-graph-webank/ - -图也可以用于记录一个大型 IT 系统内部错综复杂的微服务之间的调用关系[^tice],运维团队用其进行服务治理。这里每个点表示一个微服务,边表示两个微服务之间的调用关系;这样,运维人员可以方便地寻找可用性低于阈值 (99.99%) 的调用链路,或者发现那些出故障会影响面特别大的微服务节点。 - -![image](https://docs-cdn.nebula-graph.com.cn/books/images/microserve.png) - -图也可以用于提升代码开发效率。用图存放代码之间的函数调用关系[^tice],可以提升研发团队审查和测试代码的效率。在这样的图中,每个点是代码中的一个函数或者变量,每个边是函数或者变量之间的调用关系。当有新提交的代码之时,人们可以更方便的看到可能会受到影响到的其他接口,这样可以帮助测试人员更好的评估潜在的上线风险。 - -![image](https://docs-cdn.nebula-graph.com.cn/books/images/code.png) - -[^tice]: https://nebula-graph.com.cn/posts/meituan-graph-database-platform-practice/ - -此外,相对于静态不发生变化的属性图,我们还可以通过增加一些时间信息,发掘出更多的使用场景。 - -例如,在一个银行间账户资金流向网络里面[^1440w],点是账户,边是账户之间的转账记录。边属性记录了转账的时间、金额等。同盾、邦盛、半云科技等公司采用图技术,可以方便地通过图的方式探索发现明显的资金挪用、“以贷还贷”、“团伙贷款”等现象。 - -![image](https://docs-cdn.nebula-graph.com.cn/books/images/bank-transfer.jpg) - -[^1440w]: https://zhuanlan.zhihu.com/p/90635957 - -同样的方法也可以用于探索发现加密货币的流向。 - -![image](https://docs-cdn.nebula-graph.com.cn/books/images/block-chain.png) - -在一个黑产账户和设备网络中[^360],其中的点可以是账户、手机设备和 WIFI 网络,边是这些账户与手机设备之间的登录关系,以及手机设备和 WIFI 网络之间的接入关系。 - -![image](https://docs-cdn.nebula-graph.com.cn/books/images/360-user-1.png) - -这些登录记录的网络构成了黑产群体网络的团伙作案特征。360 数科[^360]、快手[^kuaishou]、微信[^weixin]、知乎[^zhihu]、携程金融这些公司都通过图技术实时(毫秒级的)识别超过百万个的黑产社群。 - -![image](https://docs-cdn.nebula-graph.com.cn/books/images/360-user-2.png) - -[^360]: https://nebula-graph.com.cn/posts/graph-database-data-connections-insight/ - -[^kuaishou]: https://nebula-graph.com.cn/posts/kuaishou-security-intelligence-platform-with-nebula-graph/ - -[^weixin]: https://nebula-graph.com.cn/posts/nebula-graph-for-social-networking/ - -[^zhihu]: https://mp.weixin.qq.com/s/K2QinpR5Rplw1teHpHtf4w - -更进一步,除了时间这个维度外,我们通过添加一些地理位置信息,还能发现属性图更多的应用场景。 - -例如新冠病毒的流行病学溯源[^CoV02],点是人物,边是人与人之间的接触;点属性为人物的身份证、发病时间等信息,边属性为人物之间发生密切接触的时间和地理位置等。为卫生防疫部门快速识别高风险人群和其行为轨迹提供帮助。 - -![image](https://www-cdn.nebula-graph.com.cn/nebula-blog/nCoV02.png) - -[^CoV02]: https://nebula-graph.com.cn/posts/detect-corona-virus-spreading-with-graph-database/ - -地理位置与图的结合也可以用于一些 O2O 的场景,例如基于 POI(Point-of-Interest)的实时美食推荐[^mt],使得美团这类本地生活服务平台公司能在消费者在打开 APP 的时候,实时推荐出更为合适的商家。 - -![image](https://docs-cdn.nebula-graph.com.cn/books/images/meituan2.png) - -![image](https://docs-cdn.nebula-graph.com.cn/books/images/meituan.png) - -[^mt]: https://nebula-graph.com.cn/posts/meituan-graph-database-platform-practice/ - -图还可以用于更深度的知识推理,华为、vivo、OPPO、微信、美团等公司,将图用于表征底层知识关系的数据模型。 - -根据文献[^Ubiquity] 的统计,使用图技术最多的领域,依次是: - -[^Ubiquity]: https://arxiv.org/abs/1709.03188 - -## 为什么要使用图数据库 - -虽然关系型数据库与 XML/JSON 等半结构类型的数据库,都可以用来描述图结构的数据模型,但是,图(数据库)不仅可以描述图结构与存储数据本身,更着眼于处理数据之间的关联(拓扑)关系。具体来说,图(数据库)有这么几个优点: - -- 图是一种更直观、更符合人脑思考直觉的知识表示方式。这使得我们在抽象业务问题时,可以着眼于“业务问题本身”,而不是“如何将问题描述为数据库的某种特定结构(例如表格结构)”。 - -- 图更容易展现数据的特征,例如转账的路径、近邻的社区。例如,如果要分析《权力的游戏》中的人物派别关系和人物重要性,表的组织方式如下: - - ![image](https://www-cdn.nebula-graph.com.cn/nebula-blog/gephi-01.jpeg) - - 这显然不如下方图的组织方式直观: - - ![image](https://www-cdn.nebula-graph.com.cn/nebula-blog/game-of-thrones-01.png) - - 特别是当某些中心节点被删除: - - ![image](https://www-cdn.nebula-graph.com.cn/nebula-blog/tv-game-thrones.png) - - 或者,增加一条边,可以彻底地改变整个图拓扑: - - ![image](https://www-cdn.nebula-graph.com.cn/nebula-blog/tv-game-thrones-02.png) - - 虽然只是个别数据的细微改变,图可以比表更直观地表现其中的重要而系统的信息。 - -- 图查询语言是针对图结构访问设计的,可以更加直观。例如,下面是一个 LDBC 中的查询示例,要求:查找某人(Person)在社交网络上发布的帖子(Posts);查找相应的回复(Message,回复本身还会被多次回复);发帖时间、回帖时间都满足一定条件;根据回帖数量对结果排序。 - - ![image](https://docs-cdn.nebula-graph.com.cn/books/images/efficientquery.png) - - 如果使用 PostgreSQL 编写查询语句: - - ```SQL - --PostgreSQL - WITH RECURSIVE post_all(psa_threadid - , psa_thread_creatorid, psa_messageid - , psa_creationdate, psa_messagetype - ) AS ( - SELECT m_messageid AS psa_threadid - , m_creatorid AS psa_thread_creatorid - , m_messageid AS psa_messageid - , m_creationdate, 'Post' - FROM message - WHERE 1=1 AND m_c_replyof IS NULL -- post, not comment - AND m_creationdate BETWEEN :startDate AND :endDate - UNION ALL - SELECT psa.psa_threadid AS psa_threadid - , psa.psa_thread_creatorid AS psa_thread_creatorid - , m_messageid, m_creationdate, 'Comment' - FROM message p, post_all psa - WHERE 1=1 AND p.m_c_replyof = psa.psa_messageid - AND m_creationdate BETWEEN :startDate AND :endDate - ) - SELECT p.p_personid AS "person.id" - , p.p_firstname AS "person.firstName" - , p.p_lastname AS "person.lastName" - , count(DISTINCT psa.psa_threadid) AS threadCount - END) AS messageCount - , count(DISTINCT psa.psa_messageid) AS messageCount - FROM person p left join post_all psa on ( - 1=1 AND p.p_personid = psa.psa_thread_creatorid - AND psa_creationdate BETWEEN :startDate AND :endDate - ) - GROUP BY p.p_personid, p.p_firstname, p.p_lastname - ORDER BY messageCount DESC, p.p_personid - LIMIT 100; - ``` - - 如果使用为图专门设计的图语言 Cypher 编写查询语句: - - ```Cypher - --Cypher - MATCH (person:Person)<-[:HAS_CREATOR]-(post:Post)<-[:REPLY_OF*0..]-(reply:Message) - WHERE post.creationDate >= $startDate AND post.creationDate <= $endDate - AND reply.creationDate >= $startDate AND reply.creationDate <= $endDate - RETURN - person.id, person.firstName, person.lastName, count(DISTINCT post) AS threadCount, - count(DISTINCT reply) AS messageCount - ORDER BY - messageCount DESC, person.id ASC - LIMIT 100 - ``` - -- 由于存储引擎和查询引擎可以针对图的结构专门设计,图的遍历(对应 SQL 中的 join)要高效得多。下图是知名产品 Neo4j 所做的一个对比[^mt]。 - - ![image](https://docs-cdn.nebula-graph.com.cn/books/images/neo4jhop.png) - -- 图数据库具有广泛的适用场景。例如数据集成(知识图谱)、个性化推荐、欺诈与威胁检测、风险分析与合规、身份(与控制权)验证、IT 基础设施管理、供应链与物流、社交网络研究等。 - -2019 年,根据 Gartner 的问卷调研,27% 的客户(500 组)在使用图数据库,20% 有计划使用。 - -## RDF - -受篇幅所限,本章不讨论 RDF 数据模型。 +# 图 + +当前,从计算机行业巨头(例如 Amazon 和 Facebook)到小型研究团队,都投入了大量的资源探索图数据库在解决各种数据关系问题上的潜力。当然你也可以选择像他们这样进行尝试,现在可供选择的数据库有很多。那么图数据库究竟是什么?它可以做些什么?作为一类数据库,它在数据库领域里处于什么位置呢?要回答这些问题,我们首先得了解图。 + +图是计算机科学研究的主要领域之一。图能够高效地解决目前存在的诸多问题。本章将从图说起,继而说明图数据库的优点及其在现代应用程序开发中的巨大潜力,然后介绍分布式图数据库的区别和几种其他类型的数据库。 + +## 图、图片与图论 + +图无处不在。当听到图这个词时,很多人都会想到条形图或折线图,因为有时候我们确实会把它们称作图。从传统意义上来说,图是用来展示两个或多个数据系统之间的联系的。最简单的例子如下图,下图展示了 Nebula Graph GitHub 仓库星星数量随时间推移的变化。 + +![image](https://user-images.githubusercontent.com/42762957/91426247-d3861000-e88e-11ea-8e17-e3d7d7069bd1.png "这不是本书所说的图") + +这是相对比较简单的一种图,横轴为时间,纵轴为星星数量。可以看到,星星数量是随着时间推移而上升的。这种类型的图通常称为折线图。折线图可以显示随时间(根据常用比例设置)而变化的连续数据。此处我们只给出了折线图的例子。当然图的形式有多种,比如饼图、条形图等。 + +还有一种“图”在日常口语中会更多的被提及,例如,“图像识别”,“美图秀”,“修图”等。例如下“图”的左边。 + +![image](https://docs-cdn.nebula-graph.com.cn/books/images/image.png "这也不是本书所说的图") + +但是——总会有但是——我们在本书中讨论的图是另外一个概念——“图论”中的图。 + +在数学的分支图论中,图是基本研究对象,用于表示实体与实体之间的关系。一张图由一些小圆点(称为顶点或节点,即 Vertex)和连接这些圆点的直线或曲线(称为边,即 Edge)组成。“图(Graph)”这一名词最早由西尔维斯特在 1878 年提出。 + +通常,在英文中,为了区分这两种不同的图,前者会称为 Image,后者称为 Graph。在中文中,前者会强调为“图片”,后者会强调为“拓扑图”、“网络图”等。 + +![Image](https://docs-cdn.nebula-graph.com.cn/books/images/undirectedgraph.png) + + 这才是本书所说的图。 + +简单来说,图论就是研究图的学问。图论始于 18 世纪初期的柯尼斯堡七桥问题。柯尼斯堡当时是普鲁士的城市(现在属于俄罗斯,更名为加里宁格勒)。普雷格尔河穿过柯尼斯堡,不仅把柯尼斯堡分成了两部分,而且还在河中间形成了两个小岛。这就将整个城市分割成了四个区域,各区域由七座桥连接。当时有一个与柯尼斯堡相关的小游戏,即如何只穿过每座桥一次,浏览整个城市的四个区域。下图为柯尼斯堡七座桥的简化图。 有兴趣的话可以试试寻找这个小游戏的答案[^171]。 + +![image](https://user-images.githubusercontent.com/42762957/91536940-1526c180-e948-11ea-8fe8-90f40ce28171.png) + +[^171]: 图片来源 https://medium.freecodecamp.org/i-dont-understand-graph-theory-1c96572a1401. + +大数学家欧拉为了解决了这一问题。通过将城市的四个区域抽象成点,将连接城市的七座桥抽象成连接点的边,欧拉证明了这一问题是无法解决的。简化的抽象图如下[^063]: + +![image](https://user-images.githubusercontent.com/42762957/91538126-e578b900-e949-11ea-980c-5704254e8063.png) + +[^063]: 图片来源 https://medium.freecodecamp.org/i-dont-understand-graph-theory-1c96572a1401 + +图中四个点代表柯尼斯堡的四个区域,点之间的线代表连接四个区域的七座桥。从图中不难看出,偶数座桥连接的区域可以轻松通过,因为来去可以选择不同的路线。奇数座桥连接的区域只能作为起点或者终点,因为同样的路线只能走一次。和节点相关联的边的条数称为节点度。现在可以证明,只有两个节点有奇数度,另外节点有偶数度时,也即两个区域必须有偶数座桥,剩下的区域有奇数座桥时,柯尼斯堡问题才能解决。然而由上图得知,柯尼斯堡的任何区域都没有偶数座桥,所以这个谜题无解。 + +## 属性图 + +从数学角度来说,图论是研究建模对象之间关系结构的学科。但是从工业界使用的角度,通常会对基础的图模型进行扩展,称为**属性图模型**。属性图通常由以下几部分组成: + +- 节点,即对象或实体。在本书中,通常简称为点(Vertex)。 +- 节点之间的关系,在本书中,通常简称为边(Edge)。通常边是有方向或者无方向的,以表示两个实体之间有持续的关系。 + +![image](https://docs-cdn.nebula-graph.com.cn/books/images/un-directed.png) + +- 此外,在节点和边上,还可以有属性(properties)。 + +在现实生活中,有很多属性图的例子。 + +例如企查查或者 BOSS 直聘这类的公司,用图来建模商业股权关系网络。这个网络中,点通常是一个自然人或者是一家企业,边通常是某自然人与某企业之间的股权关系。点上的属性可以是自然人姓名、年龄、身份证号等。边上的属性可以是投资金额、投资时间、董监高等职位关系。 + +![image](https://docs-cdn.nebula-graph.com.cn/books/images/enterprise-relations.png) + +在一个股票市场里面,点可以是一家上市公司,边可以是上市公司之间的相关性。点的属性可以为股票代码、简称、市值、板块等;边的属性可以为股价的时间序列相关性系数[^T01]。 + +![image](https://docs-cdn.nebula-graph.com.cn/books/images/JGraphT01.png) + +[^T01]: https://nebula-graph.com.cn/posts/stock-interrelation-analysis-jgrapht-nebula-graph/ + +图关系还可以是类似《权力的游戏》这样电视剧中的人物关系网[^s-01]:点为人物,边为人物之间的互动关系;点的属性为人物姓名、年龄、阵营等,边的属性(距离)为两个人物之间的互动次数,互动越频繁距离越近。 + +![image](https://docs-cdn.nebula-graph.com.cn/books/images/game-of-thrones-01.png) + +[^s-01]: https://nebula-graph.com.cn/posts/game-of-thrones-relationship-networkx-gephi-nebula-graph/ + +图也可以用于 IT 系统内部的治理。例如,对于像微众银行这样的公司,通常有着非常庞大的数据仓库,以及相应的数仓管理工具。这些管理工具记录了数仓内 Hive 表之间通过 Job 实现的 ETL 关系[^ware],这样的 ETL 关系,可以非常方便的用图的形式呈现和管理,当出现问题时也可以非常方便地追溯根源。 + +![image](https://docs-cdn.nebula-graph.com.cn/books/images/dataware.png) +![image](https://docs-cdn.nebula-graph.com.cn/books/images/dataware2.png) + +[^ware]: https://nebula-graph.com.cn/posts/practicing-nebula-graph-webank/ + +图也可以用于记录一个大型 IT 系统内部错综复杂的微服务之间的调用关系[^tice],运维团队用其进行服务治理。这里每个点表示一个微服务,边表示两个微服务之间的调用关系;这样,运维人员可以方便地寻找可用性低于阈值 (99.99%) 的调用链路,或者发现那些出故障会影响面特别大的微服务节点。 + +![image](https://docs-cdn.nebula-graph.com.cn/books/images/microserve.png) + +图也可以用于提升代码开发效率。用图存放代码之间的函数调用关系[^tice],可以提升研发团队审查和测试代码的效率。在这样的图中,每个点是代码中的一个函数或者变量,每个边是函数或者变量之间的调用关系。当有新提交的代码之时,人们可以更方便的看到可能会受到影响到的其他接口,这样可以帮助测试人员更好的评估潜在的上线风险。 + +![image](https://docs-cdn.nebula-graph.com.cn/books/images/code.png) + +[^tice]: https://nebula-graph.com.cn/posts/meituan-graph-database-platform-practice/ + +此外,相对于静态不发生变化的属性图,我们还可以通过增加一些时间信息,发掘出更多的使用场景。 + +例如,在一个银行间账户资金流向网络里面[^1440w],点是账户,边是账户之间的转账记录。边属性记录了转账的时间、金额等。同盾、邦盛、半云科技等公司采用图技术,可以方便地通过图的方式探索发现明显的资金挪用、“以贷还贷”、“团伙贷款”等现象。 + +![image](https://docs-cdn.nebula-graph.com.cn/books/images/bank-transfer.jpg) + +[^1440w]: https://zhuanlan.zhihu.com/p/90635957 + +同样的方法也可以用于探索发现加密货币的流向。 + +![image](https://docs-cdn.nebula-graph.com.cn/books/images/block-chain.png) + +在一个黑产账户和设备网络中[^360],其中的点可以是账户、手机设备和 WIFI 网络,边是这些账户与手机设备之间的登录关系,以及手机设备和 WIFI 网络之间的接入关系。 + +![image](https://docs-cdn.nebula-graph.com.cn/books/images/360-user-1.png) + +这些登录记录的网络构成了黑产群体网络的团伙作案特征。360 数科[^360]、快手[^kuaishou]、微信[^weixin]、知乎[^zhihu]、携程金融这些公司都通过图技术实时(毫秒级的)识别超过百万个的黑产社群。 + +![image](https://docs-cdn.nebula-graph.com.cn/books/images/360-user-2.png) + +[^360]: https://nebula-graph.com.cn/posts/graph-database-data-connections-insight/ + +[^kuaishou]: https://nebula-graph.com.cn/posts/kuaishou-security-intelligence-platform-with-nebula-graph/ + +[^weixin]: https://nebula-graph.com.cn/posts/nebula-graph-for-social-networking/ + +[^zhihu]: https://mp.weixin.qq.com/s/K2QinpR5Rplw1teHpHtf4w + +更进一步,除了时间这个维度外,我们通过添加一些地理位置信息,还能发现属性图更多的应用场景。 + +例如新冠病毒的流行病学溯源[^CoV02],点是人物,边是人与人之间的接触;点属性为人物的身份证、发病时间等信息,边属性为人物之间发生密切接触的时间和地理位置等。为卫生防疫部门快速识别高风险人群和其行为轨迹提供帮助。 + +![image](https://www-cdn.nebula-graph.com.cn/nebula-blog/nCoV02.png) + +[^CoV02]: https://nebula-graph.com.cn/posts/detect-corona-virus-spreading-with-graph-database/ + +地理位置与图的结合也可以用于一些 O2O 的场景,例如基于 POI(Point-of-Interest)的实时美食推荐[^mt],使得美团这类本地生活服务平台公司能在消费者在打开 APP 的时候,实时推荐出更为合适的商家。 + +![image](https://docs-cdn.nebula-graph.com.cn/books/images/meituan2.png) + +![image](https://docs-cdn.nebula-graph.com.cn/books/images/meituan.png) + +[^mt]: https://nebula-graph.com.cn/posts/meituan-graph-database-platform-practice/ + +图还可以用于更深度的知识推理,华为、vivo、OPPO、微信、美团等公司,将图用于表征底层知识关系的数据模型。 + +根据文献[^Ubiquity] 的统计,使用图技术最多的领域,依次是: + +[^Ubiquity]: https://arxiv.org/abs/1709.03188 + +## 为什么要使用图数据库 + +虽然关系型数据库与 XML/JSON 等半结构类型的数据库,都可以用来描述图结构的数据模型,但是,图(数据库)不仅可以描述图结构与存储数据本身,更着眼于处理数据之间的关联(拓扑)关系。具体来说,图(数据库)有这么几个优点: + +- 图是一种更直观、更符合人脑思考直觉的知识表示方式。这使得我们在抽象业务问题时,可以着眼于“业务问题本身”,而不是“如何将问题描述为数据库的某种特定结构(例如表格结构)”。 + +- 图更容易展现数据的特征,例如转账的路径、近邻的社区。例如,如果要分析《权力的游戏》中的人物派别关系和人物重要性,表的组织方式如下: + + ![image](https://www-cdn.nebula-graph.com.cn/nebula-blog/gephi-01.jpeg) + + 这显然不如下方图的组织方式直观: + + ![image](https://www-cdn.nebula-graph.com.cn/nebula-blog/game-of-thrones-01.png) + + 特别是当某些中心节点被删除: + + ![image](https://www-cdn.nebula-graph.com.cn/nebula-blog/tv-game-thrones.png) + + 或者,增加一条边,可以彻底地改变整个图拓扑: + + ![image](https://www-cdn.nebula-graph.com.cn/nebula-blog/tv-game-thrones-02.png) + + 虽然只是个别数据的细微改变,图可以比表更直观地表现其中的重要而系统的信息。 + +- 图查询语言是针对图结构访问设计的,可以更加直观。例如,下面是一个 LDBC 中的查询示例,要求:查找某人(Person)在社交网络上发布的帖子(Posts);查找相应的回复(Message,回复本身还会被多次回复);发帖时间、回帖时间都满足一定条件;根据回帖数量对结果排序。 + + ![image](https://docs-cdn.nebula-graph.com.cn/books/images/efficientquery.png) + + 如果使用 PostgreSQL 编写查询语句: + + ```SQL + --PostgreSQL + WITH RECURSIVE post_all(psa_threadid + , psa_thread_creatorid, psa_messageid + , psa_creationdate, psa_messagetype + ) AS ( + SELECT m_messageid AS psa_threadid + , m_creatorid AS psa_thread_creatorid + , m_messageid AS psa_messageid + , m_creationdate, 'Post' + FROM message + WHERE 1=1 AND m_c_replyof IS NULL -- post, not comment + AND m_creationdate BETWEEN :startDate AND :endDate + UNION ALL + SELECT psa.psa_threadid AS psa_threadid + , psa.psa_thread_creatorid AS psa_thread_creatorid + , m_messageid, m_creationdate, 'Comment' + FROM message p, post_all psa + WHERE 1=1 AND p.m_c_replyof = psa.psa_messageid + AND m_creationdate BETWEEN :startDate AND :endDate + ) + SELECT p.p_personid AS "person.id" + , p.p_firstname AS "person.firstName" + , p.p_lastname AS "person.lastName" + , count(DISTINCT psa.psa_threadid) AS threadCount + END) AS messageCount + , count(DISTINCT psa.psa_messageid) AS messageCount + FROM person p left join post_all psa on ( + 1=1 AND p.p_personid = psa.psa_thread_creatorid + AND psa_creationdate BETWEEN :startDate AND :endDate + ) + GROUP BY p.p_personid, p.p_firstname, p.p_lastname + ORDER BY messageCount DESC, p.p_personid + LIMIT 100; + ``` + + 如果使用为图专门设计的图语言 Cypher 编写查询语句: + + ```Cypher + --Cypher + MATCH (person:Person)<-[:HAS_CREATOR]-(post:Post)<-[:REPLY_OF*0..]-(reply:Message) + WHERE post.creationDate >= $startDate AND post.creationDate <= $endDate + AND reply.creationDate >= $startDate AND reply.creationDate <= $endDate + RETURN + person.id, person.firstName, person.lastName, count(DISTINCT post) AS threadCount, + count(DISTINCT reply) AS messageCount + ORDER BY + messageCount DESC, person.id ASC + LIMIT 100 + ``` + +- 由于存储引擎和查询引擎可以针对图的结构专门设计,图的遍历(对应 SQL 中的 join)要高效得多。下图是知名产品 Neo4j 所做的一个对比[^mt]。 + + ![image](https://docs-cdn.nebula-graph.com.cn/books/images/neo4jhop.png) + +- 图数据库具有广泛的适用场景。例如数据集成(知识图谱)、个性化推荐、欺诈与威胁检测、风险分析与合规、身份(与控制权)验证、IT 基础设施管理、供应链与物流、社交网络研究等。 + +2019 年,根据 Gartner 的问卷调研,27% 的客户(500 组)在使用图数据库,20% 有计划使用。 + +## RDF + +受篇幅所限,本章不讨论 RDF 数据模型。 \ No newline at end of file diff --git a/docs-2.0/0.foreground/1-graph-database.md b/docs-2.0/0.foreground/1-graph-database.md index ae17398c2c..e6942c40c9 100644 --- a/docs-2.0/0.foreground/1-graph-database.md +++ b/docs-2.0/0.foreground/1-graph-database.md @@ -75,6 +75,7 @@ https://www.marketsandmarkets.com/Market-Reports/graph-database-market-126230231 熟悉数据库的读者可能都知道结构化查询语言SQL。通过使用SQL,人们以接近自然语言的方式访问数据库。在 SQL 被广泛采用和标准化之前,关系型数据库的市场是非常碎片和割裂的——各家厂商的产品都有完全不同的接入访问方式,数据库产品自身的开发人员、数据库产品周边工具的开发人员、数据库最终的使用人员,都不得不学习各个厂商的完全不同的产品,在不同产品之间迁移极其困难。当1989年SQL-89标准被制定后,整个关系型数据库的市场快速收敛到SQL-89上。这大大降低了上述各种人员的学习曲线。 类似的,在图数据库领域,图语言(GQL)承担了类似于SQL的作用,是一种用户与图数据库主要的交互方式。但不同于SQL-89这种国际标准,GQL还没有任何国际标准。目前有两种主流的图语言: + Neo4j的Cypher (及其后续——ISO正在制定过程中的 GQL-standard 草案)和Apache TinkerPop的Gremlin。前者通常被称为声明式语言(Declarative query language)——也即用户只需要告诉系统“要什么”,而不管“怎么做”;后者通常被称为命令式语言(Imperative query language),用户会显式地指定系统的操作。 GQL国际标准正在制定过程中。 @@ -176,8 +177,6 @@ Cypher 启发了一系列后续的图查询语言,包括 [^fosdem20]: https://neo4j.com/fosdem20/ - - 其语法风格大体是 ```Cypher USE graphA # S1.1 从 Shard A 读 @@ -244,5 +243,3 @@ Oracle graph[^Oracle] 是关系型数据库巨头 Oracle 在图技术与图数 #### 新一代开源分布式图数据库 Nebula Graph 在下一章,我们将正式介绍新一代开源分布式图数据库 Nebula Graph。 - - diff --git a/docs-2.0/1.introduction/3.vid.md b/docs-2.0/1.introduction/3.vid.md index e4aa94ceb3..d3a6c399d5 100644 --- a/docs-2.0/1.introduction/3.vid.md +++ b/docs-2.0/1.introduction/3.vid.md @@ -59,7 +59,6 @@ VID的数据类型必须在[创建图空间](../3.ngql-guide/9.space-statements/ 2. 例如, `LOOKUP ON player WHERE player.name == "Tony Parker"` 或者 `MATCH (v:player {name:"Tony Parker"}) `,是通过属性 `player.name` 的索引来定位到 `start vid`; -!!! caution "不能在没有 `start vid` 情况下进行全局扫描" +!!! caution 不能在没有 `start vid` 情况下进行全局扫描; 例如 `match (n) return n;` 会返回错误,因为此时无法定位到 `start vid`;这是一个全局扫描,因此被禁止。 - diff --git a/docs-2.0/20.appendix/0.FAQ.md b/docs-2.0/20.appendix/0.FAQ.md index 0e621eb9d5..f8e7ab33de 100644 --- a/docs-2.0/20.appendix/0.FAQ.md +++ b/docs-2.0/20.appendix/0.FAQ.md @@ -32,25 +32,41 @@ Nebula Graph一直在持续开发,功能或操作的行为可能会有变化 ## 关于执行 -### 使用GO和MATCH执行相同语义的查询,查询结果为什么不同? +### 关于悬挂边 -路径的类型不同,导致查询结果可能会不同。 +悬挂边 (Dangling edge) 是指一条边的起点或者终点在数据库中不存在。 -- `GO`语句采用的是`walk`类型,遍历时点和边可以重复。 +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)。 -- `MATCH`语句兼容openCypher,采用的是`trail`类型,遍历时只有点可以重复,边不可以重复。 - -例如下图。 -![路径示例](../images/path1.png) +### 如何处理错误信息 `[ERROR (-1005)]: Used memory hits the high watermark(0.800000) of total system memory.` -从点A开始查询距离5跳的点,都会查询到点C(`A->B->C->D->E->C`),查询6跳的点时,`GO`语句会查询到点D(`A->B->C->D->E->C->D`),因为边`C->D`可以重复查询,而`MATCH`语句查询为空,因为边不可以重复。 +报错原因:Nebula Graph的`system_memory_high_watermark_ratio`参数指定了内存高水位报警机制的触发阈值,默认为`0.8`。系统内存占用率高于该值会触发报警机制,Nebula Graph会停止接受查询。 -所以使用`GO`和`MATCH`执行相同语义的查询,可能会出现`MATCH`语句的查询结果比`GO`语句少。 +解决方案: -关于路径的详细说明,请参见[维基百科](https://en.wikipedia.org/wiki/Path_(graph_theory)#Walk,_trail,_path)。 +* 清理系统内存,使其降低到阈值以下。 +* [修改Graph配置](../5.configurations-and-logs/1.configurations/1.configurations.md)。在所有Graph服务器的配置文件中增加`system_memory_high_watermark_ratio`参数,为其设置一个大于`0.8`的值,例如`0.9`。 -### 返回消息中`time spent`的含义是什么? + !!! note + + 仅Graph服务支持`system_memory_high_watermark_ratio`,Storage和Meta服务不支持该参数。 + +### 如何处理错误信息 `Storage Error E_RPC_FAILURE` + +报错原因通常为Graph服务向Storage服务请求了过多的数据,导致Storage服务超时。请尝试以下解决方案: + +* [修改配置文件](../5.configurations-and-logs/1.configurations/3.graph-config.md): 在`nebula-graphd.conf`文件中修改`--storage_client_timeout_ms`参数的值,以增加Storage client的连接超时时间。该值的单位为毫秒(ms)。例如,设置`--storage_client_timeout_ms=60000`。如果`nebula-graphd.conf`文件中未配置该参数,请手动增加。提示:请在配置文件开头添加--local_config=true再重启服务。 +* 优化查询语句:减少全库扫描型的查询,无论是否用`LIMIT`限制了返回结果的数量;用 GO 语句改写 MATCH 语句(前者有优化,后者无优化)。 +* 检查Storaged是否发生的 OOM。(`dmesg |grep nebula`)。 +* 为 Storage 服务器提供性能更好的SSD或者内存。 +* 重试请求。 + +### 如何处理错误信息 `The leader has changed. Try again later` + +已知问题,通常需要重试 1-N 次(N==partition数量)。原因为 meta client 更新leader缓存需要1-2个心跳或者通过错误触发强制更新。 + +### 返回消息中 `time spent` 的含义是什么? 将命令`SHOW SPACES`返回的消息作为示例: @@ -72,7 +88,7 @@ Got 1 rows (time spent 1235/1934 us) 不要这样设置。 -Storage服务使用Raft协议(多数表决),为保证可用性,要求出故障的副本数量不能达到一半。 +Storage 服务使用 Raft 协议(多数表决),为保证可用性,要求出故障的副本数量不能达到一半。 当机器数量为1时,`replica_factor`只能设置为`1`。 @@ -80,6 +96,30 @@ Storage服务使用Raft协议(多数表决),为保证可用性,要求出 建议在生产环境中设置`replica_factor=3`,测试环境中设置`replica_factor=1`,不要使用偶数。 +### 是否支持停止或者中断慢查询 + +支持。 + +详情请参见[终止查询](../3.ngql-guide/18.operation-and-maintenance-statements/6.kill-query.md)。 + +### 使用`GO`和`MATCH`执行相同语义的查询,查询结果为什么不同? + +路径的类型不同,导致查询结果可能会不同。 + +- `GO`语句采用的是`walk`类型,遍历时点和边可以重复。 + +- `MATCH`语句兼容openCypher,采用的是`trail`类型,遍历时只有点可以重复,边不可以重复。 + +例如下图。 + +![路径示例](../images/path1.png) + +从点A开始查询距离5跳的点,都会查询到点C(`A->B->C->D->E->C`),查询6跳的点时,`GO`语句会查询到点D(`A->B->C->D->E->C->D`),因为边`C->D`可以重复查询,而`MATCH`语句查询为空,因为边不可以重复。 + +所以使用`GO`和`MATCH`执行相同语义的查询,可能会出现`MATCH`语句的查询结果比`GO`语句少。 + +关于路径的详细说明,请参见[维基百科](https://en.wikipedia.org/wiki/Path_(graph_theory)#Walk,_trail,_path)。 + ### 如何处理错误信息`[ERROR (-7)]: SyntaxError: syntax error near`? 大部分情况下,查询语句需要有`YIELD`或`RETURN`,请检查查询语句是否包含。 @@ -134,57 +174,41 @@ Storage服务使用Raft协议(多数表决),为保证可用性,要求出 检查输入的 vid 是否是 create space 设置的整型或者 `fix_string(N)`. 如果是字符串类型,检查长度是否超过`N` (默认为 `8`). 见[create space](../3.ngql-guide/9.space-statements/1.create-space.md). -### 如何处理错误信息`edge conflict`或`vertex conflict` +### 如何处理错误信息 `edge conflict` 或 `vertex conflict` Storage服务在毫秒级时间内多次收到插入或者更新同一点或边的请求时,可能返回该错误。请稍后重试。 -### 如何处理错误信息`Storage Error E_RPC_FAILURE` - -报错原因通常为Graph服务向Storage服务请求了过多的数据,导致Storage服务超时。请尝试以下解决方案: - -* [修改配置文件](../5.configurations-and-logs/1.configurations/3.graph-config.md): 在`nebula-graphd.conf`文件中修改`--storage_client_timeout_ms`参数的值,以增加Storage client的连接超时时间。该值的单位为毫秒(ms)。例如,设置`--storage_client_timeout_ms=60000`。如果`nebula-graphd.conf`文件中未配置该参数,请手动增加。 - -* 优化查询语句:减少全库扫描型的查询,无论是否用`LIMIT`限制了返回结果的数量;用 GO 语句改写 MATCH 语句(前者有优化,后者无优化)。 -* 检查Storaged是否发生的 OOM。(`dmesg |grep nebula`)。 -* 为 Storage 服务器提供性能更好的SSD或者内存。 -* 重试请求。 - -### 如何处理错误信息`The leader has changed. Try again later` - -已知问题,通常需要重试1-N次(N==partition数量)。原因为 meta client 更新leader缓存需要1-2个心跳或者通过错误触发强制更新。 - -### 如何处理错误信息`RPC failure in MetaClient: Connection refused` +### 如何处理错误信息 `RPC failure in MetaClient: Connection refused` 报错原因通常为metad服务状态异常,或是metad和graphd服务所在机器网络不通。请尝试以下解决方案: -- 在metad所在服务器查看下metad服务状态,如果服务状态异常,可以重新启动metad服务。 +- 在metad所在服务器查看下 metad 服务状态,如果服务状态异常,可以重新启动metad服务。 - 在报错服务器下使用`telnet meta-ip:port`查看网络状态。 - 检查配置文件中的端口配置,如果端口号与连接时使用的不同,改用配置文件中的端口或者修改配置。 -### 如何处理`nebula-graph.INFO`错误日志`StorageClientBase.inl:214] Request to "x.x.x.x":9779 failed: N6apache6thrift9transport19TTransportExceptionE: Timed Out` +### 如何处理 `nebula-graph.INFO` 中错误日志 `StorageClientBase.inl:214] Request to "x.x.x.x":9779 failed: N6apache6thrift9transport19TTransportExceptionE: Timed Out` 报错原因可能是查询的数据量比较大,storaged 处理超时。请尝试以下解决方法: - 导入数据时,手动[compaction](../8.service-tuning/compaction.md),加速读的速度。 - 增加Graph服务与Storage服务的RPC连接超时时间,在`nebula-storaged.conf`文件里面修改`--storage_client_timeout_ms`参数的值。该值的单位为毫秒(ms),默认值为60000毫秒。 + -### 如何处理`nebula-storaged.INFO`错误日志`MetaClient.cpp:65] Heartbeat failed, status:Wrong cluster!`或者 `nebula-metad.INFO`含有错误日志`HBProcessor.cpp:54] Reject wrong cluster host "x.x.x.x":9771!` +### 如何处理 `nebula-storaged.INFO` 中错误日志 `MetaClient.cpp:65] Heartbeat failed, status:Wrong cluster!` 或者 `nebula-metad.INFO` 含有错误日志`HBProcessor.cpp:54] Reject wrong cluster host "x.x.x.x":9771!` 报错的原因可能是用户修改了 metad 的 ip 或者端口信息,或者 storage 之前加入过其他集群。请尝试以下解决方法: 用户到storage部署的机器所在的安装目录(默认安装目录为 `/usr/local/nebula`)下面将`cluster.id`文件删除,然后重启 storaged 服务。 -### 是否支持停止或者中断慢查询 - -支持。详情请参见[终止查询](../3.ngql-guide/18.operation-and-maintenance-statements/6.kill-query.md)。 - ### 能不能用中文字符做标识符,比如图空间、Tag、Edge type、属性、索引的名称? -不能。图空间、Tag、Edge type、属性以及索引的名称都需由大小写英文字母、数字或下划线组成,暂不支持使用中文字符。 +不能。 + +图空间、Tag、Edge type、属性以及索引的名称都需由大小写英文字母、数字或下划线组成,暂不支持使用中文字符。 同时,上述标识符区分大小写,且不可使用[关键字和保留字](../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md) 。 @@ -197,22 +221,11 @@ nebula > MATCH (s)-[e]->() WHERE id(s) == "given" RETURN count(e); #出度 nebula > MATCH (s)<-[e]-() WHERE id(s) == "given" RETURN count(e); #入度 ``` -### 是否有办法快速获取所有点的出度和入度? +### 是否有办法快速获取“所有”点的出度和入度? -没有直接命令。可以使用 [Nebula Algorithm](../nebula-algorithm.md)。 +没有直接命令。 -### 如何处理错误信息`[ERROR (-1005)]: Used memory hits the high watermark(0.800000) of total system memory.` - -报错原因:Nebula Graph的`system_memory_high_watermark_ratio`参数指定了内存高水位报警机制的触发阈值,默认为`0.8`。系统内存占用率高于该值会触发报警机制,Nebula Graph会停止接受查询。 - -解决方案: - -* 清理系统内存,使其降低到阈值以下。 -* [修改Graph配置](../5.configurations-and-logs/1.configurations/1.configurations.md)。在所有Graph服务器的配置文件中增加`system_memory_high_watermark_ratio`参数,为其设置一个大于`0.8`的值,例如`0.9`。 - - !!! note - - 仅Graph服务支持`system_memory_high_watermark_ratio`,Storage和Meta服务不支持该参数。 +可以使用 [Nebula Algorithm](../nebula-algorithm.md)。 ### [ERROR (-1005)]: Schema not exist: xxx @@ -222,12 +235,6 @@ nebula > MATCH (s)<-[e]-() WHERE id(s) == "given" RETURN count(e); #入度 - Tag或Edge type的名称是否为关键字,如果是关键字,请使用反引号(\`)将它们括起来。详情请参见[关键字](../3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md)。 -### 关于悬挂边 - -悬挂边 (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)。 - ## 关于运维 ### 日志文件过大时如何回收日志? @@ -282,9 +289,9 @@ Nebula Graph {{ nebula.release }} 未提供运维命令以实现自动扩缩容 storaged扩缩容之后,还需要运行[Balance Data 和 Balance Leader 命令](../8.service-tuning/load-balance.md)。 -### 修改Host名称后,旧的Host一直显示`OFFLINE`怎么办? +### 修改Host名称后,旧的Host一直显示 `OFFLINE` 怎么办? -`OFFLINE`状态的Host将在一天后自动删除。 +`OFFLINE` 状态的 Host 将在一天后自动删除。 ## 关于连接 @@ -300,6 +307,8 @@ storaged扩缩容之后,还需要运行[Balance Data 和 Balance Leader 命令 如果修改过配置文件中预设的端口,请找出实际使用的端口并在防火墙中开放它们。 +周边工具各自使用不用的端口,请参考各工具文档。 + ### 如何测试端口是否已开放 用户可以使用如下telnet命令检查端口状态: diff --git a/docs-2.0/20.appendix/1.relates.md b/docs-2.0/20.appendix/1.relates.md new file mode 100644 index 0000000000..24cf080abd --- /dev/null +++ b/docs-2.0/20.appendix/1.relates.md @@ -0,0 +1,76 @@ +# 相关技术 + +本节主要介绍两个和分布式图数据库关系密切的领域,数据库方面和图技术方面。 + +## 数据库方面 + +### 关系型数据库 + +关系型数据库,是指采用了关系模型来组织数据的数据库。关系模型为二维表格模型,一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。说到关系型数据库,大多数人都会想到 MySQL。MySQL 是目前最流行的数据库管理系统之一,支持使用最常见的结构化查询语言(SQL)进行数据库操作,并以表格、行、列的形式存储数据。这种存储数据的方法源自埃德加·科德(Edgar Frank Codd)于 1970 年提出的关系型数据模型。 + +在关系型数据库中,可以为待存储的每种类型的数据创建一个表。例如,球员表用来存储所有的球员信息,球队表用来存储球队信息等。SQL 表中的每行数据都必须包含一个主键(primary key)。主键是该行数据的唯一标识符。一般地,主键作为字段 ID 都是随行数自增的。关系型数据库自问世以来一直为计算机行业提供着非常好的服务,并将未来很长的时间内继续服务下去。 + +如果你用过 Excel、WPS 或其他类似的应用,你就会大概了解到关系数据库是如何工作的。首先设置好列,然后在对应的列下添加行数据。你可以对某一列数据进行求平均值或其他聚合操作,这与在关系型数据库 MySQL 中求平均值的操作类似。而 EXcel 中的数据透视表则相当于在关系型数据库 MySQL 中使用聚合函数和 CASE 语句对数据进行查询。一个 EXcel 文件可以有多张表,一张表就相当于 MySQL 的一张表。一个 EXcel 文件则类似于一个 MySQL 数据库。 + +#### 关系型数据库中的关系 + +与图数据库不同,关系型数据库(或 SQL 型的数据库)中的边也是作为实体存储在专门的边表中的。先创建两个表,球员(player)和球队(team),然后再创建表 player_team 作为边表。边表通常由相关的表 join 而成。例如,此处的边表 player_team 就由球员表和球队表 join 而成。 + +![image](https://user-images.githubusercontent.com/42762957/91702816-dc872200-ebab-11ea-8b36-577c29a3fe7a.png) + +这种存储边的方式在关联小型数据集时问题并不大,但是当关系型数据库中的关系太多时,问题就出现了。事实上,关系型数据库是非常“反关系的”。具体来说,当你只想查询一个球员的队友时,你必须对表中的所有数据进行 join 操作,然后再过滤掉你不需要的所有数据,当你的数据集达到一定规模时,这将给关系型数据库带来巨大压力。如果你想关联多张不同的表,可能在 join 爆炸(join bombs)前系统就已经无法响应了。 + +#### 关系型数据库起源 + +上文提到,关系型数据模型最早是由 IBM 的工程师埃德加·科德(Edgar Frank Codd)于 1970 年提出的。科德写了几篇数据库管理系统方面的论文,论述了关系型数据模型的潜力。关系型数据模型不依赖于数据链接列表(网状数据或层级数据),而是更多依赖于数据集。他使用元组演算(tuple calculus)的数学方法论证了这些数据集能够完成与导航数据库管理系统相同的任务。唯一的要求是,关系型数据模型需要一种合适的查询语言,以保证数据库的一致性要求。这就为后来声明型的结构化查询语言(SQL)提供了灵感来源。IBM 的 R 系统是关系型数据模型的最早使用者之一。然而,由前 IBM 员工拉里·埃里森创办的名叫软件开发实验室的小公司在市场上击败了 IBM。该公司的产品就是后来为我们熟知的 Oracle。 + +由于“关系数据库”在当时是一个比较时髦的词汇,因此许多数据库供应商都喜欢在其产品名称中使用这个词汇,尽管他们的产品实际上并不是关系型的。为了防止这种情况并减少关系型数据模型的错误使用,科德提出了著名科德 12 定律(Codd's 12 rules)。所有关系型数据系统都必须遵循科德 12 定律。 + +### NoSQL 数据库 + +图数据库并不是可以克服关系型数据库缺点的唯一替代方案。现在市面上还有很多非关系型数据库的产品,这些产品都可以叫做 NoSQL。NoSQL 一词最早于上世纪 90 年代末提出,可以解释为“非 SQL” 或“不仅是 SQL”,具体解释要根据语境判断。为便于理解,这里 NoSQL 可以解释成 “非关系型数据库”。不同于关系型数据库,NoSQL 数据库提供的数据存储、检索机制并不是基于表关系建模的。 NoSQL 数据库可以分为四类: + +- 键值存储(key-value stores) +- 列式存储(column-family stores) +- 文件存储(document stores) +- 图数据库(graph databases) + +下面将分别介绍这四类数据库。 + +#### 键值存储 + +键值存储,顾名思义,就是使用键值对存储数据的数据库。不同于关系型数据库,键值存储是没有表和列的。如果一定要做类比,键值数据库本身就像一张有很多列(也就是键)的大表。在键值存储数据库中,数据(即键值对中的值)都是通过键来存储和查询的,通常用哈希列表来实现。这比传统的 SQL 数据库要简单得多,而且对于某些 web 应用来说,这就足够了。 + +键值模型对于 IT 系统来说优势在于简单、易部署。多数情况下,这种存储方式对非关联的数据很适用。如是只是存储数据而无需查询的话,使用这种存储方法就没有问题。但是如果 DBA 只对部分值进行查询或更新的时候,键值模型就显得效率低下了。常见的键值存储数据库有:Redis、Voldemort、Oracle BDB。 + +#### 列式存储 + +NoSQL 数据库的列式存储与 NoSQL 数据库的键值存储有许多相似之处,因为列式存储仍然在使用键进行存储和检索。区别在于列式存储数据库中,列是最小的存储单元,每一列均由键、值以及用于版本控制和冲突解决的时间戳组成。这在分布式扩展时特别有用,因为在数据库更新时,可以使用时间戳定位过期数据。由于列式存储良好的扩展性,因此适用于非常大的数据集。常见的列式存储数据库有:HBase、Cassandra、HadoopDB 等。 + +#### 文档存储 + +准确来说,NoSQL 数据库文档存储实际上也是基于键值的数据库,只不过对功能做了增强。数据仍然以键值的形式存储,但是文档存储中的值是结构化的文档,而不仅仅是一个字符串或单个值。也就是说,由于信息结构的增加,文档存储能够执行更优化的查询,并且使数据检索更加容易。因此,文档存储特别适合存储、索引并管理面向文档的数据或者类似的半结构化数据。 + +从技术上讲,作为一个半结构化的信息单元,文档存储中的文档可以是任何形式可用的文档,包括 XML、JOSN、YAML 等,这取决于数据库供应商的设计。 比如,JSON 就是一种常见的选择。虽然 JSON 不是结构化数据的最佳选择,但是 JSON 型的数据在前端和后端应用中都可以使用。常见的文档存储数据库有:MongoDB、CouchDB、Terrastore 等。 + +#### 图存储 + +最后一类 NoSQL 数据库是图数据库。本书重点讨论的 Nebula Graph 也是一种图数据库。虽然同为 NoSQL 型数据库,但是图数据库与上述 NoSQL 数据库有本质上的差异。图数据库以点、边、属性的形式存储数据。其优点在于灵活性高,支持复杂的图形算法,可用于构建复杂的关系图谱。我们将在随后的章节中详细讨论图数据库。不过在本章中,你只要知道图数据库是一种 NoSQL 类型的数据库就可以了。常见的图数据库有:Nebula Graph、Neo4j、OrientDB 等。 + +## 图技术方面 + +来看一张 2020 年的图技术全景[^lan] + +[^lan]: https://graphaware.com/graphaware/2020/02/17/graph-technology-landscape-2020.html + +![Image](https://raw.githubusercontent.com/GraphCoding/graph-technology-landscape/master/GraphTechnologyLandscape.jpg) + +和图有关联的技术有很多,可以大致分为这么几类: + +- 基础设施:包括图数据库、图计算引擎、图深度学习、云服务等。 + +- 应用:包括可视化、知识图谱、反诈骗、网络安全、社交网络等。 + +- 开发工具:包括图查询语言、建模工具、开发框架和库。 + +- 书籍和会议等。 \ No newline at end of file diff --git a/docs-2.0/20.appendix/20.history.md b/docs-2.0/20.appendix/20.history.md index 20e367d702..64bda302f7 100644 --- a/docs-2.0/20.appendix/20.history.md +++ b/docs-2.0/20.appendix/20.history.md @@ -26,4 +26,4 @@ 6. 2021.8 发布 v2.5.0 -![image](https://docs-cdn.nebula-graph.com.cn/books/images/2.5.0.png) \ No newline at end of file +![image](https://docs-cdn.nebula-graph.com.cn/books/images/2.5.0.png) 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 4351101786..66125ad670 100644 --- a/docs-2.0/20.appendix/6.eco-tool-version.md +++ b/docs-2.0/20.appendix/6.eco-tool-version.md @@ -163,3 +163,4 @@ Docker Compose可以快速部署Nebula Graph集群。如何使用请参见[Docke - [Chaos Test](https://github.com/vesoft-inc/nebula-chaos) +- Backup & Restore \ No newline at end of file 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 cf3e5940b4..3005755577 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 @@ -23,8 +23,8 @@ prop_value_list: !!! Note - - `IF NOT EXISTS` 仅检测 VID + Tag 的值是否相同,不会检测属性值。 - - `IF NOT EXISTS` 会先读取一次数据是否存在,因此对性能会有明显影响。 + - `IF NOT EXISTS` 仅检测 VID + Tag 的值是否相同,不会检测属性值。 + - `IF NOT EXISTS` 会先读取一次数据是否存在,因此对性能会有明显影响。 - `tag_name`:点关联的Tag(点类型)。Tag必须提前创建,详情请参见[CREATE TAG](../10.tag-statements/1.create-tag.md)。 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 8b30a6ccef..c33af70aa1 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 @@ -147,7 +147,7 @@ // 安装GCC。安装到opt目录需要写权限,用户也可以修改为其他目录。 $ ./third-party/install-gcc.sh --prefix=/opt - // 启用GCC。 + // 启用 GCC。 $ source /opt/vesoft/toolset/gcc/7.5.0/enable ``` 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 e040d7fd44..a5d06c047a 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 @@ -209,7 +209,7 @@ Docker Compose部署的Nebula Graph,配置文件位置为`nebula-docker-compos 具体的配置说明请参见[配置管理](../../5.configurations-and-logs/1.configurations/1.configurations.md)。 -## 常见问题 +## 常见问题排查 ### 如何固定Docker映射到外部的端口? diff --git a/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/3.deploy-listener.md b/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/3.deploy-listener.md index 922464c85a..2b3145651f 100644 --- a/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/3.deploy-listener.md +++ b/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/3.deploy-listener.md @@ -74,9 +74,9 @@ ADD LISTENER ELASTICSEARCH [,, ...] 请在一个语句里完整地添加所有 listener。例如: -```ngql -nebula> ADD LISTENER ELASTICSEARCH 192.168.8.5:9789,192.168.8.6:9789; -``` + ```ngql + nebula> ADD LISTENER ELASTICSEARCH 192.168.8.5:9789,192.168.8.6:9789; + ``` ## 查看 listener 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 a88f1d7cd2..e625dd9634 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 @@ -2,6 +2,10 @@ Nebula Graph基于[gflags](https://gflags.github.io/gflags/)库打造了系统配置,多数配置项都是其中的flags。Nebula Graph服务启动时,默认会从[配置文件](#_4)中获取配置信息,文件中没有的配置项应用默认值。 +!!! enterpriseonly + + 性能、参数、查询语句的调优方式及服务。 + !!! note * 由于配置项数多且可能随着Nebula Graph的开发发生变化,文档不会介绍所有配置项。按下文说明可在命令行获取配置项的详细说明。 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 e413424d33..957f0b0939 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 @@ -25,7 +25,7 @@ Graph服务提供了两份初始配置文件`nebula-graphd.conf.default`和`nebu | `pid_file` | `pids/nebula-graphd.pid`| 记录进程ID的文件。 | |`enable_optimizer` |`true` | 是否启用优化器。| | `system_memory_high_watermark_ratio` | - |内存高水位报警机制的触发阈值,默认为`0.8`。系统内存占用率高于该值会触发报警机制,Nebula Graph会停止接受查询。初始配置文件中未设置该参数,使用需手动添加。| -| `timezone_name` | - | 指定Nebula Graph的时区。初始配置文件中未设置该参数,使用需手动添加。系统默认值为`UTC+00:00:00`。格式请参见[Specifying the Time Zone with TZ](https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html "Click to view the timezone-related content in the GNU C Library manual")。例如,东八区的设置方式为`--timezone_name=CST-8`。 | +| `timezone_name` | - | 指定Nebula Graph的时区。初始配置文件中未设置该参数,使用需手动添加。系统默认值为`UTC+00:00:00`。格式请参见[Specifying the Time Zone with TZ](https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html "Click to view the timezone-related content in the GNU C Library manual")。例如,东八区的设置方式为`--timezone_name=UTC+08:00`。 | | `local_config` | `true` | 是否从配置文件获取配置信息。 | !!! Note diff --git a/docs-2.0/nebula-studio/manage-schema/st-ug-crud-tag.md b/docs-2.0/nebula-studio/manage-schema/st-ug-crud-tag.md index d945f49e1c..2e96e28b18 100644 --- a/docs-2.0/nebula-studio/manage-schema/st-ug-crud-tag.md +++ b/docs-2.0/nebula-studio/manage-schema/st-ug-crud-tag.md @@ -28,14 +28,17 @@ Studio v{{ studio.release }} 及以后版本。请更新版本,详细操作参 5. 在 **创建** 页面上,完成以下设置: - a. **名称**:按提示信息输入合规的Tag名称。本示例中,输入 `player` 和 `team`。 - - b. (可选)如果Tag需要属性,在 **定义属性** 模块左上角,点击勾选框,并在展开的列表中,完成以下操作: - - 输入属性名称、数据类型和默认值。 - - 如果一个Tag有多个属性,可以点击 **添加属性** 按钮,并定义属性。 - - 如果要删除某个属性,在该属性所在行,点击 ![表示删除的图标](../figs/st-ug-020.png "删除") 图标。 + a. **名称**:按提示信息输入合规的Tag名称。本示例中,输入 `player` 和 `team`。 + + b. (可选)如果Tag需要属性,在 **定义属性** 模块左上角,点击勾选框,并在展开的列表中,完成以下操作: + + - 输入属性名称、数据类型和默认值。 + + - 如果一个Tag有多个属性,可以点击 **添加属性** 按钮,并定义属性。 + + - 如果要删除某个属性,在该属性所在行,点击 ![表示删除的图标](../figs/st-ug-020.png "删除") 图标。 - c. (可选)Tag未设置索引时,用户可以设置 TTL:在 **设置TTL** 模块左上角,点击勾选框,并在展开的列表中设置 `TTL_COL` 和 `TTL_DURATION` 参数信息。关于这两个参数的详细信息,参考 [TTL 配置](../../3.ngql-guide/8.clauses-and-options/ttl-options.md "点击前往 Nebula Graph 网站")。 + c. (可选)Tag未设置索引时,用户可以设置 TTL:在 **设置TTL** 模块左上角,点击勾选框,并在展开的列表中设置 `TTL_COL` 和 `TTL_DURATION` 参数信息。关于这两个参数的详细信息,参考 [TTL 配置](../../3.ngql-guide/8.clauses-and-options/ttl-options.md "点击前往 Nebula Graph 网站")。 6. 完成设置后,在 **对应的 nGQL**面板,用户能看到与上述配置等价的 nGQL 语句。 diff --git a/docs-2.0/nebula-studio/quick-start/st-ug-import-data.md b/docs-2.0/nebula-studio/quick-start/st-ug-import-data.md index 1a5f1fd4d3..60677a3e24 100644 --- a/docs-2.0/nebula-studio/quick-start/st-ug-import-data.md +++ b/docs-2.0/nebula-studio/quick-start/st-ug-import-data.md @@ -42,7 +42,7 @@ !!! Note - 在同一个图空间中,VID 始终唯一,不可重复。关于 VID 的信息,参考 [Nebula Graph 的点ID](../../1.introduction/3.vid.md) "点击进入 Nebula Graph 用户手册")。 + 在同一个图空间中,VID 始终唯一,不可重复。关于 VID 的信息,参考 [Nebula Graph 的点ID](../../1.introduction/3.vid.md) "点击进入 Nebula Graph 用户手册"。 8. 在 **TAG 1** 部分,完成以下操作: 3. 在 **TAG** 下拉列表中,选择数据源对应的Tag名称。在本示例中,`vertex_player.csv` 文件对应选择 **player**;`vertex_team.csv` 文件对应选择 **team**。 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 d8e7b754d0..d0552c19ab 100644 --- a/docs-2.0/reuse/source_connect-to-nebula-graph.md +++ b/docs-2.0/reuse/source_connect-to-nebula-graph.md @@ -2,7 +2,7 @@ Nebula Graph支持多种类型客户端,包括CLI客户端、GUI客户端和 ## Nebula Graph客户端 -用户可以使用已支持的[客户端或者命令行工具](../20.appendix/6.eco-tool-version.md)来连接Nebula Graph数据库。 +用户可以使用已支持的[客户端或者命令行工具](https://docs.nebula-graph.com.cn/{{nebula.release}}/20.appendix/6.eco-tool-version/)来连接Nebula Graph数据库。 - 运行Nebula Console的机器和运行Nebula Graph的服务器网络互通。 diff --git a/docs-2.0/reuse/source_install-nebula-graph-by-rpm-or-deb.md b/docs-2.0/reuse/source_install-nebula-graph-by-rpm-or-deb.md index 01866aeaf3..9253a3918c 100644 --- a/docs-2.0/reuse/source_install-nebula-graph-by-rpm-or-deb.md +++ b/docs-2.0/reuse/source_install-nebula-graph-by-rpm-or-deb.md @@ -2,7 +2,7 @@ RPM和DEB是Linux系统下常见的两种安装包格式,本文介绍如何使 !!! note - 部署Nebula Graph集群的方式参见[使用RPM/DEB包部署集群](/4.deployment-and-installation/2.compile-and-install-nebula-graph/deploy-nebula-graph-cluster)。 + 部署Nebula Graph集群的方式参见[使用RPM/DEB包部署集群](https://docs.nebula-graph.com.cn/{{nebula.release}}/4.deployment-and-installation/1.resource-preparations/)。 ## 前提条件 @@ -127,5 +127,5 @@ RPM和DEB是Linux系统下常见的两种安装包格式,本文介绍如何使 ## 后续操作 -- [启动Nebula Graph](/2.5.0/2.quick-start/5.start-stop-service) -- [连接Nebula Graph](/2.5.0/2.quick-start/3.connect-to-nebula-graph) +- [启动Nebula Graph](https://docs.nebula-graph.com.cn/{{nebula.release}}/2.quick-start/5.start-stop-service/) +- [连接Nebula Graph](https://docs.nebula-graph.com.cn/{{nebula.release}}/2.quick-start/3.connect-to-nebula-graph/) diff --git a/docs-2.0/reuse/source_manage-service.md b/docs-2.0/reuse/source_manage-service.md index 1c03f15428..6a0dd91803 100644 --- a/docs-2.0/reuse/source_manage-service.md +++ b/docs-2.0/reuse/source_manage-service.md @@ -164,7 +164,9 @@ nebula-docker-compose_storaged2_1 ./bin/nebula-storaged --fl ... Up (healthy 0.0.0.0:49227->9779/tcp, 9780/tcp ``` -如果服务有异常,用户可以先确认异常的容器名称(例如`nebula-docker-compose_graphd2_1`),然后执行`docker ps`查看对应的`CONTAINER ID`(示例为`2a6c56c405f5`),最后登录容器排查问题。 +如果服务有异常,用户可以先确认异常的容器名称(例如`nebula-docker-compose_graphd2_1`), + +然后执行`docker ps`查看对应的`CONTAINER ID`(示例为`2a6c56c405f5`)。 ```bash nebula-docker-compose]$ docker ps @@ -178,11 +180,15 @@ a74054c6ae25 vesoft/nebula-graphd:v2-nightly "/usr/local/nebula/b…" 36 45736a32a23a vesoft/nebula-metad:v2-nightly "./bin/nebula-metad …" 36 minutes ago Up 36 minutes (healthy) 9560/tcp, 0.0.0.0:49213->9559/tcp, 0.0.0.0:49212->19559/tcp, 0.0.0.0:49211->19560/tcp nebula-docker-compose_metad0_1 3b2c90eb073e vesoft/nebula-metad:v2-nightly "./bin/nebula-metad …" 36 minutes ago Up 36 minutes (healthy) 9560/tcp, 0.0.0.0:49207->9559/tcp, 0.0.0.0:49206->19559/tcp, 0.0.0.0:49205->19560/tcp nebula-docker-compose_metad2_1 7bb31b7a5b3f vesoft/nebula-metad:v2-nightly "./bin/nebula-metad …" 36 minutes ago Up 36 minutes (healthy) 9560/tcp, 0.0.0.0:49210->9559/tcp, 0.0.0.0:49209->19559/tcp, 0.0.0.0:49208->19560/tcp nebula-docker-compose_metad1_1 +``` +最后登录容器排查问题 + +```bash nebula-docker-compose]$ docker exec -it 2a6c56c405f5 bash [root@2a6c56c405f5 nebula]# ``` ## 下一步 -[连接Nebula Graph](../2.quick-start/3.connect-to-nebula-graph.md) +[连接Nebula Graph](https://docs.nebula-graph.com.cn/{{nebula.release}}/2.quick-start/3.connect-to-nebula-graph/) diff --git a/mkdocs.yml b/mkdocs.yml index 40c8cbb4c3..439c0f1fb4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -23,11 +23,10 @@ extra_css: - stylesheets/extra.css extra: nebula: - release: 2.5.0 - nightly: v2-nightly - master: master base20: 2.0 base200: 2.0.0 + release: book + nightly: v2-nightly version: method: mike social: @@ -35,55 +34,23 @@ extra: link: 'https://github.com/vesoft-inc/nebula-docs-cn' studio: base111b: 1.1.1-beta - base220: 2.2.1 - base300: 3.0.0 - release: 3.0.0 - explorer: - base100: 1.0.0 - release: 2.0.0 + base220: 2.2.0 exchange: - release: 2.5.0 - branch: v2.5 + release: master importer: - release: 2.5.0 - branch: release-v2.0.0-ga + release: master algorithm: - release: 2.5.0 - branch: v2.5 + release: master sparkconnector: - release: 2.5.0 - branch: v2.5 + release: master flinkconnector: - release: 2.5.0 - branch: v2.5 + release: master dockercompose: - release: 2.5.0 - branch: v2.5.0 + release: master common: - release: 2.5.0 - dashboard: - release: 1.0.1 - base100: 1.0.0 - branch: v1.0.1 - console: - release: 2.5.0 - br: - release: 0.5.0 - cpp: - release: 2.5.0 - branch: v2.5.0 - java: - release: 2.5.0 - branch: v2.5.0 - python: - release: 2.5.0 - branch: v2.5.0 - go: - release: 2.5.0 - branch: release-v2.5.0 - bench: - release: 1.0.0 - branch: master + release: master + + nav: @@ -95,11 +62,10 @@ nav: - 相关技术: 0.foreground/2.relates.md - 简介: - - 什么是Nebula Graph: 1.introduction/1.what-is-nebula-graph.md + - '': 1.introduction/1.what-is-nebula-graph.md - 数据模型: 1.introduction/2.data-model.md - - 路径: 1.introduction/2.1.path.md - VID: 1.introduction/3.vid.md - - 服务架构: + - Nebula Graph架构: - 架构总览: 1.introduction/3.nebula-graph-architecture/1.architecture-overview.md - Meta服务: 1.introduction/3.nebula-graph-architecture/2.meta-service.md - Graph服务: 1.introduction/3.nebula-graph-architecture/3.graph-service.md @@ -107,20 +73,19 @@ nav: - 快速入门: - 快速入门流程: 2.quick-start/1.quick-start-workflow.md - - 步骤1:安装Nebula Graph: 2.quick-start/2.install-nebula-graph.md - - 步骤2:启动Nebula Graph: 2.quick-start/5.start-stop-service.md - - 步骤3:连接Nebula Graph: 2.quick-start/3.connect-to-nebula-graph.md - - 步骤4:使用常用命令: 2.quick-start/4.nebula-graph-crud.md + - Docker Compose部署Nebula Graph: 2.quick-start/2.deploy-nebula-graph-with-docker-compose.md + - 管理Nebula Graph服务: 2.quick-start/5.start-stop-service.md + - 连接Nebula Graph: 2.quick-start/3.connect-to-nebula-graph.md + - Nebula Graph常用语法(CRUD): 2.quick-start/4.nebula-graph-crud.md - nGQL指南: - nGQL概述: - - 什么是nGQL: 3.ngql-guide/1.nGQL-overview/1.overview.md + - Nebula Graph查询语言(nGQL): 3.ngql-guide/1.nGQL-overview/1.overview.md - 图模式: 3.ngql-guide/1.nGQL-overview/3.graph-patterns.md - 注释: 3.ngql-guide/1.nGQL-overview/comments.md - 大小写区分: 3.ngql-guide/1.nGQL-overview/identifier-case-sensitivity.md - 关键字: 3.ngql-guide/1.nGQL-overview/keywords-and-reserved-words.md - - nGQL风格指南: 3.ngql-guide/1.nGQL-overview/ngql-style-guide.md - + - 数据类型: - 数值: 3.ngql-guide/3.data-types/1.numeric.md - 布尔: 3.ngql-guide/3.data-types/2.boolean.md @@ -152,14 +117,14 @@ nav: - 字符串函数: 3.ngql-guide/6.functions-and-expressions/2.string.md - 日期时间函数: 3.ngql-guide/6.functions-and-expressions/3.date-and-time.md - Schema函数: 3.ngql-guide/6.functions-and-expressions/4.schema.md + - CASE表达式: 3.ngql-guide/6.functions-and-expressions/5.case-expressions.md - 列表函数: 3.ngql-guide/6.functions-and-expressions/6.list.md - count函数: 3.ngql-guide/6.functions-and-expressions/7.count.md - collect函数: 3.ngql-guide/6.functions-and-expressions/10.collect.md - reduce函数: 3.ngql-guide/6.functions-and-expressions/11.reduce.md - hash函数: 3.ngql-guide/6.functions-and-expressions/12.hash.md - 谓词函数: 3.ngql-guide/6.functions-and-expressions/8.predicate.md - - 自定义函数: 3.ngql-guide/6.functions-and-expressions/9.user-defined-functions.md - - CASE表达式: 3.ngql-guide/6.functions-and-expressions/5.case-expressions.md +# - 自定义函数: 3.ngql-guide/6.functions-and-expressions/9.user-defined-functions.md - 通用查询语句: - MATCH: 3.ngql-guide/7.general-query-statements/2.match.md @@ -182,8 +147,6 @@ nav: - SHOW STATS: 3.ngql-guide/7.general-query-statements/6.show/14.show-stats.md - SHOW TAGS/EDGES: 3.ngql-guide/7.general-query-statements/6.show/15.show-tags-edges.md - SHOW USERS: 3.ngql-guide/7.general-query-statements/6.show/16.show-users.md - - SHOW SESSIONS: 3.ngql-guide/7.general-query-statements/6.show/17.show-sessions.md - - SHOW QUERIES: 3.ngql-guide/7.general-query-statements/6.show/18.show-queries.md - 子句和选项: - GROUP BY: 3.ngql-guide/8.clauses-and-options/group-by.md @@ -202,13 +165,13 @@ nav: - DESCRIBE SPACE: 3.ngql-guide/9.space-statements/4.describe-space.md - DROP SPACE: 3.ngql-guide/9.space-statements/5.drop-space.md - - Tag语句: + - 标签语句: - CREATE TAG: 3.ngql-guide/10.tag-statements/1.create-tag.md - - DROP TAG: 3.ngql-guide/10.tag-statements/2.drop-tag.md + - DROP TAGS: 3.ngql-guide/10.tag-statements/2.drop-tag.md - ALTER TAG: 3.ngql-guide/10.tag-statements/3.alter-tag.md - SHOW TAGS: 3.ngql-guide/10.tag-statements/4.show-tags.md - DESCRIBE TAG: 3.ngql-guide/10.tag-statements/5.describe-tag.md - - Edge type语句: + - 边类型语句: - CREATE EDGE: 3.ngql-guide/11.edge-type-statements/1.create-edge.md - DROP EDGE: 3.ngql-guide/11.edge-type-statements/2.drop-edge.md - ALTER EDGE: 3.ngql-guide/11.edge-type-statements/3.alter-edge.md @@ -255,25 +218,18 @@ nav: # - CONFIG syntax: 3.ngql-guide/18.operation-and-maintenance-statements/1.configs-syntax.md - BALANCE: 3.ngql-guide/18.operation-and-maintenance-statements/2.balance-syntax.md - 作业管理: 3.ngql-guide/18.operation-and-maintenance-statements/4.job-statements.md - - 终止查询: 3.ngql-guide/18.operation-and-maintenance-statements/6.kill-query.md - 安装部署: - 准备资源: 4.deployment-and-installation/1.resource-preparations.md - - 编译与安装: - - 使用源码安装: 4.deployment-and-installation/2.compile-and-install-nebula-graph/1.install-nebula-graph-by-compiling-the-source-code.md - - 使用RPM/DEB包安装: 4.deployment-and-installation/2.compile-and-install-nebula-graph/2.install-nebula-graph-by-rpm-or-deb.md - - 使用Docker Compose部署: 4.deployment-and-installation/2.compile-and-install-nebula-graph/3.deploy-nebula-graph-with-docker-compose.md - - 使用RPM/DEB包部署集群: 4.deployment-and-installation/2.compile-and-install-nebula-graph/deploy-nebula-graph-cluster.md - - 管理服务: 4.deployment-and-installation/manage-service.md - - 连接服务: 4.deployment-and-installation/connect-to-nebula-graph.md - - 升级版本: - - 升级历史版本至v2.5.0: 4.deployment-and-installation/3.upgrade-nebula-graph/upgrade-nebula-graph-to-250.md - - 升级v2.0.x至v2.5.0: 4.deployment-and-installation/3.upgrade-nebula-graph/upgrade-nebula-from-200-to-250.md + - 编译安装Nebula Graph: + - 源码编译安装: 4.deployment-and-installation/2.compile-and-install-nebula-graph/1.install-nebula-graph-by-compiling-the-source-code.md + - RPM/DEB包安装: 4.deployment-and-installation/2.compile-and-install-nebula-graph/2.install-nebula-graph-by-rpm-or-deb.md + - 部署Nebula Graph集群: 4.deployment-and-installation/deploy-nebula-graph-cluster.md - 卸载Nebula Graph: 4.deployment-and-installation/4.uninstall-nebula-graph.md - - 配置与日志: + - 配置和日志: - 配置: - - 配置管理: 5.configurations-and-logs/1.configurations/1.configurations.md + - 配置简介: 5.configurations-and-logs/1.configurations/1.configurations.md - Meta服务配置: 5.configurations-and-logs/1.configurations/2.meta-config.md - Graph服务配置: 5.configurations-and-logs/1.configurations/3.graph-config.md - Storage服务配置: 5.configurations-and-logs/1.configurations/4.storage-config.md @@ -301,18 +257,9 @@ nav: - Storage负载均衡: 8.service-tuning/load-balance.md - 图建模: 8.service-tuning/2.graph-modeling.md - 系统建模: 8.service-tuning/3.system-design.md - - 执行计划: 8.service-tuning/4.plan.md - 超级节点(稠密点): 8.service-tuning/super-node.md - - 客户端: - - 客户端介绍: 14.client/1.nebula-client.md - - Nebula CPP: 14.client/3.nebula-cpp-client.md - - Nebula Java: 14.client/4.nebula-java-client.md - - Nebula Python: 14.client/5.nebula-python-client.md - - Nebula Go: 14.client/6.nebula-go-client.md - - Nebula Graph Studio: - - Studio版本更新说明: nebula-studio/about-studio/st-ug-release-note.md - 认识 Nebula Graph Studio: - 什么是 Nebula Graph Studio: nebula-studio/about-studio/st-ug-what-is-graph-studio.md - 名词解释: nebula-studio/about-studio/st-ug-terms.md @@ -331,44 +278,29 @@ nav: - 操作指南: - 管理 Schema: - 操作图空间: nebula-studio/manage-schema/st-ug-crud-space.md - - 操作Tag: nebula-studio/manage-schema/st-ug-crud-tag.md - - 操作Edge type: nebula-studio/manage-schema/st-ug-crud-edge-type.md + - 操作标签: nebula-studio/manage-schema/st-ug-crud-tag.md + - 操作边类型: nebula-studio/manage-schema/st-ug-crud-edge-type.md - 操作索引: nebula-studio/manage-schema/st-ug-crud-index.md - 使用控制台: - 控制台界面: nebula-studio/use-console/st-ug-console.md - - 导入图探索: nebula-studio/use-console/st-ug-open-in-explore.md - - 查看子图: nebula-studio/use-console/st-ug-visualize-subgraph.md + - 导入图探索: nebula-studio/use-console/st-ug-open-in-explorer.md + - 查看子图: nebula-studio/use-console/st-ug-visualize-findpath.md - 故障排查: - 连接数据库错误: nebula-studio/troubleshooting/st-ug-config-server-errors.md - 无法访问 Studio: nebula-studio/troubleshooting/st-ug-connection-errors.md - - Studio 常见问题: nebula-studio/troubleshooting/st-ug-faq.md - - - Nebula Graph Dashboard: - - 什么是Nebula Graph Dashboard: nebula-dashboard/1.what-is-dashboard.md - - 部署Dashboard: nebula-dashboard/2.deploy-dashboard.md - - 连接Dashboard: nebula-dashboard/3.connect-dashboard.md - - Dashboard页面介绍: nebula-dashboard/4.use-dashboard.md - - 监控指标说明: nebula-dashboard/6.monitor-parameter.md - - - Nebula Graph Explorer: - - 什么是Nebula Graph Explorer: nebula-explorer/about-explorer/ex-ug-what-is-explorer.md - - 安装与登录: - - 部署 Explorer: nebula-explorer/deploy-connect/ex-ug-deploy.md - - 连接数据库: nebula-explorer/deploy-connect/ex-ug-connect.md - - 清除连接: nebula-explorer/deploy-connect/ex-ug-reset-connection.md - - 操作指南: - - 页面概览: nebula-explorer/operation-guide/ex-ug-page-overview.md - - 查询探索: nebula-explorer/operation-guide/ex-ug-query-exploration.md - - 图探索拓展: nebula-explorer/operation-guide/ex-ug-graph-exploration.md - - 画布操作: nebula-explorer/operation-guide/ex-ug-canvas.md - - 关系列表: nebula-explorer/operation-guide/ex-ug-relationship-list.md - - 快捷键: nebula-explorer/operation-guide/ex-ug-shortcuts.md +# - 常见问题: nebula-studio/troubleshooting/st-ug-faq.md - Nebula Importer: - 使用Nebula Importer: nebula-importer/use-importer.md - 有表头配置说明: nebula-importer/config-with-header.md - 无表头配置说明: nebula-importer/config-without-header.md + - Nebula Spark Connector: nebula-spark-connector.md + + - Nebula Flink Connector: nebula-flink-connector.md + + - Nebula Algorithm: nebula-algorithm.md + - Nebula Exchange: - 认识Nebula Exchange: - 什么是Nebula Exchange: nebula-exchange/about-exchange/ex-ug-what-is-exchange.md @@ -384,26 +316,14 @@ nav: - 导入Parquet文件数据: nebula-exchange/use-exchange/ex-ug-import-from-parquet.md - 导入HBase数据: nebula-exchange/use-exchange/ex-ug-import-from-hbase.md - 导入MySQL数据: nebula-exchange/use-exchange/ex-ug-import-from-mysql.md - - 导入ClickHouse数据: nebula-exchange/use-exchange/ex-ug-import-from-clickhouse.md - 导入Neo4j数据: nebula-exchange/use-exchange/ex-ug-import-from-neo4j.md - 导入Hive数据: nebula-exchange/use-exchange/ex-ug-import-from-hive.md - - 导入MaxCompute数据: nebula-exchange/use-exchange/ex-ug-import-from-maxcompute.md - 导入Pulsar数据: nebula-exchange/use-exchange/ex-ug-import-from-pulsar.md - 导入Kafka数据: nebula-exchange/use-exchange/ex-ug-import-from-kafka.md - - 导入SST文件数据: nebula-exchange/use-exchange/ex-ug-import-from-sst.md - - Exchange 常见问题: nebula-exchange/ex-ug-FAQ.md - - - Nebula Algorithm: nebula-algorithm.md - - - Nebula Spark Connector: nebula-spark-connector.md - - - Nebula Flink Connector: nebula-flink-connector.md - - - Nebula Bench: nebula-bench.md + - 常见问题FAQ: nebula-exchange/ex-ug-FAQ.md - 附录: - - Release Note: 20.appendix/releasenote.md - - 常见问题 FAQ: 20.appendix/0.FAQ.md + - Nebula Graph 常见问题: 20.appendix/0.FAQ.md - 生态工具概览: 20.appendix/6.eco-tool-version.md - Nebula Graph 常见问题: 20.appendix/0.FAQ.md - 导入工具选择: 20.appendix/write-tools.md @@ -415,6 +335,31 @@ nav: - PDF: ./pdf/NebulaGraph-CN.pdf # - English Docs: https://docs.nebula-graph.io/ +# - 图算法: +# - nebula-algorithm: +# - 什么是 nebula-algorithm: nebula-algorithm/na-ug-what-is-nebula-algorithm.md +# - 使用限制: nebula-algorithm/na-ug-limitations.md +# - 编译 nebula-algorithm: nebula-algorithm/na-ug-compile.md +# - 使用示例: nebula-algorithm/na-ug-example.md +# +# - Nebula Flink Connector: +# - 什么是 Nebula Flink Connector: nebula-flink/nf-ug-what-is-flink-connector.md +# - 编译 Nebula Flink Connector: nebula-flink/nf-ug-compile.md +# - 使用限制: nebula-flink/nf-ug-limitations.md +# - 自定义 source (NebulaSource): nebula-flink/nf-ug-customize-source.md +# - 自定义 sink (NebulaSink): nebula-flink/nf-ug-customize-sink.md +# - 特殊说明: nebula-flink/nf-ug-notes.md +# +# - Nebula Spark Connector: +# - 什么是 Nebula Spark Connector: spark-connector/sc-ug-what-is-spark-connector.md +# - 编译 Nebula Spark Connector: spark-connector/sc-ug-compile.md +# - 使用限制: spark-connector/sc-ug-limitations.md +# - Nebula Spark Connector Reader: +# - 什么是 Nebula Spark Connector Reader: spark-connector/reader/sc-ug-what-is-reader.md +# - 使用示例: spark-connector/reader/sc-ug-reader-example.md +# - Nebula Spark Connector Writer: +# - 什么是 Nebula Spark Connector Writer: spark-connector/writer/sc-ug-what-is-writer.md +# - 使用示例: spark-connector/writer/sc-ug-writer-example.md # Extensions markdown_extensions: - footnotes @@ -427,8 +372,6 @@ markdown_extensions: separator: "_" - mdx_truly_sane_lists - pymdownx.superfences - - pymdownx.snippets: - base_path: docs-2.0/reuse/ - pymdownx.arithmatex: generic: true @@ -437,14 +380,12 @@ static_templates: # Plugins plugins: - - search - - macros: - include_dir: docs-2.0/reuse/ + - macros - git-revision-date-localized - with-pdf: copyright: 2021 Vesoft Inc. - cover_subtitle: 2.5.0 - author: 吴敏,周瑶,梁振亚,杨怡璇 + cover_subtitle: 2.0.2 + author: 吴敏,周瑶,梁振亚 cover: true back_cover: true cover_logo: 'https://cloud-cdn.nebula-graph.com.cn/nebula-for-pdf.png' @@ -455,11 +396,9 @@ plugins: extra_javascript: - js/version-select.js - js/config.js - - js/jquery.js - - js/init.js - https://polyfill.io/v3/polyfill.min.js?features=es6 - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js -google_analytics: - - UA-60523578-15 - - auto +#google_analytics: +# - UA-60523578-15 +# - auto