From e24e1613faebc206a8dacaab911116412217785c Mon Sep 17 00:00:00 2001 From: zhongyunWan Date: Wed, 16 Oct 2024 02:37:41 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20zhongyun?= =?UTF-8?q?Wan/tugraph-db@b8708ac29744abc5fd12cd4a70d61c7a6c607ea4=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 404.html | 4 ++-- assets/js/{0668f123.501aefe2.js => 0668f123.7ce505e3.js} | 2 +- assets/js/{0969a4ab.d3e01106.js => 0969a4ab.54d36027.js} | 2 +- assets/js/{12614a71.c23612cc.js => 12614a71.107cff91.js} | 2 +- assets/js/{153b9838.76147dd2.js => 153b9838.b03f82e3.js} | 2 +- assets/js/{22131911.d9333dd1.js => 22131911.aedb6db8.js} | 2 +- assets/js/{2602de02.a33c14bc.js => 2602de02.9b502649.js} | 2 +- assets/js/{2ffb589b.53e8d1eb.js => 2ffb589b.f0af2f6d.js} | 2 +- assets/js/{3284e532.11f42682.js => 3284e532.ca995ddb.js} | 2 +- assets/js/{34a06ef9.1f99600c.js => 34a06ef9.0e0fa98d.js} | 2 +- assets/js/{367d0d1d.49b73106.js => 367d0d1d.fb92a985.js} | 2 +- assets/js/{36a5b4e6.7eed2b49.js => 36a5b4e6.e5329f6b.js} | 2 +- assets/js/{36b9e001.5ab6650e.js => 36b9e001.790d4006.js} | 2 +- assets/js/{37536724.ea29d1e3.js => 37536724.b0b07329.js} | 2 +- assets/js/{37590f4c.dffbc72f.js => 37590f4c.a0703510.js} | 2 +- assets/js/{388c432b.bdb1f719.js => 388c432b.5cb4f18e.js} | 2 +- assets/js/{39e34d9b.3e2e9ce4.js => 39e34d9b.c26d1deb.js} | 2 +- assets/js/{3fac061c.c7403e38.js => 3fac061c.c2b4a952.js} | 2 +- assets/js/{418c52d8.d2d5a54f.js => 418c52d8.36a7ae91.js} | 2 +- assets/js/{43d06d47.c66955a5.js => 43d06d47.b9218c16.js} | 2 +- assets/js/{4930370d.dea89834.js => 4930370d.28d38979.js} | 2 +- assets/js/{4e149bf8.74d3a2c0.js => 4e149bf8.0555ee2f.js} | 2 +- assets/js/{50b94c42.d8f0a772.js => 50b94c42.52a29011.js} | 2 +- assets/js/{5189e784.c209ae45.js => 5189e784.98484c1b.js} | 2 +- assets/js/{54acc636.35f642d9.js => 54acc636.b4d5e407.js} | 2 +- assets/js/{553e0098.67cf795e.js => 553e0098.4a760954.js} | 2 +- assets/js/{5680df66.7884e317.js => 5680df66.c948707d.js} | 2 +- assets/js/{65f6f344.398d47b6.js => 65f6f344.4fe3115b.js} | 2 +- assets/js/{6690cca3.8a89dfc4.js => 6690cca3.696e367a.js} | 2 +- assets/js/{66d55dfc.c5aa7b96.js => 66d55dfc.5620834d.js} | 2 +- assets/js/{6cc43114.ef4d9c30.js => 6cc43114.5d07794d.js} | 2 +- assets/js/{6e5b21f1.5072a35c.js => 6e5b21f1.dce507ec.js} | 2 +- assets/js/{6fe137e4.9da9f63d.js => 6fe137e4.cee0e85a.js} | 2 +- assets/js/{7387447f.9211323f.js => 7387447f.5468010f.js} | 2 +- assets/js/{74344ff3.9cfc5742.js => 74344ff3.a8e08772.js} | 2 +- assets/js/{77278843.b99f48f2.js => 77278843.be5db94e.js} | 2 +- assets/js/{7c05b63b.c8c4f137.js => 7c05b63b.483d50ee.js} | 2 +- assets/js/{7c75d82b.472a4844.js => 7c75d82b.48c6b775.js} | 2 +- assets/js/{7ca1a5df.3683e3f1.js => 7ca1a5df.9d98152c.js} | 2 +- assets/js/{7d21d01b.e18fdcc4.js => 7d21d01b.02de3e80.js} | 2 +- assets/js/{7f99a0c3.7878e52e.js => 7f99a0c3.d8c1a2b0.js} | 2 +- assets/js/{8110278a.af0bfd97.js => 8110278a.1ca5c965.js} | 2 +- assets/js/{811fe2fb.a4ef1e3e.js => 811fe2fb.ef47da70.js} | 2 +- assets/js/{84f7962c.d1670fe1.js => 84f7962c.dbac439d.js} | 2 +- assets/js/{8534c110.827af05f.js => 8534c110.e6f55f35.js} | 2 +- assets/js/{8652d030.3a5cdcb6.js => 8652d030.4ac43b0d.js} | 2 +- assets/js/{86859d92.2091b9a5.js => 86859d92.2fa3acf6.js} | 2 +- assets/js/{8e6640c6.97eff1d8.js => 8e6640c6.0951c84b.js} | 2 +- assets/js/{8fce0df1.db80b012.js => 8fce0df1.91a02b91.js} | 2 +- assets/js/{916cc991.c73c9a1b.js => 916cc991.5136f99f.js} | 2 +- assets/js/{99926a12.92c42b8a.js => 99926a12.0be987ce.js} | 2 +- assets/js/{9c8d271c.5282d178.js => 9c8d271c.4a8a3f1b.js} | 2 +- assets/js/{9d582788.f13b8533.js => 9d582788.a06cb8e8.js} | 2 +- assets/js/{9f7ad7a9.4070ff00.js => 9f7ad7a9.29558be6.js} | 2 +- assets/js/{a30dc11a.485c65f4.js => a30dc11a.e94a0bdf.js} | 2 +- assets/js/{a98e52e2.7fe9ec6e.js => a98e52e2.2f2398d1.js} | 2 +- assets/js/{b45c3470.9dd61fda.js => b45c3470.f3914aeb.js} | 2 +- assets/js/{b7950652.c6524e5a.js => b7950652.4d363fda.js} | 2 +- assets/js/{b7cec5eb.dd1959ad.js => b7cec5eb.c1096ee8.js} | 2 +- assets/js/{b7dd3f88.849d69fb.js => b7dd3f88.3a55716a.js} | 2 +- assets/js/{ba766c72.1e881a97.js => ba766c72.144ae3a4.js} | 2 +- assets/js/{c803846e.75ebb8ee.js => c803846e.d727b2eb.js} | 2 +- assets/js/{ccf6bcc5.f8b99ec9.js => ccf6bcc5.a1a5c566.js} | 2 +- assets/js/{cd445c99.cf39df8e.js => cd445c99.ef1cfb46.js} | 2 +- assets/js/{cf75e3c6.5299505e.js => cf75e3c6.3ed992c2.js} | 2 +- assets/js/{d05da8ca.1753553d.js => d05da8ca.47d6d859.js} | 2 +- assets/js/{d1d3a510.8f141c35.js => d1d3a510.94a4f7e7.js} | 2 +- assets/js/{e166abdf.75ee1bff.js => e166abdf.1ade5365.js} | 2 +- assets/js/{e1aa53d6.9db38469.js => e1aa53d6.f4182e93.js} | 2 +- assets/js/{e48326fb.283ec13a.js => e48326fb.be73c242.js} | 2 +- assets/js/{e523e931.c8aa6d3e.js => e523e931.219e1523.js} | 2 +- assets/js/{ecfd9356.e9277bf7.js => ecfd9356.935fbcd8.js} | 2 +- assets/js/{f01c9311.d2d65d20.js => f01c9311.d822b0e3.js} | 2 +- assets/js/{f0d3c377.d2da98db.js => f0d3c377.25815bae.js} | 2 +- assets/js/{f5a37f2d.3855de93.js => f5a37f2d.fe64c836.js} | 2 +- assets/js/{f7c36d28.2bdac649.js => f7c36d28.18d97080.js} | 2 +- assets/js/{f8266f2b.401f41de.js => f8266f2b.28aae18b.js} | 2 +- assets/js/{f8bd24ea.1015e958.js => f8bd24ea.bf2fc0f0.js} | 2 +- assets/js/{facc0445.38b210dd.js => facc0445.c5d55231.js} | 2 +- assets/js/{fd689854.0183f75c.js => fd689854.e2ec635d.js} | 2 +- assets/js/{main.d825a6d7.js => main.4c61da86.js} | 4 ++-- ...d825a6d7.js.LICENSE.txt => main.4c61da86.js.LICENSE.txt} | 0 .../{runtime~main.4b69dc72.js => runtime~main.201050bb.js} | 2 +- en/best-practices/data_migration/index.html | 6 +++--- en/best-practices/learn_practices/index.html | 6 +++--- en/best-practices/rdbms-to-tugraph/index.html | 6 +++--- en/best-practices/selection/index.html | 6 +++--- en/best-practices/spatial/index.html | 6 +++--- en/client-tools/bolt-client/index.html | 6 +++--- en/client-tools/bolt-console-client/index.html | 6 +++--- en/client-tools/cpp-client/index.html | 6 +++--- en/client-tools/java-client/index.html | 6 +++--- en/client-tools/python-client/index.html | 6 +++--- en/client-tools/restful-api-legacy/index.html | 6 +++--- en/client-tools/restful-api/index.html | 6 +++--- en/client-tools/rpc-api/index.html | 6 +++--- en/client-tools/tugraph-ogm/index.html | 6 +++--- en/contacts/index.html | 6 +++--- en/contributor-manual/community-roles/index.html | 6 +++--- en/contributor-manual/contributing/index.html | 6 +++--- en/contributor-manual/corporate-cla/index.html | 6 +++--- en/contributor-manual/individual-cla/index.html | 6 +++--- en/contributor-manual/roadmap/index.html | 6 +++--- en/faq/index.html | 6 +++--- en/guide/index.html | 6 +++--- en/installation&running/cloud-deployment/index.html | 6 +++--- en/installation&running/compile/index.html | 6 +++--- en/installation&running/docker-deployment/index.html | 6 +++--- en/installation&running/environment-mode/index.html | 6 +++--- en/installation&running/environment/index.html | 6 +++--- en/installation&running/high-availability-mode/index.html | 6 +++--- en/installation&running/local-package-deployment/index.html | 6 +++--- en/installation&running/tugraph-running/index.html | 6 +++--- en/introduction/architecture/index.html | 6 +++--- en/introduction/characteristics/htap/index.html | 6 +++--- .../characteristics/multi-level-Interfaces/index.html | 6 +++--- .../characteristics/performance-oriented/index.html | 6 +++--- en/introduction/functionality/index.html | 6 +++--- en/introduction/glossary/index.html | 6 +++--- en/introduction/scenarios/index.html | 6 +++--- en/introduction/schema/index.html | 6 +++--- en/introduction/what-is-gdbms/index.html | 6 +++--- en/introduction/what-is-graph/index.html | 6 +++--- en/introduction/what-is-tugraph/index.html | 6 +++--- en/olap&procedure/learn/heterogeneous_graph/index.html | 6 +++--- en/olap&procedure/learn/sampling_api/index.html | 6 +++--- en/olap&procedure/learn/training/index.html | 6 +++--- en/olap&procedure/learn/tutorial/index.html | 6 +++--- en/olap&procedure/olap/algorithms/index.html | 6 +++--- en/olap&procedure/olap/olap-base-api/index.html | 6 +++--- en/olap&procedure/olap/olap-on-db-api/index.html | 6 +++--- en/olap&procedure/olap/olap-on-disk-api/index.html | 6 +++--- en/olap&procedure/olap/python-api/index.html | 6 +++--- en/olap&procedure/olap/tutorial/index.html | 6 +++--- en/olap&procedure/procedure/Rust-procedure/index.html | 6 +++--- en/olap&procedure/procedure/index.html | 6 +++--- en/olap&procedure/procedure/traversal/index.html | 6 +++--- en/permission/log/index.html | 6 +++--- en/permission/monitoring/index.html | 6 +++--- en/permission/privilege/index.html | 6 +++--- en/permission/reset_admin_password/index.html | 6 +++--- en/permission/token/index.html | 6 +++--- en/quality/integration-testing/index.html | 6 +++--- en/quality/unit-testing/index.html | 6 +++--- en/query/cypher/index.html | 6 +++--- en/query/gql/index.html | 6 +++--- en/quick-start/demo/movie/index.html | 6 +++--- en/quick-start/demo/round-the-world/index.html | 6 +++--- en/quick-start/demo/the-three-body/index.html | 6 +++--- en/quick-start/demo/three-kingdoms/index.html | 6 +++--- en/quick-start/demo/wandering-earth/index.html | 6 +++--- en/quick-start/preparation/index.html | 6 +++--- en/user-guide/tugraph-browser-legacy/index.html | 6 +++--- en/user-guide/tugraph-browser/index.html | 6 +++--- en/utility-tools/backup-and-restore/index.html | 6 +++--- en/utility-tools/data-export/index.html | 6 +++--- en/utility-tools/data-import/index.html | 6 +++--- en/utility-tools/data-warmup/index.html | 6 +++--- en/utility-tools/ha-cluster-management/index.html | 6 +++--- en/utility-tools/tugraph-cli/index.html | 6 +++--- en/utility-tools/tugraph-datax/index.html | 6 +++--- en/utility-tools/tugraph-explorer/index.html | 6 +++--- index.html | 4 ++-- markdown-page/index.html | 4 ++-- .../architecture/index.html" | 4 ++-- .../functionality/index.html" | 4 ++-- .../TuGraph\345\205\245\351\227\250/glossary/index.html" | 4 ++-- .../TuGraph\345\205\245\351\227\250/scenarios/index.html" | 4 ++-- .../TuGraph\345\205\245\351\227\250/schema/index.html" | 4 ++-- .../what-is-gdbms/index.html" | 4 ++-- .../what-is-graph/index.html" | 4 ++-- .../what-is-tugraph/index.html" | 4 ++-- .../htap/index.html" | 4 ++-- .../multi-level-Interfaces/index.html" | 4 ++-- .../performance-oriented/index.html" | 4 ++-- zh/contacts/index.html | 4 ++-- zh/development_guide/index.html | 4 ++-- zh/faq/index.html | 4 ++-- zh/guide/index.html | 4 ++-- .../tugraph-browser-legacy/index.html" | 4 ++-- .../tugraph-browser/index.html" | 4 ++-- .../algorithms/index.html" | 4 ++-- .../olap-base-api/index.html" | 4 ++-- .../olap-on-db-api/index.html" | 4 ++-- .../olap-on-disk-api/index.html" | 4 ++-- .../python-api/index.html" | 4 ++-- .../tutorial/index.html" | 4 ++-- .../heterogeneous_graph/index.html" | 4 ++-- .../sampling_api/index.html" | 4 ++-- .../training/index.html" | 4 ++-- .../tutorial/index.html" | 4 ++-- .../Rust-procedure/index.html" | 4 ++-- .../index.html" | 4 ++-- .../traversal/index.html" | 4 ++-- .../cloud-deployment/index.html" | 4 ++-- .../compile/index.html" | 4 ++-- .../docker-deployment/index.html" | 4 ++-- .../environment-mode/index.html" | 4 ++-- .../environment/index.html" | 4 ++-- .../high-availability-mode/index.html" | 4 ++-- .../local-package-deployment/index.html" | 4 ++-- .../tugraph-running/index.html" | 4 ++-- .../backup-and-restore/index.html" | 4 ++-- .../data-export/index.html" | 4 ++-- .../data-import/index.html" | 4 ++-- .../data-warmup/index.html" | 4 ++-- .../ha-cluster-management/index.html" | 4 ++-- .../restful/index.html" | 4 ++-- .../tugraph-cli/index.html" | 4 ++-- .../tugraph-datax/index.html" | 4 ++-- .../tugraph-explorer/index.html" | 4 ++-- .../bolt-client/index.html" | 4 ++-- .../bolt-console-client/index.html" | 4 ++-- .../cpp-client/index.html" | 4 ++-- .../java-client/index.html" | 4 ++-- .../python-client/index.html" | 4 ++-- .../restful-api-legacy/index.html" | 4 ++-- .../restful-api/index.html" | 4 ++-- .../rpc-api/index.html" | 4 ++-- .../tugraph-ogm/index.html" | 4 ++-- .../demo\347\244\272\344\276\213/movie/index.html" | 4 ++-- .../round-the-world/index.html" | 4 ++-- .../demo\347\244\272\344\276\213/the-three-body/index.html" | 4 ++-- .../demo\347\244\272\344\276\213/three-kingdoms/index.html" | 4 ++-- .../wandering-earth/index.html" | 4 ++-- .../preparation/index.html" | 4 ++-- .../data_migration/index.html" | 4 ++-- .../learn_practices/index.html" | 4 ++-- .../rdbms-to-tugraph/index.html" | 4 ++-- .../selection/index.html" | 4 ++-- .../spatial/index.html" | 4 ++-- .../cypher/index.html" | 4 ++-- .../gql/index.html" | 4 ++-- .../vector_index/index.html" | 4 ++-- .../integration-testing/index.html" | 4 ++-- .../unit-testing/index.html" | 4 ++-- .../community-roles/index.html" | 4 ++-- .../contributing/index.html" | 4 ++-- .../corporate-cla/index.html" | 4 ++-- .../individual-cla/index.html" | 4 ++-- .../roadmap/index.html" | 4 ++-- .../log/index.html" | 4 ++-- .../monitoring/index.html" | 4 ++-- .../privilege/index.html" | 4 ++-- .../reset_admin_password/index.html" | 4 ++-- .../token/index.html" | 4 ++-- 246 files changed, 489 insertions(+), 489 deletions(-) rename assets/js/{0668f123.501aefe2.js => 0668f123.7ce505e3.js} (99%) rename assets/js/{0969a4ab.d3e01106.js => 0969a4ab.54d36027.js} (99%) rename assets/js/{12614a71.c23612cc.js => 12614a71.107cff91.js} (99%) rename assets/js/{153b9838.76147dd2.js => 153b9838.b03f82e3.js} (99%) rename assets/js/{22131911.d9333dd1.js => 22131911.aedb6db8.js} (99%) rename assets/js/{2602de02.a33c14bc.js => 2602de02.9b502649.js} (98%) rename assets/js/{2ffb589b.53e8d1eb.js => 2ffb589b.f0af2f6d.js} (99%) rename assets/js/{3284e532.11f42682.js => 3284e532.ca995ddb.js} (98%) rename assets/js/{34a06ef9.1f99600c.js => 34a06ef9.0e0fa98d.js} (99%) rename assets/js/{367d0d1d.49b73106.js => 367d0d1d.fb92a985.js} (99%) rename assets/js/{36a5b4e6.7eed2b49.js => 36a5b4e6.e5329f6b.js} (99%) rename assets/js/{36b9e001.5ab6650e.js => 36b9e001.790d4006.js} (99%) rename assets/js/{37536724.ea29d1e3.js => 37536724.b0b07329.js} (98%) rename assets/js/{37590f4c.dffbc72f.js => 37590f4c.a0703510.js} (99%) rename assets/js/{388c432b.bdb1f719.js => 388c432b.5cb4f18e.js} (98%) rename assets/js/{39e34d9b.3e2e9ce4.js => 39e34d9b.c26d1deb.js} (99%) rename assets/js/{3fac061c.c7403e38.js => 3fac061c.c2b4a952.js} (99%) rename assets/js/{418c52d8.d2d5a54f.js => 418c52d8.36a7ae91.js} (99%) rename assets/js/{43d06d47.c66955a5.js => 43d06d47.b9218c16.js} (98%) rename assets/js/{4930370d.dea89834.js => 4930370d.28d38979.js} (99%) rename assets/js/{4e149bf8.74d3a2c0.js => 4e149bf8.0555ee2f.js} (99%) rename assets/js/{50b94c42.d8f0a772.js => 50b94c42.52a29011.js} (99%) rename assets/js/{5189e784.c209ae45.js => 5189e784.98484c1b.js} (99%) rename assets/js/{54acc636.35f642d9.js => 54acc636.b4d5e407.js} (99%) rename assets/js/{553e0098.67cf795e.js => 553e0098.4a760954.js} (98%) rename assets/js/{5680df66.7884e317.js => 5680df66.c948707d.js} (99%) rename assets/js/{65f6f344.398d47b6.js => 65f6f344.4fe3115b.js} (99%) rename assets/js/{6690cca3.8a89dfc4.js => 6690cca3.696e367a.js} (99%) rename assets/js/{66d55dfc.c5aa7b96.js => 66d55dfc.5620834d.js} (97%) rename assets/js/{6cc43114.ef4d9c30.js => 6cc43114.5d07794d.js} (98%) rename assets/js/{6e5b21f1.5072a35c.js => 6e5b21f1.dce507ec.js} (99%) rename assets/js/{6fe137e4.9da9f63d.js => 6fe137e4.cee0e85a.js} (96%) rename assets/js/{7387447f.9211323f.js => 7387447f.5468010f.js} (99%) rename assets/js/{74344ff3.9cfc5742.js => 74344ff3.a8e08772.js} (99%) rename assets/js/{77278843.b99f48f2.js => 77278843.be5db94e.js} (99%) rename assets/js/{7c05b63b.c8c4f137.js => 7c05b63b.483d50ee.js} (98%) rename assets/js/{7c75d82b.472a4844.js => 7c75d82b.48c6b775.js} (99%) rename assets/js/{7ca1a5df.3683e3f1.js => 7ca1a5df.9d98152c.js} (99%) rename assets/js/{7d21d01b.e18fdcc4.js => 7d21d01b.02de3e80.js} (99%) rename assets/js/{7f99a0c3.7878e52e.js => 7f99a0c3.d8c1a2b0.js} (99%) rename assets/js/{8110278a.af0bfd97.js => 8110278a.1ca5c965.js} (99%) rename assets/js/{811fe2fb.a4ef1e3e.js => 811fe2fb.ef47da70.js} (99%) rename assets/js/{84f7962c.d1670fe1.js => 84f7962c.dbac439d.js} (99%) rename assets/js/{8534c110.827af05f.js => 8534c110.e6f55f35.js} (99%) rename assets/js/{8652d030.3a5cdcb6.js => 8652d030.4ac43b0d.js} (99%) rename assets/js/{86859d92.2091b9a5.js => 86859d92.2fa3acf6.js} (99%) rename assets/js/{8e6640c6.97eff1d8.js => 8e6640c6.0951c84b.js} (98%) rename assets/js/{8fce0df1.db80b012.js => 8fce0df1.91a02b91.js} (99%) rename assets/js/{916cc991.c73c9a1b.js => 916cc991.5136f99f.js} (99%) rename assets/js/{99926a12.92c42b8a.js => 99926a12.0be987ce.js} (98%) rename assets/js/{9c8d271c.5282d178.js => 9c8d271c.4a8a3f1b.js} (99%) rename assets/js/{9d582788.f13b8533.js => 9d582788.a06cb8e8.js} (99%) rename assets/js/{9f7ad7a9.4070ff00.js => 9f7ad7a9.29558be6.js} (98%) rename assets/js/{a30dc11a.485c65f4.js => a30dc11a.e94a0bdf.js} (99%) rename assets/js/{a98e52e2.7fe9ec6e.js => a98e52e2.2f2398d1.js} (99%) rename assets/js/{b45c3470.9dd61fda.js => b45c3470.f3914aeb.js} (99%) rename assets/js/{b7950652.c6524e5a.js => b7950652.4d363fda.js} (99%) rename assets/js/{b7cec5eb.dd1959ad.js => b7cec5eb.c1096ee8.js} (98%) rename assets/js/{b7dd3f88.849d69fb.js => b7dd3f88.3a55716a.js} (99%) rename assets/js/{ba766c72.1e881a97.js => ba766c72.144ae3a4.js} (99%) rename assets/js/{c803846e.75ebb8ee.js => c803846e.d727b2eb.js} (98%) rename assets/js/{ccf6bcc5.f8b99ec9.js => ccf6bcc5.a1a5c566.js} (98%) rename assets/js/{cd445c99.cf39df8e.js => cd445c99.ef1cfb46.js} (99%) rename assets/js/{cf75e3c6.5299505e.js => cf75e3c6.3ed992c2.js} (96%) rename assets/js/{d05da8ca.1753553d.js => d05da8ca.47d6d859.js} (99%) rename assets/js/{d1d3a510.8f141c35.js => d1d3a510.94a4f7e7.js} (98%) rename assets/js/{e166abdf.75ee1bff.js => e166abdf.1ade5365.js} (98%) rename assets/js/{e1aa53d6.9db38469.js => e1aa53d6.f4182e93.js} (99%) rename assets/js/{e48326fb.283ec13a.js => e48326fb.be73c242.js} (96%) rename assets/js/{e523e931.c8aa6d3e.js => e523e931.219e1523.js} (99%) rename assets/js/{ecfd9356.e9277bf7.js => ecfd9356.935fbcd8.js} (98%) rename assets/js/{f01c9311.d2d65d20.js => f01c9311.d822b0e3.js} (99%) rename assets/js/{f0d3c377.d2da98db.js => f0d3c377.25815bae.js} (98%) rename assets/js/{f5a37f2d.3855de93.js => f5a37f2d.fe64c836.js} (99%) rename assets/js/{f7c36d28.2bdac649.js => f7c36d28.18d97080.js} (99%) rename assets/js/{f8266f2b.401f41de.js => f8266f2b.28aae18b.js} (99%) rename assets/js/{f8bd24ea.1015e958.js => f8bd24ea.bf2fc0f0.js} (98%) rename assets/js/{facc0445.38b210dd.js => facc0445.c5d55231.js} (99%) rename assets/js/{fd689854.0183f75c.js => fd689854.e2ec635d.js} (99%) rename assets/js/{main.d825a6d7.js => main.4c61da86.js} (93%) rename assets/js/{main.d825a6d7.js.LICENSE.txt => main.4c61da86.js.LICENSE.txt} (100%) rename assets/js/{runtime~main.4b69dc72.js => runtime~main.201050bb.js} (58%) rename zh/introduction/architecture/index.html => "zh/TuGraph\345\205\245\351\227\250/architecture/index.html" (99%) rename zh/introduction/functionality/index.html => "zh/TuGraph\345\205\245\351\227\250/functionality/index.html" (99%) rename zh/introduction/glossary/index.html => "zh/TuGraph\345\205\245\351\227\250/glossary/index.html" (99%) rename zh/introduction/scenarios/index.html => "zh/TuGraph\345\205\245\351\227\250/scenarios/index.html" (99%) rename zh/introduction/schema/index.html => "zh/TuGraph\345\205\245\351\227\250/schema/index.html" (99%) rename zh/introduction/what-is-gdbms/index.html => "zh/TuGraph\345\205\245\351\227\250/what-is-gdbms/index.html" (99%) rename zh/introduction/what-is-graph/index.html => "zh/TuGraph\345\205\245\351\227\250/what-is-graph/index.html" (99%) rename zh/introduction/what-is-tugraph/index.html => "zh/TuGraph\345\205\245\351\227\250/what-is-tugraph/index.html" (99%) rename zh/introduction/characteristics/htap/index.html => "zh/TuGraph\345\205\245\351\227\250/\344\272\247\345\223\201\347\211\271\347\202\271/htap/index.html" (99%) rename zh/introduction/characteristics/multi-level-Interfaces/index.html => "zh/TuGraph\345\205\245\351\227\250/\344\272\247\345\223\201\347\211\271\347\202\271/multi-level-Interfaces/index.html" (99%) rename zh/introduction/characteristics/performance-oriented/index.html => "zh/TuGraph\345\205\245\351\227\250/\344\272\247\345\223\201\347\211\271\347\202\271/performance-oriented/index.html" (99%) rename zh/user-guide/tugraph-browser-legacy/index.html => "zh/\345\217\257\350\247\206\345\214\226\346\223\215\344\275\234\346\214\207\345\215\227/tugraph-browser-legacy/index.html" (99%) rename zh/user-guide/tugraph-browser/index.html => "zh/\345\217\257\350\247\206\345\214\226\346\223\215\344\275\234\346\214\207\345\215\227/tugraph-browser/index.html" (99%) rename zh/olap&procedure/olap/algorithms/index.html => "zh/\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\210\206\346\236\220\346\216\245\345\217\243/\345\210\206\346\236\220\346\216\245\345\217\243/algorithms/index.html" (99%) rename zh/olap&procedure/olap/olap-base-api/index.html => "zh/\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\210\206\346\236\220\346\216\245\345\217\243/\345\210\206\346\236\220\346\216\245\345\217\243/olap-base-api/index.html" (99%) rename zh/olap&procedure/olap/olap-on-db-api/index.html => "zh/\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\210\206\346\236\220\346\216\245\345\217\243/\345\210\206\346\236\220\346\216\245\345\217\243/olap-on-db-api/index.html" (99%) rename zh/olap&procedure/olap/olap-on-disk-api/index.html => "zh/\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\210\206\346\236\220\346\216\245\345\217\243/\345\210\206\346\236\220\346\216\245\345\217\243/olap-on-disk-api/index.html" (99%) rename zh/olap&procedure/olap/python-api/index.html => "zh/\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\210\206\346\236\220\346\216\245\345\217\243/\345\210\206\346\236\220\346\216\245\345\217\243/python-api/index.html" (99%) rename zh/olap&procedure/olap/tutorial/index.html => "zh/\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\210\206\346\236\220\346\216\245\345\217\243/\345\210\206\346\236\220\346\216\245\345\217\243/tutorial/index.html" (99%) rename zh/olap&procedure/learn/heterogeneous_graph/index.html => "zh/\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\210\206\346\236\220\346\216\245\345\217\243/\345\233\276\345\255\246\344\271\240/heterogeneous_graph/index.html" (99%) rename zh/olap&procedure/learn/sampling_api/index.html => "zh/\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\210\206\346\236\220\346\216\245\345\217\243/\345\233\276\345\255\246\344\271\240/sampling_api/index.html" (99%) rename zh/olap&procedure/learn/training/index.html => "zh/\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\210\206\346\236\220\346\216\245\345\217\243/\345\233\276\345\255\246\344\271\240/training/index.html" (99%) rename zh/olap&procedure/learn/tutorial/index.html => "zh/\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\210\206\346\236\220\346\216\245\345\217\243/\345\233\276\345\255\246\344\271\240/tutorial/index.html" (99%) rename zh/olap&procedure/procedure/Rust-procedure/index.html => "zh/\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\210\206\346\236\220\346\216\245\345\217\243/\345\255\230\345\202\250\350\277\207\347\250\213/Rust-procedure/index.html" (99%) rename zh/olap&procedure/procedure/index.html => "zh/\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\210\206\346\236\220\346\216\245\345\217\243/\345\255\230\345\202\250\350\277\207\347\250\213/index.html" (99%) rename zh/olap&procedure/procedure/traversal/index.html => "zh/\345\255\230\345\202\250\350\277\207\347\250\213\345\222\214\345\210\206\346\236\220\346\216\245\345\217\243/\345\255\230\345\202\250\350\277\207\347\250\213/traversal/index.html" (99%) rename zh/installation&running/cloud-deployment/index.html => "zh/\345\256\211\350\243\205\345\222\214\350\277\220\350\241\214/cloud-deployment/index.html" (99%) rename zh/installation&running/compile/index.html => "zh/\345\256\211\350\243\205\345\222\214\350\277\220\350\241\214/compile/index.html" (99%) rename zh/installation&running/docker-deployment/index.html => "zh/\345\256\211\350\243\205\345\222\214\350\277\220\350\241\214/docker-deployment/index.html" (99%) rename zh/installation&running/environment-mode/index.html => "zh/\345\256\211\350\243\205\345\222\214\350\277\220\350\241\214/environment-mode/index.html" (99%) rename zh/installation&running/environment/index.html => "zh/\345\256\211\350\243\205\345\222\214\350\277\220\350\241\214/environment/index.html" (99%) rename zh/installation&running/high-availability-mode/index.html => "zh/\345\256\211\350\243\205\345\222\214\350\277\220\350\241\214/high-availability-mode/index.html" (99%) rename zh/installation&running/local-package-deployment/index.html => "zh/\345\256\211\350\243\205\345\222\214\350\277\220\350\241\214/local-package-deployment/index.html" (99%) rename zh/installation&running/tugraph-running/index.html => "zh/\345\256\211\350\243\205\345\222\214\350\277\220\350\241\214/tugraph-running/index.html" (99%) rename zh/utility-tools/backup-and-restore/index.html => "zh/\345\256\236\347\224\250\345\267\245\345\205\267/backup-and-restore/index.html" (99%) rename zh/utility-tools/data-export/index.html => "zh/\345\256\236\347\224\250\345\267\245\345\205\267/data-export/index.html" (99%) rename zh/utility-tools/data-import/index.html => "zh/\345\256\236\347\224\250\345\267\245\345\205\267/data-import/index.html" (99%) rename zh/utility-tools/data-warmup/index.html => "zh/\345\256\236\347\224\250\345\267\245\345\205\267/data-warmup/index.html" (99%) rename zh/utility-tools/ha-cluster-management/index.html => "zh/\345\256\236\347\224\250\345\267\245\345\205\267/ha-cluster-management/index.html" (99%) rename zh/utility-tools/restful/index.html => "zh/\345\256\236\347\224\250\345\267\245\345\205\267/restful/index.html" (99%) rename zh/utility-tools/tugraph-cli/index.html => "zh/\345\256\236\347\224\250\345\267\245\345\205\267/tugraph-cli/index.html" (99%) rename zh/utility-tools/tugraph-datax/index.html => "zh/\345\256\236\347\224\250\345\267\245\345\205\267/tugraph-datax/index.html" (99%) rename zh/utility-tools/tugraph-explorer/index.html => "zh/\345\256\236\347\224\250\345\267\245\345\205\267/tugraph-explorer/index.html" (99%) rename zh/client-tools/bolt-client/index.html => "zh/\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267/bolt-client/index.html" (99%) rename zh/client-tools/bolt-console-client/index.html => "zh/\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267/bolt-console-client/index.html" (99%) rename zh/client-tools/cpp-client/index.html => "zh/\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267/cpp-client/index.html" (99%) rename zh/client-tools/java-client/index.html => "zh/\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267/java-client/index.html" (99%) rename zh/client-tools/python-client/index.html => "zh/\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267/python-client/index.html" (99%) rename zh/client-tools/restful-api-legacy/index.html => "zh/\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267/restful-api-legacy/index.html" (99%) rename zh/client-tools/restful-api/index.html => "zh/\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267/restful-api/index.html" (99%) rename zh/client-tools/rpc-api/index.html => "zh/\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267/rpc-api/index.html" (99%) rename zh/client-tools/tugraph-ogm/index.html => "zh/\345\256\242\346\210\267\347\253\257\345\267\245\345\205\267/tugraph-ogm/index.html" (99%) rename zh/quick-start/demo/movie/index.html => "zh/\345\277\253\351\200\237\344\270\212\346\211\213/demo\347\244\272\344\276\213/movie/index.html" (99%) rename zh/quick-start/demo/round-the-world/index.html => "zh/\345\277\253\351\200\237\344\270\212\346\211\213/demo\347\244\272\344\276\213/round-the-world/index.html" (99%) rename zh/quick-start/demo/the-three-body/index.html => "zh/\345\277\253\351\200\237\344\270\212\346\211\213/demo\347\244\272\344\276\213/the-three-body/index.html" (99%) rename zh/quick-start/demo/three-kingdoms/index.html => "zh/\345\277\253\351\200\237\344\270\212\346\211\213/demo\347\244\272\344\276\213/three-kingdoms/index.html" (99%) rename zh/quick-start/demo/wandering-earth/index.html => "zh/\345\277\253\351\200\237\344\270\212\346\211\213/demo\347\244\272\344\276\213/wandering-earth/index.html" (99%) rename zh/quick-start/preparation/index.html => "zh/\345\277\253\351\200\237\344\270\212\346\211\213/preparation/index.html" (99%) rename zh/best-practices/data_migration/index.html => "zh/\346\234\200\344\275\263\345\256\236\350\267\265/data_migration/index.html" (99%) rename zh/best-practices/learn_practices/index.html => "zh/\346\234\200\344\275\263\345\256\236\350\267\265/learn_practices/index.html" (99%) rename zh/best-practices/rdbms-to-tugraph/index.html => "zh/\346\234\200\344\275\263\345\256\236\350\267\265/rdbms-to-tugraph/index.html" (99%) rename zh/best-practices/selection/index.html => "zh/\346\234\200\344\275\263\345\256\236\350\267\265/selection/index.html" (99%) rename zh/best-practices/spatial/index.html => "zh/\346\234\200\344\275\263\345\256\236\350\267\265/spatial/index.html" (99%) rename zh/query/cypher/index.html => "zh/\346\237\245\350\257\242\350\257\255\350\250\200/cypher/index.html" (99%) rename zh/query/gql/index.html => "zh/\346\237\245\350\257\242\350\257\255\350\250\200/gql/index.html" (99%) rename zh/query/vector_index/index.html => "zh/\346\237\245\350\257\242\350\257\255\350\250\200/vector_index/index.html" (99%) rename zh/quality/integration-testing/index.html => "zh/\346\265\213\350\257\225\344\270\216\350\264\250\351\207\217\344\277\235\351\232\234/integration-testing/index.html" (99%) rename zh/quality/unit-testing/index.html => "zh/\346\265\213\350\257\225\344\270\216\350\264\250\351\207\217\344\277\235\351\232\234/unit-testing/index.html" (99%) rename zh/contributor-manual/community-roles/index.html => "zh/\350\264\241\347\214\256\350\200\205\346\226\207\346\241\243/community-roles/index.html" (99%) rename zh/contributor-manual/contributing/index.html => "zh/\350\264\241\347\214\256\350\200\205\346\226\207\346\241\243/contributing/index.html" (99%) rename zh/contributor-manual/corporate-cla/index.html => "zh/\350\264\241\347\214\256\350\200\205\346\226\207\346\241\243/corporate-cla/index.html" (99%) rename zh/contributor-manual/individual-cla/index.html => "zh/\350\264\241\347\214\256\350\200\205\346\226\207\346\241\243/individual-cla/index.html" (99%) rename zh/contributor-manual/roadmap/index.html => "zh/\350\264\241\347\214\256\350\200\205\346\226\207\346\241\243/roadmap/index.html" (99%) rename zh/permission/log/index.html => "zh/\350\277\220\347\273\264\344\270\216\346\235\203\351\231\220\347\256\241\347\220\206/log/index.html" (99%) rename zh/permission/monitoring/index.html => "zh/\350\277\220\347\273\264\344\270\216\346\235\203\351\231\220\347\256\241\347\220\206/monitoring/index.html" (99%) rename zh/permission/privilege/index.html => "zh/\350\277\220\347\273\264\344\270\216\346\235\203\351\231\220\347\256\241\347\220\206/privilege/index.html" (99%) rename zh/permission/reset_admin_password/index.html => "zh/\350\277\220\347\273\264\344\270\216\346\235\203\351\231\220\347\256\241\347\220\206/reset_admin_password/index.html" (99%) rename zh/permission/token/index.html => "zh/\350\277\220\347\273\264\344\270\216\346\235\203\351\231\220\347\256\241\347\220\206/token/index.html" (99%) diff --git a/404.html b/404.html index e8ed75ce98..ff2160deba 100644 --- a/404.html +++ b/404.html @@ -4,8 +4,8 @@ Page Not Found | My Site - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/assets/js/0668f123.501aefe2.js b/assets/js/0668f123.7ce505e3.js similarity index 99% rename from assets/js/0668f123.501aefe2.js rename to assets/js/0668f123.7ce505e3.js index 692acbe291..ba43752c40 100644 --- a/assets/js/0668f123.501aefe2.js +++ b/assets/js/0668f123.7ce505e3.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6381],{7843:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>o});var i=s(4848),t=s(8453);const r={},a="TuGraph Browser(old version)",l={id:"user-guide/tugraph-browser-legacy",title:"TuGraph Browser(old version)",description:"This document focuses on the use of TuGraph Browser",source:"@site/../docs/en-US/source/4.user-guide/2.tugraph-browser-legacy.md",sourceDirName:"4.user-guide",slug:"/user-guide/tugraph-browser-legacy",permalink:"/tugraph-db/en/user-guide/tugraph-browser-legacy",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Browser",permalink:"/tugraph-db/en/user-guide/tugraph-browser"},next:{title:"Environment",permalink:"/tugraph-db/en/installation&running/environment"}},c={},o=[{value:"Definition",id:"definition",level:2},{value:"Functionality",id:"functionality",level:2},{value:"How to use it",id:"how-to-use-it",level:2},{value:"1. Connect to the database",id:"1-connect-to-the-database",level:3},{value:"2. Login",id:"2-login",level:3},{value:"3. Workbench",id:"3-workbench",level:3},{value:"3.1 Quick Start",id:"31-quick-start",level:4},{value:"3.2 Create subgraphs and examples",id:"32-create-subgraphs-and-examples",level:4},{value:"3.2.1 Create a subgraph",id:"321-create-a-subgraph",level:5},{value:"3.3 query",id:"33-query",level:4},{value:"3.3.1 User Interface Layout",id:"331-user-interface-layout",level:5},{value:"3.3.2 Result set display area function details",id:"332-result-set-display-area-function-details",level:5},{value:"3.3.3 Schema",id:"333-schema",level:5},{value:"3.3.4 Data import",id:"334-data-import",level:5},{value:"3.3.5 plug-in (Stored Procedure)",id:"335-plug-in-stored-procedure",level:5},{value:"3.3.6 Help",id:"336-help",level:5},{value:"3.4 Console",id:"34-console",level:4},{value:"3.4.1 Basic database information",id:"341-basic-database-information",level:5},{value:"3.4.2 Permission management",id:"342-permission-management",level:5},{value:"3.4.3 Live status",id:"343-live-status",level:5},{value:"3.4.4 Task Management",id:"344-task-management",level:5},{value:"3.4.5 Audit logs",id:"345-audit-logs",level:5}];function h(e){const n={blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"tugraph-browserold-version",children:"TuGraph Browser(old version)"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"This document focuses on the use of TuGraph Browser"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"definition",children:"Definition"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph Browser is a visual development tool provided by TuGraph."}),"\n",(0,i.jsx)(n.h2,{id:"functionality",children:"Functionality"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph Browser provides graph database developers with functions such as visual graph data development, graph data management and maintenance."}),"\n",(0,i.jsx)(n.h2,{id:"how-to-use-it",children:"How to use it"}),"\n",(0,i.jsx)(n.h3,{id:"1-connect-to-the-database",children:"1. Connect to the database"}),"\n",(0,i.jsx)(n.p,{children:"When the user completes the installation of the graph database, you can access it through the Browser, TuGraph Browser tool. The user only needs to type in the browser address bar: IP of the server where TuGraph is located :Port. The default port is 7090."}),"\n",(0,i.jsx)(n.h3,{id:"2-login",children:"2. Login"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/1.tugraph-browser-lpgin.png",alt:"alt Login"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"When the page is opened successfully, the first thing you see is the login page, and the user needs to fill in the account number and password to log in."}),"\n",(0,i.jsx)(n.li,{children:"Default account: admin"}),"\n",(0,i.jsx)(n.li,{children:"Default password: 73@TuGraph"}),"\n",(0,i.jsx)(n.li,{children:"It is recommended that users change the initialized password in time after logging in"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"3-workbench",children:"3. Workbench"}),"\n",(0,i.jsx)(n.h4,{id:"31-quick-start",children:"3.1 Quick Start"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"When you log in for the first time, the system will create an empty graph by default"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/2.tugraph-browser-quickstart-01.png",alt:"alt quick start"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"The user clicks on the help option and selects Get Started quickly"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/3.tugraph-browser-quickstart-02.png",alt:"alt help"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Then click "One-click Create Model" -- >" One-click Create Data "to complete the construction of the built-in Movie data graph'}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"32-create-subgraphs-and-examples",children:"3.2 Create subgraphs and examples"}),"\n",(0,i.jsx)(n.h5,{id:"321-create-a-subgraph",children:"3.2.1 Create a subgraph"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Click on New subgraph\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/4.tugraph-browser-create-subgraph-01.png",alt:"alt Create subgraph"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Fill in the form information\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/5.tugraph-browser-create-subgraph-02.png",alt:"alt Fill out the form"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Subgraph name"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Subgraph description"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Configuration information"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Click OK to prompt that creation succeeded"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Toggle the subgraph\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/6.tugraph-browser-use-graph-01.png",alt:"alt Toggle subgraph"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Click New Example\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/3.3.0-image/create-scene-01.png",alt:"alt Create subgraph"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Select the example and click Create\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/3.3.0-image/select-scene.png",alt:"alt Create subgraph"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"33-query",children:"3.3 query"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/7.tugraph-browser-query-01.png",alt:"alt Query"})}),"\n",(0,i.jsx)(n.h5,{id:"331-user-interface-layout",children:"3.3.1 User Interface Layout"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Cypher input box"}),"\n",(0,i.jsx)(n.li,{children:"Result set display area"}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"332-result-set-display-area-function-details",children:"3.3.2 Result set display area function details"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Result set tag display and functions\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/3.3.0-image/tugraph-browser-result.png",alt:"alt Result set tag"})]}),"\n",(0,i.jsx)(n.li,{children:"All types of statistics for the result set are shown here"}),"\n",(0,i.jsx)(n.li,{children:'Click on the different "label" to make the following changes\n-Change the display color'}),"\n",(0,i.jsx)(n.li,{children:"Modify the node size or edge thickness"}),"\n",(0,i.jsx)(n.li,{children:"Modify default display properties or system properties"}),"\n",(0,i.jsx)(n.li,{children:"Layout modification"}),"\n",(0,i.jsx)(n.li,{children:"Force guide layout"}),"\n",(0,i.jsx)(n.li,{children:"Grid layout"}),"\n",(0,i.jsx)(n.li,{children:"Tree layout"}),"\n",(0,i.jsx)(n.li,{children:"Environment layout"}),"\n",(0,i.jsx)(n.li,{children:"edge polymerization"}),"\n",(0,i.jsx)(n.li,{children:"Edges of the same type and direction can be merged"}),"\n",(0,i.jsx)(n.li,{children:"Create nodes"}),"\n",(0,i.jsx)(n.li,{children:"Click the Create Node button"}),"\n",(0,i.jsx)(n.li,{children:"Select the node type"}),"\n",(0,i.jsx)(n.li,{children:"Add node content"}),"\n",(0,i.jsx)(n.li,{children:"Create relationships"}),"\n",(0,i.jsx)(n.li,{children:"Select start and end points in the canvas"}),"\n",(0,i.jsx)(n.li,{children:"Select the type that can be matched"}),"\n",(0,i.jsx)(n.li,{children:"Enter node information"}),"\n",(0,i.jsx)(n.li,{children:"Stop layout"}),"\n",(0,i.jsx)(n.li,{children:"When too much data is causing the browser page to stall, you can click this stop layout button to improve the smoothness of the experience"}),"\n",(0,i.jsx)(n.li,{children:"Mouse hover"}),"\n",(0,i.jsx)(n.li,{children:"Enable this feature to highlight the one-degree neighbors of the mouse-over node"}),"\n",(0,i.jsx)(n.li,{children:"Result set export"}),"\n",(0,i.jsx)(n.li,{children:"Result sets can be exported as png, json, csv three different file forms"}),"\n",(0,i.jsx)(n.li,{children:"the refresh"}),"\n",(0,i.jsx)(n.li,{children:"Clicking the refresh button will re-execute the initial cypher statement for the current page and refresh the result set\nMaximize -\n-Click Maximize button, the result set display area will be displayed in full screen"}),"\n",(0,i.jsxs)(n.li,{children:["Result set display mode switching\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Support graph, table and text modes"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"333-schema",children:"3.3.3 Schema"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["model\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/3.3.0-image/create-schema.png",alt:"Modeling Alt"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"schema supports real-time addition, deletion, modification and query"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"schema supports import and export"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"334-data-import",children:"3.3.4 Data import"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Local data import"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/14.tugraph-browser-import-data-01.png",alt:"alt Query"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Select the file encoding format"}),"\n",(0,i.jsx)(n.li,{children:"Select a local CSV file"}),"\n",(0,i.jsx)(n.li,{children:"Select the model for the corresponding node or edge"}),"\n",(0,i.jsx)(n.li,{children:"Do the data mapping"}),"\n",(0,i.jsx)(n.li,{children:"Complete the data import"}),"\n",(0,i.jsx)(n.li,{children:"The maximum supported size for a single file is 2GB."}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"335-plug-in-stored-procedure",children:"3.3.5 plug-in (Stored Procedure)"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Use of plug-ins"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/15.tugraph-browser-plugin.png",alt:"alt Query"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Users can upload the plug-in program written locally, execute it in the visual page, and view the execution result"}),"\n",(0,i.jsx)(n.li,{children:"Users can perform, uninstall, execute, and download plug-ins in the visualization page"}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"336-help",children:"3.3.6 Help"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["where it records how TuGraph-browser is used\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/16.TuGraph-browser-help.png",alt:"alt Query"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"34-console",children:"3.4 Console"}),"\n",(0,i.jsx)(n.h5,{id:"341-basic-database-information",children:"3.4.1 Basic database information"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Displays basic database configuration information\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/17.tugraph-browser-config.png",alt:"alt Query"})]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"342-permission-management",children:"3.4.2 Permission management"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["A function module used to create users and roles. Users can manage permissions here\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/18.tugraph-browser-auth.png",alt:"alt Query"})]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"343-live-status",children:"3.4.3 Live status"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["This shows the database real-time status, including: CPU usage, memory usage, disk usage, number of data requests, disk IO\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/19.tugraph-browser-status.png",alt:"alt Query"})]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"344-task-management",children:"3.4.4 Task Management"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Here the user can see the task in execution and stop the task\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/20.tugraph-browser-task.png",alt:"alt Query"})]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"345-audit-logs",children:"3.4.5 Audit logs"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Database related audit logs recorded here, used to troubleshoot problems encountered in use\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/21.tugraph-browser-log.png",alt:"alt Query"})]}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>l});var i=s(6540);const t={},r=i.createContext(t);function a(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6381],{7843:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>o});var i=s(4848),t=s(8453);const r={},a="TuGraph Browser(old version)",l={id:"user-guide/tugraph-browser-legacy",title:"TuGraph Browser(old version)",description:"This document focuses on the use of TuGraph Browser",source:"@site/../docs/en-US/source/4.user-guide/2.tugraph-browser-legacy.md",sourceDirName:"4.user-guide",slug:"/user-guide/tugraph-browser-legacy",permalink:"/tugraph-db/en/user-guide/tugraph-browser-legacy",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Browser",permalink:"/tugraph-db/en/user-guide/tugraph-browser"},next:{title:"Environment",permalink:"/tugraph-db/en/installation&running/environment"}},c={},o=[{value:"Definition",id:"definition",level:2},{value:"Functionality",id:"functionality",level:2},{value:"How to use it",id:"how-to-use-it",level:2},{value:"1. Connect to the database",id:"1-connect-to-the-database",level:3},{value:"2. Login",id:"2-login",level:3},{value:"3. Workbench",id:"3-workbench",level:3},{value:"3.1 Quick Start",id:"31-quick-start",level:4},{value:"3.2 Create subgraphs and examples",id:"32-create-subgraphs-and-examples",level:4},{value:"3.2.1 Create a subgraph",id:"321-create-a-subgraph",level:5},{value:"3.3 query",id:"33-query",level:4},{value:"3.3.1 User Interface Layout",id:"331-user-interface-layout",level:5},{value:"3.3.2 Result set display area function details",id:"332-result-set-display-area-function-details",level:5},{value:"3.3.3 Schema",id:"333-schema",level:5},{value:"3.3.4 Data import",id:"334-data-import",level:5},{value:"3.3.5 plug-in (Stored Procedure)",id:"335-plug-in-stored-procedure",level:5},{value:"3.3.6 Help",id:"336-help",level:5},{value:"3.4 Console",id:"34-console",level:4},{value:"3.4.1 Basic database information",id:"341-basic-database-information",level:5},{value:"3.4.2 Permission management",id:"342-permission-management",level:5},{value:"3.4.3 Live status",id:"343-live-status",level:5},{value:"3.4.4 Task Management",id:"344-task-management",level:5},{value:"3.4.5 Audit logs",id:"345-audit-logs",level:5}];function h(e){const n={blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"tugraph-browserold-version",children:"TuGraph Browser(old version)"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"This document focuses on the use of TuGraph Browser"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"definition",children:"Definition"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph Browser is a visual development tool provided by TuGraph."}),"\n",(0,i.jsx)(n.h2,{id:"functionality",children:"Functionality"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph Browser provides graph database developers with functions such as visual graph data development, graph data management and maintenance."}),"\n",(0,i.jsx)(n.h2,{id:"how-to-use-it",children:"How to use it"}),"\n",(0,i.jsx)(n.h3,{id:"1-connect-to-the-database",children:"1. Connect to the database"}),"\n",(0,i.jsx)(n.p,{children:"When the user completes the installation of the graph database, you can access it through the Browser, TuGraph Browser tool. The user only needs to type in the browser address bar: IP of the server where TuGraph is located :Port. The default port is 7090."}),"\n",(0,i.jsx)(n.h3,{id:"2-login",children:"2. Login"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/1.tugraph-browser-lpgin.png",alt:"alt Login"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"When the page is opened successfully, the first thing you see is the login page, and the user needs to fill in the account number and password to log in."}),"\n",(0,i.jsx)(n.li,{children:"Default account: admin"}),"\n",(0,i.jsx)(n.li,{children:"Default password: 73@TuGraph"}),"\n",(0,i.jsx)(n.li,{children:"It is recommended that users change the initialized password in time after logging in"}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"3-workbench",children:"3. Workbench"}),"\n",(0,i.jsx)(n.h4,{id:"31-quick-start",children:"3.1 Quick Start"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"When you log in for the first time, the system will create an empty graph by default"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/2.tugraph-browser-quickstart-01.png",alt:"alt quick start"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"The user clicks on the help option and selects Get Started quickly"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/3.tugraph-browser-quickstart-02.png",alt:"alt help"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Then click "One-click Create Model" -- >" One-click Create Data "to complete the construction of the built-in Movie data graph'}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"32-create-subgraphs-and-examples",children:"3.2 Create subgraphs and examples"}),"\n",(0,i.jsx)(n.h5,{id:"321-create-a-subgraph",children:"3.2.1 Create a subgraph"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Click on New subgraph\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/4.tugraph-browser-create-subgraph-01.png",alt:"alt Create subgraph"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Fill in the form information\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/5.tugraph-browser-create-subgraph-02.png",alt:"alt Fill out the form"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Subgraph name"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Subgraph description"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Configuration information"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Click OK to prompt that creation succeeded"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Toggle the subgraph\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/6.tugraph-browser-use-graph-01.png",alt:"alt Toggle subgraph"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Click New Example\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/3.3.0-image/create-scene-01.png",alt:"alt Create subgraph"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Select the example and click Create\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/3.3.0-image/select-scene.png",alt:"alt Create subgraph"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"33-query",children:"3.3 query"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/7.tugraph-browser-query-01.png",alt:"alt Query"})}),"\n",(0,i.jsx)(n.h5,{id:"331-user-interface-layout",children:"3.3.1 User Interface Layout"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Cypher input box"}),"\n",(0,i.jsx)(n.li,{children:"Result set display area"}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"332-result-set-display-area-function-details",children:"3.3.2 Result set display area function details"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Result set tag display and functions\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/3.3.0-image/tugraph-browser-result.png",alt:"alt Result set tag"})]}),"\n",(0,i.jsx)(n.li,{children:"All types of statistics for the result set are shown here"}),"\n",(0,i.jsx)(n.li,{children:'Click on the different "label" to make the following changes\n-Change the display color'}),"\n",(0,i.jsx)(n.li,{children:"Modify the node size or edge thickness"}),"\n",(0,i.jsx)(n.li,{children:"Modify default display properties or system properties"}),"\n",(0,i.jsx)(n.li,{children:"Layout modification"}),"\n",(0,i.jsx)(n.li,{children:"Force guide layout"}),"\n",(0,i.jsx)(n.li,{children:"Grid layout"}),"\n",(0,i.jsx)(n.li,{children:"Tree layout"}),"\n",(0,i.jsx)(n.li,{children:"Environment layout"}),"\n",(0,i.jsx)(n.li,{children:"edge polymerization"}),"\n",(0,i.jsx)(n.li,{children:"Edges of the same type and direction can be merged"}),"\n",(0,i.jsx)(n.li,{children:"Create nodes"}),"\n",(0,i.jsx)(n.li,{children:"Click the Create Node button"}),"\n",(0,i.jsx)(n.li,{children:"Select the node type"}),"\n",(0,i.jsx)(n.li,{children:"Add node content"}),"\n",(0,i.jsx)(n.li,{children:"Create relationships"}),"\n",(0,i.jsx)(n.li,{children:"Select start and end points in the canvas"}),"\n",(0,i.jsx)(n.li,{children:"Select the type that can be matched"}),"\n",(0,i.jsx)(n.li,{children:"Enter node information"}),"\n",(0,i.jsx)(n.li,{children:"Stop layout"}),"\n",(0,i.jsx)(n.li,{children:"When too much data is causing the browser page to stall, you can click this stop layout button to improve the smoothness of the experience"}),"\n",(0,i.jsx)(n.li,{children:"Mouse hover"}),"\n",(0,i.jsx)(n.li,{children:"Enable this feature to highlight the one-degree neighbors of the mouse-over node"}),"\n",(0,i.jsx)(n.li,{children:"Result set export"}),"\n",(0,i.jsx)(n.li,{children:"Result sets can be exported as png, json, csv three different file forms"}),"\n",(0,i.jsx)(n.li,{children:"the refresh"}),"\n",(0,i.jsx)(n.li,{children:"Clicking the refresh button will re-execute the initial cypher statement for the current page and refresh the result set\nMaximize -\n-Click Maximize button, the result set display area will be displayed in full screen"}),"\n",(0,i.jsxs)(n.li,{children:["Result set display mode switching\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Support graph, table and text modes"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"333-schema",children:"3.3.3 Schema"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["model\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/3.3.0-image/create-schema.png",alt:"Modeling Alt"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"schema supports real-time addition, deletion, modification and query"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"schema supports import and export"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"334-data-import",children:"3.3.4 Data import"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Local data import"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/14.tugraph-browser-import-data-01.png",alt:"alt Query"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Select the file encoding format"}),"\n",(0,i.jsx)(n.li,{children:"Select a local CSV file"}),"\n",(0,i.jsx)(n.li,{children:"Select the model for the corresponding node or edge"}),"\n",(0,i.jsx)(n.li,{children:"Do the data mapping"}),"\n",(0,i.jsx)(n.li,{children:"Complete the data import"}),"\n",(0,i.jsx)(n.li,{children:"The maximum supported size for a single file is 2GB."}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"335-plug-in-stored-procedure",children:"3.3.5 plug-in (Stored Procedure)"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Use of plug-ins"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/15.tugraph-browser-plugin.png",alt:"alt Query"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Users can upload the plug-in program written locally, execute it in the visual page, and view the execution result"}),"\n",(0,i.jsx)(n.li,{children:"Users can perform, uninstall, execute, and download plug-ins in the visualization page"}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"336-help",children:"3.3.6 Help"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["where it records how TuGraph-browser is used\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/16.TuGraph-browser-help.png",alt:"alt Query"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"34-console",children:"3.4 Console"}),"\n",(0,i.jsx)(n.h5,{id:"341-basic-database-information",children:"3.4.1 Basic database information"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Displays basic database configuration information\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/17.tugraph-browser-config.png",alt:"alt Query"})]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"342-permission-management",children:"3.4.2 Permission management"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["A function module used to create users and roles. Users can manage permissions here\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/18.tugraph-browser-auth.png",alt:"alt Query"})]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"343-live-status",children:"3.4.3 Live status"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["This shows the database real-time status, including: CPU usage, memory usage, disk usage, number of data requests, disk IO\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/19.tugraph-browser-status.png",alt:"alt Query"})]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"344-task-management",children:"3.4.4 Task Management"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Here the user can see the task in execution and stop the task\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/20.tugraph-browser-task.png",alt:"alt Query"})]}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"345-audit-logs",children:"3.4.5 Audit logs"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Database related audit logs recorded here, used to troubleshoot problems encountered in use\n",(0,i.jsx)(n.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/2.Operating/21.tugraph-browser-log.png",alt:"alt Query"})]}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>l});var i=s(6540);const t={},r=i.createContext(t);function a(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0969a4ab.d3e01106.js b/assets/js/0969a4ab.54d36027.js similarity index 99% rename from assets/js/0969a4ab.d3e01106.js rename to assets/js/0969a4ab.54d36027.js index e56210b551..c4b01e425c 100644 --- a/assets/js/0969a4ab.d3e01106.js +++ b/assets/js/0969a4ab.54d36027.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[7243],{8948:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>l,frontMatter:()=>o,metadata:()=>i,toc:()=>h});var t=r(4848),a=r(8453);const o={},s="The Three Body",i={id:"quick-start/demo/the-three-body",title:"The Three Body",description:"This document mainly introduces the usage of Three-Body demo.",source:"@site/../docs/en-US/source/3.quick-start/2.demo/3.the-three-body.md",sourceDirName:"3.quick-start/2.demo",slug:"/quick-start/demo/the-three-body",permalink:"/tugraph-db/en/quick-start/demo/the-three-body",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"DEMO:Wandering Earth",permalink:"/tugraph-db/en/quick-start/demo/wandering-earth"},next:{title:"Three Kingdoms",permalink:"/tugraph-db/en/quick-start/demo/three-kingdoms"}},d={},h=[{value:"1.Demo Scenario Design",id:"1demo-scenario-design",level:2},{value:"2.Instructions for Use",id:"2instructions-for-use",level:2},{value:"3.Data Import",id:"3data-import",level:2},{value:"4.Cypher Query",id:"4cypher-query",level:2},{value:"5.Usage Demo",id:"5usage-demo",level:2},{value:"5.1.Data Import Demo",id:"51data-import-demo",level:3},{value:"6.Query Demo",id:"6query-demo",level:2},{value:"6.1.Character Relationship Query",id:"61character-relationship-query",level:3},{value:"6.2.Neighbor Vertex Analysis",id:"62neighbor-vertex-analysis",level:3},{value:"6.3.Query Common Neighbors of Node A and B",id:"63query-common-neighbors-of-node-a-and-b",level:3},{value:"6.4.Set/Change Properties",id:"64setchange-properties",level:3},{value:"6.5.Add/Delete Nodes",id:"65adddelete-nodes",level:3}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"the-three-body",children:"The Three Body"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document mainly introduces the usage of Three-Body demo."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1demo-scenario-design",children:"1.Demo Scenario Design"}),"\n",(0,t.jsx)(n.p,{children:"The demo scenario is designed based on the story background of Three-Body 1, 2, and 3."}),"\n",(0,t.jsx)(n.p,{children:'According to the setting of the Three-Body story, we have designed 4 types of nodes and 6 types of edges. The nodes include "character", "organization", "plan", and "timeline", while the edges include "character-character relationship", "character-plan relationship", "character-organization relationship", "organization-plan relationship", and "organization-organization relationship". According to the plot, corresponding schema data and some queries have been prepared to propose some questions about the plot.'}),"\n",(0,t.jsx)(n.h2,{id:"2instructions-for-use",children:"2.Instructions for Use"}),"\n",(0,t.jsx)(n.p,{children:"Prerequisite: TuGraph is installed."}),"\n",(0,t.jsx)(n.h2,{id:"3data-import",children:"3.Data Import"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Manual import\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Data storage directory: ",(0,t.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-db-demo",children:"https://github.com/TuGraph-family/tugraph-db-demo"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Modify the DATA_PATH in import.json according to the corresponding data storage directory. For more details, please refer to ",(0,t.jsx)(n.a,{href:"/tugraph-db/en/utility-tools/data-import",children:"Data Importing"}),"."]}),"\n",(0,t.jsx)(n.li,{children:"After starting the TuGraph service, access ${HOST_IP}:7070 to open the web page and confirm whether the data is imported successfully."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["Automatic creation\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Click ",(0,t.jsx)(n.code,{children:"New Graph Project"}),", select Three-Body data, fill in the graph project configuration, and the system will automatically create the Three-Body scenario graph project."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"4cypher-query",children:"4.Cypher Query"}),"\n",(0,t.jsx)(n.p,{children:"Refer to the TuGraph documentation and enter Cypher in the TuGraph web page frontend to execute a query."}),"\n",(0,t.jsx)(n.h2,{id:"5usage-demo",children:"5.Usage Demo"}),"\n",(0,t.jsx)(n.h3,{id:"51data-import-demo",children:"5.1.Data Import Demo"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"data",src:r(36).A+"",width:"1527",height:"999"})}),"\n",(0,t.jsx)(n.h2,{id:"6query-demo",children:"6.Query Demo"}),"\n",(0,t.jsx)(n.h3,{id:"61character-relationship-query",children:"6.1.Character Relationship Query"}),"\n",(0,t.jsx)(n.p,{children:"In the plot of Three-Body 1, a large number of scientists committed suicide all over the world at the beginning, which aroused the attention of the police. During the investigation process, the truth behind it gradually surfaced step by step according to the clues of the character relationships, as shown in the above graph. Shi Qiang and Wang Miao discovered that most people had direct or indirect connections with Ye Wenjie, and sent Wang Miao undercover to finally discover Ye Wenjie's ultimate commander identity. As can be seen in the graph, there are many edge relationships (many one-degree or two-degree neighbors) around Ye Wenjie's vertex."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cypher",children:"MATCH (n)-[e:person_person]-(m) RETURN n,e,m\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"data",src:r(5040).A+"",width:"1527",height:"999"})}),"\n",(0,t.jsx)(n.h3,{id:"62neighbor-vertex-analysis",children:"6.2.Neighbor Vertex Analysis"}),"\n",(0,t.jsx)(n.p,{children:'There are many plans in Three-Body, and sometimes we may be confused. At this time, we can use the graph\'s neighbor vertex query to view the relevant characters and organizations of the plan. For example, in the "Wallfacer Project", we can see that there are four characters related to it, and these four are also the "Wallfacers" who are highly expected by the world.'}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cypher",children:'MATCH (p:plan {name: "\u9762\u58c1\u8ba1\u5212"})-[e]-(neighbor:person)\nRETURN neighbor,p,e\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"data",src:r(7019).A+"",width:"1527",height:"999"})}),"\n",(0,t.jsx)(n.h3,{id:"63query-common-neighbors-of-node-a-and-b",children:"6.3.Query Common Neighbors of Node A and B"}),"\n",(0,t.jsx)(n.p,{children:"We often want to know who are the common related characters between two characters, so that we can quickly grasp the relationship between these two characters. In the case of large amounts of data, it is very convenient to use Cypher for graph relationship analysis!"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cypher",children:'MATCH (a:person {name: "\u53f6\u6587\u6d01"})-[e1:person_person]->(n)<-[e2:person_person]-(b:person {name: "\u6c6a\u6dfc"})\nRETURN a,b,n,e1,e2\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"data",src:r(9154).A+"",width:"1527",height:"999"})}),"\n",(0,t.jsx)(n.h3,{id:"64setchange-properties",children:"6.4.Set/Change Properties"}),"\n",(0,t.jsx)(n.p,{children:'As the plot progresses, we gradually learn about the various labels on "Ye Wenjie", so we can also update these labels to the "Ye Wenjie" node:'}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cypher",children:'MATCH (p:person {name: "\u53f6\u6587\u6d01"})\nSET p.introduce = "\u6e05\u534e\u5927\u5b66\u6559\u6388\u3001ETO\u7cbe\u795e\u9886\u8896\u3001\u9996\u4f4d\u548c\u4e09\u4f53\u4eba\u4ea4\u6d41\u7684\u4eba"\nRETURN p\n'})}),"\n",(0,t.jsx)(n.h3,{id:"65adddelete-nodes",children:"6.5.Add/Delete Nodes"}),"\n",(0,t.jsx)(n.p,{children:"Later, we learned about characters such as Luo Ji and Cheng Xin, and organizations such as PIA and the Star Ring Group, and wanted to add them as nodes to the graph:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cypher",children:'CREATE (a:person {introduce: "\u7269\u7406\u5b66\u6559\u6388", name: "bbb"})\nRETURN a\n'})})]})}function l(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},5040:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/three-body-cypher1-f48c03a7aaf7b1ee2b1dd8b302bf956c.png"},7019:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/three-body-cypher2-91d2678a5e9fb47de7ae9e31fd33d264.png"},9154:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/three-body-cypher3-4ce04e7d3f064d8f1b703b36de2156e5.png"},36:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/three-body-data-8e5b825e6b329f9026994a69bdbb5ead.png"},8453:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>i});var t=r(6540);const a={},o=t.createContext(a);function s(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[7243],{8948:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>l,frontMatter:()=>o,metadata:()=>i,toc:()=>h});var t=r(4848),a=r(8453);const o={},s="The Three Body",i={id:"quick-start/demo/the-three-body",title:"The Three Body",description:"This document mainly introduces the usage of Three-Body demo.",source:"@site/../docs/en-US/source/3.quick-start/2.demo/3.the-three-body.md",sourceDirName:"3.quick-start/2.demo",slug:"/quick-start/demo/the-three-body",permalink:"/tugraph-db/en/quick-start/demo/the-three-body",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"DEMO:Wandering Earth",permalink:"/tugraph-db/en/quick-start/demo/wandering-earth"},next:{title:"Three Kingdoms",permalink:"/tugraph-db/en/quick-start/demo/three-kingdoms"}},d={},h=[{value:"1.Demo Scenario Design",id:"1demo-scenario-design",level:2},{value:"2.Instructions for Use",id:"2instructions-for-use",level:2},{value:"3.Data Import",id:"3data-import",level:2},{value:"4.Cypher Query",id:"4cypher-query",level:2},{value:"5.Usage Demo",id:"5usage-demo",level:2},{value:"5.1.Data Import Demo",id:"51data-import-demo",level:3},{value:"6.Query Demo",id:"6query-demo",level:2},{value:"6.1.Character Relationship Query",id:"61character-relationship-query",level:3},{value:"6.2.Neighbor Vertex Analysis",id:"62neighbor-vertex-analysis",level:3},{value:"6.3.Query Common Neighbors of Node A and B",id:"63query-common-neighbors-of-node-a-and-b",level:3},{value:"6.4.Set/Change Properties",id:"64setchange-properties",level:3},{value:"6.5.Add/Delete Nodes",id:"65adddelete-nodes",level:3}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"the-three-body",children:"The Three Body"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document mainly introduces the usage of Three-Body demo."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1demo-scenario-design",children:"1.Demo Scenario Design"}),"\n",(0,t.jsx)(n.p,{children:"The demo scenario is designed based on the story background of Three-Body 1, 2, and 3."}),"\n",(0,t.jsx)(n.p,{children:'According to the setting of the Three-Body story, we have designed 4 types of nodes and 6 types of edges. The nodes include "character", "organization", "plan", and "timeline", while the edges include "character-character relationship", "character-plan relationship", "character-organization relationship", "organization-plan relationship", and "organization-organization relationship". According to the plot, corresponding schema data and some queries have been prepared to propose some questions about the plot.'}),"\n",(0,t.jsx)(n.h2,{id:"2instructions-for-use",children:"2.Instructions for Use"}),"\n",(0,t.jsx)(n.p,{children:"Prerequisite: TuGraph is installed."}),"\n",(0,t.jsx)(n.h2,{id:"3data-import",children:"3.Data Import"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Manual import\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Data storage directory: ",(0,t.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-db-demo",children:"https://github.com/TuGraph-family/tugraph-db-demo"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Modify the DATA_PATH in import.json according to the corresponding data storage directory. For more details, please refer to ",(0,t.jsx)(n.a,{href:"/tugraph-db/en/utility-tools/data-import",children:"Data Importing"}),"."]}),"\n",(0,t.jsx)(n.li,{children:"After starting the TuGraph service, access ${HOST_IP}:7070 to open the web page and confirm whether the data is imported successfully."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["Automatic creation\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Click ",(0,t.jsx)(n.code,{children:"New Graph Project"}),", select Three-Body data, fill in the graph project configuration, and the system will automatically create the Three-Body scenario graph project."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"4cypher-query",children:"4.Cypher Query"}),"\n",(0,t.jsx)(n.p,{children:"Refer to the TuGraph documentation and enter Cypher in the TuGraph web page frontend to execute a query."}),"\n",(0,t.jsx)(n.h2,{id:"5usage-demo",children:"5.Usage Demo"}),"\n",(0,t.jsx)(n.h3,{id:"51data-import-demo",children:"5.1.Data Import Demo"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"data",src:r(36).A+"",width:"1527",height:"999"})}),"\n",(0,t.jsx)(n.h2,{id:"6query-demo",children:"6.Query Demo"}),"\n",(0,t.jsx)(n.h3,{id:"61character-relationship-query",children:"6.1.Character Relationship Query"}),"\n",(0,t.jsx)(n.p,{children:"In the plot of Three-Body 1, a large number of scientists committed suicide all over the world at the beginning, which aroused the attention of the police. During the investigation process, the truth behind it gradually surfaced step by step according to the clues of the character relationships, as shown in the above graph. Shi Qiang and Wang Miao discovered that most people had direct or indirect connections with Ye Wenjie, and sent Wang Miao undercover to finally discover Ye Wenjie's ultimate commander identity. As can be seen in the graph, there are many edge relationships (many one-degree or two-degree neighbors) around Ye Wenjie's vertex."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cypher",children:"MATCH (n)-[e:person_person]-(m) RETURN n,e,m\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"data",src:r(5040).A+"",width:"1527",height:"999"})}),"\n",(0,t.jsx)(n.h3,{id:"62neighbor-vertex-analysis",children:"6.2.Neighbor Vertex Analysis"}),"\n",(0,t.jsx)(n.p,{children:'There are many plans in Three-Body, and sometimes we may be confused. At this time, we can use the graph\'s neighbor vertex query to view the relevant characters and organizations of the plan. For example, in the "Wallfacer Project", we can see that there are four characters related to it, and these four are also the "Wallfacers" who are highly expected by the world.'}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cypher",children:'MATCH (p:plan {name: "\u9762\u58c1\u8ba1\u5212"})-[e]-(neighbor:person)\nRETURN neighbor,p,e\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"data",src:r(7019).A+"",width:"1527",height:"999"})}),"\n",(0,t.jsx)(n.h3,{id:"63query-common-neighbors-of-node-a-and-b",children:"6.3.Query Common Neighbors of Node A and B"}),"\n",(0,t.jsx)(n.p,{children:"We often want to know who are the common related characters between two characters, so that we can quickly grasp the relationship between these two characters. In the case of large amounts of data, it is very convenient to use Cypher for graph relationship analysis!"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cypher",children:'MATCH (a:person {name: "\u53f6\u6587\u6d01"})-[e1:person_person]->(n)<-[e2:person_person]-(b:person {name: "\u6c6a\u6dfc"})\nRETURN a,b,n,e1,e2\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"data",src:r(9154).A+"",width:"1527",height:"999"})}),"\n",(0,t.jsx)(n.h3,{id:"64setchange-properties",children:"6.4.Set/Change Properties"}),"\n",(0,t.jsx)(n.p,{children:'As the plot progresses, we gradually learn about the various labels on "Ye Wenjie", so we can also update these labels to the "Ye Wenjie" node:'}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cypher",children:'MATCH (p:person {name: "\u53f6\u6587\u6d01"})\nSET p.introduce = "\u6e05\u534e\u5927\u5b66\u6559\u6388\u3001ETO\u7cbe\u795e\u9886\u8896\u3001\u9996\u4f4d\u548c\u4e09\u4f53\u4eba\u4ea4\u6d41\u7684\u4eba"\nRETURN p\n'})}),"\n",(0,t.jsx)(n.h3,{id:"65adddelete-nodes",children:"6.5.Add/Delete Nodes"}),"\n",(0,t.jsx)(n.p,{children:"Later, we learned about characters such as Luo Ji and Cheng Xin, and organizations such as PIA and the Star Ring Group, and wanted to add them as nodes to the graph:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-cypher",children:'CREATE (a:person {introduce: "\u7269\u7406\u5b66\u6559\u6388", name: "bbb"})\nRETURN a\n'})})]})}function l(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},5040:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/three-body-cypher1-f48c03a7aaf7b1ee2b1dd8b302bf956c.png"},7019:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/three-body-cypher2-91d2678a5e9fb47de7ae9e31fd33d264.png"},9154:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/three-body-cypher3-4ce04e7d3f064d8f1b703b36de2156e5.png"},36:(e,n,r)=>{r.d(n,{A:()=>t});const t=r.p+"assets/images/three-body-data-8e5b825e6b329f9026994a69bdbb5ead.png"},8453:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>i});var t=r(6540);const a={},o=t.createContext(a);function s(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/12614a71.c23612cc.js b/assets/js/12614a71.107cff91.js similarity index 99% rename from assets/js/12614a71.c23612cc.js rename to assets/js/12614a71.107cff91.js index abcf8f04ed..a041199a91 100644 --- a/assets/js/12614a71.c23612cc.js +++ b/assets/js/12614a71.107cff91.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3796],{8674:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var t=a(4848),r=a(8453);const i={},o="Learning Tutorial",d={id:"olap&procedure/learn/tutorial",title:"Learning Tutorial",description:"This document is designed as a guide for TuGraph users. Before reading the detailed documentation, users should first read this document to have a general understanding of the graph learning process of TuGraph, which will make it easier to read the detailed documentation later. The guide program is based on a simple program instance of TuGraph, and we will focus on its usage.",source:"@site/../docs/en-US/source/9.olap&procedure/3.learn/1.tutorial.md",sourceDirName:"9.olap&procedure/3.learn",slug:"/olap&procedure/learn/tutorial",permalink:"/tugraph-db/en/olap&procedure/learn/tutorial",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Built-in Algorithm Description",permalink:"/tugraph-db/en/olap&procedure/olap/algorithms"},next:{title:"Sampling API",permalink:"/tugraph-db/en/olap&procedure/learn/sampling_api"}},s={},l=[{value:"1. Introduction to TuGraph Graph Learning Module",id:"1-introduction-to-tugraph-graph-learning-module",level:2},{value:"2. Run Process",id:"2-run-process",level:2},{value:"3. TuGraph compilation and data preparation",id:"3-tugraph-compilation-and-data-preparation",level:2},{value:"4. Data Import",id:"4-data-import",level:2},{value:"5. Feature Conversion",id:"5-feature-conversion",level:2},{value:"6. Sampling Operators and Compilation",id:"6-sampling-operators-and-compilation",level:2},{value:"6.1.Sampling Operator Introduction",id:"61sampling-operator-introduction",level:3},{value:"6.2.Compilation",id:"62compilation",level:3},{value:"7. Model Training and Storage",id:"7-model-training-and-storage",level:2},{value:"8. Model Loading",id:"8-model-loading",level:2}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"learning-tutorial",children:"Learning Tutorial"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document is designed as a guide for TuGraph users. Before reading the detailed documentation, users should first read this document to have a general understanding of the graph learning process of TuGraph, which will make it easier to read the detailed documentation later. The guide program is based on a simple program instance of TuGraph, and we will focus on its usage."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1-introduction-to-tugraph-graph-learning-module",children:"1. Introduction to TuGraph Graph Learning Module"}),"\n",(0,t.jsx)(n.p,{children:"Graph learning is a machine learning method that utilizes the topological information of a graph structure to analyze and model data. Unlike traditional machine learning methods, graph learning uses graph structures where vertices represent entities in data and edges represent relationships between entities. By extracting features and patterns from these vertices and edges, deep associations and patterns can be revealed in data that can be used in various practical applications."}),"\n",(0,t.jsx)(n.p,{children:"The TuGraph Graph Learning Module is a graph learning module based on a graph database that provides four sampling operators: Neighbor Sampling, Edge Sampling, Random Walk Sampling, and Negative Sampling. These operators can be used to sample vertices and edges in a graph to generate training data. The sampling process is performed in a parallel computing environment, providing high efficiency and scalability."}),"\n",(0,t.jsx)(n.p,{children:"After sampling, the obtained training data can be used to train a model that can be used for various graph learning tasks such as prediction and classification. Through training, the model can learn the relationships between vertices and edges in the graph, allowing for prediction and classification of new vertices and edges. In practical applications, this module can be used to handle large-scale graph data such as social networks, recommendation systems, and bioinformatics."}),"\n",(0,t.jsx)(n.h2,{id:"2-run-process",children:"2. Run Process"}),"\n",(0,t.jsx)(n.p,{children:"The TuGraph graph learning module samples graph data in TuGraph, and the sampled vertices and edges are used as graph learning features for learning and training. The operation process is shown in the figure below:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Alt text",src:a(3388).A+"",width:"746",height:"984"})}),"\n",(0,t.jsx)(n.h2,{id:"3-tugraph-compilation-and-data-preparation",children:"3. TuGraph compilation and data preparation"}),"\n",(0,t.jsxs)(n.p,{children:["For TuGraph compilation, please refer to: ",(0,t.jsx)(n.a,{href:"/tugraph-db/en/installation&running/compile",children:"Compile"}),"\nExecute in the build/output directory:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cp -r ../../test/integration/data/ ./ && cp -r ../../learn/examples/* ./\n"})}),"\n",(0,t.jsx)(n.p,{children:"This command copies the relevant files of the dataset to the build/output directory."}),"\n",(0,t.jsx)(n.h2,{id:"4-data-import",children:"4. Data Import"}),"\n",(0,t.jsxs)(n.p,{children:["Please refer to ",(0,t.jsx)(n.a,{href:"/tugraph-db/en/utility-tools/data-import",children:"Data Import"})," for data import."]}),"\n",(0,t.jsx)(n.p,{children:"Taking the cora dataset as an example for the import process:"}),"\n",(0,t.jsx)(n.p,{children:"Execute in the build/output directory:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"./lgraph_import -c ./data/algo/cora.conf --dir ./coradb --overwrite 1\n"})}),"\n",(0,t.jsx)(n.p,{children:"Where cora.conf is the graph schema file representing the format of the graph data. coradb is the imported graph data file name representing the storage location of the graph data."}),"\n",(0,t.jsx)(n.h2,{id:"5-feature-conversion",children:"5. Feature Conversion"}),"\n",(0,t.jsx)(n.p,{children:"Since the features in graph learning are generally represented as long float arrays, TuGraph does not support loading float array types, so they can be imported as string types and converted to char* for subsequent storage and access, and the implementation details can refer to the feature_float.cpp file."}),"\n",(0,t.jsx)(n.p,{children:"The specific execution process is as follows:"}),"\n",(0,t.jsx)(n.p,{children:"Compile the imported plugin in the build directory.\uff08Skip if TuGraph has been compiled\uff09:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"make feature_float_embed"})}),"\n",(0,t.jsx)(n.p,{children:"Execute in the build/output directory:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"./algo/feature_float_embed ./coradb"})}),"\n",(0,t.jsx)(n.p,{children:"Then the conversion can be performed."}),"\n",(0,t.jsx)(n.h2,{id:"6-sampling-operators-and-compilation",children:"6. Sampling Operators and Compilation"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph implements an operator for obtaining the full graph data and four sampling operators at the cython layer, as follows:"}),"\n",(0,t.jsx)(n.h3,{id:"61sampling-operator-introduction",children:"6.1.Sampling Operator Introduction"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Sampling Operator"}),(0,t.jsx)(n.th,{children:"Sampling Method"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GetDB"}),(0,t.jsx)(n.td,{children:"Get the graph data from the database and convert it into the required data structure"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Neighbor Sampling"}),(0,t.jsx)(n.td,{children:"Sample the neighboring nodes of the given node to obtain the sampling subgraph"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Edge Sampling"}),(0,t.jsx)(n.td,{children:"Sample the edges in the graph according to the sampling rate to obtain the sampling subgraph"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Random Walk Sampling"}),(0,t.jsx)(n.td,{children:"Conduct a random walk based on the given node to obtain the sampling subgraph"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Negative Sampling"}),(0,t.jsx)(n.td,{children:"Generate a subgraph of non-existent edges"})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"62compilation",children:"6.2.Compilation"}),"\n",(0,t.jsx)(n.p,{children:"Skip if TuGraph has been compiled.\nExecute in the tugraph-db/build folder:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"make -j2"})}),"\n",(0,t.jsx)(n.p,{children:"Or execute in the tugraph-db/learn/procedures folder:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"python3 setup.py build_ext -i"})}),"\n",(0,t.jsx)(n.p,{children:"Once the algorithm so is obtained, it can be used by importing it in Python."}),"\n",(0,t.jsx)(n.h2,{id:"7-model-training-and-storage",children:"7. Model Training and Storage"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph calls the cython layer operator at the Python layer to implement graph learning and training."}),"\n",(0,t.jsx)(n.p,{children:"The usage of the TuGraph graph learning module is as follows:"}),"\n",(0,t.jsx)(n.p,{children:"Execute in the build/output folder:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"python3 train_full_cora.py --model_save_path ./cora_model"})}),"\n",(0,t.jsx)(n.p,{children:"Then training can be performed."}),"\n",(0,t.jsx)(n.p,{children:"If the final printed loss value is less than 0.9, the training is successful. So far, the graph model training is completed, and the model is saved in the cora_model file."}),"\n",(0,t.jsx)(n.h2,{id:"8-model-loading",children:"8. Model Loading"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:"model = build_model()\nmodel.load_state_dict(torch.load(model_save_path))\nmodel.eval()\n"})}),"\n",(0,t.jsx)(n.p,{children:"Before using a saved model, it is necessary to load it first. In the code above, the trained model is loaded using the provided code."}),"\n",(0,t.jsx)(n.p,{children:"After loading the model, we can use it to make predictions and classifications for new vertices and edges. For prediction, we can input one or multiple vertices and the model will output corresponding prediction results. For classification, we can input the whole graph, and the model will classify the vertices and edges in the graph to achieve the task goal."}),"\n",(0,t.jsx)(n.p,{children:"Using a trained model can save time and resources compared to retraining the model. Additionally, since the model has already learned the relationships between vertices and edges in the graph, it can adapt well to new data and improve the accuracy of predictions and classifications."})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},3388:(e,n,a)=>{a.d(n,{A:()=>t});const t=a.p+"assets/images/learn_flow_chart_en-4a77be5d31e739c6855f132fdc7bcd8a.png"},8453:(e,n,a)=>{a.d(n,{R:()=>o,x:()=>d});var t=a(6540);const r={},i=t.createContext(r);function o(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3796],{8674:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var t=a(4848),r=a(8453);const i={},o="Learning Tutorial",d={id:"olap&procedure/learn/tutorial",title:"Learning Tutorial",description:"This document is designed as a guide for TuGraph users. Before reading the detailed documentation, users should first read this document to have a general understanding of the graph learning process of TuGraph, which will make it easier to read the detailed documentation later. The guide program is based on a simple program instance of TuGraph, and we will focus on its usage.",source:"@site/../docs/en-US/source/9.olap&procedure/3.learn/1.tutorial.md",sourceDirName:"9.olap&procedure/3.learn",slug:"/olap&procedure/learn/tutorial",permalink:"/tugraph-db/en/olap&procedure/learn/tutorial",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Built-in Algorithm Description",permalink:"/tugraph-db/en/olap&procedure/olap/algorithms"},next:{title:"Sampling API",permalink:"/tugraph-db/en/olap&procedure/learn/sampling_api"}},s={},l=[{value:"1. Introduction to TuGraph Graph Learning Module",id:"1-introduction-to-tugraph-graph-learning-module",level:2},{value:"2. Run Process",id:"2-run-process",level:2},{value:"3. TuGraph compilation and data preparation",id:"3-tugraph-compilation-and-data-preparation",level:2},{value:"4. Data Import",id:"4-data-import",level:2},{value:"5. Feature Conversion",id:"5-feature-conversion",level:2},{value:"6. Sampling Operators and Compilation",id:"6-sampling-operators-and-compilation",level:2},{value:"6.1.Sampling Operator Introduction",id:"61sampling-operator-introduction",level:3},{value:"6.2.Compilation",id:"62compilation",level:3},{value:"7. Model Training and Storage",id:"7-model-training-and-storage",level:2},{value:"8. Model Loading",id:"8-model-loading",level:2}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"learning-tutorial",children:"Learning Tutorial"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document is designed as a guide for TuGraph users. Before reading the detailed documentation, users should first read this document to have a general understanding of the graph learning process of TuGraph, which will make it easier to read the detailed documentation later. The guide program is based on a simple program instance of TuGraph, and we will focus on its usage."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1-introduction-to-tugraph-graph-learning-module",children:"1. Introduction to TuGraph Graph Learning Module"}),"\n",(0,t.jsx)(n.p,{children:"Graph learning is a machine learning method that utilizes the topological information of a graph structure to analyze and model data. Unlike traditional machine learning methods, graph learning uses graph structures where vertices represent entities in data and edges represent relationships between entities. By extracting features and patterns from these vertices and edges, deep associations and patterns can be revealed in data that can be used in various practical applications."}),"\n",(0,t.jsx)(n.p,{children:"The TuGraph Graph Learning Module is a graph learning module based on a graph database that provides four sampling operators: Neighbor Sampling, Edge Sampling, Random Walk Sampling, and Negative Sampling. These operators can be used to sample vertices and edges in a graph to generate training data. The sampling process is performed in a parallel computing environment, providing high efficiency and scalability."}),"\n",(0,t.jsx)(n.p,{children:"After sampling, the obtained training data can be used to train a model that can be used for various graph learning tasks such as prediction and classification. Through training, the model can learn the relationships between vertices and edges in the graph, allowing for prediction and classification of new vertices and edges. In practical applications, this module can be used to handle large-scale graph data such as social networks, recommendation systems, and bioinformatics."}),"\n",(0,t.jsx)(n.h2,{id:"2-run-process",children:"2. Run Process"}),"\n",(0,t.jsx)(n.p,{children:"The TuGraph graph learning module samples graph data in TuGraph, and the sampled vertices and edges are used as graph learning features for learning and training. The operation process is shown in the figure below:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Alt text",src:a(3388).A+"",width:"746",height:"984"})}),"\n",(0,t.jsx)(n.h2,{id:"3-tugraph-compilation-and-data-preparation",children:"3. TuGraph compilation and data preparation"}),"\n",(0,t.jsxs)(n.p,{children:["For TuGraph compilation, please refer to: ",(0,t.jsx)(n.a,{href:"/tugraph-db/en/installation&running/compile",children:"Compile"}),"\nExecute in the build/output directory:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cp -r ../../test/integration/data/ ./ && cp -r ../../learn/examples/* ./\n"})}),"\n",(0,t.jsx)(n.p,{children:"This command copies the relevant files of the dataset to the build/output directory."}),"\n",(0,t.jsx)(n.h2,{id:"4-data-import",children:"4. Data Import"}),"\n",(0,t.jsxs)(n.p,{children:["Please refer to ",(0,t.jsx)(n.a,{href:"/tugraph-db/en/utility-tools/data-import",children:"Data Import"})," for data import."]}),"\n",(0,t.jsx)(n.p,{children:"Taking the cora dataset as an example for the import process:"}),"\n",(0,t.jsx)(n.p,{children:"Execute in the build/output directory:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"./lgraph_import -c ./data/algo/cora.conf --dir ./coradb --overwrite 1\n"})}),"\n",(0,t.jsx)(n.p,{children:"Where cora.conf is the graph schema file representing the format of the graph data. coradb is the imported graph data file name representing the storage location of the graph data."}),"\n",(0,t.jsx)(n.h2,{id:"5-feature-conversion",children:"5. Feature Conversion"}),"\n",(0,t.jsx)(n.p,{children:"Since the features in graph learning are generally represented as long float arrays, TuGraph does not support loading float array types, so they can be imported as string types and converted to char* for subsequent storage and access, and the implementation details can refer to the feature_float.cpp file."}),"\n",(0,t.jsx)(n.p,{children:"The specific execution process is as follows:"}),"\n",(0,t.jsx)(n.p,{children:"Compile the imported plugin in the build directory.\uff08Skip if TuGraph has been compiled\uff09:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"make feature_float_embed"})}),"\n",(0,t.jsx)(n.p,{children:"Execute in the build/output directory:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"./algo/feature_float_embed ./coradb"})}),"\n",(0,t.jsx)(n.p,{children:"Then the conversion can be performed."}),"\n",(0,t.jsx)(n.h2,{id:"6-sampling-operators-and-compilation",children:"6. Sampling Operators and Compilation"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph implements an operator for obtaining the full graph data and four sampling operators at the cython layer, as follows:"}),"\n",(0,t.jsx)(n.h3,{id:"61sampling-operator-introduction",children:"6.1.Sampling Operator Introduction"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Sampling Operator"}),(0,t.jsx)(n.th,{children:"Sampling Method"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GetDB"}),(0,t.jsx)(n.td,{children:"Get the graph data from the database and convert it into the required data structure"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Neighbor Sampling"}),(0,t.jsx)(n.td,{children:"Sample the neighboring nodes of the given node to obtain the sampling subgraph"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Edge Sampling"}),(0,t.jsx)(n.td,{children:"Sample the edges in the graph according to the sampling rate to obtain the sampling subgraph"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Random Walk Sampling"}),(0,t.jsx)(n.td,{children:"Conduct a random walk based on the given node to obtain the sampling subgraph"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Negative Sampling"}),(0,t.jsx)(n.td,{children:"Generate a subgraph of non-existent edges"})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"62compilation",children:"6.2.Compilation"}),"\n",(0,t.jsx)(n.p,{children:"Skip if TuGraph has been compiled.\nExecute in the tugraph-db/build folder:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"make -j2"})}),"\n",(0,t.jsx)(n.p,{children:"Or execute in the tugraph-db/learn/procedures folder:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"python3 setup.py build_ext -i"})}),"\n",(0,t.jsx)(n.p,{children:"Once the algorithm so is obtained, it can be used by importing it in Python."}),"\n",(0,t.jsx)(n.h2,{id:"7-model-training-and-storage",children:"7. Model Training and Storage"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph calls the cython layer operator at the Python layer to implement graph learning and training."}),"\n",(0,t.jsx)(n.p,{children:"The usage of the TuGraph graph learning module is as follows:"}),"\n",(0,t.jsx)(n.p,{children:"Execute in the build/output folder:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"python3 train_full_cora.py --model_save_path ./cora_model"})}),"\n",(0,t.jsx)(n.p,{children:"Then training can be performed."}),"\n",(0,t.jsx)(n.p,{children:"If the final printed loss value is less than 0.9, the training is successful. So far, the graph model training is completed, and the model is saved in the cora_model file."}),"\n",(0,t.jsx)(n.h2,{id:"8-model-loading",children:"8. Model Loading"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:"model = build_model()\nmodel.load_state_dict(torch.load(model_save_path))\nmodel.eval()\n"})}),"\n",(0,t.jsx)(n.p,{children:"Before using a saved model, it is necessary to load it first. In the code above, the trained model is loaded using the provided code."}),"\n",(0,t.jsx)(n.p,{children:"After loading the model, we can use it to make predictions and classifications for new vertices and edges. For prediction, we can input one or multiple vertices and the model will output corresponding prediction results. For classification, we can input the whole graph, and the model will classify the vertices and edges in the graph to achieve the task goal."}),"\n",(0,t.jsx)(n.p,{children:"Using a trained model can save time and resources compared to retraining the model. Additionally, since the model has already learned the relationships between vertices and edges in the graph, it can adapt well to new data and improve the accuracy of predictions and classifications."})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},3388:(e,n,a)=>{a.d(n,{A:()=>t});const t=a.p+"assets/images/learn_flow_chart_en-4a77be5d31e739c6855f132fdc7bcd8a.png"},8453:(e,n,a)=>{a.d(n,{R:()=>o,x:()=>d});var t=a(6540);const r={},i=t.createContext(r);function o(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/153b9838.76147dd2.js b/assets/js/153b9838.b03f82e3.js similarity index 99% rename from assets/js/153b9838.76147dd2.js rename to assets/js/153b9838.b03f82e3.js index adb2b516a2..e72c692ea7 100644 --- a/assets/js/153b9838.76147dd2.js +++ b/assets/js/153b9838.b03f82e3.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8404],{9136:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var t=r(4848),i=r(8453);const a={},o="Quick Start",s={id:"quick-start/preparation",title:"Quick Start",description:"This document is intended for new users to get started quickly and contains an introduction, features, installation, and use of TuGraph.",source:"@site/../docs/en-US/source/3.quick-start/1.preparation.md",sourceDirName:"3.quick-start",slug:"/quick-start/preparation",permalink:"/tugraph-db/en/quick-start/preparation",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Glossary",permalink:"/tugraph-db/en/introduction/glossary"},next:{title:"DEMO:Movie",permalink:"/tugraph-db/en/quick-start/demo/movie"}},l={},d=[{value:"1.Introduction",id:"1introduction",level:2},{value:"1.1.Supported Platforms",id:"11supported-platforms",level:3},{value:"1.2.Hardware requirements",id:"12hardware-requirements",level:3},{value:"2.Installation",id:"2installation",level:2},{value:"2.1.Fast experience through Docker",id:"21fast-experience-through-docker",level:3},{value:"2.2.Description of New and Old Front-ends.",id:"22description-of-new-and-old-front-ends",level:3}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"quick-start",children:"Quick Start"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document is intended for new users to get started quickly and contains an introduction, features, installation, and use of TuGraph."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph is a large-scale graph computing system independently developed by Ant Group, providing graph database engine and graph analysis engine. Its main features are large data storage and computation, high throughput, and flexible API, while supporting efficient online transaction processing (OLTP) and online analytical processing (OLAP). LightGraph and GeaGraph are former names of TuGraph."}),"\n",(0,t.jsx)(n.p,{children:"The main functional features include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Labeled property Graph Model"}),"\n",(0,t.jsx)(n.li,{children:"Support multiple Graphs"}),"\n",(0,t.jsx)(n.li,{children:"Full ACID transaction processing"}),"\n",(0,t.jsx)(n.li,{children:"Built-in 34 graph analysis algorithm"}),"\n",(0,t.jsx)(n.li,{children:"Graph visualization tool based on Web client"}),"\n",(0,t.jsx)(n.li,{children:"RESTful API and RPC are supported"}),"\n",(0,t.jsx)(n.li,{children:"OpenCypher graph query language"}),"\n",(0,t.jsx)(n.li,{children:"Stored procedure based on C++/Python/Java"}),"\n",(0,t.jsx)(n.li,{children:"The Traversal API for efficient graph algorithm development"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Performance and scalability features include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"TB large capacity"}),"\n",(0,t.jsx)(n.li,{children:"High throughput of ten million vertices per second"}),"\n",(0,t.jsx)(n.li,{children:"High Availability Support (Enterprise Edition)"}),"\n",(0,t.jsx)(n.li,{children:"High-performance Batch Import"}),"\n",(0,t.jsx)(n.li,{children:"Online/offline backup"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"11supported-platforms",children:"1.1.Supported Platforms"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph supports both X86_64 and ARM64 architectures in physical, virtual, and containerized environments."}),"\n",(0,t.jsx)(n.h3,{id:"12hardware-requirements",children:"1.2.Hardware requirements"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"You are advised to use NVMe SSDS with large memory configurations for optimal performance\u3002"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Hardware"}),(0,t.jsx)(n.th,{children:"Minimum Configuration"}),(0,t.jsx)(n.th,{children:"Recommended configuration"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"CPU"}),(0,t.jsx)(n.td,{children:"X86_64"}),(0,t.jsx)(n.td,{children:"Xeon E5 2670 v4"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Memory"}),(0,t.jsx)(n.td,{children:"4GB"}),(0,t.jsx)(n.td,{children:"256GB"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Disk"}),(0,t.jsx)(n.td,{children:"100GB"}),(0,t.jsx)(n.td,{children:"1TB NVMe SSD"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"System"}),(0,t.jsx)(n.td,{children:"Linux 2.6"}),(0,t.jsx)(n.td,{children:"Ubuntu 18.04, CentOS 7.3"})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"2installation",children:"2.Installation"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph can be installed quickly via Docker Image or locally via RPM /deb packages.In addition, TuGraph offers community edition services on Alibaba Cloud Computing Nest, which means you don't need to purchase your own cloud host to quickly deploy TuGraph services and achieve operational monitoring, thus building your own graph application."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Installation package/image download: refer to the TuGraph-Latest-Version section in ",(0,t.jsx)(n.a,{href:"/tugraph-db/en/guide",children:"Download address"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Computing Nest Deployment: You can search for it on Alibaba Cloud Computing Nest, or you can quickly access it through [deployment link] (../5.developer-manual/1.installation/5.cloud-deployment.md)."}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"21fast-experience-through-docker",children:"2.1.Fast experience through Docker"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"The Docker environment installed locally"}),"\n",(0,t.jsxs)(n.p,{children:["The docker official documentation\uff1a",(0,t.jsx)(n.a,{href:"https://docs.docker.com/get-started/",children:"https://docs.docker.com/get-started/"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Pull the docker images"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"docker pull tugraph/tugraph-runtime-centos7\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start docker"}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The TuGraph service can be started in two ways. The first method integrates the image pull with the service startup, allowing users to execute the container-running operation to simultaneously start the TuGraph service. The second method involves manually entering the container after creating the TuGraph container to trigger the service startup. While this method may involve more initial steps, it offers greater flexibility for password resets in cases such as forgetting the password."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Method One"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:" docker run -d -p 7070:7070 -p 7687:7687 -p 9090:9090 -v /root/tugraph/data:/var/lib/lgraph/data -v /root/tugraph/log:/var/log/lgraph_log \\\n --name tugraph_demo ${REPOSITORY}:${VERSION}\n\n# ${REPOSITORY} is the image address,${VERSION} is the version number.\n# 7070 is default http port\uff0cfor tugraph-db-browser accessing..\n# 7687 is bolt port, for neo4j client accessing.\n# 9090 is default RPC port\uff0cfor RPC client accessing.\n\n# The default data directory is /var/lib/lgraph/data and the default log directory is /var/log/lgraph_log,\n# which is configured in the tugraph configuration file at /usr/local/etc/lgraph.json inside the docker.\n# This command mounts the data directory and log directory to /root/tugraph/ on the host for persistence,\n# which you can modify according to your actual situation.\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Method Two"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:" docker run -dt -p 7070:7070 -p 7687:7687 -p 9090:9090 -v /root/tugraph/data:/var/lib/lgraph/data -v /root/tugraph/log:/var/log/lgraph_log \\\n --name tugraph_demo ${REPOSITORY}:${VERSION} /bin/bash\n \n docker exec -it tugraph_demo bash\n lgraph_server -c /usr/local/etc/lgraph.json -d start\n\n# ${REPOSITORY} is the image address,${VERSION} is the version number.\n# 7070 is default http port\uff0cfor tugraph-db-browser accessing..\n# 7687 is bolt port, for neo4j client accessing.\n# 9090 is default RPC port\uff0cfor RPC client accessing.\n\n# The default data directory is /var/lib/lgraph/data and the default log directory is /var/log/lgraph_log,\n# which is configured in the tugraph configuration file at /usr/local/etc/lgraph.json inside the docker.\n# This command mounts the data directory and log directory to /root/tugraph/ on the host for persistence,\n# which you can modify according to your actual situation.\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"4",children:["\n",(0,t.jsx)(n.li,{children:"Open by browser"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Accessing tugraph-db-browser: ",(0,t.jsx)(n.code,{children:"http://x.x.x.x:7070"}),". The database address format is ",(0,t.jsx)(n.code,{children:"bolt://ip:bolt_port"}),",Default account is ",(0,t.jsx)(n.code,{children:"admin"})," and default password is ",(0,t.jsx)(n.code,{children:"73@TuGraph"}),".\nThe page will be redirected to the password modification page for the first login. Please modify the password according to the page prompt."]}),"\n",(0,t.jsx)(n.h3,{id:"22description-of-new-and-old-front-ends",children:"2.2.Description of New and Old Front-ends."}),"\n",(0,t.jsxs)(n.p,{children:['To access the container and choose between the old and new versions of the frontend, modify the configuration file located at "/usr/local/etc/lgraph.json". For the old version, change the value of the "web" parameter to "/usr/local/share/lgraph/resource"; for the new version, set it to "/usr/local/share/lgraph/browser-resource". Once you\'ve finished editing the configuration file, run the command ',(0,t.jsx)(n.code,{children:"docker restart tugraph"})," to apply the changes. Bear in mind that the new version is the default selection."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>s});var t=r(6540);const i={},a=t.createContext(i);function o(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8404],{9136:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var t=r(4848),i=r(8453);const a={},o="Quick Start",s={id:"quick-start/preparation",title:"Quick Start",description:"This document is intended for new users to get started quickly and contains an introduction, features, installation, and use of TuGraph.",source:"@site/../docs/en-US/source/3.quick-start/1.preparation.md",sourceDirName:"3.quick-start",slug:"/quick-start/preparation",permalink:"/tugraph-db/en/quick-start/preparation",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Glossary",permalink:"/tugraph-db/en/introduction/glossary"},next:{title:"DEMO:Movie",permalink:"/tugraph-db/en/quick-start/demo/movie"}},l={},d=[{value:"1.Introduction",id:"1introduction",level:2},{value:"1.1.Supported Platforms",id:"11supported-platforms",level:3},{value:"1.2.Hardware requirements",id:"12hardware-requirements",level:3},{value:"2.Installation",id:"2installation",level:2},{value:"2.1.Fast experience through Docker",id:"21fast-experience-through-docker",level:3},{value:"2.2.Description of New and Old Front-ends.",id:"22description-of-new-and-old-front-ends",level:3}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"quick-start",children:"Quick Start"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document is intended for new users to get started quickly and contains an introduction, features, installation, and use of TuGraph."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph is a large-scale graph computing system independently developed by Ant Group, providing graph database engine and graph analysis engine. Its main features are large data storage and computation, high throughput, and flexible API, while supporting efficient online transaction processing (OLTP) and online analytical processing (OLAP). LightGraph and GeaGraph are former names of TuGraph."}),"\n",(0,t.jsx)(n.p,{children:"The main functional features include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Labeled property Graph Model"}),"\n",(0,t.jsx)(n.li,{children:"Support multiple Graphs"}),"\n",(0,t.jsx)(n.li,{children:"Full ACID transaction processing"}),"\n",(0,t.jsx)(n.li,{children:"Built-in 34 graph analysis algorithm"}),"\n",(0,t.jsx)(n.li,{children:"Graph visualization tool based on Web client"}),"\n",(0,t.jsx)(n.li,{children:"RESTful API and RPC are supported"}),"\n",(0,t.jsx)(n.li,{children:"OpenCypher graph query language"}),"\n",(0,t.jsx)(n.li,{children:"Stored procedure based on C++/Python/Java"}),"\n",(0,t.jsx)(n.li,{children:"The Traversal API for efficient graph algorithm development"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Performance and scalability features include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"TB large capacity"}),"\n",(0,t.jsx)(n.li,{children:"High throughput of ten million vertices per second"}),"\n",(0,t.jsx)(n.li,{children:"High Availability Support (Enterprise Edition)"}),"\n",(0,t.jsx)(n.li,{children:"High-performance Batch Import"}),"\n",(0,t.jsx)(n.li,{children:"Online/offline backup"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"11supported-platforms",children:"1.1.Supported Platforms"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph supports both X86_64 and ARM64 architectures in physical, virtual, and containerized environments."}),"\n",(0,t.jsx)(n.h3,{id:"12hardware-requirements",children:"1.2.Hardware requirements"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.em,{children:"You are advised to use NVMe SSDS with large memory configurations for optimal performance\u3002"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Hardware"}),(0,t.jsx)(n.th,{children:"Minimum Configuration"}),(0,t.jsx)(n.th,{children:"Recommended configuration"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"CPU"}),(0,t.jsx)(n.td,{children:"X86_64"}),(0,t.jsx)(n.td,{children:"Xeon E5 2670 v4"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Memory"}),(0,t.jsx)(n.td,{children:"4GB"}),(0,t.jsx)(n.td,{children:"256GB"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Disk"}),(0,t.jsx)(n.td,{children:"100GB"}),(0,t.jsx)(n.td,{children:"1TB NVMe SSD"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"System"}),(0,t.jsx)(n.td,{children:"Linux 2.6"}),(0,t.jsx)(n.td,{children:"Ubuntu 18.04, CentOS 7.3"})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"2installation",children:"2.Installation"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph can be installed quickly via Docker Image or locally via RPM /deb packages.In addition, TuGraph offers community edition services on Alibaba Cloud Computing Nest, which means you don't need to purchase your own cloud host to quickly deploy TuGraph services and achieve operational monitoring, thus building your own graph application."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Installation package/image download: refer to the TuGraph-Latest-Version section in ",(0,t.jsx)(n.a,{href:"/tugraph-db/en/guide",children:"Download address"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Computing Nest Deployment: You can search for it on Alibaba Cloud Computing Nest, or you can quickly access it through [deployment link] (../5.developer-manual/1.installation/5.cloud-deployment.md)."}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"21fast-experience-through-docker",children:"2.1.Fast experience through Docker"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"The Docker environment installed locally"}),"\n",(0,t.jsxs)(n.p,{children:["The docker official documentation\uff1a",(0,t.jsx)(n.a,{href:"https://docs.docker.com/get-started/",children:"https://docs.docker.com/get-started/"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Pull the docker images"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"docker pull tugraph/tugraph-runtime-centos7\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start docker"}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The TuGraph service can be started in two ways. The first method integrates the image pull with the service startup, allowing users to execute the container-running operation to simultaneously start the TuGraph service. The second method involves manually entering the container after creating the TuGraph container to trigger the service startup. While this method may involve more initial steps, it offers greater flexibility for password resets in cases such as forgetting the password."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Method One"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:" docker run -d -p 7070:7070 -p 7687:7687 -p 9090:9090 -v /root/tugraph/data:/var/lib/lgraph/data -v /root/tugraph/log:/var/log/lgraph_log \\\n --name tugraph_demo ${REPOSITORY}:${VERSION}\n\n# ${REPOSITORY} is the image address,${VERSION} is the version number.\n# 7070 is default http port\uff0cfor tugraph-db-browser accessing..\n# 7687 is bolt port, for neo4j client accessing.\n# 9090 is default RPC port\uff0cfor RPC client accessing.\n\n# The default data directory is /var/lib/lgraph/data and the default log directory is /var/log/lgraph_log,\n# which is configured in the tugraph configuration file at /usr/local/etc/lgraph.json inside the docker.\n# This command mounts the data directory and log directory to /root/tugraph/ on the host for persistence,\n# which you can modify according to your actual situation.\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Method Two"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:" docker run -dt -p 7070:7070 -p 7687:7687 -p 9090:9090 -v /root/tugraph/data:/var/lib/lgraph/data -v /root/tugraph/log:/var/log/lgraph_log \\\n --name tugraph_demo ${REPOSITORY}:${VERSION} /bin/bash\n \n docker exec -it tugraph_demo bash\n lgraph_server -c /usr/local/etc/lgraph.json -d start\n\n# ${REPOSITORY} is the image address,${VERSION} is the version number.\n# 7070 is default http port\uff0cfor tugraph-db-browser accessing..\n# 7687 is bolt port, for neo4j client accessing.\n# 9090 is default RPC port\uff0cfor RPC client accessing.\n\n# The default data directory is /var/lib/lgraph/data and the default log directory is /var/log/lgraph_log,\n# which is configured in the tugraph configuration file at /usr/local/etc/lgraph.json inside the docker.\n# This command mounts the data directory and log directory to /root/tugraph/ on the host for persistence,\n# which you can modify according to your actual situation.\n"})}),"\n",(0,t.jsxs)(n.ol,{start:"4",children:["\n",(0,t.jsx)(n.li,{children:"Open by browser"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Accessing tugraph-db-browser: ",(0,t.jsx)(n.code,{children:"http://x.x.x.x:7070"}),". The database address format is ",(0,t.jsx)(n.code,{children:"bolt://ip:bolt_port"}),",Default account is ",(0,t.jsx)(n.code,{children:"admin"})," and default password is ",(0,t.jsx)(n.code,{children:"73@TuGraph"}),".\nThe page will be redirected to the password modification page for the first login. Please modify the password according to the page prompt."]}),"\n",(0,t.jsx)(n.h3,{id:"22description-of-new-and-old-front-ends",children:"2.2.Description of New and Old Front-ends."}),"\n",(0,t.jsxs)(n.p,{children:['To access the container and choose between the old and new versions of the frontend, modify the configuration file located at "/usr/local/etc/lgraph.json". For the old version, change the value of the "web" parameter to "/usr/local/share/lgraph/resource"; for the new version, set it to "/usr/local/share/lgraph/browser-resource". Once you\'ve finished editing the configuration file, run the command ',(0,t.jsx)(n.code,{children:"docker restart tugraph"})," to apply the changes. Bear in mind that the new version is the default selection."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>s});var t=r(6540);const i={},a=t.createContext(i);function o(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/22131911.d9333dd1.js b/assets/js/22131911.aedb6db8.js similarity index 99% rename from assets/js/22131911.d9333dd1.js rename to assets/js/22131911.aedb6db8.js index accbc46f7f..145d5a63a7 100644 --- a/assets/js/22131911.d9333dd1.js +++ b/assets/js/22131911.aedb6db8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6635],{3807:(n,e,s)=>{s.r(e),s.d(e,{assets:()=>c,contentTitle:()=>l,default:()=>j,frontMatter:()=>i,metadata:()=>t,toc:()=>h});var r=s(4848),d=s(8453);const i={},l="Cypher API",t={id:"query/cypher",title:"Cypher API",description:"This document mainly introduces the detailed usage instructions of TuGraph-Cypher.",source:"@site/../docs/en-US/source/8.query/1.cypher.md",sourceDirName:"8.query",slug:"/query/cypher",permalink:"/tugraph-db/en/query/cypher",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph RESTful API Legacy",permalink:"/tugraph-db/en/client-tools/restful-api-legacy"},next:{title:"ISO GQL",permalink:"/tugraph-db/en/query/gql"}},c={},h=[{value:"Table of contents",id:"table-of-contents",level:2},{value:"1.Operators",id:"1operators",level:2},{value:"1.1.Summary",id:"11summary",level:3},{value:"1.2.General operators",id:"12general-operators",level:3},{value:"1.3.Mathematical operators",id:"13mathematical-operators",level:3},{value:"1.4.Comparison operators",id:"14comparison-operators",level:3},{value:"1.5.String-specific comparison operators",id:"15string-specific-comparison-operators",level:3},{value:"1.6.Boolean operators",id:"16boolean-operators",level:3},{value:"1.7.String operators",id:"17string-operators",level:3},{value:"1.8.List operators",id:"18list-operators",level:3},{value:"2.Clauses",id:"2clauses",level:2},{value:"2.1.Summary",id:"21summary",level:3},{value:"2.2.MATCH",id:"22match",level:3},{value:"2.3.RETURN",id:"23return",level:3},{value:"2.4.WHERE",id:"24where",level:3},{value:"2.5.SKIP",id:"25skip",level:3},{value:"2.6.LIMIT",id:"26limit",level:3},{value:"2.7.CREATE",id:"27create",level:3},{value:"2.8.CALL[\u2026YIELD]",id:"28callyield",level:3},{value:"2.9.UNION",id:"29union",level:3},{value:"3.Functions",id:"3functions",level:2},{value:"3.1.Whole List Of Functions",id:"31whole-list-of-functions",level:3},{value:"3.2.Predicate functions",id:"32predicate-functions",level:3},{value:"3.3.Scalar functions",id:"33scalar-functions",level:3},{value:"3.4.Aggregating functions",id:"34aggregating-functions",level:3},{value:"3.5.List Funtions:",id:"35list-funtions",level:3},{value:"3.6.Mathematical functions",id:"36mathematical-functions",level:3},{value:"4.Extensions To OpenCypher",id:"4extensions-to-opencypher",level:2},{value:"5.Procedures",id:"5procedures",level:2},{value:"5.1.procedures' demos",id:"51procedures-demos",level:3},{value:"5.2.Whole List Of Procedures",id:"52whole-list-of-procedures",level:3}];function x(n){const e={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...n.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.header,{children:(0,r.jsx)(e.h1,{id:"cypher-api",children:"Cypher API"})}),"\n",(0,r.jsxs)(e.blockquote,{children:["\n",(0,r.jsx)(e.p,{children:"This document mainly introduces the detailed usage instructions of TuGraph-Cypher."}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"table-of-contents",children:"Table of contents"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.a,{href:"#1operators",children:"1.Operators"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#11summary",children:"1.1.Summary"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#12general-operators",children:"1.2.General Operators"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#13mathematical-operators",children:"1.3.Mathematical Operators"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#14comparison-operators",children:"1.4.Comparison Operators"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#15string-specific-comparison-operators",children:"1.5.String Specific Comparison Operators"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#16boolean-operators",children:"1.6.Boolean Operators"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#17string-operators",children:"1.7.String Operators"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#18list-operators",children:"1.8.List Operators"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.a,{href:"#2clauses",children:"2.Clauses"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#21summary",children:"2.1.Summary"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#22match",children:"2.2.Match"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#23return",children:"2.3.Return"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#24where",children:"2.4.Where"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#25skip",children:"2.5.Skip"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#26limit",children:"2.6.Limit"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#27create",children:"2.7.Create"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#28callyield",children:"2.8.Callyield"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#29union",children:"2.9.Union"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.a,{href:"#3functions",children:"3.Functions"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#31whole-list-of-functions",children:"3.1.Whole List of Functions"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#32predicate-functions",children:"3.2.Predicate Functions"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#33scalar-functions",children:"3.3.Scalar Functions"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#34aggregating-functions",children:"3.4.Aggregating Functions"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#35list-funtions",children:"3.5.List Funtions"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#36mathematical-functions",children:"3.6.Mathematical Functions"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#4extensions-to-opencypher",children:"4.Extensions to Opencypher"})}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.a,{href:"#5procedures",children:"5.Procedures"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#51procedures-demos",children:"5.1.Procedures Demos"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#52whole-list-of-procedures",children:"5.2.Whole List of Procedures"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"1operators",children:"1.Operators"}),"\n",(0,r.jsx)(e.h3,{id:"11summary",children:"1.1.Summary"}),"\n",(0,r.jsx)(e.p,{children:"Operators support progress overview\uff1a"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"category"}),(0,r.jsx)(e.th,{children:"supported"}),(0,r.jsx)(e.th,{children:"unsupported"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"General operators"}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"DISTINCT"}),", ",(0,r.jsx)(e.code,{children:"."})," for property access"]}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"[]"})," for dynamic property access"]})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Mathematical operators"}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"+"}),", ",(0,r.jsx)(e.code,{children:"-"}),", ",(0,r.jsx)(e.code,{children:"*"}),", ",(0,r.jsx)(e.code,{children:"/"}),", ",(0,r.jsx)(e.code,{children:"%"}),", ",(0,r.jsx)(e.code,{children:"^"})]}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Comparison operators"}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"="}),", ",(0,r.jsx)(e.code,{children:"<>"}),", ",(0,r.jsx)(e.code,{children:"<"}),", ",(0,r.jsx)(e.code,{children:">"}),", ",(0,r.jsx)(e.code,{children:"\u21d0"}),", ",(0,r.jsx)(e.code,{children:">="}),", ",(0,r.jsx)(e.code,{children:"IS NULL"}),", ",(0,r.jsx)(e.code,{children:"IS NOT NULL"})]}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"String-specific comparison operators"}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"STARTS WITH"}),", ",(0,r.jsx)(e.code,{children:"ENDS WITH"}),", ",(0,r.jsx)(e.code,{children:"CONTAINS"}),", ",(0,r.jsx)(e.code,{children:"REGEXP"})]}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Boolean operators"}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"AND"}),", ",(0,r.jsx)(e.code,{children:"OR"}),", ",(0,r.jsx)(e.code,{children:"XOR"}),", ",(0,r.jsx)(e.code,{children:"NOT"})]}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"String operators"}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"+"})," for concatenation"]}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"List operators"}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"+"})," for concatenation, ",(0,r.jsx)(e.code,{children:"IN"})," to check existence of an element in a list, ",(0,r.jsx)(e.code,{children:"[]"})," for accessing element(s)"]}),(0,r.jsx)(e.td,{})]})]})]}),"\n",(0,r.jsx)(e.h3,{id:"12general-operators",children:"1.2.General operators"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Using the DISTINCT operator"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (a:Person {name: 'Anne', eyeColor: 'blue'}),\n (b:Person {name: 'Bill', eyeColor: 'brown'}),\n (c:Person {name: 'Carol', eyeColor: 'blue'})\n"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (p:Person ) RETURN DISTINCT p.eyeColor\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:["\u2713 Accessing properties of a nested literal map using the ",(0,r.jsx)(e.code,{children:"."})," operator"]}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH {person: {name: 'Anne', age: 25}} AS p\nRETURN p.person.name\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:["\u274f Filtering on a dynamically-computed property key using the ",(0,r.jsx)(e.code,{children:"[]"})," operator"]}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (a:Restaurant {name: 'Hungry Jo', rating_hygiene: 10, rating_food: 7}),\n (b:Restaurant {name: 'Buttercup Tea Rooms', rating_hygiene: 5, rating_food:6}),\n (c1:Category {name: 'hygiene'}), (c2:Category {name: 'food'})\n"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:'MATCH (restaurant:Restaurant), (category:Category)\nWHERE restaurant["rating_" + category.name] > 6\nRETURN DISTINCT restaurant.name\n'})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"13mathematical-operators",children:"1.3.Mathematical operators"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:["\u2713 Using the exponentiation operator ",(0,r.jsx)(e.code,{children:"^"})]}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH 2 AS number, 3 AS exponent\nRETURN number ^ exponent AS result\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:["\u2713 Using the unary minus operator ",(0,r.jsx)(e.code,{children:"-"})]}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH -3 AS a, 4 AS b\nRETURN b - a AS result\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"14comparison-operators",children:"1.4.Comparison operators"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Comparing two numbers\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH 4 AS one, 3 AS two\nRETURN one > two AS result\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"15string-specific-comparison-operators",children:"1.5.String-specific comparison operators"}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.span,{id:"jump"})}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Using STARTS WITH to filter names"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH ['John', 'Mark', 'Jonathan', 'Bill'] AS somenames\nUNWIND somenames AS names\nWITH names AS candidate\nWHERE candidate STARTS WITH 'Jo'\nRETURN candidate\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Using REGEXP to filter names"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH ['John', 'Mark', 'Jonathan', 'Bill'] AS somenames\nUNWIND somenames AS names\nWITH names AS candidate\nWHERE candidate REGEXP 'Jo.*n'\nRETURN candidate\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"16boolean-operators",children:"1.6.Boolean operators"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Using boolean operators to filter numbers"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH [2, 4, 7, 9, 12] AS numberlist\nUNWIND numberlist AS number\nWITH number\nWHERE number = 4 OR (number > 6 AND number < 10)\nRETURN number\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"17string-operators",children:"1.7.String operators"}),"\n",(0,r.jsx)(e.p,{children:"String operators comprise:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:["\u2713 concatenating strings: ",(0,r.jsx)(e.code,{children:"+"})]}),"\n",(0,r.jsxs)(e.p,{children:["More details on string-specific comparison operators can be found ",(0,r.jsx)(e.a,{href:"#jump",children:"here"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"18list-operators",children:"1.8.List operators"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Concatenating two lists using +"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN [1,2,3,4,5]+[6,7] AS myList\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Using IN to check if a number is in a list"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH [2, 3, 4, 5] AS numberlist\nUNWIND numberlist AS number\nWITH number\nWHERE number IN [2, 3, 8]\nRETURN number\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Accessing elements in a list using the [] operator"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH ['Anne', 'John', 'Bill', 'Diane', 'Eve'] AS names\nRETURN names[1..3] AS result\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"2clauses",children:"2.Clauses"}),"\n",(0,r.jsx)(e.h3,{id:"21summary",children:"2.1.Summary"}),"\n",(0,r.jsx)(e.p,{children:"Clauses support progress list\uff1a"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Category"}),(0,r.jsx)(e.th,{children:"Syntax"}),(0,r.jsx)(e.th,{children:"Notes"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Reading clauses"}),(0,r.jsx)(e.td,{children:"MATCH"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"OPTIONAL MATCH"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"MANDATORY MATCH"}),(0,r.jsx)(e.td,{children:"Pending"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Projecting clauses"}),(0,r.jsx)(e.td,{children:"RETURN \u2026 [AS]"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"WITH \u2026 [AS]"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"UNWIND \u2026 [AS]"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Reading sub-clauses"}),(0,r.jsx)(e.td,{children:"WHERE"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"ORDER BY [ASC[ENDING] / DESC[ENDING]]"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"SKIP"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"LIMIT"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Writing clauses"}),(0,r.jsx)(e.td,{children:"CREATE"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"DELETE"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"DETACH DELETE"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"SET"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"REMOVE"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Reading/Writing clauses"}),(0,r.jsx)(e.td,{children:"MERGE"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"CALL [\u2026YIELD]"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Set operations"}),(0,r.jsx)(e.td,{children:"UNION"}),(0,r.jsx)(e.td,{children:"Pending"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"UNION ALL"}),(0,r.jsx)(e.td,{children:"Supported"})]})]})]}),"\n",(0,r.jsx)(e.h3,{id:"22match",children:"2.2.MATCH"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Basic node finding"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Get all nodes\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nRETURN n\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Get all nodes with a label\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (movie:Movie)\nRETURN movie.title\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Related nodes\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (director {name: 'Oliver Stone'})-[]-(movie)\nRETURN movie.title\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Match with labels\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (director {name: 'Oliver Stone'})-[]-(movie)\nRETURN movie.title\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Relationship basics"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Outgoing relationships\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (:Person {name: 'Oliver Stone'})-[]->(movie)\nRETURN movie.title\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Directed relationships and variable\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (:Person {name: 'Oliver Stone'})-[r]->(movie)\nRETURN type(r)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Match on relationship type\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (wallstreet:Movie {title: 'Wall Street'})<-[:ACTED_IN]-(actor)\nRETURN actor.name\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Match on multiple relationship types\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (wallstreet {title: 'Wall Street'})<-[:ACTED_IN|:DIRECTED]-(person)\nRETURN person.name\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Match on relationship type and use a variable\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (wallstreet {title: 'Wall Street'})<-[r:ACTED_IN]-(actor)\nRETURN r.role\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Relationships in depth"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u274f Relationship types with uncommon characters"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n {name: 'Rob Reiner'})-[r:`TYPE WITH SPACE`]->()\nRETURN type(r)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Multiple relationships"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (charlie {name: 'Charlie Sheen'})-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director)\nRETURN movie.title, director.name\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Variable-length relationships"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (martin {name: 'Charlie Sheen'})-[:ACTED_IN*1..3]-(movie:Movie)\nRETURN movie.title\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Relationship variable in variable-length relationships"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH p = (actor {name: 'Charlie Sheen'})-[:ACTED_IN*2]-(co_actor)\nRETURN relationships(p)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u274f Match with properties on a variable-length path"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH p = (charlie:Person)-[* {blocked:false}]-(martin:Person)\nWHERE charlie.name = 'Charlie Sheen' AND martin.name = 'Martin Sheen'\nRETURN p\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Zero-length paths"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (wallstreet:Movie {title: 'Wall Street'})-[*0..1]-(x)\nRETURN x\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Named paths"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH p = (michael {name: 'Michael Douglas'})-[]->() RETURN p\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Matching on a bound relationship"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)-[r]-(b)\nWHERE id(r)= 0\nRETURN a,b\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Shortest path"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Single shortest path\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (martin:person {name: 'Carrie-Anne Moss'}), (laurence:person {name: 'Laurence Fishburne'})\nCALL algo.shortestPath(martin, laurence) YIELD nodeCount,totalCost,path RETURN nodeCount,totalCost,path\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 All shortest paths\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (martin:person {name: 'Carrie-Anne Moss'}), (laurence:person {name: 'Laurence Fishburne'}) WITH martin, laurence\nCALL algo.allShortestPaths(martin, laurence) YIELD nodeIds,relationshipIds,cost RETURN nodeIds,relationshipIds,cost\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Get node or relationship by id"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Node by id\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE id(n)= 0\nRETURN n\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2612 Relationship by id\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH ()-[r]->()\nWHERE id(r) = 0\nRETURN r\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Multiple nodes by id\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE id(n) IN [0, 3, 5]\nRETURN n\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"23return",children:"2.3.RETURN"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Return nodes"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n {name: 'B'}) RETURN n\n"})}),"\n",(0,r.jsxs)(e.blockquote,{children:["\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Note"})}),"\n",(0,r.jsxs)(e.p,{children:["Return ",(0,r.jsx)(e.code,{children:"id"})," of n."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Return relationships"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n {name: 'A'})-[r:KNOWS]->(c)\nRETURN r\n"})}),"\n",(0,r.jsxs)(e.blockquote,{children:["\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Note"})}),"\n",(0,r.jsxs)(e.p,{children:["Return ",(0,r.jsx)(e.code,{children:"EdgeUid"})," of r."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Return property"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n {name: 'A'}) RETURN n.name\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u274f Return all elements"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH p = (a {name: 'A'})-[r]->(b)\nRETURN *\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u274f Variable with uncommon characters"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (`This isn\\'t a common variable`)\nWHERE `This isn\\'t a common variable`.name = 'A'\nRETURN `This isn\\'t a common variable`.happy\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Aliasing a field"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a {name: 'A'})\nRETURN a.age AS SomethingTotallyDifferent\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Optional properties"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nRETURN n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u274f Other expressions"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a {name: 'A'})\nRETURN a.age > 30, \"I'm a literal\", (a)-[]->()\n"})}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"(a)-[]->()"})," not supported."]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Unique results"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a {name: 'A'})-[]->(b)\nRETURN DISTINCT b\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"24where",children:"2.4.WHERE"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Basic usage"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Boolean operations\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name = 'Peter' XOR (n.age < 30 AND n.name = 'Tobias') OR NOT (n.name =\n'Tobias' OR n.name = 'Peter')\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Filter on node label\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n:Swedish\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Filter on node property\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.age < 30\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Filter on relationship property\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)-[k:KNOWS]->(f)\nWHERE k.since < 2000\nRETURN f.name, f.age, f.email\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u274f Filter on dynamically-computed property\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH 'AGE' AS propname\nMATCH (n)\nWHERE n[toLower(propname)]< 30\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Property existence checking\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE exists(n.belt)\nRETURN n.name, n.belt\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"String matching"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Match the beginning of a string\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name STARTS WITH 'Pet'\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Match the ending of a string\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name ENDS WITH 'ter'\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Match anywhere within a string\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name CONTAINS 'ete'\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 String matching negation\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE NOT n.name ENDS WITH 's'\nRETURN n.name, n.age\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:["Using path patterns in ",(0,r.jsx)(e.code,{children:"WHERE"})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Filter on patterns"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (tobias {name: 'Tobias'}), (others)\nWHERE others.name IN ['Andres', 'Peter'] AND (tobias)<-[]-(others)\nRETURN others.name, others.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Filter on patterns using NOT"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (persons), (peter {name: 'Peter'})\nWHERE NOT (persons)-[]->(peter)\nRETURN persons.name, persons.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Filter on patterns with properties"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE (n)-[:KNOWS]-({name: 'Tobias'})\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Filter on relationship type"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)-[r]->()\nWHERE n.name='Andres' AND type(r) STARTS WITH 'K'\nRETURN type(r), r.since\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Lists"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 IN operator\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nWHERE a.name IN ['Peter', 'Tobias']\nRETURN a.name, a.age\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Missing properties and values"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Default to false if property is missing\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.belt = 'white'\nRETURN n.name, n.age, n.belt\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Default to true if property is missing\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.belt = 'white' OR n.belt IS NULL RETURN n.name, n.age, n.belt\nORDER BY n.name\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Filter on null\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (person)\nWHERE person.name = 'Peter' AND person.belt IS NULL RETURN person.name, person.age,\nperson.belt\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Using ranges"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Simple range\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nWHERE a.name >= 'Peter'\nRETURN a.name, a.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Composite range\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nWHERE a.name > 'Andres' AND a.name < 'Tobias'\nRETURN a.name, a.age\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"25skip",children:"2.5.SKIP"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Skip first three records\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nRETURN n.name\nORDER BY n.name\nSKIP 3\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Return middle two records\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nRETURN n.name\nORDER BY n.name\nSKIP 1\nLIMIT 2\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Using an expression with SKIP to return a subset of the records\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nRETURN n.name\nORDER BY n.name\nSKIP toInteger(3*rand())+ 1\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"26limit",children:"2.6.LIMIT"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Return a subset of the records\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nRETURN n.name\nLIMIT 3\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Using an expression with LIMIT to return a subset of the records\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nRETURN n.name\nLIMIT toInteger(3 * rand())+ 1\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"27create",children:"2.7.CREATE"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Create nodes"}),"\n",(0,r.jsxs)(e.blockquote,{children:["\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Note"})}),"\n",(0,r.jsx)(e.p,{children:"TuGraph does not support creating empty nodes and does not support multiple labels."}),"\n"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2612 Create single node\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (n)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2612 Create multiple nodes\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (n), (m)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Create a node with a label\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (n:Person)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2612 Create a node with multiple labels\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (n:Person:Swedish)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Create node and add labels and properties\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (n:Person {name: 'Andres', title: 'Developer'})\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Return created node\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (a {name: 'Andres'})\nRETURN a\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Create relationships"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Create a relationship between two nodes\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a:Person), (b:Person)\nWHERE a.name = 'Node A' AND b.name = 'Node B'\nCREATE (a)-[r:RELTYPE]->(b)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Create a relationship and set properties\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a:Person), (b:Person)\nWHERE a.name = 'Node A' AND b.name = 'Node B'\nCREATE (a)-[r:RELTYPE {name: a.name + '<->' + b.name}]->(b)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Create a full path\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE p = (andres {name:'Andres'})-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael {name:'Michael'})\nRETURN p\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Use parameters with CREATE"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u274f Create node with a parameter for the properties\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (n:Person $props)\nRETURN n\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2612 Create multiple nodes with a parameter for their properties\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"UNWIND $props AS map\nCREATE (n)\nSET n = map\n"})}),"\ncannot create vertex without label."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"28callyield",children:"2.8.CALL[\u2026YIELD]"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Call a procedure using CALL\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.vertexLabels\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 View the signature for a procedure\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.procedures() YIELD name, signature\nWHERE name='dbms.listConfig'\nRETURN signature\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u274f Call a procedure using a quoted namespace and name\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL `db`.`vertexLabels`\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Call a procedure with literal arguments\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL org.opencypher.procedure.example.addNodeToIndex('users', 0, 'name')\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u274f Call a procedure with parameter arguments\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL org.opencypher.procedure.example.addNodeToIndex($indexName,$node,$propKey)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u274f Call a procedure with mixed literal and parameter arguments\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL org.opencypher.procedure.example.addNodeToIndex('users', $node, 'name')\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Call a procedure with literal and default arguments\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL org.opencypher.procedure.example.addNodeToIndex('users', 0)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Call a procedure within a complex query using CALL\u2026YIELD\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.vertexLabels() YIELD label\nRETURN count(label) AS numLabels\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Call a procedure and filter its results\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.vertexLabels() YIELD label\nWHERE label CONTAINS 'User'\nRETURN count(label) AS numLabels\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u274f Call a procedure within a complex query and rename its outputs\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.propertyKeys() YIELD propertyKey AS prop\nMATCH (n)\nWHERE n[prop] IS NOT NULL RETURN prop, count(n) AS numNodes\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"29union",children:"2.9.UNION"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Combine two queries and retain duplicates\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Actor)\nRETURN n.name AS name\nUNION ALL MATCH (n:Movie)\nRETURN n.title AS name\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u274f Combine two queries and remove duplicates\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Actor)\nRETURN n.name AS name\nUNION\nMATCH (n:Movie)\nRETURN n.title AS name\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"3functions",children:"3.Functions"}),"\n",(0,r.jsx)(e.h3,{id:"31whole-list-of-functions",children:"3.1.Whole List Of Functions"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Category"}),(0,r.jsx)(e.th,{children:"Function"}),(0,r.jsx)(e.th,{children:"Notes"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Predicate functions"}),(0,r.jsx)(e.td,{children:"exists()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"all()"}),(0,r.jsx)(e.td,{children:"Not supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"any()"}),(0,r.jsx)(e.td,{children:"Not supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"single()"}),(0,r.jsx)(e.td,{children:"Not supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"none()"}),(0,r.jsx)(e.td,{children:"Not supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Scalar functions"}),(0,r.jsx)(e.td,{children:"id()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"euid()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"properties()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"head()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"last()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"toBoolean()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"toFloat()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"toInteger()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"toString()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"type()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"startnode()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"endnode()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"size()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"length()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"substring()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"concat()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"label()"}),(0,r.jsx)(e.td,{children:"OpenCypher extension method"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Aggregating functions"}),(0,r.jsx)(e.td,{children:"avg()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"collect()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"count()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"max()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"min()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"percentileCont()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"percentileDisc()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"stDev()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"stDevP()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"variance()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"varianceP()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"sum()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"List functions"}),(0,r.jsx)(e.td,{children:"keys()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"labels()"}),(0,r.jsx)(e.td,{children:"Returns a result with only one label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"nodes()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"range()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"subscript()"}),(0,r.jsx)(e.td,{children:"Not supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Mathematical functions"}),(0,r.jsx)(e.td,{children:"abs()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"ceil()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{})]})]})]}),"\n",(0,r.jsx)(e.h3,{id:"32predicate-functions",children:"3.2.Predicate functions"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"exists()"}),"\n",(0,r.jsx)(e.p,{children:"judge it whether a vertex or edge has the field ."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE exists(n.belt)\nRETURN n.name, n.belt\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"exists(name)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"true"})})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"33scalar-functions",children:"3.3.Scalar functions"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"id()"}),"\n",(0,r.jsx)(e.p,{children:"get the id of vertex."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nRETURN id(a)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"vid"})})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"1"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"2"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"..."})})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"properties()"}),"\n",(0,r.jsx)(e.p,{children:"get a map containing all the properties of a node or relationship."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (p:Person {name: 'Stefan', city: 'Berlin'})\nRETURN properties(p)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"properties"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"{name:Stefan,city:Berlin}"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"head()"}),"\n",(0,r.jsx)(e.p,{children:"get the first element of a list."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nWHERE a.name = 'Eskil'\nRETURN a.array, head(a.array)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"a.array"}),(0,r.jsx)(e.th,{children:"head(a.array)"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:'["one","two","three"]'}),(0,r.jsx)(e.td,{children:'"one"'})]})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"last()"}),"\n",(0,r.jsx)(e.p,{children:"get the last element of a list."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nWHERE a.name = 'Eskil'\nRETURN a.array, last(a.array)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"a.array"}),(0,r.jsx)(e.th,{children:"last(a.array)"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:'["one","two","three"]'}),(0,r.jsx)(e.td,{children:'"three"'})]})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"toFloat()"}),"\n",(0,r.jsx)(e.p,{children:"Converts an integer or string value to a floating point number."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN toFloat('11.5'), toFloat('not a number')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"float"})})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"11.5"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"null"})})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"toInteger()"}),"\n",(0,r.jsx)(e.p,{children:"Converts a floating point or string value to an integer value."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN toInteger('2.3') AS integer\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"integer"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"2"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"toString()"}),"\n",(0,r.jsx)(e.p,{children:"Converts an integer, float, boolean value to a string."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN toString(2.3)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"type()"}),"\n",(0,r.jsx)(e.p,{children:"get the string representation of the relationship type."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)-[r]->()\nWHERE n.name = 'Alice'\nRETURN type(r)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"type"})})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"acted_in"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"acted_in"})})]})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"34aggregating-functions",children:"3.4.Aggregating functions"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"avg()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the average of a set of numeric values."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Person)\nRETURN avg(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"avg(n.born)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"1869.2661654135338"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"collect()"}),"\n",(0,r.jsx)(e.p,{children:"Returns a list containing the values returned by an expression."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Person)\nRETURN collect(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"collect(n.born)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"[1967,...]"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"count()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the number of values or records."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n {name: 'A'})-[]->(x)\nRETURN labels(n), n.age, count(*)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"labels(n)"}),(0,r.jsx)(e.th,{children:"n.age"}),(0,r.jsx)(e.th,{children:"count(*)"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:'["Person"]'}),(0,r.jsx)(e.td,{children:"13"}),(0,r.jsx)(e.td,{children:"3"})]})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"max()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the maximum value in a set of values."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Person)\nRETURN max(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"max(n.age)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"44"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"min()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the minimum value in a set of values."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Person)\nRETURN min(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"min(n.age)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"13"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"percentileCont()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the percentile of a value over a group using linear interpolation."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Person)\nRETURN percentileCont(n.age, 0.4)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"percentileCont(n.age, 0.4)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"29"})})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"percentileDisc()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the nearest value to the given percentile over a group using a rounding method."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Output:"})," the percentile of the given value over a group."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Person)\nRETURN percentileDisc(n.age, 0.5)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"percentileDisc(n.age, 0.5)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"33"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"stDev()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the standard deviation for the given value over a group for a sample of a population."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name IN ['A', 'B', 'C']\nRETURN stDev(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"stDev(n.age)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"15.716233645501712"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"stDevP()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the standard deviation for the given value over a group for an entire population."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name IN ['A', 'B', 'C']\nRETURN stDevP(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"stDevP(n.age)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"12.832251036613439"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"variance()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the variance for the given value over a group for a sample of a population."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name IN ['A', 'B', 'C']\nRETURN variance(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"variance(n.age)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"247"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"varianceP()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the variance for the given value over a group for an entire population."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name IN ['A', 'B', 'C']\nRETURN varianceP(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"varianceP(n.age)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"164.66666666667"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"sum()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the sum of a set of numeric values."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Person)\nRETURN sum(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"sum(n.age)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"90"})})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"35list-funtions",children:"3.5.List Funtions:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"keys()"}),"\n",(0,r.jsx)(e.p,{children:"get the field names of some vertex."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nWHERE a.name = 'Alice'\nRETURN keys(a)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"keys(a)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:'["name","age","eyes"]'})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"labels()/label()"}),"\n",(0,r.jsx)(e.p,{children:"Returns a list containing the string representations for all the property names of a node, relationship, or map."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nWHERE a.name = 'Alice'\nRETURN labels(a)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"labels"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:'["Person","Developer"]'})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"nodes()"}),"\n",(0,r.jsx)(e.p,{children:"Get vertex ids of a path"}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH p = (from {name: 'Bob'})-[*1..]->(to {name: 'Alice'})\nRETURN nodes(p)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"nodes(p)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"[0, 1, 10, 12]"})})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"36mathematical-functions",children:"3.6.Mathematical functions"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"abs()"}),"\n",(0,r.jsx)(e.p,{children:"get the absolute value of some data."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a:person {name: 'Laurence Fishburne'}),(e:person {name: 'Carrie-Anne Moss'})\nRETURN a.born, e.born, abs(a.born-e.born)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"a.born"}),(0,r.jsx)(e.th,{children:"e.born"}),(0,r.jsx)(e.th,{children:"abs(a.born - e.born)"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"1961"}),(0,r.jsx)(e.td,{children:"1967"}),(0,r.jsx)(e.td,{children:"6"})]})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"ceil()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the smallest floating point number that is greater than or equal to a number and equal to a mathematical integer."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance.\n",(0,r.jsx)(e.strong,{children:"Example input:"})]}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN ceil(0.1)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"ceil(0.1)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"1.0"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"floor()"}),"\n",(0,r.jsx)(e.p,{children:"get the largest floating point number that is less than or equal to the given number and equal to a mathematical integer."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN floor(0.9)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"floor(0.9)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"0.0"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"round()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the value of a number rounded to the nearest integer."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN round(3.141592)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"round"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"3"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"rand()"}),"\n",(0,r.jsx)(e.p,{children:"Returns returns a random floating point number in the range from 0 (inclusive) to 1 exclusive)."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN rand()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"rand()"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"0.9797131960534085"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"sign()"}),"\n",(0,r.jsx)(e.p,{children:"Get the signum of the given number: 0 if the number is 0, -1 for any negative number, and 1 for any positive number."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN sign(-17), sign(0.1)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"sign(-17)"}),(0,r.jsx)(e.th,{children:"sign(0.1)"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"-1"}),(0,r.jsx)(e.td,{children:"1"})]})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"4extensions-to-opencypher",children:"4.Extensions To OpenCypher"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Number of Labels"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"TuGraph: Each node/relationship must have one and only one label. So error occurs when there is no label, and the 1st label will be picked as the label if there are more than one label."}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"OpenCypher: One node/relationship may have 0 to many labels."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Schema."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"TuGraph: TuGraph has strong schema"}),"\n",(0,r.jsx)(e.li,{children:"OpenCypher: schema-less"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"5procedures",children:"5.Procedures"}),"\n",(0,r.jsx)(e.h3,{id:"51procedures-demos",children:"5.1.procedures' demos"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.procedures()"}),"\n",(0,r.jsx)(e.p,{children:"Lists all available procedures."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Output:"})," a list of {",(0,r.jsx)(e.code,{children:"signature"}),", ",(0,r.jsx)(e.code,{children:"name"}),"}."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.procedures()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"signature"}),(0,r.jsx)(e.th,{children:"name"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.vertexLabels() :: (label::STRING)"}),(0,r.jsx)(e.td,{children:"db.vertexLabels"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.edgeLabels() :: (edgeLabels::STRING)"}),(0,r.jsx)(e.td,{children:"db.edgeLabels"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.indexes() :: (index::LIST)"}),(0,r.jsx)(e.td,{children:"db.indexes"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"..."}),(0,r.jsx)(e.td,{children:"..."})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.vertexLabels()"}),"\n",(0,r.jsx)(e.p,{children:"Lists all available labels of vertex."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Output:"})," a list of {",(0,r.jsx)(e.code,{children:"name"}),"}."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.vertexLabels()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"label"})})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"genre"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"keyword"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"movie"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"..."})})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.edgeLabels()"}),"\n",(0,r.jsx)(e.p,{children:"Lists all available labels of edges."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Output:"})," a list of {edgeLabels}."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.edgeLabels()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"edgeLabel"})})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"acted_in"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"directed"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"..."})})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.createVertexLabel(label_name, primary_field, field_spec...)"}),"\n",(0,r.jsx)(e.p,{children:"Create a vertex label."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of vertex label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"primary_field"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"primary field of vertex label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_spec"}),(0,r.jsx)(e.td,{children:"list"}),(0,r.jsx)(e.td,{children:"specification of a field"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which each ",(0,r.jsx)(e.code,{children:"field_spec"})," is a list of string in the form of ",(0,r.jsx)(e.code,{children:"[field_name, field_type, true]"}),", where true is specified only for optional fields."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Output:"})," If successful, it returns a success message."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.createVertexLabel('Person', 'id', 'id', 'int64', false, 'name', 'string', true)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"Added label [Person]\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.getLabelSchema(label_type, label_name)"}),"\n",(0,r.jsx)(e.p,{children:"Get the schema definition of the label in a subgraph."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," subgraph, as specified in the ",(0,r.jsx)(e.code,{children:"graph"})," parameter in REST or RPC request."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_type"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"either 'vertex' or 'edge'"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Output:"})," a list of label specifications, in which each element is a list of the following fields:"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"field_name"}),(0,r.jsx)(e.th,{children:"field_type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the field"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"type"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"type of the field"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"optional"}),(0,r.jsx)(e.td,{children:"boolean"}),(0,r.jsx)(e.td,{children:"whether the field is optional"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.getLabelSchema('vertex', 'Person')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"name"}),(0,r.jsx)(e.th,{children:"type"}),(0,r.jsx)(e.th,{children:"optional"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"id"}),(0,r.jsx)(e.td,{children:"INT32"}),(0,r.jsx)(e.td,{children:"false"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"born"}),(0,r.jsx)(e.td,{children:"INT32"}),(0,r.jsx)(e.td,{children:"true"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"STRING"}),(0,r.jsx)(e.td,{children:"true"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"poster_image"}),(0,r.jsx)(e.td,{children:"STRING"}),(0,r.jsx)(e.td,{children:"true"})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.createLabel(label_type, label_name, extra, field_spec...)"}),"\n",(0,r.jsx)(e.p,{children:"Create a vertex or edge label."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_type"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"either 'vertex' or 'edge'"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"extra"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"for edge, it means constraints; for vertex, it means primary property"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_spec"}),(0,r.jsx)(e.td,{children:"list"}),(0,r.jsx)(e.td,{children:"specification of a field"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which each ",(0,r.jsx)(e.code,{children:"field_spec"})," is a list of string in the form of ",(0,r.jsx)(e.code,{children:"[field_name, field_type, 'optional']"}),".\nfor edge, ",(0,r.jsx)(e.code,{children:"extra"})," should be a json array string, like this ",(0,r.jsx)(e.code,{children:'[["label1","label2"], ["label3","label4"]]'}),", if edge has no constraints, give an empty json array, like this ",(0,r.jsx)(e.code,{children:"[]"}),"\n",(0,r.jsx)(e.strong,{children:"Output:"})]}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.createLabel('vertex', 'new_label', 'id', ['id','int32',false], ['name','string', true]);\nCALL db.createLabel('edge', 'new_edge', '[[\"id1\",\"id2\"]]', ['id','int32',false], ['name', 'string', true]);\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"Vertex label [new_label] successfully added.\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.deleteLabel(label_type, label_name)"}),"\n",(0,r.jsx)(e.p,{children:"Delete a vertex or edge label."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_type"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"either 'vertex' or 'edge'"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"field_name"}),(0,r.jsx)(e.th,{children:"field_type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"affected"}),(0,r.jsx)(e.td,{children:"integer"}),(0,r.jsx)(e.td,{children:"number of vertexes/edges deleted"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.deleteLabel('vertex', 'person')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"affected"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"1024"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.alterLabelDelFields(label_type, label_name, field_names)"}),"\n",(0,r.jsx)(e.p,{children:"Delete specified fields from the label."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_type"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"either 'vertex' or 'edge'"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_names"}),(0,r.jsx)(e.td,{children:"list of strings"}),(0,r.jsx)(e.td,{children:"names of the fields to delete"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"field_name"}),(0,r.jsx)(e.th,{children:"field_type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"affected"}),(0,r.jsx)(e.td,{children:"integer"}),(0,r.jsx)(e.td,{children:"number of vertexes/edges modified"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.alterLabelDelFields('vertex', 'Person', ['name', 'image'])\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"affected"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"1024"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.alterLabelAddFields(label_type, label_name, field_value_spec...)"}),"\n",(0,r.jsx)(e.p,{children:"Adds specified fields to the label."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_type"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"either 'vertex' or 'edge'"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_value_spec"}),(0,r.jsx)(e.td,{children:"list"}),(0,r.jsx)(e.td,{children:"specification of a field"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which each ",(0,r.jsx)(e.code,{children:"field_value_spec"})," is a list of string in the form of ",(0,r.jsx)(e.code,{children:"[field_name, field_type, field_value, 'optional']"}),", where: ",(0,r.jsx)(e.code,{children:"field_value"})," is the default value of the field."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"field_name"}),(0,r.jsx)(e.th,{children:"field_type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"affected"}),(0,r.jsx)(e.td,{children:"integer"}),(0,r.jsx)(e.td,{children:"number of vertexes/edges modified"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.alterLabelAddFields(\n'vertex',\n'new_label',\n['birth_date', DATE, '', true],\n['img', BLOB, '', true])\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"affected"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"1024"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.alterLabelModFields(label_type, label_name, field_spec...)"}),"\n",(0,r.jsx)(e.p,{children:"Modifies the specified fields in the label."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_type"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"either 'vertex' or 'edge'"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_spec"}),(0,r.jsx)(e.td,{children:"list"}),(0,r.jsx)(e.td,{children:"specification of a field"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which each ",(0,r.jsx)(e.code,{children:"field_spec"})," is a list of string in the form of ",(0,r.jsx)(e.code,{children:"[field_name, field_type, 'optional']"}),".The target field should exist."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"field_name"}),(0,r.jsx)(e.th,{children:"field_type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"affected"}),(0,r.jsx)(e.td,{children:"integer"}),(0,r.jsx)(e.td,{children:"number of vertexes/edges modified"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.alterLabelModFields(\n'vertex',\n'new_label',\n['birth_date', 'DATETIME', '1900-01-01 00:00:00'],\n['gender', 'BOOL', false])\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"affected"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"1024"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.createEdgeLabel( label_name, field_spec...)"}),"\n",(0,r.jsx)(e.p,{children:"Create an edge label."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"edge_constraints"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"edge constraints"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_spec"}),(0,r.jsx)(e.td,{children:"list"}),(0,r.jsx)(e.td,{children:"specification of a field"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which each ",(0,r.jsx)(e.code,{children:"field_spec"})," is a list of string in the form of ",(0,r.jsx)(e.code,{children:"[field_name, field_type, optional]"}),", where optional is specified as true, only for optional fields."]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"edge_constraints"})," is a json array string, This parameter limits the combination of starting and ending vertex of the edge, for example: ",(0,r.jsx)(e.code,{children:'\'[["vertex_label1","vertex_label2"],["vertex_label3","vertex_label4"]]\''}),", which limits the edge direction can only be from ",(0,r.jsx)(e.code,{children:"vertex_label1"})," to ",(0,r.jsx)(e.code,{children:"vertex_label2"})," or from ",(0,r.jsx)(e.code,{children:"vertex_label3"})," to ",(0,r.jsx)(e.code,{children:"vertex_label4"}),". If you don't want to have any constraints, give an empty array string, like this ",(0,r.jsx)(e.code,{children:"'[]'"})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.createEdgeLabel('KNOWS', '[]', 'name', 'int32',true)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"Added type [KNOWS]\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.addIndex(label_name, field_name, unique)"}),"\n",(0,r.jsx)(e.p,{children:"create an index on some field of one vertex label ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"specification of a field"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"unique"}),(0,r.jsx)(e.td,{children:"boolean"}),(0,r.jsx)(e.td,{children:"Specifies whether the index is unique"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.addIndex('Person', 'id', true)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"Added index [Perosn:id]\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.addEdgeIndex(label_name, field_name, unique, pair_unique)"}),"\n",(0,r.jsx)(e.p,{children:"create an index on some field of one edge label ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"specification of a field"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"unique"}),(0,r.jsx)(e.td,{children:"boolean"}),(0,r.jsx)(e.td,{children:"Specifies whether the index is unique"})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"| pair_unique | boolean | Specifies whether the index is pair_unique |"}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.addEdgeIndex('BornIn', 'id', true, false)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"Added index [BornIn:id]\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.changePassword(current_password ,new_password)"}),"\n",(0,r.jsx)(e.p,{children:"Change the current user's password."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"current_password"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the current password"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"new_password"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"new password"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.changePassword('73@TuGraph','admin')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"true\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.changeUserPassword(user_name, new_password)"}),"\n",(0,r.jsx)(e.p,{children:"Change the current user's password."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the user's name"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"new_password"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"new password"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.changeUserPassword('quest','73@TuGraph')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"true\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.createUser(user_name, password)"}),"\n",(0,r.jsx)(e.p,{children:"create new user on this graph database."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the new user name"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"password"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the password of new user"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.createUser('quest',\"admin\")\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"true\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.deleteUser(user_name)"}),"\n",(0,r.jsx)(e.p,{children:"delete user on this graph database."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the user name to be deleted"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.deleteUser('quest')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"true\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.listUsers()"}),"\n",(0,r.jsx)(e.p,{children:"get all user's name of the graph database."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"a list of user names, in which each element is a list of the following fields:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user.name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the user name"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"is.admin"}),(0,r.jsx)(e.td,{children:"boolean"}),(0,r.jsx)(e.td,{children:"the permission of this user"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.listUsers()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"user.name"}),(0,r.jsx)(e.th,{children:"is.admin"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"admin"}),(0,r.jsx)(e.td,{children:"true"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"..."}),(0,r.jsx)(e.td,{children:"..."})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.showCurrentUser()"}),"\n",(0,r.jsx)(e.p,{children:"get current user's name."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"a list of user names, in which each element is a list of the following fields:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user.user"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the current user name"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.showCurrentUser()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"user.name"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"admin"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.listAllowedHosts()"}),"\n",(0,r.jsx)(e.p,{children:"get the list of ips to be allowed ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"a list of ips which are allowed."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.listAllowedHosts()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"host"})})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"192.168.1.22"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"..."})})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.deleteAllowedHosts(hosts)"}),"\n",(0,r.jsx)(e.p,{children:"delete some ips from the list of ips to be allowed ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"the number of ip which been deleted."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.deleteAllowedHosts('192.168.1.22','192.168.1.23')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"success"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"2"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.addAllowedHosts(hosts)"}),"\n",(0,r.jsx)(e.p,{children:"add some ips from the list of ips to be allowed ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"the number of ip which been added."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.addAllowedHosts('192.168.1.22','192.168.1.23')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"success"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"2"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.graph.createGraph(graph_name, description, max_size_GB)"}),"\n",(0,r.jsx)(e.p,{children:"create a new subgraph in this graph database ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the name of new subgraph"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"description"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"description of new subgraph"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"max_size_GB"}),(0,r.jsx)(e.td,{children:"integer"}),(0,r.jsx)(e.td,{children:"Upper limit of subgraph capacity"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"if successful , it will return true."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.graph.createGraph('graph1', 'description', 2045)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"success"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"true"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.graph.deleteGraph(graph_name)"}),"\n",(0,r.jsx)(e.p,{children:"delete a subgraph in this graph database ."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the name of subgraph to been deleted"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"if successful , it will return true."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.graph.deleteGraph('graph1')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"success"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"true"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.graph.modGraph(graph_name, config)"}),"\n",(0,r.jsx)(e.p,{children:"delete a subgraph in this graph database ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the name of subgraph to been deleted"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"config"}),(0,r.jsx)(e.td,{children:"map"}),(0,r.jsx)(e.td,{children:"the configuration to be modified"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"if successful , it will return true."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.graph.modGraph('graph1',{description:'this graph', max_size_GB:20})\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"success"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"true"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.graph.listGraphs()"}),"\n",(0,r.jsx)(e.p,{children:"get all subgraph in this graph database ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"a list of {subgraph and configuration}."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.graph.listGraphs()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"graph.name"}),(0,r.jsx)(e.th,{children:"configuration"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"default"}),(0,r.jsx)(e.td,{children:'{"description":"","max_size_GB":1024}'})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph1"}),(0,r.jsx)(e.td,{children:'{"description":"this graph","max_size_GB":20}'})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"..."}),(0,r.jsx)(e.td,{children:"..."})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.graph.listUserGraphs(user_name)"}),"\n",(0,r.jsx)(e.p,{children:"get subgraph list which specified user can read or write"}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"a list of {subgraph and configuration}."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:'CALL dbms.graph.listUserGraphs("test_user")\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"graph.name"}),(0,r.jsx)(e.th,{children:"configuration"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"default"}),(0,r.jsx)(e.td,{children:'{"description":"","max_size_GB":1024}'})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph1"}),(0,r.jsx)(e.td,{children:'{"description":"this graph","max_size_GB":20}'})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"..."}),(0,r.jsx)(e.td,{children:"..."})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.config.list()"}),"\n",(0,r.jsx)(e.p,{children:"get some config of this graph database ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"a list of {configuration}."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.config.list()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"name"}),(0,r.jsx)(e.th,{children:"value"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"bind_host"}),(0,r.jsx)(e.td,{children:"0.0.0.0"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"durable"}),(0,r.jsx)(e.td,{children:"true"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"..."}),(0,r.jsx)(e.td,{children:"..."})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.config.update(updates)"}),"\n",(0,r.jsx)(e.p,{children:"get some config of this graph database ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message"}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.config.update({\n enable_ip_check:false,\n durable:true,\n optimistic_txn:true,\n enable_audit_log:true})\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"Update succeeded.\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.takeSnapshot()"}),"\n",(0,r.jsx)(e.p,{children:"take the snapshot on this current graph database."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns the path of snapshot."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.takeSnapshot()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"path"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"log/db/snapshot/2020-07-20_17.20.03"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.listBackupFiles()"}),"\n",(0,r.jsx)(e.p,{children:"get the path of backuped files."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns the path of snapshot."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.listBackupFiles()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"path"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"tugraph/db/binlog/binlog_0"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"algo.shortestPath(startNode, endNode, config)"}),"\n",(0,r.jsx)(e.p,{children:"get one of the shortest paths between two vertexes."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"startNode"}),(0,r.jsx)(e.td,{children:"Node"}),(0,r.jsx)(e.td,{children:"the source node of paths"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"endNode"}),(0,r.jsx)(e.td,{children:"Node"}),(0,r.jsx)(e.td,{children:"the destination node paths"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"config"}),(0,r.jsx)(e.td,{children:"MAP"}),(0,r.jsx)(e.td,{children:"the filter of shortest paths, the formate as {maxHops:3, relationshipQuery:'HAS_CHILD'}"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it will returns one group result of the shortest path."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n1 {name:'Hugo Weaving'}),(n2 {title:'The Matrix'})\nCALL algo.shortestPath(n1,n2) YIELD nodeCount,totalCost RETURN nodeCount,totalCost\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"nodeCount"}),(0,r.jsx)(e.th,{children:"totalCost"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"2"}),(0,r.jsx)(e.td,{children:"1"})]})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"algo.allShortestPaths(startNode, endNode, config))"}),"\n",(0,r.jsx)(e.p,{children:"get the path of backuped files."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns the path of snapshot."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n1 {name:'Hugo Weaving'}),(n2 {title:'The Matrix'})\nCALL algo.allShortestPaths(n1,n2) YIELD nodeIds,cost RETURN nodeIds,cost\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"nodeIds"}),(0,r.jsx)(e.th,{children:"cost"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"[2,665]"}),(0,r.jsx)(e.td,{children:"1"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"..."}),(0,r.jsx)(e.td,{})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"algo.algo.native.extract(id, config))"}),"\n",(0,r.jsx)(e.p,{children:"get the field values of a list of vertexes or edges."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"id"}),(0,r.jsx)(e.td,{children:"ANY"}),(0,r.jsx)(e.td,{children:"the id of vertexes or edges , the id must be variable"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"config"}),(0,r.jsx)(e.td,{children:"MAP"}),(0,r.jsx)(e.td,{children:"the configuration of this extraction of vertexes or edges"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which each ",(0,r.jsx)(e.code,{children:"config"})," is a map in the form of ",(0,r.jsx)(e.code,{children:"{isNode:true, filed:'HAS_CHILD'}"}),", if ",(0,r.jsx)(e.code,{children:"isNode"})," is specified true, the ",(0,r.jsx)(e.code,{children:"id"})," is a vertex id, or it is an edge id."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a list of the value of vertexes or edges specified field ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"with [2,3] as vids CALL algo.native.extract(vids,{isNode:true, field:'id'})\nYIELD value RETURN value\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"value"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"[4,5]"})})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"52whole-list-of-procedures",children:"5.2.Whole List Of Procedures"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Name"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Signature"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.vertexLabels"}),(0,r.jsx)(e.td,{children:"list all vertex labels"}),(0,r.jsx)(e.td,{children:"db.vertexLabels() :: (label::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.edgeLabels"}),(0,r.jsx)(e.td,{children:"list all edge labels"}),(0,r.jsx)(e.td,{children:"db.edgeLabels() :: (edgeLabels::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.indexes"}),(0,r.jsx)(e.td,{children:"list all indexes"}),(0,r.jsx)(e.td,{children:"db.indexes() :: (label::STRING,field::STRING,label_type:STRING,unique::BOOLEAN,pair_unique::BOOLEAN)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.listLabelIndexes"}),(0,r.jsx)(e.td,{children:"list indexes by label"}),(0,r.jsx)(e.td,{children:"db.listLabelIndexes(label_name:STRING,label_type:STRING) :: (label::STRING,field::STRING,unique::BOOLEAN,pair_unique::BOOLEAN)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.warmup"}),(0,r.jsx)(e.td,{children:"warm up the DB"}),(0,r.jsx)(e.td,{children:"db.warmup() :: (time_used::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.createVertexLabel"}),(0,r.jsx)(e.td,{children:"create a vertex label"}),(0,r.jsx)(e.td,{children:"db.createVertexLabel(label_name::STRING,field_specs::LIST) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.createLabel"}),(0,r.jsx)(e.td,{children:"create a vertex/edge label"}),(0,r.jsx)(e.td,{children:"db.createLabel(label_type::STRING,label_name::STRING,extra::STRING,field_specs::LIST) :: ()"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.getLabelSchema"}),(0,r.jsx)(e.td,{children:"get the schema of label"}),(0,r.jsx)(e.td,{children:"db.getLabelSchema(label_type::STRING,label_name::STRING) :: (name::STRING,type::STRING,optional::BOOLEAN)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.getVertexSchema"}),(0,r.jsx)(e.td,{children:"get the schema of vertex label"}),(0,r.jsx)(e.td,{children:"db.getVertexSchema(label::STRING) :: (schema::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.getEdgeSchema"}),(0,r.jsx)(e.td,{children:"get the schema of edge label"}),(0,r.jsx)(e.td,{children:"db.getEdgeSchema(label::STRING) :: (schema::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.deleteLabel"}),(0,r.jsx)(e.td,{children:"delete vertex/edge label"}),(0,r.jsx)(e.td,{children:"db.deleteLabel(label_type::STRING,label_name::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.alterLabelDelFields"}),(0,r.jsx)(e.td,{children:"delete some fields of a label on a subgraph"}),(0,r.jsx)(e.td,{children:"db.alterLabelDelFields(label_type::STRING,label_name::STRING,del_fields::LIST) :: (record_affected::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.alterLabelAddFields"}),(0,r.jsx)(e.td,{children:"add some fields of a label on a subgraph"}),(0,r.jsx)(e.td,{children:"db.alterLabelAddFields(label_type::STRING,label_name::STRING,add_field_spec_values::LIST) :: (record_affected::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.alterLabelModFields"}),(0,r.jsx)(e.td,{children:"modify some fields of a label on a subgraph"}),(0,r.jsx)(e.td,{children:"db.alterLabelModFields(label_type::STRING,label_name::STRING,mod_field_specs::LIST) :: (record_affected::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.createEdgeLabel"}),(0,r.jsx)(e.td,{children:"create a edge label"}),(0,r.jsx)(e.td,{children:"db.createEdgeLabel(type_name::STRING,field_specs::LIST) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.addIndex"}),(0,r.jsx)(e.td,{children:"add an index"}),(0,r.jsx)(e.td,{children:"db.addIndex(label_name::STRING,field_name::STRING,unique::BOOLEAN) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.addEdgeIndex"}),(0,r.jsx)(e.td,{children:"add an index"}),(0,r.jsx)(e.td,{children:"db.addEdgeIndex(label_name::STRING,field_name::STRING,unique::BOOLEAN,pair_unique::BOOLEAN) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.addVertexCompositeIndex"}),(0,r.jsx)(e.td,{children:"add composite index"}),(0,r.jsx)(e.td,{children:"db.addVertexCompositeIndex(label_name::STRING,field_names::LIST,unique::BOOLEAN) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.deleteIndex"}),(0,r.jsx)(e.td,{children:"delete an index"}),(0,r.jsx)(e.td,{children:"db.deleteIndex(label_name::STRING,field_name::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.backup"}),(0,r.jsx)(e.td,{children:"backup the db"}),(0,r.jsx)(e.td,{children:"db.backup(destination::STRING) :: ()"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.procedures"}),(0,r.jsx)(e.td,{children:"list all procedures"}),(0,r.jsx)(e.td,{children:"dbms.procedures() :: (name::STRING,signature::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.changePassword"}),(0,r.jsx)(e.td,{children:"change current user password"}),(0,r.jsx)(e.td,{children:"dbms.security.changePassword(current_password::STRING,new_password::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.changeUserPassword"}),(0,r.jsx)(e.td,{children:"change user password"}),(0,r.jsx)(e.td,{children:"dbms.security.changeUserPassword(user_name::STRING,new_password::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.createUser"}),(0,r.jsx)(e.td,{children:"create an account"}),(0,r.jsx)(e.td,{children:"dbms.security.createUser(user_name::STRING,password::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.deleteUser"}),(0,r.jsx)(e.td,{children:"delete an account"}),(0,r.jsx)(e.td,{children:"dbms.security.deleteUser(user_name::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.listUsers"}),(0,r.jsx)(e.td,{children:"list all accounts"}),(0,r.jsx)(e.td,{children:"dbms.security.listUsers() :: (user_name::STRING,user_info::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.showCurrentUser"}),(0,r.jsx)(e.td,{children:"get current user name"}),(0,r.jsx)(e.td,{children:"dbms.security.showCurrentUser() :: (current_user::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.getUserPermissions"}),(0,r.jsx)(e.td,{children:"get the permissions of a specified user"}),(0,r.jsx)(e.td,{children:"dbms.security.getUserPermissions(user_name::STRING) :: (user_info::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.graph.createGraph"}),(0,r.jsx)(e.td,{children:"create a subgraph"}),(0,r.jsx)(e.td,{children:"dbms.graph.createGraph(graph_name::STRING, description::STRING, max_size_GB::INTEGER) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.graph.modGraph"}),(0,r.jsx)(e.td,{children:"modify the config of a subgraph"}),(0,r.jsx)(e.td,{children:"dbms.graph.modGraph(graph_name::STRING,config::MAP) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.graph.deleteGraph"}),(0,r.jsx)(e.td,{children:"delete a subgraph"}),(0,r.jsx)(e.td,{children:"dbms.graph.deleteGraph(graph_name::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.graph.listGraphs"}),(0,r.jsx)(e.td,{children:"list all subgraphs"}),(0,r.jsx)(e.td,{children:"dbms.graph.listGraphs() :: (graph_name::STRING,configuration::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.graph.getGraphInfo"}),(0,r.jsx)(e.td,{children:"get the information of a specified graph"}),(0,r.jsx)(e.td,{children:"dbms.graph.getGraphInfo(graph_name::STRING)::(graph_name::STRING,configuration::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.addAllowedHosts"}),(0,r.jsx)(e.td,{children:"add to the trust list"}),(0,r.jsx)(e.td,{children:"dbms.security.addAllowedHosts(hosts::LIST) :: (num_new::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.deleteAllowedHosts"}),(0,r.jsx)(e.td,{children:"remove from the trust list"}),(0,r.jsx)(e.td,{children:"dbms.security.deleteAllowedHosts(hosts::LIST) :: (record_affected::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.listAllowedHosts"}),(0,r.jsx)(e.td,{children:"list the trust list"}),(0,r.jsx)(e.td,{children:"dbms.security.listAllowedHosts() :: (host::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.config.update"}),(0,r.jsx)(e.td,{children:"update the configuration"}),(0,r.jsx)(e.td,{children:"dbms.config.update(updates::MAP) :: (message::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.config.list"}),(0,r.jsx)(e.td,{children:"list the configuration"}),(0,r.jsx)(e.td,{children:"dbms.config.list() :: (name::STRING,value::ANY)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"algo.shortestPath"}),(0,r.jsx)(e.td,{children:"get a shortest path between two vertexes"}),(0,r.jsx)(e.td,{children:"algo.shortestPath(startNode::NODE,endNode::NODE,config::MAP) :: (nodeCount::INTEGER,totalCost::FLOAT)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"algo.allShortestPaths"}),(0,r.jsx)(e.td,{children:"get all the shortest paths between two vertexes"}),(0,r.jsx)(e.td,{children:"algo.allShortestPaths(startNode::NODE,endNode::NODE,config::MAP) :: (nodeIds::LIST,relationshipIds::LIST,cost::LIST)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"algo.native.extract"}),(0,r.jsx)(e.td,{children:"get the field values of a list of vertexes or edges specified id"}),(0,r.jsx)(e.td,{children:"algo.native.extract(id::ANY,config::MAP) :: (value::ANY)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.flushDB"}),(0,r.jsx)(e.td,{children:"flush the db"}),(0,r.jsx)(e.td,{children:"db.flushDB() :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.listRoles"}),(0,r.jsx)(e.td,{children:"list all roles"}),(0,r.jsx)(e.td,{children:"dbms.security.listRoles() :: (role_name::STRING,role_info::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.createRole"}),(0,r.jsx)(e.td,{children:"create a role"}),(0,r.jsx)(e.td,{children:"dbms.security.createRole(role_name::STRING,desc::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.deleteRole"}),(0,r.jsx)(e.td,{children:"delete a role"}),(0,r.jsx)(e.td,{children:"dbms.security.deleteRole(role_name::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.getRoleInfo"}),(0,r.jsx)(e.td,{children:"get the role information"}),(0,r.jsx)(e.td,{children:"dbms.security.getRoleInfo(role::STRING) :: (role_info::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.disableRole"}),(0,r.jsx)(e.td,{children:"enable/disable the role"}),(0,r.jsx)(e.td,{children:"dbms.security.disableRole(role::STRING,disable::BOOLEAN) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.modRoleDesc"}),(0,r.jsx)(e.td,{children:"modify the description of a role"}),(0,r.jsx)(e.td,{children:"dbms.security.modRoleDesc(role::STRING,description::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.rebuildRoleAccessLevel"}),(0,r.jsx)(e.td,{children:"rebuild the user subgraph access rights"}),(0,r.jsx)(e.td,{children:"dbms.security.rebuildRoleAccessLevel(role::STRING,access_level::MAP) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.modRoleAccessLevel"}),(0,r.jsx)(e.td,{children:"modify the user subgraph access rights"}),(0,r.jsx)(e.td,{children:"dbms.security.modRoleAccessLevel(role::STRING,access_level::MAP) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.modRoleFieldAccessLevel"}),(0,r.jsx)(e.td,{children:"modify the user property access rights"}),(0,r.jsx)(e.td,{children:"dbms.security.modRoleFieldAccessLevel(role::STRING,graph::STRING,label::STRING,field::STRING,label_type::STRING,field_access_level::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.getUserInfo"}),(0,r.jsx)(e.td,{children:"get the user information"}),(0,r.jsx)(e.td,{children:"dbms.security.getUserInfo(user::STRING) :: (user_info::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.getUserMemoryUsage"}),(0,r.jsx)(e.td,{children:"get the memory usage for a user"}),(0,r.jsx)(e.td,{children:"dbms.security.getUserMemoryUsage(user::STRING) :: (memory_usage::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.disableUser"}),(0,r.jsx)(e.td,{children:"enable/disable the user"}),(0,r.jsx)(e.td,{children:"dbms.security.disableUser(user::STRING,disable::BOOLEAN) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.setCurrentDesc"}),(0,r.jsx)(e.td,{children:"set the current user description"}),(0,r.jsx)(e.td,{children:"dbms.security.setCurrentDesc(description::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.setUserDesc"}),(0,r.jsx)(e.td,{children:"set user description"}),(0,r.jsx)(e.td,{children:"dbms.security.setUserDesc(user::STRING,description::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.setUserMemoryLimit"}),(0,r.jsx)(e.td,{children:"set user memory limit"}),(0,r.jsx)(e.td,{children:"dbms.security.setUserMemoryLimit(user::STRING,memorylimit::INTEGER) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.deleteUserRoles"}),(0,r.jsx)(e.td,{children:"delete roles from the user"}),(0,r.jsx)(e.td,{children:"dbms.security.deleteUserRoles(user::STRING,roles::LIST) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.rebuildUserRoles"}),(0,r.jsx)(e.td,{children:"rebuild the relationship between the user and the role"}),(0,r.jsx)(e.td,{children:"dbms.security.rebuildUserRoles(user::STRING,roles::LIST) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.addUserRoles"}),(0,r.jsx)(e.td,{children:"add the user roles"}),(0,r.jsx)(e.td,{children:"dbms.security.addUserRoles(user::STRING,roles::LIST) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.plugin.loadPlugin"}),(0,r.jsx)(e.td,{children:"load a plugin"}),(0,r.jsx)(e.td,{children:"db.plugin.loadPlugin(plugin_type::STRING,plugin_name::STRING,plugin_content::STRING or MAP,code_type::STRING,plugin_description::STRING,read_only::BOOLEAN, version::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.plugin.deletePlugin"}),(0,r.jsx)(e.td,{children:"unload a plugin"}),(0,r.jsx)(e.td,{children:"db.plugin.deletePlugin(plugin_type::STRING,plugin_name::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.plugin.listPlugin"}),(0,r.jsx)(e.td,{children:"list all plugins"}),(0,r.jsx)(e.td,{children:"db.plugin.listPlugin(plugin_type::STRING,plugin_version::STRING) :: (plugin_description::LIST)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.plugin.getPluginInfo"}),(0,r.jsx)(e.td,{children:"get the information of a specified plugin"}),(0,r.jsx)(e.td,{children:"db.plugin.getPluginInfo(plugin_type::STRING,plugin_name::STRING,show_code::BOOLEAN)::(plugin_description::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.plugin.callPlugin"}),(0,r.jsx)(e.td,{children:"execute the plugins"}),(0,r.jsx)(e.td,{children:"db.plugin.callPlugin(plugin_type::STRING,plugin_name::STRING,param::STRING,timeout::DOUBLE,in_process::BOOLEAN) :: (success::BOOLEAN,result::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.importor.dataImportor"}),(0,r.jsx)(e.td,{children:"import vertex/edge data"}),(0,r.jsx)(e.td,{children:"db.importor.dataImportor(description::STRING,content::STRING,continue_on_error::BOOLEAN,thread_nums::INTEGER,delimiter::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.importor.schemaImportor"}),(0,r.jsx)(e.td,{children:"import vertex/edge schema"}),(0,r.jsx)(e.td,{children:"db.importor.schemaImportor(description::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.meta.count"}),(0,r.jsx)(e.td,{children:"get the total number of vertex and edge"}),(0,r.jsx)(e.td,{children:"db.dbms.meta.count() :: (type::STRING, number::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.meta.countDetail"}),(0,r.jsx)(e.td,{children:"get the number of vertex and edge for each label"}),(0,r.jsx)(e.td,{children:"db.dbms.meta.countDetail() :: (is_vertex::BOOLEAN, label::STRING, count::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.meta.refreshCount"}),(0,r.jsx)(e.td,{children:"recount the number of vertex and edge, stop writing during the count"}),(0,r.jsx)(e.td,{children:"db.dbms.meta.refreshCount() :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.task.listTasks"}),(0,r.jsx)(e.td,{children:"list running tasks"}),(0,r.jsx)(e.td,{children:"dbms.task.listTasks()::(tasks::LIST)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.task.terminateTask"}),(0,r.jsx)(e.td,{children:"terminate task"}),(0,r.jsx)(e.td,{children:"dbms.task.terminateTask(task_id::STRING)::(::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.ha.clusterInfo"}),(0,r.jsx)(e.td,{children:"get cluster info in HA mode"}),(0,r.jsx)(e.td,{children:"dbms.ha.clusterInfo() :: (cluster_info::LIST, is_master::BOOLEAN)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.dropDB"}),(0,r.jsx)(e.td,{children:"empty the db"}),(0,r.jsx)(e.td,{children:"db.dropDB() :: (::VOID)"})]})]})]})]})}function j(n={}){const{wrapper:e}={...(0,d.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(x,{...n})}):x(n)}},8453:(n,e,s)=>{s.d(e,{R:()=>l,x:()=>t});var r=s(6540);const d={},i=r.createContext(d);function l(n){const e=r.useContext(i);return r.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function t(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(d):n.components||d:l(n.components),r.createElement(i.Provider,{value:e},n.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6635],{3807:(n,e,s)=>{s.r(e),s.d(e,{assets:()=>c,contentTitle:()=>l,default:()=>j,frontMatter:()=>i,metadata:()=>t,toc:()=>h});var r=s(4848),d=s(8453);const i={},l="Cypher API",t={id:"query/cypher",title:"Cypher API",description:"This document mainly introduces the detailed usage instructions of TuGraph-Cypher.",source:"@site/../docs/en-US/source/8.query/1.cypher.md",sourceDirName:"8.query",slug:"/query/cypher",permalink:"/tugraph-db/en/query/cypher",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph RESTful API Legacy",permalink:"/tugraph-db/en/client-tools/restful-api-legacy"},next:{title:"ISO GQL",permalink:"/tugraph-db/en/query/gql"}},c={},h=[{value:"Table of contents",id:"table-of-contents",level:2},{value:"1.Operators",id:"1operators",level:2},{value:"1.1.Summary",id:"11summary",level:3},{value:"1.2.General operators",id:"12general-operators",level:3},{value:"1.3.Mathematical operators",id:"13mathematical-operators",level:3},{value:"1.4.Comparison operators",id:"14comparison-operators",level:3},{value:"1.5.String-specific comparison operators",id:"15string-specific-comparison-operators",level:3},{value:"1.6.Boolean operators",id:"16boolean-operators",level:3},{value:"1.7.String operators",id:"17string-operators",level:3},{value:"1.8.List operators",id:"18list-operators",level:3},{value:"2.Clauses",id:"2clauses",level:2},{value:"2.1.Summary",id:"21summary",level:3},{value:"2.2.MATCH",id:"22match",level:3},{value:"2.3.RETURN",id:"23return",level:3},{value:"2.4.WHERE",id:"24where",level:3},{value:"2.5.SKIP",id:"25skip",level:3},{value:"2.6.LIMIT",id:"26limit",level:3},{value:"2.7.CREATE",id:"27create",level:3},{value:"2.8.CALL[\u2026YIELD]",id:"28callyield",level:3},{value:"2.9.UNION",id:"29union",level:3},{value:"3.Functions",id:"3functions",level:2},{value:"3.1.Whole List Of Functions",id:"31whole-list-of-functions",level:3},{value:"3.2.Predicate functions",id:"32predicate-functions",level:3},{value:"3.3.Scalar functions",id:"33scalar-functions",level:3},{value:"3.4.Aggregating functions",id:"34aggregating-functions",level:3},{value:"3.5.List Funtions:",id:"35list-funtions",level:3},{value:"3.6.Mathematical functions",id:"36mathematical-functions",level:3},{value:"4.Extensions To OpenCypher",id:"4extensions-to-opencypher",level:2},{value:"5.Procedures",id:"5procedures",level:2},{value:"5.1.procedures' demos",id:"51procedures-demos",level:3},{value:"5.2.Whole List Of Procedures",id:"52whole-list-of-procedures",level:3}];function x(n){const e={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...n.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.header,{children:(0,r.jsx)(e.h1,{id:"cypher-api",children:"Cypher API"})}),"\n",(0,r.jsxs)(e.blockquote,{children:["\n",(0,r.jsx)(e.p,{children:"This document mainly introduces the detailed usage instructions of TuGraph-Cypher."}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"table-of-contents",children:"Table of contents"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.a,{href:"#1operators",children:"1.Operators"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#11summary",children:"1.1.Summary"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#12general-operators",children:"1.2.General Operators"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#13mathematical-operators",children:"1.3.Mathematical Operators"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#14comparison-operators",children:"1.4.Comparison Operators"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#15string-specific-comparison-operators",children:"1.5.String Specific Comparison Operators"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#16boolean-operators",children:"1.6.Boolean Operators"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#17string-operators",children:"1.7.String Operators"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#18list-operators",children:"1.8.List Operators"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.a,{href:"#2clauses",children:"2.Clauses"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#21summary",children:"2.1.Summary"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#22match",children:"2.2.Match"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#23return",children:"2.3.Return"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#24where",children:"2.4.Where"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#25skip",children:"2.5.Skip"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#26limit",children:"2.6.Limit"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#27create",children:"2.7.Create"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#28callyield",children:"2.8.Callyield"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#29union",children:"2.9.Union"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.a,{href:"#3functions",children:"3.Functions"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#31whole-list-of-functions",children:"3.1.Whole List of Functions"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#32predicate-functions",children:"3.2.Predicate Functions"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#33scalar-functions",children:"3.3.Scalar Functions"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#34aggregating-functions",children:"3.4.Aggregating Functions"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#35list-funtions",children:"3.5.List Funtions"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#36mathematical-functions",children:"3.6.Mathematical Functions"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#4extensions-to-opencypher",children:"4.Extensions to Opencypher"})}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.a,{href:"#5procedures",children:"5.Procedures"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#51procedures-demos",children:"5.1.Procedures Demos"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.a,{href:"#52whole-list-of-procedures",children:"5.2.Whole List of Procedures"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"1operators",children:"1.Operators"}),"\n",(0,r.jsx)(e.h3,{id:"11summary",children:"1.1.Summary"}),"\n",(0,r.jsx)(e.p,{children:"Operators support progress overview\uff1a"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"category"}),(0,r.jsx)(e.th,{children:"supported"}),(0,r.jsx)(e.th,{children:"unsupported"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"General operators"}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"DISTINCT"}),", ",(0,r.jsx)(e.code,{children:"."})," for property access"]}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"[]"})," for dynamic property access"]})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Mathematical operators"}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"+"}),", ",(0,r.jsx)(e.code,{children:"-"}),", ",(0,r.jsx)(e.code,{children:"*"}),", ",(0,r.jsx)(e.code,{children:"/"}),", ",(0,r.jsx)(e.code,{children:"%"}),", ",(0,r.jsx)(e.code,{children:"^"})]}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Comparison operators"}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"="}),", ",(0,r.jsx)(e.code,{children:"<>"}),", ",(0,r.jsx)(e.code,{children:"<"}),", ",(0,r.jsx)(e.code,{children:">"}),", ",(0,r.jsx)(e.code,{children:"\u21d0"}),", ",(0,r.jsx)(e.code,{children:">="}),", ",(0,r.jsx)(e.code,{children:"IS NULL"}),", ",(0,r.jsx)(e.code,{children:"IS NOT NULL"})]}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"String-specific comparison operators"}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"STARTS WITH"}),", ",(0,r.jsx)(e.code,{children:"ENDS WITH"}),", ",(0,r.jsx)(e.code,{children:"CONTAINS"}),", ",(0,r.jsx)(e.code,{children:"REGEXP"})]}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Boolean operators"}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"AND"}),", ",(0,r.jsx)(e.code,{children:"OR"}),", ",(0,r.jsx)(e.code,{children:"XOR"}),", ",(0,r.jsx)(e.code,{children:"NOT"})]}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"String operators"}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"+"})," for concatenation"]}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"List operators"}),(0,r.jsxs)(e.td,{children:[(0,r.jsx)(e.code,{children:"+"})," for concatenation, ",(0,r.jsx)(e.code,{children:"IN"})," to check existence of an element in a list, ",(0,r.jsx)(e.code,{children:"[]"})," for accessing element(s)"]}),(0,r.jsx)(e.td,{})]})]})]}),"\n",(0,r.jsx)(e.h3,{id:"12general-operators",children:"1.2.General operators"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Using the DISTINCT operator"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (a:Person {name: 'Anne', eyeColor: 'blue'}),\n (b:Person {name: 'Bill', eyeColor: 'brown'}),\n (c:Person {name: 'Carol', eyeColor: 'blue'})\n"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (p:Person ) RETURN DISTINCT p.eyeColor\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:["\u2713 Accessing properties of a nested literal map using the ",(0,r.jsx)(e.code,{children:"."})," operator"]}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH {person: {name: 'Anne', age: 25}} AS p\nRETURN p.person.name\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:["\u274f Filtering on a dynamically-computed property key using the ",(0,r.jsx)(e.code,{children:"[]"})," operator"]}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (a:Restaurant {name: 'Hungry Jo', rating_hygiene: 10, rating_food: 7}),\n (b:Restaurant {name: 'Buttercup Tea Rooms', rating_hygiene: 5, rating_food:6}),\n (c1:Category {name: 'hygiene'}), (c2:Category {name: 'food'})\n"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:'MATCH (restaurant:Restaurant), (category:Category)\nWHERE restaurant["rating_" + category.name] > 6\nRETURN DISTINCT restaurant.name\n'})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"13mathematical-operators",children:"1.3.Mathematical operators"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:["\u2713 Using the exponentiation operator ",(0,r.jsx)(e.code,{children:"^"})]}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH 2 AS number, 3 AS exponent\nRETURN number ^ exponent AS result\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:["\u2713 Using the unary minus operator ",(0,r.jsx)(e.code,{children:"-"})]}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH -3 AS a, 4 AS b\nRETURN b - a AS result\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"14comparison-operators",children:"1.4.Comparison operators"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Comparing two numbers\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH 4 AS one, 3 AS two\nRETURN one > two AS result\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"15string-specific-comparison-operators",children:"1.5.String-specific comparison operators"}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.span,{id:"jump"})}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Using STARTS WITH to filter names"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH ['John', 'Mark', 'Jonathan', 'Bill'] AS somenames\nUNWIND somenames AS names\nWITH names AS candidate\nWHERE candidate STARTS WITH 'Jo'\nRETURN candidate\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Using REGEXP to filter names"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH ['John', 'Mark', 'Jonathan', 'Bill'] AS somenames\nUNWIND somenames AS names\nWITH names AS candidate\nWHERE candidate REGEXP 'Jo.*n'\nRETURN candidate\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"16boolean-operators",children:"1.6.Boolean operators"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Using boolean operators to filter numbers"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH [2, 4, 7, 9, 12] AS numberlist\nUNWIND numberlist AS number\nWITH number\nWHERE number = 4 OR (number > 6 AND number < 10)\nRETURN number\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"17string-operators",children:"1.7.String operators"}),"\n",(0,r.jsx)(e.p,{children:"String operators comprise:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:["\u2713 concatenating strings: ",(0,r.jsx)(e.code,{children:"+"})]}),"\n",(0,r.jsxs)(e.p,{children:["More details on string-specific comparison operators can be found ",(0,r.jsx)(e.a,{href:"#jump",children:"here"})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"18list-operators",children:"1.8.List operators"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Concatenating two lists using +"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN [1,2,3,4,5]+[6,7] AS myList\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Using IN to check if a number is in a list"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH [2, 3, 4, 5] AS numberlist\nUNWIND numberlist AS number\nWITH number\nWHERE number IN [2, 3, 8]\nRETURN number\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Accessing elements in a list using the [] operator"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH ['Anne', 'John', 'Bill', 'Diane', 'Eve'] AS names\nRETURN names[1..3] AS result\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"2clauses",children:"2.Clauses"}),"\n",(0,r.jsx)(e.h3,{id:"21summary",children:"2.1.Summary"}),"\n",(0,r.jsx)(e.p,{children:"Clauses support progress list\uff1a"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Category"}),(0,r.jsx)(e.th,{children:"Syntax"}),(0,r.jsx)(e.th,{children:"Notes"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Reading clauses"}),(0,r.jsx)(e.td,{children:"MATCH"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"OPTIONAL MATCH"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"MANDATORY MATCH"}),(0,r.jsx)(e.td,{children:"Pending"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Projecting clauses"}),(0,r.jsx)(e.td,{children:"RETURN \u2026 [AS]"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"WITH \u2026 [AS]"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"UNWIND \u2026 [AS]"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Reading sub-clauses"}),(0,r.jsx)(e.td,{children:"WHERE"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"ORDER BY [ASC[ENDING] / DESC[ENDING]]"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"SKIP"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"LIMIT"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Writing clauses"}),(0,r.jsx)(e.td,{children:"CREATE"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"DELETE"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"DETACH DELETE"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"SET"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"REMOVE"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Reading/Writing clauses"}),(0,r.jsx)(e.td,{children:"MERGE"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"CALL [\u2026YIELD]"}),(0,r.jsx)(e.td,{children:"Supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Set operations"}),(0,r.jsx)(e.td,{children:"UNION"}),(0,r.jsx)(e.td,{children:"Pending"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"UNION ALL"}),(0,r.jsx)(e.td,{children:"Supported"})]})]})]}),"\n",(0,r.jsx)(e.h3,{id:"22match",children:"2.2.MATCH"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Basic node finding"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Get all nodes\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nRETURN n\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Get all nodes with a label\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (movie:Movie)\nRETURN movie.title\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Related nodes\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (director {name: 'Oliver Stone'})-[]-(movie)\nRETURN movie.title\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Match with labels\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (director {name: 'Oliver Stone'})-[]-(movie)\nRETURN movie.title\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Relationship basics"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Outgoing relationships\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (:Person {name: 'Oliver Stone'})-[]->(movie)\nRETURN movie.title\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Directed relationships and variable\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (:Person {name: 'Oliver Stone'})-[r]->(movie)\nRETURN type(r)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Match on relationship type\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (wallstreet:Movie {title: 'Wall Street'})<-[:ACTED_IN]-(actor)\nRETURN actor.name\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Match on multiple relationship types\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (wallstreet {title: 'Wall Street'})<-[:ACTED_IN|:DIRECTED]-(person)\nRETURN person.name\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Match on relationship type and use a variable\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (wallstreet {title: 'Wall Street'})<-[r:ACTED_IN]-(actor)\nRETURN r.role\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Relationships in depth"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u274f Relationship types with uncommon characters"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n {name: 'Rob Reiner'})-[r:`TYPE WITH SPACE`]->()\nRETURN type(r)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Multiple relationships"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (charlie {name: 'Charlie Sheen'})-[:ACTED_IN]->(movie)<-[:DIRECTED]-(director)\nRETURN movie.title, director.name\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Variable-length relationships"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (martin {name: 'Charlie Sheen'})-[:ACTED_IN*1..3]-(movie:Movie)\nRETURN movie.title\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Relationship variable in variable-length relationships"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH p = (actor {name: 'Charlie Sheen'})-[:ACTED_IN*2]-(co_actor)\nRETURN relationships(p)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u274f Match with properties on a variable-length path"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH p = (charlie:Person)-[* {blocked:false}]-(martin:Person)\nWHERE charlie.name = 'Charlie Sheen' AND martin.name = 'Martin Sheen'\nRETURN p\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Zero-length paths"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (wallstreet:Movie {title: 'Wall Street'})-[*0..1]-(x)\nRETURN x\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Named paths"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH p = (michael {name: 'Michael Douglas'})-[]->() RETURN p\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Matching on a bound relationship"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)-[r]-(b)\nWHERE id(r)= 0\nRETURN a,b\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Shortest path"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Single shortest path\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (martin:person {name: 'Carrie-Anne Moss'}), (laurence:person {name: 'Laurence Fishburne'})\nCALL algo.shortestPath(martin, laurence) YIELD nodeCount,totalCost,path RETURN nodeCount,totalCost,path\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 All shortest paths\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (martin:person {name: 'Carrie-Anne Moss'}), (laurence:person {name: 'Laurence Fishburne'}) WITH martin, laurence\nCALL algo.allShortestPaths(martin, laurence) YIELD nodeIds,relationshipIds,cost RETURN nodeIds,relationshipIds,cost\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Get node or relationship by id"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Node by id\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE id(n)= 0\nRETURN n\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2612 Relationship by id\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH ()-[r]->()\nWHERE id(r) = 0\nRETURN r\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Multiple nodes by id\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE id(n) IN [0, 3, 5]\nRETURN n\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"23return",children:"2.3.RETURN"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Return nodes"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n {name: 'B'}) RETURN n\n"})}),"\n",(0,r.jsxs)(e.blockquote,{children:["\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Note"})}),"\n",(0,r.jsxs)(e.p,{children:["Return ",(0,r.jsx)(e.code,{children:"id"})," of n."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Return relationships"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n {name: 'A'})-[r:KNOWS]->(c)\nRETURN r\n"})}),"\n",(0,r.jsxs)(e.blockquote,{children:["\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Note"})}),"\n",(0,r.jsxs)(e.p,{children:["Return ",(0,r.jsx)(e.code,{children:"EdgeUid"})," of r."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Return property"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n {name: 'A'}) RETURN n.name\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u274f Return all elements"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH p = (a {name: 'A'})-[r]->(b)\nRETURN *\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u274f Variable with uncommon characters"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (`This isn\\'t a common variable`)\nWHERE `This isn\\'t a common variable`.name = 'A'\nRETURN `This isn\\'t a common variable`.happy\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Aliasing a field"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a {name: 'A'})\nRETURN a.age AS SomethingTotallyDifferent\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Optional properties"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nRETURN n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u274f Other expressions"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a {name: 'A'})\nRETURN a.age > 30, \"I'm a literal\", (a)-[]->()\n"})}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"(a)-[]->()"})," not supported."]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Unique results"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a {name: 'A'})-[]->(b)\nRETURN DISTINCT b\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"24where",children:"2.4.WHERE"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Basic usage"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Boolean operations\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name = 'Peter' XOR (n.age < 30 AND n.name = 'Tobias') OR NOT (n.name =\n'Tobias' OR n.name = 'Peter')\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Filter on node label\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n:Swedish\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Filter on node property\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.age < 30\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Filter on relationship property\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)-[k:KNOWS]->(f)\nWHERE k.since < 2000\nRETURN f.name, f.age, f.email\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u274f Filter on dynamically-computed property\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"WITH 'AGE' AS propname\nMATCH (n)\nWHERE n[toLower(propname)]< 30\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Property existence checking\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE exists(n.belt)\nRETURN n.name, n.belt\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"String matching"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Match the beginning of a string\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name STARTS WITH 'Pet'\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Match the ending of a string\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name ENDS WITH 'ter'\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Match anywhere within a string\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name CONTAINS 'ete'\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 String matching negation\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE NOT n.name ENDS WITH 's'\nRETURN n.name, n.age\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:["Using path patterns in ",(0,r.jsx)(e.code,{children:"WHERE"})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Filter on patterns"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (tobias {name: 'Tobias'}), (others)\nWHERE others.name IN ['Andres', 'Peter'] AND (tobias)<-[]-(others)\nRETURN others.name, others.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Filter on patterns using NOT"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (persons), (peter {name: 'Peter'})\nWHERE NOT (persons)-[]->(peter)\nRETURN persons.name, persons.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Filter on patterns with properties"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE (n)-[:KNOWS]-({name: 'Tobias'})\nRETURN n.name, n.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"\u2713 Filter on relationship type"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)-[r]->()\nWHERE n.name='Andres' AND type(r) STARTS WITH 'K'\nRETURN type(r), r.since\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Lists"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 IN operator\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nWHERE a.name IN ['Peter', 'Tobias']\nRETURN a.name, a.age\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Missing properties and values"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Default to false if property is missing\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.belt = 'white'\nRETURN n.name, n.age, n.belt\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Default to true if property is missing\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.belt = 'white' OR n.belt IS NULL RETURN n.name, n.age, n.belt\nORDER BY n.name\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Filter on null\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (person)\nWHERE person.name = 'Peter' AND person.belt IS NULL RETURN person.name, person.age,\nperson.belt\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Using ranges"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Simple range\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nWHERE a.name >= 'Peter'\nRETURN a.name, a.age\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Composite range\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nWHERE a.name > 'Andres' AND a.name < 'Tobias'\nRETURN a.name, a.age\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"25skip",children:"2.5.SKIP"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Skip first three records\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nRETURN n.name\nORDER BY n.name\nSKIP 3\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Return middle two records\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nRETURN n.name\nORDER BY n.name\nSKIP 1\nLIMIT 2\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Using an expression with SKIP to return a subset of the records\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nRETURN n.name\nORDER BY n.name\nSKIP toInteger(3*rand())+ 1\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"26limit",children:"2.6.LIMIT"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Return a subset of the records\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nRETURN n.name\nLIMIT 3\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Using an expression with LIMIT to return a subset of the records\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nRETURN n.name\nLIMIT toInteger(3 * rand())+ 1\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"27create",children:"2.7.CREATE"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Create nodes"}),"\n",(0,r.jsxs)(e.blockquote,{children:["\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Note"})}),"\n",(0,r.jsx)(e.p,{children:"TuGraph does not support creating empty nodes and does not support multiple labels."}),"\n"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2612 Create single node\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (n)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2612 Create multiple nodes\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (n), (m)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Create a node with a label\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (n:Person)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2612 Create a node with multiple labels\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (n:Person:Swedish)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Create node and add labels and properties\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (n:Person {name: 'Andres', title: 'Developer'})\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Return created node\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (a {name: 'Andres'})\nRETURN a\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Create relationships"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Create a relationship between two nodes\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a:Person), (b:Person)\nWHERE a.name = 'Node A' AND b.name = 'Node B'\nCREATE (a)-[r:RELTYPE]->(b)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Create a relationship and set properties\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a:Person), (b:Person)\nWHERE a.name = 'Node A' AND b.name = 'Node B'\nCREATE (a)-[r:RELTYPE {name: a.name + '<->' + b.name}]->(b)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Create a full path\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE p = (andres {name:'Andres'})-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael {name:'Michael'})\nRETURN p\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Use parameters with CREATE"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u274f Create node with a parameter for the properties\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (n:Person $props)\nRETURN n\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2612 Create multiple nodes with a parameter for their properties\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"UNWIND $props AS map\nCREATE (n)\nSET n = map\n"})}),"\ncannot create vertex without label."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"28callyield",children:"2.8.CALL[\u2026YIELD]"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Call a procedure using CALL\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.vertexLabels\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 View the signature for a procedure\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.procedures() YIELD name, signature\nWHERE name='dbms.listConfig'\nRETURN signature\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u274f Call a procedure using a quoted namespace and name\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL `db`.`vertexLabels`\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Call a procedure with literal arguments\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL org.opencypher.procedure.example.addNodeToIndex('users', 0, 'name')\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u274f Call a procedure with parameter arguments\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL org.opencypher.procedure.example.addNodeToIndex($indexName,$node,$propKey)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u274f Call a procedure with mixed literal and parameter arguments\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL org.opencypher.procedure.example.addNodeToIndex('users', $node, 'name')\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Call a procedure with literal and default arguments\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL org.opencypher.procedure.example.addNodeToIndex('users', 0)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Call a procedure within a complex query using CALL\u2026YIELD\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.vertexLabels() YIELD label\nRETURN count(label) AS numLabels\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u2713 Call a procedure and filter its results\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.vertexLabels() YIELD label\nWHERE label CONTAINS 'User'\nRETURN count(label) AS numLabels\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u274f Call a procedure within a complex query and rename its outputs\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.propertyKeys() YIELD propertyKey AS prop\nMATCH (n)\nWHERE n[prop] IS NOT NULL RETURN prop, count(n) AS numNodes\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"29union",children:"2.9.UNION"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\u2713 Combine two queries and retain duplicates\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Actor)\nRETURN n.name AS name\nUNION ALL MATCH (n:Movie)\nRETURN n.title AS name\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\u274f Combine two queries and remove duplicates\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Actor)\nRETURN n.name AS name\nUNION\nMATCH (n:Movie)\nRETURN n.title AS name\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"3functions",children:"3.Functions"}),"\n",(0,r.jsx)(e.h3,{id:"31whole-list-of-functions",children:"3.1.Whole List Of Functions"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Category"}),(0,r.jsx)(e.th,{children:"Function"}),(0,r.jsx)(e.th,{children:"Notes"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Predicate functions"}),(0,r.jsx)(e.td,{children:"exists()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"all()"}),(0,r.jsx)(e.td,{children:"Not supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"any()"}),(0,r.jsx)(e.td,{children:"Not supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"single()"}),(0,r.jsx)(e.td,{children:"Not supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"none()"}),(0,r.jsx)(e.td,{children:"Not supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Scalar functions"}),(0,r.jsx)(e.td,{children:"id()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"euid()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"properties()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"head()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"last()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"toBoolean()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"toFloat()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"toInteger()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"toString()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"type()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"startnode()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"endnode()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"size()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"length()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"substring()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"concat()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"label()"}),(0,r.jsx)(e.td,{children:"OpenCypher extension method"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Aggregating functions"}),(0,r.jsx)(e.td,{children:"avg()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"collect()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"count()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"max()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"min()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"percentileCont()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"percentileDisc()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"stDev()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"stDevP()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"variance()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"varianceP()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"sum()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"List functions"}),(0,r.jsx)(e.td,{children:"keys()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"labels()"}),(0,r.jsx)(e.td,{children:"Returns a result with only one label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"nodes()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"range()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"subscript()"}),(0,r.jsx)(e.td,{children:"Not supported"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Mathematical functions"}),(0,r.jsx)(e.td,{children:"abs()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{children:"ceil()"}),(0,r.jsx)(e.td,{})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{}),(0,r.jsx)(e.td,{})]})]})]}),"\n",(0,r.jsx)(e.h3,{id:"32predicate-functions",children:"3.2.Predicate functions"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"exists()"}),"\n",(0,r.jsx)(e.p,{children:"judge it whether a vertex or edge has the field ."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE exists(n.belt)\nRETURN n.name, n.belt\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"exists(name)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"true"})})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"33scalar-functions",children:"3.3.Scalar functions"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"id()"}),"\n",(0,r.jsx)(e.p,{children:"get the id of vertex."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nRETURN id(a)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"vid"})})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"1"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"2"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"..."})})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"properties()"}),"\n",(0,r.jsx)(e.p,{children:"get a map containing all the properties of a node or relationship."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CREATE (p:Person {name: 'Stefan', city: 'Berlin'})\nRETURN properties(p)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"properties"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"{name:Stefan,city:Berlin}"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"head()"}),"\n",(0,r.jsx)(e.p,{children:"get the first element of a list."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nWHERE a.name = 'Eskil'\nRETURN a.array, head(a.array)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"a.array"}),(0,r.jsx)(e.th,{children:"head(a.array)"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:'["one","two","three"]'}),(0,r.jsx)(e.td,{children:'"one"'})]})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"last()"}),"\n",(0,r.jsx)(e.p,{children:"get the last element of a list."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nWHERE a.name = 'Eskil'\nRETURN a.array, last(a.array)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"a.array"}),(0,r.jsx)(e.th,{children:"last(a.array)"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:'["one","two","three"]'}),(0,r.jsx)(e.td,{children:'"three"'})]})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"toFloat()"}),"\n",(0,r.jsx)(e.p,{children:"Converts an integer or string value to a floating point number."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN toFloat('11.5'), toFloat('not a number')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"float"})})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"11.5"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"null"})})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"toInteger()"}),"\n",(0,r.jsx)(e.p,{children:"Converts a floating point or string value to an integer value."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN toInteger('2.3') AS integer\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"integer"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"2"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"toString()"}),"\n",(0,r.jsx)(e.p,{children:"Converts an integer, float, boolean value to a string."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN toString(2.3)\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"type()"}),"\n",(0,r.jsx)(e.p,{children:"get the string representation of the relationship type."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)-[r]->()\nWHERE n.name = 'Alice'\nRETURN type(r)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"type"})})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"acted_in"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"acted_in"})})]})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"34aggregating-functions",children:"3.4.Aggregating functions"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"avg()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the average of a set of numeric values."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Person)\nRETURN avg(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"avg(n.born)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"1869.2661654135338"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"collect()"}),"\n",(0,r.jsx)(e.p,{children:"Returns a list containing the values returned by an expression."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Person)\nRETURN collect(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"collect(n.born)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"[1967,...]"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"count()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the number of values or records."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n {name: 'A'})-[]->(x)\nRETURN labels(n), n.age, count(*)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"labels(n)"}),(0,r.jsx)(e.th,{children:"n.age"}),(0,r.jsx)(e.th,{children:"count(*)"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:'["Person"]'}),(0,r.jsx)(e.td,{children:"13"}),(0,r.jsx)(e.td,{children:"3"})]})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"max()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the maximum value in a set of values."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Person)\nRETURN max(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"max(n.age)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"44"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"min()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the minimum value in a set of values."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Person)\nRETURN min(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"min(n.age)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"13"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"percentileCont()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the percentile of a value over a group using linear interpolation."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Person)\nRETURN percentileCont(n.age, 0.4)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"percentileCont(n.age, 0.4)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"29"})})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"percentileDisc()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the nearest value to the given percentile over a group using a rounding method."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Output:"})," the percentile of the given value over a group."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Person)\nRETURN percentileDisc(n.age, 0.5)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"percentileDisc(n.age, 0.5)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"33"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"stDev()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the standard deviation for the given value over a group for a sample of a population."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name IN ['A', 'B', 'C']\nRETURN stDev(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"stDev(n.age)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"15.716233645501712"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"stDevP()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the standard deviation for the given value over a group for an entire population."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name IN ['A', 'B', 'C']\nRETURN stDevP(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"stDevP(n.age)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"12.832251036613439"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"variance()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the variance for the given value over a group for a sample of a population."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name IN ['A', 'B', 'C']\nRETURN variance(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"variance(n.age)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"247"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"varianceP()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the variance for the given value over a group for an entire population."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n)\nWHERE n.name IN ['A', 'B', 'C']\nRETURN varianceP(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"varianceP(n.age)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"164.66666666667"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"sum()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the sum of a set of numeric values."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n:Person)\nRETURN sum(n.age)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"sum(n.age)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"90"})})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"35list-funtions",children:"3.5.List Funtions:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"keys()"}),"\n",(0,r.jsx)(e.p,{children:"get the field names of some vertex."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nWHERE a.name = 'Alice'\nRETURN keys(a)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"keys(a)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:'["name","age","eyes"]'})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"labels()/label()"}),"\n",(0,r.jsx)(e.p,{children:"Returns a list containing the string representations for all the property names of a node, relationship, or map."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a)\nWHERE a.name = 'Alice'\nRETURN labels(a)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"labels"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:'["Person","Developer"]'})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"nodes()"}),"\n",(0,r.jsx)(e.p,{children:"Get vertex ids of a path"}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH p = (from {name: 'Bob'})-[*1..]->(to {name: 'Alice'})\nRETURN nodes(p)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"nodes(p)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"[0, 1, 10, 12]"})})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"36mathematical-functions",children:"3.6.Mathematical functions"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"abs()"}),"\n",(0,r.jsx)(e.p,{children:"get the absolute value of some data."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (a:person {name: 'Laurence Fishburne'}),(e:person {name: 'Carrie-Anne Moss'})\nRETURN a.born, e.born, abs(a.born-e.born)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"a.born"}),(0,r.jsx)(e.th,{children:"e.born"}),(0,r.jsx)(e.th,{children:"abs(a.born - e.born)"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"1961"}),(0,r.jsx)(e.td,{children:"1967"}),(0,r.jsx)(e.td,{children:"6"})]})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"ceil()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the smallest floating point number that is greater than or equal to a number and equal to a mathematical integer."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance.\n",(0,r.jsx)(e.strong,{children:"Example input:"})]}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN ceil(0.1)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"ceil(0.1)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"1.0"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"floor()"}),"\n",(0,r.jsx)(e.p,{children:"get the largest floating point number that is less than or equal to the given number and equal to a mathematical integer."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN floor(0.9)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"floor(0.9)"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"0.0"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"round()"}),"\n",(0,r.jsx)(e.p,{children:"Returns the value of a number rounded to the nearest integer."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN round(3.141592)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"round"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"3"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"rand()"}),"\n",(0,r.jsx)(e.p,{children:"Returns returns a random floating point number in the range from 0 (inclusive) to 1 exclusive)."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN rand()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"rand()"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"0.9797131960534085"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"sign()"}),"\n",(0,r.jsx)(e.p,{children:"Get the signum of the given number: 0 if the number is 0, -1 for any negative number, and 1 for any positive number."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"RETURN sign(-17), sign(0.1)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"sign(-17)"}),(0,r.jsx)(e.th,{children:"sign(0.1)"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"-1"}),(0,r.jsx)(e.td,{children:"1"})]})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"4extensions-to-opencypher",children:"4.Extensions To OpenCypher"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Number of Labels"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"TuGraph: Each node/relationship must have one and only one label. So error occurs when there is no label, and the 1st label will be picked as the label if there are more than one label."}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"OpenCypher: One node/relationship may have 0 to many labels."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"Schema."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:"TuGraph: TuGraph has strong schema"}),"\n",(0,r.jsx)(e.li,{children:"OpenCypher: schema-less"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"5procedures",children:"5.Procedures"}),"\n",(0,r.jsx)(e.h3,{id:"51procedures-demos",children:"5.1.procedures' demos"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.procedures()"}),"\n",(0,r.jsx)(e.p,{children:"Lists all available procedures."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Output:"})," a list of {",(0,r.jsx)(e.code,{children:"signature"}),", ",(0,r.jsx)(e.code,{children:"name"}),"}."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.procedures()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"signature"}),(0,r.jsx)(e.th,{children:"name"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.vertexLabels() :: (label::STRING)"}),(0,r.jsx)(e.td,{children:"db.vertexLabels"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.edgeLabels() :: (edgeLabels::STRING)"}),(0,r.jsx)(e.td,{children:"db.edgeLabels"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.indexes() :: (index::LIST)"}),(0,r.jsx)(e.td,{children:"db.indexes"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"..."}),(0,r.jsx)(e.td,{children:"..."})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.vertexLabels()"}),"\n",(0,r.jsx)(e.p,{children:"Lists all available labels of vertex."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Output:"})," a list of {",(0,r.jsx)(e.code,{children:"name"}),"}."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.vertexLabels()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"label"})})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"genre"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"keyword"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"movie"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"..."})})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.edgeLabels()"}),"\n",(0,r.jsx)(e.p,{children:"Lists all available labels of edges."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Output:"})," a list of {edgeLabels}."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.edgeLabels()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"edgeLabel"})})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"acted_in"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"directed"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"..."})})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.createVertexLabel(label_name, primary_field, field_spec...)"}),"\n",(0,r.jsx)(e.p,{children:"Create a vertex label."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," whole instance."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of vertex label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"primary_field"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"primary field of vertex label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_spec"}),(0,r.jsx)(e.td,{children:"list"}),(0,r.jsx)(e.td,{children:"specification of a field"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which each ",(0,r.jsx)(e.code,{children:"field_spec"})," is a list of string in the form of ",(0,r.jsx)(e.code,{children:"[field_name, field_type, true]"}),", where true is specified only for optional fields."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Output:"})," If successful, it returns a success message."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.createVertexLabel('Person', 'id', 'id', 'int64', false, 'name', 'string', true)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"Added label [Person]\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.getLabelSchema(label_type, label_name)"}),"\n",(0,r.jsx)(e.p,{children:"Get the schema definition of the label in a subgraph."}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Scope:"})," subgraph, as specified in the ",(0,r.jsx)(e.code,{children:"graph"})," parameter in REST or RPC request."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_type"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"either 'vertex' or 'edge'"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"Output:"})," a list of label specifications, in which each element is a list of the following fields:"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"field_name"}),(0,r.jsx)(e.th,{children:"field_type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the field"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"type"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"type of the field"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"optional"}),(0,r.jsx)(e.td,{children:"boolean"}),(0,r.jsx)(e.td,{children:"whether the field is optional"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.getLabelSchema('vertex', 'Person')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"name"}),(0,r.jsx)(e.th,{children:"type"}),(0,r.jsx)(e.th,{children:"optional"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"id"}),(0,r.jsx)(e.td,{children:"INT32"}),(0,r.jsx)(e.td,{children:"false"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"born"}),(0,r.jsx)(e.td,{children:"INT32"}),(0,r.jsx)(e.td,{children:"true"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"STRING"}),(0,r.jsx)(e.td,{children:"true"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"poster_image"}),(0,r.jsx)(e.td,{children:"STRING"}),(0,r.jsx)(e.td,{children:"true"})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.createLabel(label_type, label_name, extra, field_spec...)"}),"\n",(0,r.jsx)(e.p,{children:"Create a vertex or edge label."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_type"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"either 'vertex' or 'edge'"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"extra"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"for edge, it means constraints; for vertex, it means primary property"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_spec"}),(0,r.jsx)(e.td,{children:"list"}),(0,r.jsx)(e.td,{children:"specification of a field"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which each ",(0,r.jsx)(e.code,{children:"field_spec"})," is a list of string in the form of ",(0,r.jsx)(e.code,{children:"[field_name, field_type, 'optional']"}),".\nfor edge, ",(0,r.jsx)(e.code,{children:"extra"})," should be a json array string, like this ",(0,r.jsx)(e.code,{children:'[["label1","label2"], ["label3","label4"]]'}),", if edge has no constraints, give an empty json array, like this ",(0,r.jsx)(e.code,{children:"[]"}),"\n",(0,r.jsx)(e.strong,{children:"Output:"})]}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.createLabel('vertex', 'new_label', 'id', ['id','int32',false], ['name','string', true]);\nCALL db.createLabel('edge', 'new_edge', '[[\"id1\",\"id2\"]]', ['id','int32',false], ['name', 'string', true]);\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"Vertex label [new_label] successfully added.\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.deleteLabel(label_type, label_name)"}),"\n",(0,r.jsx)(e.p,{children:"Delete a vertex or edge label."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_type"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"either 'vertex' or 'edge'"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"field_name"}),(0,r.jsx)(e.th,{children:"field_type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"affected"}),(0,r.jsx)(e.td,{children:"integer"}),(0,r.jsx)(e.td,{children:"number of vertexes/edges deleted"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.deleteLabel('vertex', 'person')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"affected"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"1024"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.alterLabelDelFields(label_type, label_name, field_names)"}),"\n",(0,r.jsx)(e.p,{children:"Delete specified fields from the label."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_type"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"either 'vertex' or 'edge'"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_names"}),(0,r.jsx)(e.td,{children:"list of strings"}),(0,r.jsx)(e.td,{children:"names of the fields to delete"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"field_name"}),(0,r.jsx)(e.th,{children:"field_type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"affected"}),(0,r.jsx)(e.td,{children:"integer"}),(0,r.jsx)(e.td,{children:"number of vertexes/edges modified"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.alterLabelDelFields('vertex', 'Person', ['name', 'image'])\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"affected"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"1024"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.alterLabelAddFields(label_type, label_name, field_value_spec...)"}),"\n",(0,r.jsx)(e.p,{children:"Adds specified fields to the label."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_type"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"either 'vertex' or 'edge'"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_value_spec"}),(0,r.jsx)(e.td,{children:"list"}),(0,r.jsx)(e.td,{children:"specification of a field"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which each ",(0,r.jsx)(e.code,{children:"field_value_spec"})," is a list of string in the form of ",(0,r.jsx)(e.code,{children:"[field_name, field_type, field_value, 'optional']"}),", where: ",(0,r.jsx)(e.code,{children:"field_value"})," is the default value of the field."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"field_name"}),(0,r.jsx)(e.th,{children:"field_type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"affected"}),(0,r.jsx)(e.td,{children:"integer"}),(0,r.jsx)(e.td,{children:"number of vertexes/edges modified"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.alterLabelAddFields(\n'vertex',\n'new_label',\n['birth_date', DATE, '', true],\n['img', BLOB, '', true])\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"affected"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"1024"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.alterLabelModFields(label_type, label_name, field_spec...)"}),"\n",(0,r.jsx)(e.p,{children:"Modifies the specified fields in the label."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_type"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"either 'vertex' or 'edge'"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_spec"}),(0,r.jsx)(e.td,{children:"list"}),(0,r.jsx)(e.td,{children:"specification of a field"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which each ",(0,r.jsx)(e.code,{children:"field_spec"})," is a list of string in the form of ",(0,r.jsx)(e.code,{children:"[field_name, field_type, 'optional']"}),".The target field should exist."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"field_name"}),(0,r.jsx)(e.th,{children:"field_type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"affected"}),(0,r.jsx)(e.td,{children:"integer"}),(0,r.jsx)(e.td,{children:"number of vertexes/edges modified"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.alterLabelModFields(\n'vertex',\n'new_label',\n['birth_date', 'DATETIME', '1900-01-01 00:00:00'],\n['gender', 'BOOL', false])\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"affected"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"1024"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.createEdgeLabel( label_name, field_spec...)"}),"\n",(0,r.jsx)(e.p,{children:"Create an edge label."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"edge_constraints"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"edge constraints"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_spec"}),(0,r.jsx)(e.td,{children:"list"}),(0,r.jsx)(e.td,{children:"specification of a field"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which each ",(0,r.jsx)(e.code,{children:"field_spec"})," is a list of string in the form of ",(0,r.jsx)(e.code,{children:"[field_name, field_type, optional]"}),", where optional is specified as true, only for optional fields."]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"edge_constraints"})," is a json array string, This parameter limits the combination of starting and ending vertex of the edge, for example: ",(0,r.jsx)(e.code,{children:'\'[["vertex_label1","vertex_label2"],["vertex_label3","vertex_label4"]]\''}),", which limits the edge direction can only be from ",(0,r.jsx)(e.code,{children:"vertex_label1"})," to ",(0,r.jsx)(e.code,{children:"vertex_label2"})," or from ",(0,r.jsx)(e.code,{children:"vertex_label3"})," to ",(0,r.jsx)(e.code,{children:"vertex_label4"}),". If you don't want to have any constraints, give an empty array string, like this ",(0,r.jsx)(e.code,{children:"'[]'"})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.createEdgeLabel('KNOWS', '[]', 'name', 'int32',true)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"Added type [KNOWS]\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.addIndex(label_name, field_name, unique)"}),"\n",(0,r.jsx)(e.p,{children:"create an index on some field of one vertex label ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"specification of a field"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"unique"}),(0,r.jsx)(e.td,{children:"boolean"}),(0,r.jsx)(e.td,{children:"Specifies whether the index is unique"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.addIndex('Person', 'id', true)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"Added index [Perosn:id]\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"db.addEdgeIndex(label_name, field_name, unique, pair_unique)"}),"\n",(0,r.jsx)(e.p,{children:"create an index on some field of one edge label ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"name of the label"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"specification of a field"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"unique"}),(0,r.jsx)(e.td,{children:"boolean"}),(0,r.jsx)(e.td,{children:"Specifies whether the index is unique"})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"| pair_unique | boolean | Specifies whether the index is pair_unique |"}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL db.addEdgeIndex('BornIn', 'id', true, false)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"Added index [BornIn:id]\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.changePassword(current_password ,new_password)"}),"\n",(0,r.jsx)(e.p,{children:"Change the current user's password."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"current_password"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the current password"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"new_password"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"new password"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.changePassword('73@TuGraph','admin')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"true\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.changeUserPassword(user_name, new_password)"}),"\n",(0,r.jsx)(e.p,{children:"Change the current user's password."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the user's name"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"new_password"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"new password"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.changeUserPassword('quest','73@TuGraph')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"true\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.createUser(user_name, password)"}),"\n",(0,r.jsx)(e.p,{children:"create new user on this graph database."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the new user name"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"password"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the password of new user"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.createUser('quest',\"admin\")\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"true\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.deleteUser(user_name)"}),"\n",(0,r.jsx)(e.p,{children:"delete user on this graph database."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the user name to be deleted"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.deleteUser('quest')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"true\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.listUsers()"}),"\n",(0,r.jsx)(e.p,{children:"get all user's name of the graph database."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"a list of user names, in which each element is a list of the following fields:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user.name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the user name"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"is.admin"}),(0,r.jsx)(e.td,{children:"boolean"}),(0,r.jsx)(e.td,{children:"the permission of this user"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.listUsers()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"user.name"}),(0,r.jsx)(e.th,{children:"is.admin"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"admin"}),(0,r.jsx)(e.td,{children:"true"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"..."}),(0,r.jsx)(e.td,{children:"..."})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.showCurrentUser()"}),"\n",(0,r.jsx)(e.p,{children:"get current user's name."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"a list of user names, in which each element is a list of the following fields:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user.user"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the current user name"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.showCurrentUser()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"user.name"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"admin"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.listAllowedHosts()"}),"\n",(0,r.jsx)(e.p,{children:"get the list of ips to be allowed ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"a list of ips which are allowed."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.listAllowedHosts()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"host"})})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"192.168.1.22"})}),(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"..."})})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.deleteAllowedHosts(hosts)"}),"\n",(0,r.jsx)(e.p,{children:"delete some ips from the list of ips to be allowed ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"the number of ip which been deleted."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.deleteAllowedHosts('192.168.1.22','192.168.1.23')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"success"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"2"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.security.addAllowedHosts(hosts)"}),"\n",(0,r.jsx)(e.p,{children:"add some ips from the list of ips to be allowed ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"the number of ip which been added."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.security.addAllowedHosts('192.168.1.22','192.168.1.23')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"success"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"2"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.graph.createGraph(graph_name, description, max_size_GB)"}),"\n",(0,r.jsx)(e.p,{children:"create a new subgraph in this graph database ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the name of new subgraph"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"description"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"description of new subgraph"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"max_size_GB"}),(0,r.jsx)(e.td,{children:"integer"}),(0,r.jsx)(e.td,{children:"Upper limit of subgraph capacity"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"if successful , it will return true."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.graph.createGraph('graph1', 'description', 2045)\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"success"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"true"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.graph.deleteGraph(graph_name)"}),"\n",(0,r.jsx)(e.p,{children:"delete a subgraph in this graph database ."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the name of subgraph to been deleted"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"if successful , it will return true."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.graph.deleteGraph('graph1')\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"success"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"true"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.graph.modGraph(graph_name, config)"}),"\n",(0,r.jsx)(e.p,{children:"delete a subgraph in this graph database ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph_name"}),(0,r.jsx)(e.td,{children:"string"}),(0,r.jsx)(e.td,{children:"the name of subgraph to been deleted"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"config"}),(0,r.jsx)(e.td,{children:"map"}),(0,r.jsx)(e.td,{children:"the configuration to be modified"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"if successful , it will return true."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.graph.modGraph('graph1',{description:'this graph', max_size_GB:20})\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"success"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"true"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.graph.listGraphs()"}),"\n",(0,r.jsx)(e.p,{children:"get all subgraph in this graph database ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"a list of {subgraph and configuration}."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.graph.listGraphs()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"graph.name"}),(0,r.jsx)(e.th,{children:"configuration"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"default"}),(0,r.jsx)(e.td,{children:'{"description":"","max_size_GB":1024}'})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph1"}),(0,r.jsx)(e.td,{children:'{"description":"this graph","max_size_GB":20}'})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"..."}),(0,r.jsx)(e.td,{children:"..."})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.graph.listUserGraphs(user_name)"}),"\n",(0,r.jsx)(e.p,{children:"get subgraph list which specified user can read or write"}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"a list of {subgraph and configuration}."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:'CALL dbms.graph.listUserGraphs("test_user")\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"graph.name"}),(0,r.jsx)(e.th,{children:"configuration"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"default"}),(0,r.jsx)(e.td,{children:'{"description":"","max_size_GB":1024}'})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph1"}),(0,r.jsx)(e.td,{children:'{"description":"this graph","max_size_GB":20}'})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"..."}),(0,r.jsx)(e.td,{children:"..."})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.config.list()"}),"\n",(0,r.jsx)(e.p,{children:"get some config of this graph database ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"a list of {configuration}."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.config.list()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"name"}),(0,r.jsx)(e.th,{children:"value"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"bind_host"}),(0,r.jsx)(e.td,{children:"0.0.0.0"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"durable"}),(0,r.jsx)(e.td,{children:"true"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"..."}),(0,r.jsx)(e.td,{children:"..."})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.config.update(updates)"}),"\n",(0,r.jsx)(e.p,{children:"get some config of this graph database ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a success message"}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.config.update({\n enable_ip_check:false,\n durable:true,\n optimistic_txn:true,\n enable_audit_log:true})\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"Update succeeded.\n"})}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.takeSnapshot()"}),"\n",(0,r.jsx)(e.p,{children:"take the snapshot on this current graph database."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns the path of snapshot."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.takeSnapshot()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"path"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"log/db/snapshot/2020-07-20_17.20.03"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"dbms.listBackupFiles()"}),"\n",(0,r.jsx)(e.p,{children:"get the path of backuped files."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns the path of snapshot."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"CALL dbms.listBackupFiles()\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"path"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"tugraph/db/binlog/binlog_0"})})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"algo.shortestPath(startNode, endNode, config)"}),"\n",(0,r.jsx)(e.p,{children:"get one of the shortest paths between two vertexes."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"startNode"}),(0,r.jsx)(e.td,{children:"Node"}),(0,r.jsx)(e.td,{children:"the source node of paths"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"endNode"}),(0,r.jsx)(e.td,{children:"Node"}),(0,r.jsx)(e.td,{children:"the destination node paths"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"config"}),(0,r.jsx)(e.td,{children:"MAP"}),(0,r.jsx)(e.td,{children:"the filter of shortest paths, the formate as {maxHops:3, relationshipQuery:'HAS_CHILD'}"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it will returns one group result of the shortest path."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n1 {name:'Hugo Weaving'}),(n2 {title:'The Matrix'})\nCALL algo.shortestPath(n1,n2) YIELD nodeCount,totalCost RETURN nodeCount,totalCost\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"nodeCount"}),(0,r.jsx)(e.th,{children:"totalCost"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"2"}),(0,r.jsx)(e.td,{children:"1"})]})})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"algo.allShortestPaths(startNode, endNode, config))"}),"\n",(0,r.jsx)(e.p,{children:"get the path of backuped files."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns the path of snapshot."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"MATCH (n1 {name:'Hugo Weaving'}),(n2 {title:'The Matrix'})\nCALL algo.allShortestPaths(n1,n2) YIELD nodeIds,cost RETURN nodeIds,cost\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"nodeIds"}),(0,r.jsx)(e.th,{children:"cost"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"[2,665]"}),(0,r.jsx)(e.td,{children:"1"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"..."}),(0,r.jsx)(e.td,{})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsx)(e.p,{children:"algo.algo.native.extract(id, config))"}),"\n",(0,r.jsx)(e.p,{children:"get the field values of a list of vertexes or edges."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Parameters:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"parameter"}),(0,r.jsx)(e.th,{children:"parameter type"}),(0,r.jsx)(e.th,{children:"description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"id"}),(0,r.jsx)(e.td,{children:"ANY"}),(0,r.jsx)(e.td,{children:"the id of vertexes or edges , the id must be variable"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"config"}),(0,r.jsx)(e.td,{children:"MAP"}),(0,r.jsx)(e.td,{children:"the configuration of this extraction of vertexes or edges"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which each ",(0,r.jsx)(e.code,{children:"config"})," is a map in the form of ",(0,r.jsx)(e.code,{children:"{isNode:true, filed:'HAS_CHILD'}"}),", if ",(0,r.jsx)(e.code,{children:"isNode"})," is specified true, the ",(0,r.jsx)(e.code,{children:"id"})," is a vertex id, or it is an edge id."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Output:"})}),"\n",(0,r.jsx)(e.p,{children:"If successful, it returns a list of the value of vertexes or edges specified field ."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example input:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:"with [2,3] as vids CALL algo.native.extract(vids,{isNode:true, field:'id'})\nYIELD value RETURN value\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example output:"})}),"\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.th,{children:"value"})})}),(0,r.jsx)(e.tbody,{children:(0,r.jsx)(e.tr,{children:(0,r.jsx)(e.td,{children:"[4,5]"})})})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.h3,{id:"52whole-list-of-procedures",children:"5.2.Whole List Of Procedures"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Name"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Signature"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.vertexLabels"}),(0,r.jsx)(e.td,{children:"list all vertex labels"}),(0,r.jsx)(e.td,{children:"db.vertexLabels() :: (label::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.edgeLabels"}),(0,r.jsx)(e.td,{children:"list all edge labels"}),(0,r.jsx)(e.td,{children:"db.edgeLabels() :: (edgeLabels::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.indexes"}),(0,r.jsx)(e.td,{children:"list all indexes"}),(0,r.jsx)(e.td,{children:"db.indexes() :: (label::STRING,field::STRING,label_type:STRING,unique::BOOLEAN,pair_unique::BOOLEAN)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.listLabelIndexes"}),(0,r.jsx)(e.td,{children:"list indexes by label"}),(0,r.jsx)(e.td,{children:"db.listLabelIndexes(label_name:STRING,label_type:STRING) :: (label::STRING,field::STRING,unique::BOOLEAN,pair_unique::BOOLEAN)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.warmup"}),(0,r.jsx)(e.td,{children:"warm up the DB"}),(0,r.jsx)(e.td,{children:"db.warmup() :: (time_used::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.createVertexLabel"}),(0,r.jsx)(e.td,{children:"create a vertex label"}),(0,r.jsx)(e.td,{children:"db.createVertexLabel(label_name::STRING,field_specs::LIST) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.createLabel"}),(0,r.jsx)(e.td,{children:"create a vertex/edge label"}),(0,r.jsx)(e.td,{children:"db.createLabel(label_type::STRING,label_name::STRING,extra::STRING,field_specs::LIST) :: ()"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.getLabelSchema"}),(0,r.jsx)(e.td,{children:"get the schema of label"}),(0,r.jsx)(e.td,{children:"db.getLabelSchema(label_type::STRING,label_name::STRING) :: (name::STRING,type::STRING,optional::BOOLEAN)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.getVertexSchema"}),(0,r.jsx)(e.td,{children:"get the schema of vertex label"}),(0,r.jsx)(e.td,{children:"db.getVertexSchema(label::STRING) :: (schema::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.getEdgeSchema"}),(0,r.jsx)(e.td,{children:"get the schema of edge label"}),(0,r.jsx)(e.td,{children:"db.getEdgeSchema(label::STRING) :: (schema::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.deleteLabel"}),(0,r.jsx)(e.td,{children:"delete vertex/edge label"}),(0,r.jsx)(e.td,{children:"db.deleteLabel(label_type::STRING,label_name::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.alterLabelDelFields"}),(0,r.jsx)(e.td,{children:"delete some fields of a label on a subgraph"}),(0,r.jsx)(e.td,{children:"db.alterLabelDelFields(label_type::STRING,label_name::STRING,del_fields::LIST) :: (record_affected::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.alterLabelAddFields"}),(0,r.jsx)(e.td,{children:"add some fields of a label on a subgraph"}),(0,r.jsx)(e.td,{children:"db.alterLabelAddFields(label_type::STRING,label_name::STRING,add_field_spec_values::LIST) :: (record_affected::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.alterLabelModFields"}),(0,r.jsx)(e.td,{children:"modify some fields of a label on a subgraph"}),(0,r.jsx)(e.td,{children:"db.alterLabelModFields(label_type::STRING,label_name::STRING,mod_field_specs::LIST) :: (record_affected::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.createEdgeLabel"}),(0,r.jsx)(e.td,{children:"create a edge label"}),(0,r.jsx)(e.td,{children:"db.createEdgeLabel(type_name::STRING,field_specs::LIST) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.addIndex"}),(0,r.jsx)(e.td,{children:"add an index"}),(0,r.jsx)(e.td,{children:"db.addIndex(label_name::STRING,field_name::STRING,unique::BOOLEAN) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.addEdgeIndex"}),(0,r.jsx)(e.td,{children:"add an index"}),(0,r.jsx)(e.td,{children:"db.addEdgeIndex(label_name::STRING,field_name::STRING,unique::BOOLEAN,pair_unique::BOOLEAN) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.addVertexCompositeIndex"}),(0,r.jsx)(e.td,{children:"add composite index"}),(0,r.jsx)(e.td,{children:"db.addVertexCompositeIndex(label_name::STRING,field_names::LIST,unique::BOOLEAN) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.deleteIndex"}),(0,r.jsx)(e.td,{children:"delete an index"}),(0,r.jsx)(e.td,{children:"db.deleteIndex(label_name::STRING,field_name::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.backup"}),(0,r.jsx)(e.td,{children:"backup the db"}),(0,r.jsx)(e.td,{children:"db.backup(destination::STRING) :: ()"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.procedures"}),(0,r.jsx)(e.td,{children:"list all procedures"}),(0,r.jsx)(e.td,{children:"dbms.procedures() :: (name::STRING,signature::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.changePassword"}),(0,r.jsx)(e.td,{children:"change current user password"}),(0,r.jsx)(e.td,{children:"dbms.security.changePassword(current_password::STRING,new_password::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.changeUserPassword"}),(0,r.jsx)(e.td,{children:"change user password"}),(0,r.jsx)(e.td,{children:"dbms.security.changeUserPassword(user_name::STRING,new_password::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.createUser"}),(0,r.jsx)(e.td,{children:"create an account"}),(0,r.jsx)(e.td,{children:"dbms.security.createUser(user_name::STRING,password::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.deleteUser"}),(0,r.jsx)(e.td,{children:"delete an account"}),(0,r.jsx)(e.td,{children:"dbms.security.deleteUser(user_name::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.listUsers"}),(0,r.jsx)(e.td,{children:"list all accounts"}),(0,r.jsx)(e.td,{children:"dbms.security.listUsers() :: (user_name::STRING,user_info::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.showCurrentUser"}),(0,r.jsx)(e.td,{children:"get current user name"}),(0,r.jsx)(e.td,{children:"dbms.security.showCurrentUser() :: (current_user::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.getUserPermissions"}),(0,r.jsx)(e.td,{children:"get the permissions of a specified user"}),(0,r.jsx)(e.td,{children:"dbms.security.getUserPermissions(user_name::STRING) :: (user_info::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.graph.createGraph"}),(0,r.jsx)(e.td,{children:"create a subgraph"}),(0,r.jsx)(e.td,{children:"dbms.graph.createGraph(graph_name::STRING, description::STRING, max_size_GB::INTEGER) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.graph.modGraph"}),(0,r.jsx)(e.td,{children:"modify the config of a subgraph"}),(0,r.jsx)(e.td,{children:"dbms.graph.modGraph(graph_name::STRING,config::MAP) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.graph.deleteGraph"}),(0,r.jsx)(e.td,{children:"delete a subgraph"}),(0,r.jsx)(e.td,{children:"dbms.graph.deleteGraph(graph_name::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.graph.listGraphs"}),(0,r.jsx)(e.td,{children:"list all subgraphs"}),(0,r.jsx)(e.td,{children:"dbms.graph.listGraphs() :: (graph_name::STRING,configuration::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.graph.getGraphInfo"}),(0,r.jsx)(e.td,{children:"get the information of a specified graph"}),(0,r.jsx)(e.td,{children:"dbms.graph.getGraphInfo(graph_name::STRING)::(graph_name::STRING,configuration::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.addAllowedHosts"}),(0,r.jsx)(e.td,{children:"add to the trust list"}),(0,r.jsx)(e.td,{children:"dbms.security.addAllowedHosts(hosts::LIST) :: (num_new::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.deleteAllowedHosts"}),(0,r.jsx)(e.td,{children:"remove from the trust list"}),(0,r.jsx)(e.td,{children:"dbms.security.deleteAllowedHosts(hosts::LIST) :: (record_affected::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.listAllowedHosts"}),(0,r.jsx)(e.td,{children:"list the trust list"}),(0,r.jsx)(e.td,{children:"dbms.security.listAllowedHosts() :: (host::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.config.update"}),(0,r.jsx)(e.td,{children:"update the configuration"}),(0,r.jsx)(e.td,{children:"dbms.config.update(updates::MAP) :: (message::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.config.list"}),(0,r.jsx)(e.td,{children:"list the configuration"}),(0,r.jsx)(e.td,{children:"dbms.config.list() :: (name::STRING,value::ANY)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"algo.shortestPath"}),(0,r.jsx)(e.td,{children:"get a shortest path between two vertexes"}),(0,r.jsx)(e.td,{children:"algo.shortestPath(startNode::NODE,endNode::NODE,config::MAP) :: (nodeCount::INTEGER,totalCost::FLOAT)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"algo.allShortestPaths"}),(0,r.jsx)(e.td,{children:"get all the shortest paths between two vertexes"}),(0,r.jsx)(e.td,{children:"algo.allShortestPaths(startNode::NODE,endNode::NODE,config::MAP) :: (nodeIds::LIST,relationshipIds::LIST,cost::LIST)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"algo.native.extract"}),(0,r.jsx)(e.td,{children:"get the field values of a list of vertexes or edges specified id"}),(0,r.jsx)(e.td,{children:"algo.native.extract(id::ANY,config::MAP) :: (value::ANY)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.flushDB"}),(0,r.jsx)(e.td,{children:"flush the db"}),(0,r.jsx)(e.td,{children:"db.flushDB() :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.listRoles"}),(0,r.jsx)(e.td,{children:"list all roles"}),(0,r.jsx)(e.td,{children:"dbms.security.listRoles() :: (role_name::STRING,role_info::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.createRole"}),(0,r.jsx)(e.td,{children:"create a role"}),(0,r.jsx)(e.td,{children:"dbms.security.createRole(role_name::STRING,desc::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.deleteRole"}),(0,r.jsx)(e.td,{children:"delete a role"}),(0,r.jsx)(e.td,{children:"dbms.security.deleteRole(role_name::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.getRoleInfo"}),(0,r.jsx)(e.td,{children:"get the role information"}),(0,r.jsx)(e.td,{children:"dbms.security.getRoleInfo(role::STRING) :: (role_info::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.disableRole"}),(0,r.jsx)(e.td,{children:"enable/disable the role"}),(0,r.jsx)(e.td,{children:"dbms.security.disableRole(role::STRING,disable::BOOLEAN) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.modRoleDesc"}),(0,r.jsx)(e.td,{children:"modify the description of a role"}),(0,r.jsx)(e.td,{children:"dbms.security.modRoleDesc(role::STRING,description::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.rebuildRoleAccessLevel"}),(0,r.jsx)(e.td,{children:"rebuild the user subgraph access rights"}),(0,r.jsx)(e.td,{children:"dbms.security.rebuildRoleAccessLevel(role::STRING,access_level::MAP) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.modRoleAccessLevel"}),(0,r.jsx)(e.td,{children:"modify the user subgraph access rights"}),(0,r.jsx)(e.td,{children:"dbms.security.modRoleAccessLevel(role::STRING,access_level::MAP) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.modRoleFieldAccessLevel"}),(0,r.jsx)(e.td,{children:"modify the user property access rights"}),(0,r.jsx)(e.td,{children:"dbms.security.modRoleFieldAccessLevel(role::STRING,graph::STRING,label::STRING,field::STRING,label_type::STRING,field_access_level::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.getUserInfo"}),(0,r.jsx)(e.td,{children:"get the user information"}),(0,r.jsx)(e.td,{children:"dbms.security.getUserInfo(user::STRING) :: (user_info::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.getUserMemoryUsage"}),(0,r.jsx)(e.td,{children:"get the memory usage for a user"}),(0,r.jsx)(e.td,{children:"dbms.security.getUserMemoryUsage(user::STRING) :: (memory_usage::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.disableUser"}),(0,r.jsx)(e.td,{children:"enable/disable the user"}),(0,r.jsx)(e.td,{children:"dbms.security.disableUser(user::STRING,disable::BOOLEAN) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.setCurrentDesc"}),(0,r.jsx)(e.td,{children:"set the current user description"}),(0,r.jsx)(e.td,{children:"dbms.security.setCurrentDesc(description::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.setUserDesc"}),(0,r.jsx)(e.td,{children:"set user description"}),(0,r.jsx)(e.td,{children:"dbms.security.setUserDesc(user::STRING,description::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.setUserMemoryLimit"}),(0,r.jsx)(e.td,{children:"set user memory limit"}),(0,r.jsx)(e.td,{children:"dbms.security.setUserMemoryLimit(user::STRING,memorylimit::INTEGER) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.deleteUserRoles"}),(0,r.jsx)(e.td,{children:"delete roles from the user"}),(0,r.jsx)(e.td,{children:"dbms.security.deleteUserRoles(user::STRING,roles::LIST) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.rebuildUserRoles"}),(0,r.jsx)(e.td,{children:"rebuild the relationship between the user and the role"}),(0,r.jsx)(e.td,{children:"dbms.security.rebuildUserRoles(user::STRING,roles::LIST) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.security.addUserRoles"}),(0,r.jsx)(e.td,{children:"add the user roles"}),(0,r.jsx)(e.td,{children:"dbms.security.addUserRoles(user::STRING,roles::LIST) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.plugin.loadPlugin"}),(0,r.jsx)(e.td,{children:"load a plugin"}),(0,r.jsx)(e.td,{children:"db.plugin.loadPlugin(plugin_type::STRING,plugin_name::STRING,plugin_content::STRING or MAP,code_type::STRING,plugin_description::STRING,read_only::BOOLEAN, version::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.plugin.deletePlugin"}),(0,r.jsx)(e.td,{children:"unload a plugin"}),(0,r.jsx)(e.td,{children:"db.plugin.deletePlugin(plugin_type::STRING,plugin_name::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.plugin.listPlugin"}),(0,r.jsx)(e.td,{children:"list all plugins"}),(0,r.jsx)(e.td,{children:"db.plugin.listPlugin(plugin_type::STRING,plugin_version::STRING) :: (plugin_description::LIST)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.plugin.getPluginInfo"}),(0,r.jsx)(e.td,{children:"get the information of a specified plugin"}),(0,r.jsx)(e.td,{children:"db.plugin.getPluginInfo(plugin_type::STRING,plugin_name::STRING,show_code::BOOLEAN)::(plugin_description::MAP)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.plugin.callPlugin"}),(0,r.jsx)(e.td,{children:"execute the plugins"}),(0,r.jsx)(e.td,{children:"db.plugin.callPlugin(plugin_type::STRING,plugin_name::STRING,param::STRING,timeout::DOUBLE,in_process::BOOLEAN) :: (success::BOOLEAN,result::STRING)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.importor.dataImportor"}),(0,r.jsx)(e.td,{children:"import vertex/edge data"}),(0,r.jsx)(e.td,{children:"db.importor.dataImportor(description::STRING,content::STRING,continue_on_error::BOOLEAN,thread_nums::INTEGER,delimiter::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.importor.schemaImportor"}),(0,r.jsx)(e.td,{children:"import vertex/edge schema"}),(0,r.jsx)(e.td,{children:"db.importor.schemaImportor(description::STRING) :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.meta.count"}),(0,r.jsx)(e.td,{children:"get the total number of vertex and edge"}),(0,r.jsx)(e.td,{children:"db.dbms.meta.count() :: (type::STRING, number::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.meta.countDetail"}),(0,r.jsx)(e.td,{children:"get the number of vertex and edge for each label"}),(0,r.jsx)(e.td,{children:"db.dbms.meta.countDetail() :: (is_vertex::BOOLEAN, label::STRING, count::INTEGER)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.meta.refreshCount"}),(0,r.jsx)(e.td,{children:"recount the number of vertex and edge, stop writing during the count"}),(0,r.jsx)(e.td,{children:"db.dbms.meta.refreshCount() :: (::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.task.listTasks"}),(0,r.jsx)(e.td,{children:"list running tasks"}),(0,r.jsx)(e.td,{children:"dbms.task.listTasks()::(tasks::LIST)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.task.terminateTask"}),(0,r.jsx)(e.td,{children:"terminate task"}),(0,r.jsx)(e.td,{children:"dbms.task.terminateTask(task_id::STRING)::(::VOID)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"dbms.ha.clusterInfo"}),(0,r.jsx)(e.td,{children:"get cluster info in HA mode"}),(0,r.jsx)(e.td,{children:"dbms.ha.clusterInfo() :: (cluster_info::LIST, is_master::BOOLEAN)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db.dropDB"}),(0,r.jsx)(e.td,{children:"empty the db"}),(0,r.jsx)(e.td,{children:"db.dropDB() :: (::VOID)"})]})]})]})]})}function j(n={}){const{wrapper:e}={...(0,d.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(x,{...n})}):x(n)}},8453:(n,e,s)=>{s.d(e,{R:()=>l,x:()=>t});var r=s(6540);const d={},i=r.createContext(d);function l(n){const e=r.useContext(i);return r.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function t(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(d):n.components||d:l(n.components),r.createElement(i.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/2602de02.a33c14bc.js b/assets/js/2602de02.9b502649.js similarity index 98% rename from assets/js/2602de02.a33c14bc.js rename to assets/js/2602de02.9b502649.js index decbc06970..3bc9513c83 100644 --- a/assets/js/2602de02.a33c14bc.js +++ b/assets/js/2602de02.9b502649.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5514],{3171:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>n,metadata:()=>i,toc:()=>d});var r=a(4848),s=a(8453);const n={},o="Backup and Restore",i={id:"utility-tools/backup-and-restore",title:"Backup and Restore",description:"This document mainly introduces the data backup and restore function of TuGraph.",source:"@site/../docs/en-US/source/6.utility-tools/3.backup-and-restore.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/backup-and-restore",permalink:"/tugraph-db/en/utility-tools/backup-and-restore",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Data Export",permalink:"/tugraph-db/en/utility-tools/data-export"},next:{title:"Data Warmup",permalink:"/tugraph-db/en/utility-tools/data-warmup"}},c={},d=[{value:"1.Data Backup",id:"1data-backup",level:2},{value:"2.Data Restore",id:"2data-restore",level:2}];function u(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"backup-and-restore",children:"Backup and Restore"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"This document mainly introduces the data backup and restore function of TuGraph."}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"1data-backup",children:"1.Data Backup"}),"\n",(0,r.jsx)(t.p,{children:"TuGraph can use the 'lgraph_backup' tool to backup data.\nThe 'lgraph_backup' tool can backup data from a TuGraph database to another directory. It can be used as follows:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"$ lgraph_backup -s {source_dir} -d {destination_dir} -c {true/false}\n"})}),"\n",(0,r.jsx)(t.p,{children:"Details:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-s {source_dir}"})," specifies the directory where the database (source database) to be backed up resides."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-d {destination_dir}"})," specifies the directory where the backup file (destination database) is stored.\nIf the target database is not empty, 'lgraph_backup' prompts you whether to overwrite the database."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-c {true/false}"})," indicates whether a compaction occurs during backup.\nEvery compaction creates a tighter backup, but every compaction takes longer to create. This option defaults to 'true'."]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"2data-restore",children:"2.Data Restore"}),"\n",(0,r.jsxs)(t.p,{children:["The target database ",(0,r.jsx)(t.code,{children:"{destination_dir}"})," obtained using the ",(0,r.jsx)(t.code,{children:"lgraph_backup"})," tool backs up all subgraphs of the source database ",(0,r.jsx)(t.code,{children:"{source_dir}"}),", but does not include the raft information of the HA cluster, thereby ensuring that the service and cluster can be successfully restarted with the backup database and the data is consistent with the source database. The following command can be used to restart the service with the backup database. When the service starts, the storage process of all subgraphs will be restored to ensure that the backup service is completely consistent with the original service."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"$ lgraph_server -c lgraph.json --directory {destination_dir} -d start\n"})}),"\n",(0,r.jsx)(t.p,{children:"Details"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-d {destination_dir}"})," Specify the directory where the backup file (target database) is located."]}),"\n"]})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},8453:(e,t,a)=>{a.d(t,{R:()=>o,x:()=>i});var r=a(6540);const s={},n=r.createContext(s);function o(e){const t=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5514],{3171:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>n,metadata:()=>i,toc:()=>d});var r=a(4848),s=a(8453);const n={},o="Backup and Restore",i={id:"utility-tools/backup-and-restore",title:"Backup and Restore",description:"This document mainly introduces the data backup and restore function of TuGraph.",source:"@site/../docs/en-US/source/6.utility-tools/3.backup-and-restore.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/backup-and-restore",permalink:"/tugraph-db/en/utility-tools/backup-and-restore",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Data Export",permalink:"/tugraph-db/en/utility-tools/data-export"},next:{title:"Data Warmup",permalink:"/tugraph-db/en/utility-tools/data-warmup"}},c={},d=[{value:"1.Data Backup",id:"1data-backup",level:2},{value:"2.Data Restore",id:"2data-restore",level:2}];function u(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"backup-and-restore",children:"Backup and Restore"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"This document mainly introduces the data backup and restore function of TuGraph."}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"1data-backup",children:"1.Data Backup"}),"\n",(0,r.jsx)(t.p,{children:"TuGraph can use the 'lgraph_backup' tool to backup data.\nThe 'lgraph_backup' tool can backup data from a TuGraph database to another directory. It can be used as follows:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"$ lgraph_backup -s {source_dir} -d {destination_dir} -c {true/false}\n"})}),"\n",(0,r.jsx)(t.p,{children:"Details:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-s {source_dir}"})," specifies the directory where the database (source database) to be backed up resides."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-d {destination_dir}"})," specifies the directory where the backup file (destination database) is stored.\nIf the target database is not empty, 'lgraph_backup' prompts you whether to overwrite the database."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-c {true/false}"})," indicates whether a compaction occurs during backup.\nEvery compaction creates a tighter backup, but every compaction takes longer to create. This option defaults to 'true'."]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"2data-restore",children:"2.Data Restore"}),"\n",(0,r.jsxs)(t.p,{children:["The target database ",(0,r.jsx)(t.code,{children:"{destination_dir}"})," obtained using the ",(0,r.jsx)(t.code,{children:"lgraph_backup"})," tool backs up all subgraphs of the source database ",(0,r.jsx)(t.code,{children:"{source_dir}"}),", but does not include the raft information of the HA cluster, thereby ensuring that the service and cluster can be successfully restarted with the backup database and the data is consistent with the source database. The following command can be used to restart the service with the backup database. When the service starts, the storage process of all subgraphs will be restored to ensure that the backup service is completely consistent with the original service."]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"$ lgraph_server -c lgraph.json --directory {destination_dir} -d start\n"})}),"\n",(0,r.jsx)(t.p,{children:"Details"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-d {destination_dir}"})," Specify the directory where the backup file (target database) is located."]}),"\n"]})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},8453:(e,t,a)=>{a.d(t,{R:()=>o,x:()=>i});var r=a(6540);const s={},n=r.createContext(s);function o(e){const t=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2ffb589b.53e8d1eb.js b/assets/js/2ffb589b.f0af2f6d.js similarity index 99% rename from assets/js/2ffb589b.53e8d1eb.js rename to assets/js/2ffb589b.f0af2f6d.js index 14731c78cf..1dacbbe6c7 100644 --- a/assets/js/2ffb589b.53e8d1eb.js +++ b/assets/js/2ffb589b.f0af2f6d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[2001],{8603:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var o=t(4848),a=t(8453);const r={},i="Monitoring",s={id:"permission/monitoring",title:"Monitoring",description:"This document mainly introduces the visualization operation and maintenance monitoring of TuGraph.",source:"@site/../docs/en-US/source/10.permission/4.monitoring.md",sourceDirName:"10.permission",slug:"/permission/monitoring",permalink:"/tugraph-db/en/permission/monitoring",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Forgot Admin Password",permalink:"/tugraph-db/en/permission/reset_admin_password"},next:{title:"Log",permalink:"/tugraph-db/en/permission/log"}},l={},d=[{value:"1.Design Concept",id:"1design-concept",level:2},{value:"1.1.TuGraph",id:"11tugraph",level:3},{value:"1.2.TuGraph Monitor",id:"12tugraph-monitor",level:3},{value:"1.3.Prometheus",id:"13prometheus",level:3},{value:"1.4.Grafana",id:"14grafana",level:3},{value:"2.Deployment Solution",id:"2deployment-solution",level:2},{value:"2.1.Step 1",id:"21step-1",level:3},{value:"2.2.Step 2",id:"22step-2",level:3},{value:"2.3.Step Three",id:"23step-three",level:3},{value:"2.4.Step Four",id:"24step-four",level:3},{value:"3.Future Plans",id:"3future-plans",level:2}];function c(n){const e={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...n.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.header,{children:(0,o.jsx)(e.h1,{id:"monitoring",children:"Monitoring"})}),"\n",(0,o.jsxs)(e.blockquote,{children:["\n",(0,o.jsx)(e.p,{children:"This document mainly introduces the visualization operation and maintenance monitoring of TuGraph."}),"\n"]}),"\n",(0,o.jsx)(e.h2,{id:"1design-concept",children:"1.Design Concept"}),"\n",(0,o.jsx)(e.p,{children:"Visualization monitoring is not an indispensable part of TuGraph itself. Therefore, in the design, visualization monitoring is regarded as an application in the peripheral ecology of TuGraph to reduce the coupling with TuGraph database and its own impact. TuGraph visualization monitoring adopts the hottest open source solution - TuGraph Monitor + Prometheus + Grafana. Wherein, TuGraph Monitor is the client of TuGraph service, which initiates Procedure requests to TuGraph service through TCP connection. After receiving the request, TuGraph service collects statistics of CPU, memory, disk, IO, and number of requests on its own machine and responds. TuGraph Monitor packages the index data received from TuGraph into the format required by Prometheus and saves it in memory, waiting for Prometheus to obtain it through HTTP request. Prometheus regularly obtains packaged request data from TuGraph Monitor through HTTP requests and saves it in its own time-series database according to the time obtained. Grafana can obtain the statistical data within a certain time period from Prometheus according to user configuration and draw easy-to-understand graphics on the web interface to display the final result. In the entire request chain, the active acquisition, i.e. pull model, is used, which has the advantages of minimizing the coupling between data producers and data consumers, making development simpler, and not requiring data producers to consider the data processing capability of data consumers. Even if the data processing ability of a consumer is weak, it will not be crushed by the data producer producing data too fast. One of the shortcomings of the active pulling model is that the real-time performance of the data is insufficient. However, in this scenario, data does not have high real-time requirements."}),"\n",(0,o.jsx)(e.h3,{id:"11tugraph",children:"1.1.TuGraph"}),"\n",(0,o.jsx)(e.p,{children:"TuGraph database provides the ability to collect multiple data information, such as disk, memory, network IO, and query requests, in the service machine, and provides queries through standard Procedure methods. This action of collecting data only occurs when a user queries through the interface, avoiding the impact of TuGraph monitoring service on user business query requests when users do not need the indicators on TuGraph monitoring service machine."}),"\n",(0,o.jsx)(e.h3,{id:"12tugraph-monitor",children:"1.2.TuGraph Monitor"}),"\n",(0,o.jsx)(e.p,{children:"TuGraph Monitor is a tool in the peripheral ecology of TuGraph. It communicates with TuGraph through C++ RPC Client as one of the many users of TuGraph and queries the performance indicators of the machine where TuGraph service is located through the Procedure query interface. It packages the results returned by TuGraph into the data model required by Prometheus and waits for Prometheus to obtain them. Users can set the query time interval to minimize the impact of obtaining monitoring indicators on business queries."}),"\n",(0,o.jsx)(e.h3,{id:"13prometheus",children:"1.3.Prometheus"}),"\n",(0,o.jsxs)(e.p,{children:["Prometheus is an open-source monitoring platform with a dedicated time-series database. It regularly obtains statistical indicators from the TuGraph Monitor service through HTTP requests and saves them in its own time-series database. For details, please refer to the official website:",(0,o.jsx)(e.a,{href:"https://prometheus.io/docs/introduction/first_steps",children:"https://prometheus.io/docs/introduction/first_steps"})]}),"\n",(0,o.jsx)(e.h3,{id:"14grafana",children:"1.4.Grafana"}),"\n",(0,o.jsxs)(e.p,{children:["Grafana is an open-source visualization and analysis software. It can obtain data from multiple data sources, including Prometheus, and can convert data in the time-series database into tools for beautiful graphics and visual effects. For specific information, please refer to the official website:",(0,o.jsx)(e.a,{href:"https://grafana.com/docs/grafana/v7.5/getting-started/",children:"https://grafana.com/docs/grafana/v7.5/getting-started/"})]}),"\n",(0,o.jsx)(e.h2,{id:"2deployment-solution",children:"2.Deployment Solution"}),"\n",(0,o.jsx)(e.h3,{id:"21step-1",children:"2.1.Step 1"}),"\n",(0,o.jsxs)(e.p,{children:["Start the TuGraph service. For details, please refer to the documentation:",(0,o.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/blob/master/doc/zh-CN/1.guide/3.quick-start.md",children:"https://github.com/TuGraph-db/tugraph-db/blob/master/doc/zh-CN/1.guide/3.quick-start.md"})]}),"\n",(0,o.jsx)(e.h3,{id:"22step-2",children:"2.2.Step 2"}),"\n",(0,o.jsx)(e.p,{children:"Start the TuGraph Monitor tool. The startup command is as follows:"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{className:"language-shell",children:"./lgraph_monitor --server_host 127.0.0.1:9091 -u admin -p your_password \\\n\t\t\t--monitor_host 127.0.0.1:9999 --sampling_interval_ms 1000\n"})}),"\n",(0,o.jsx)(e.p,{children:"The meanings of the parameters are as follows:"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{className:"language-shell",children:"Available command line options:\n --server_host Host on which the tugraph rpc server runs.\n Default=127.0.0.1:9091.\n -u, --user DB username.\n -p, --password DB password.\n --monitor_host Host on which the monitor restful server runs.\n Default=127.0.0.1:9999.\n --sampling_interval_ms\n sampling interval in millisecond. Default=1.5e2.\n -h, --help Print this help message. Default=0.\n"})}),"\n",(0,o.jsx)(e.h3,{id:"23step-three",children:"2.3.Step Three"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsxs)(e.li,{children:["\n",(0,o.jsxs)(e.p,{children:["Download the Prometheus tarball that matches your machine architecture and system version. Download link:",(0,o.jsx)(e.a,{href:"https://prometheus.io/download/",children:"https://prometheus.io/download/"})]}),"\n"]}),"\n",(0,o.jsxs)(e.li,{children:["\n",(0,o.jsx)(e.p,{children:"Unzip the tarball with the following command:"}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{className:"language-shell",children:"tar -zxvf prometheus-2.37.5.linux-amd64.tar.gz\n"})}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"Modify the configuration file prometheus.yml and add the following configuration to enable Prometheus to scrape performance data packaged by TuGraph Monitor."}),"\n"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"scrape_configs:\n # The job name is added as a label `job=` to any timeseries scraped from this config.\n - job_name: \"tugraph\"\n\n # metrics_path defaults to '/metrics'\n # scheme defaults to 'http'.\n\n static_configs:\n - targets: [\"localhost:9111\"]\n"})}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"Start Prometheus. You can obtain specific startup parameters with the following command:"}),"\n"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{className:"language-shell",children:"./prometheus -h\n"})}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"Verify if the Prometheus service is running properly by logging into the Prometheus service through the web portal, and querying whether the monitoring index resources_report has been obtained. If the data can be successfully queried, the operation is successful."}),"\n"]}),"\n",(0,o.jsx)(e.h3,{id:"24step-four",children:"2.4.Step Four"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsxs)(e.li,{children:["\n",(0,o.jsxs)(e.p,{children:["Download the Grafana installation package that matches your machine architecture and system version. Download link:",(0,o.jsx)(e.a,{href:"https://grafana.com/grafana/download",children:"https://grafana.com/grafana/download"})]}),"\n"]}),"\n",(0,o.jsxs)(e.li,{children:["\n",(0,o.jsxs)(e.p,{children:["Install Grafana. For details, refer to:",(0,o.jsx)(e.a,{href:"https://grafana.com/docs/grafana/v7.5/installation/",children:" https://grafana.com/docs/grafana/v7.5/installation/"})]}),"\n"]}),"\n",(0,o.jsxs)(e.li,{children:["\n",(0,o.jsxs)(e.p,{children:["Start Grafana. For details, refer to:",(0,o.jsx)(e.a,{href:"https://grafana.com/docs/grafana/v7.5/installation/",children:" https://grafana.com/docs/grafana/v7.5/installation/"})]}),"\n"]}),"\n",(0,o.jsxs)(e.li,{children:["\n",(0,o.jsx)(e.p,{children:"Configure Grafana. First, configure the IP address of Prometheus in the data source settings. After the configuration is completed, verify if the data source is connected successfully by testing the connection function. Then, import the following template and modify the correct interface IP and port in the page according to the actual situation. Finally, set the refresh time and monitoring time range according to the actual situation."}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{className:"language-json",children:'{\n "annotations": {\n "list": [\n {\n "builtIn": 1,\n "datasource": {\n "type": "grafana",\n },\n "enable": true,\n "hide": true,\n "iconColor": "rgba(0, 211, 255, 1)",\n "name": "Annotations & Alerts",\n "target": {\n "limit": 100,\n "matchAny": false,\n "tags": [],\n "type": "dashboard"\n },\n "type": "dashboard"\n }\n ]\n },\n "editable": true,\n "fiscalYearStartMonth": 0,\n "graphTooltip": 0,\n "id": 2,\n "links": [],\n "liveNow": false,\n "panels": [\n {\n "datasource": {\n "type": "prometheus",\n },\n "fieldConfig": {\n "defaults": {\n "color": {\n "mode": "palette-classic"\n },\n "custom": {\n "hideFrom": {\n "legend": false,\n "tooltip": false,\n "viz": false\n }\n },\n "mappings": [],\n "unit": "kbytes"\n },\n "overrides": [\n {\n "matcher": {\n "id": "byName",\n "options": "D {instance=\\"localhost:7010\\", job=\\"TuGraph\\", resouces_type=\\"memory\\", type=\\"available\\"}"\n },\n "properties": [\n {\n "id": "displayName",\n "value": "others"\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "D {__name__=\\"resources_report\\", instance=\\"localhost:7010\\", job=\\"TuGraph\\", resouces_type=\\"memory\\", type=\\"available\\"}"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-green",\n "mode": "fixed"\n }\n },\n {\n "id": "displayName",\n "value": "others"\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "others"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-blue",\n "mode": "fixed"\n }\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "graph_used"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-orange",\n "mode": "fixed"\n }\n }\n ]\n }\n ]\n },\n "gridPos": {\n "h": 16,\n "w": 6,\n "x": 0,\n "y": 0\n },\n "id": 14,\n "options": {\n "displayLabels": [\n "name",\n "value"\n ],\n "legend": {\n "displayMode": "table",\n "placement": "bottom",\n "values": [\n "percent",\n "value"\n ]\n },\n "pieType": "pie",\n "reduceOptions": {\n "calcs": [\n "lastNotNull"\n ],\n "fields": "",\n "values": false\n },\n "tooltip": {\n "mode": "single",\n "sort": "none"\n }\n },\n "targets": [\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"memory\\",type=\\"self\\"}",\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "A"\n },\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"memory\\",type=\\"available\\"}",\n "hide": false,\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "B"\n },\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"memory\\",type=\\"total\\"}",\n "hide": true,\n "legendFormat": "{{label_name}}",\n "range": true,\n "refId": "C"\n },\n {\n "datasource": {\n "type": "__expr__",\n },\n "expression": "$C -$A - $B",\n "hide": false,\n "refId": "D",\n "type": "math"\n }\n ],\n "title": "memory",\n "type": "piechart"\n },\n {\n "alert": {\n "alertRuleTags": {},\n "conditions": [\n {\n "evaluator": {\n "params": [\n 1000\n ],\n "type": "gt"\n },\n "operator": {\n "type": "and"\n },\n "query": {\n "params": [\n "A",\n "5m",\n "now"\n ]\n },\n "reducer": {\n "params": [],\n "type": "avg"\n },\n "type": "query"\n }\n ],\n "executionErrorState": "alerting",\n "for": "5m",\n "frequency": "1m",\n "handler": 1,\n "message": "[Production Graph Database Grafana] \\n QPS exceeds 1000",\n "name": "Request statistics alert",\n "noDataState": "no_data",\n "notifications": []\n },\n "datasource": {\n "type": "prometheus",\n },\n "fieldConfig": {\n "defaults": {\n "color": {\n "mode": "palette-classic"\n },\n "custom": {\n "axisLabel": "",\n "axisPlacement": "auto",\n "barAlignment": 0,\n "drawStyle": "line",\n "fillOpacity": 7,\n "gradientMode": "none",\n "hideFrom": {\n "legend": false,\n "tooltip": false,\n "viz": false\n },\n "lineInterpolation": "smooth",\n "lineWidth": 1,\n "pointSize": 5,\n "scaleDistribution": {\n "type": "linear"\n },\n "showPoints": "auto",\n "spanNulls": false,\n "stacking": {\n "group": "A",\n "mode": "none"\n },\n "thresholdsStyle": {\n "mode": "off"\n }\n },\n "mappings": [],\n "thresholds": {\n "mode": "absolute",\n "steps": [\n {\n "color": "green",\n "value": null\n },\n {\n "color": "red",\n "value": 80\n }\n ]\n },\n "unit": " "\n },\n "overrides": [\n {\n "matcher": {\n "id": "byName",\n "options": "write"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-blue",\n "mode": "fixed"\n }\n }\n ]\n }\n ]\n },\n "gridPos": {\n "h": 16,\n "w": 12,\n "x": 6,\n "y": 0\n },\n "id": 4,\n "options": {\n "legend": {\n "calcs": [\n "min",\n "max",\n "mean",\n "last"\n ],\n "displayMode": "table",\n "placement": "bottom"\n },\n "tooltip": {\n "mode": "single",\n "sort": "none"\n }\n },\n "targets": [\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "expr": "{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"request\\",type=~\\"total|write\\"}",\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "A"\n }\n ],\n "thresholds": [\n {\n "colorMode": "critical",\n "op": "gt",\n "value": 1000,\n "visible": true\n }\n ],\n "title": "Request statistics",\n "type": "timeseries"\n },\n {\n "datasource": {\n "type": "prometheus",\n },\n "fieldConfig": {\n "defaults": {\n "color": {\n "mode": "palette-classic"\n },\n "custom": {\n "hideFrom": {\n "legend": false,\n "tooltip": false,\n "viz": false\n }\n },\n "mappings": [],\n "unit": "decbits"\n },\n "overrides": [\n {\n "matcher": {\n "id": "byName",\n "options": "graph_used"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-red",\n "mode": "fixed"\n }\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "available"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-orange",\n "mode": "fixed"\n }\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "D"\n },\n "properties": [\n {\n "id": "displayName",\n "value": "other"\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "other"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-purple",\n "mode": "fixed"\n }\n }\n ]\n }\n ]\n },\n "gridPos": {\n "h": 16,\n "w": 6,\n "x": 18,\n "y": 0\n },\n "id": 12,\n "options": {\n "displayLabels": [\n "name",\n "value"\n ],\n "legend": {\n "displayMode": "table",\n "placement": "bottom",\n "sortBy": "Value",\n "sortDesc": true,\n "values": [\n "value",\n "percent"\n ]\n },\n "pieType": "pie",\n "reduceOptions": {\n "calcs": [\n "lastNotNull"\n ],\n "fields": "",\n "values": false\n },\n "tooltip": {\n "mode": "single",\n "sort": "none"\n }\n },\n "targets": [\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "exemplar": false,\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"disk\\",type=\\"available\\"}",\n "format": "time_series",\n "instant": false,\n "interval": "",\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "A"\n },\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"disk\\",type=\\"self\\"}",\n "hide": false,\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "B"\n },\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"disk\\",type=\\"total\\"}",\n "hide": true,\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "C"\n },\n {\n "datasource": {\n "type": "__expr__",\n },\n "expression": "$C - $A - $B",\n "hide": false,\n "refId": "D",\n "type": "math"\n }\n ],\n "title": "disk",\n "transformations": [\n {\n "id": "configFromData",\n "options": {\n "applyTo": {\n "id": "byFrameRefID"\n },\n "configRefId": "config",\n "mappings": []\n }\n }\n ],\n "type": "piechart"\n },\n {\n "alert": {\n "alertRuleTags": {},\n "conditions": [\n {\n "evaluator": {\n "params": [\n 90\n ],\n "type": "gt"\n },\n "operator": {\n "type": "and"\n },\n "query": {\n "params": [\n "A",\n "5m",\n "now"\n ]\n },\n "reducer": {\n "params": [],\n "type": "avg"\n },\n "type": "query"\n }\n ],\n "executionErrorState": "alerting",\n "for": "5m",\n "frequency": "1m",\n "handler": 1,\n "message": "[Production Graph Database Grafana] \\nCPU usage rate exceeds 90%",\n "name": "CPU usage rate alert",\n "noDataState": "no_data",\n "notifications": [\n {\n }\n ]\n },\n "datasource": {\n "type": "prometheus",\n },\n "description": "",\n "fieldConfig": {\n "defaults": {\n "color": {\n "mode": "palette-classic"\n },\n "custom": {\n "axisLabel": "",\n "axisPlacement": "auto",\n "barAlignment": 0,\n "drawStyle": "line",\n "fillOpacity": 4,\n "gradientMode": "none",\n "hideFrom": {\n "legend": false,\n "tooltip": false,\n "viz": false\n },\n "lineInterpolation": "linear",\n "lineWidth": 1,\n "pointSize": 5,\n "scaleDistribution": {\n "type": "linear"\n },\n "showPoints": "auto",\n "spanNulls": false,\n "stacking": {\n "group": "A",\n "mode": "none"\n },\n "thresholdsStyle": {\n "mode": "off"\n }\n },\n "mappings": [],\n "thresholds": {\n "mode": "absolute",\n "steps": [\n {\n "color": "green",\n "value": null\n },\n {\n "color": "red",\n "value": 80\n }\n ]\n },\n "unit": "percent"\n },\n "overrides": [\n {\n "matcher": {\n "id": "byName",\n "options": "graph_used"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-orange",\n "mode": "fixed"\n }\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "total_used"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-purple",\n "mode": "fixed"\n }\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "self"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-green",\n "mode": "fixed"\n }\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "total"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-purple",\n "mode": "fixed"\n }\n }\n ]\n }\n ]\n },\n "gridPos": {\n "h": 14,\n "w": 12,\n "x": 0,\n "y": 16\n },\n "id": 6,\n "options": {\n "legend": {\n "calcs": [\n "min",\n "max",\n "mean",\n "last"\n ],\n "displayMode": "table",\n "placement": "bottom"\n },\n "tooltip": {\n "mode": "single",\n "sort": "none"\n }\n },\n "targets": [\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"cpu\\",type=~\\"total|self\\"}",\n "hide": false,\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "A"\n }\n ],\n "thresholds": [\n {\n "colorMode": "critical",\n "op": "gt",\n "value": 90,\n "visible": true\n }\n ],\n "title": "CPU usage rate",\n "type": "timeseries"\n },\n {\n "alert": {\n "alertRuleTags": {},\n "conditions": [\n {\n "evaluator": {\n "params": [\n 10000\n ],\n "type": "gt"\n },\n "operator": {\n "type": "and"\n },\n "query": {\n "params": [\n "A",\n "5m",\n "now"\n ]\n },\n "reducer": {\n "params": [],\n "type": "avg"\n },\n "type": "query"\n }\n ],\n "executionErrorState": "alerting",\n "for": "5m",\n "frequency": "1m",\n "handler": 1,\n "message": "[Production Graph Database Grafana] Disk IO exceeds 10MB/S",\n "name": "Disk IO alert",\n "noDataState": "no_data",\n "notifications": []\n },\n "datasource": {\n "type": "prometheus",\n },\n "fieldConfig": {\n "defaults": {\n "color": {\n "mode": "palette-classic"\n },\n "custom": {\n "axisLabel": "",\n "axisPlacement": "auto",\n "barAlignment": 0,\n "drawStyle": "line",\n "fillOpacity": 7,\n "gradientMode": "none",\n "hideFrom": {\n "legend": false,\n "tooltip": false,\n "viz": false\n },\n "lineInterpolation": "smooth",\n "lineWidth": 1,\n "pointSize": 5,\n "scaleDistribution": {\n "type": "linear"\n },\n "showPoints": "auto",\n "spanNulls": false,\n "stacking": {\n "group": "A",\n "mode": "none"\n },\n "thresholdsStyle": {\n "mode": "off"\n }\n },\n "mappings": [],\n "thresholds": {\n "mode": "absolute",\n "steps": [\n {\n "color": "green",\n "value": null\n },\n {\n "color": "red",\n "value": 80\n }\n ]\n },\n "unit": "bps"\n },\n "overrides": [\n {\n "matcher": {\n "id": "byName",\n "options": "read"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "super-light-green",\n "mode": "fixed"\n }\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "write"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "super-light-red",\n "mode": "fixed"\n }\n }\n ]\n }\n ]\n },\n "gridPos": {\n "h": 14,\n "w": 12,\n "x": 12,\n "y": 16\n },\n "id": 2,\n "options": {\n "legend": {\n "calcs": [\n "min",\n "max",\n "mean",\n "last"\n ],\n "displayMode": "table",\n "placement": "bottom"\n },\n "tooltip": {\n "mode": "single",\n "sort": "none"\n }\n },\n "targets": [\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "builder",\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"disk_rate\\",type=~\\"read|write\\"}",\n "hide": false,\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "A"\n }\n ],\n "thresholds": [\n {\n "colorMode": "critical",\n "op": "gt",\n "value": 10000,\n "visible": true\n }\n ],\n "title": "\u78c1\u76d8IO",\n "type": "timeseries"\n }\n ],\n "refresh": "",\n "schemaVersion": 36,\n "style": "dark",\n "tags": [],\n "templating": {\n "list": []\n },\n "time": {\n "from": "now-24h",\n "to": "now"\n },\n "timepicker": {\n "hidden": false,\n "refresh_intervals": [\n "10s"\n ]\n },\n "timezone": "",\n "title": "TuGraph Monitoring Web",\n "version": 20,\n "weekStart": ""\n}\n'})}),"\n",(0,o.jsx)(e.p,{children:"Verify the effect by refreshing the browser page. If the pie chart and line chart are displayed correctly, the configuration is completed."}),"\n",(0,o.jsx)(e.h2,{id:"3future-plans",children:"3.Future Plans"}),"\n",(0,o.jsx)(e.p,{children:"Currently, visual monitoring only supports single-machine monitoring and can monitor performance indicators such as CPU, disk, network IO, and request QPS of the machine on which the service is located. In the future, monitoring for HA clusters will be implemented, and more meaningful indicators will be included in the monitoring scope."})]})}function p(n={}){const{wrapper:e}={...(0,a.R)(),...n.components};return e?(0,o.jsx)(e,{...n,children:(0,o.jsx)(c,{...n})}):c(n)}},8453:(n,e,t)=>{t.d(e,{R:()=>i,x:()=>s});var o=t(6540);const a={},r=o.createContext(a);function i(n){const e=o.useContext(r);return o.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function s(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(a):n.components||a:i(n.components),o.createElement(r.Provider,{value:e},n.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[2001],{8603:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var o=t(4848),a=t(8453);const r={},i="Monitoring",s={id:"permission/monitoring",title:"Monitoring",description:"This document mainly introduces the visualization operation and maintenance monitoring of TuGraph.",source:"@site/../docs/en-US/source/10.permission/4.monitoring.md",sourceDirName:"10.permission",slug:"/permission/monitoring",permalink:"/tugraph-db/en/permission/monitoring",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Forgot Admin Password",permalink:"/tugraph-db/en/permission/reset_admin_password"},next:{title:"Log",permalink:"/tugraph-db/en/permission/log"}},l={},d=[{value:"1.Design Concept",id:"1design-concept",level:2},{value:"1.1.TuGraph",id:"11tugraph",level:3},{value:"1.2.TuGraph Monitor",id:"12tugraph-monitor",level:3},{value:"1.3.Prometheus",id:"13prometheus",level:3},{value:"1.4.Grafana",id:"14grafana",level:3},{value:"2.Deployment Solution",id:"2deployment-solution",level:2},{value:"2.1.Step 1",id:"21step-1",level:3},{value:"2.2.Step 2",id:"22step-2",level:3},{value:"2.3.Step Three",id:"23step-three",level:3},{value:"2.4.Step Four",id:"24step-four",level:3},{value:"3.Future Plans",id:"3future-plans",level:2}];function c(n){const e={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...n.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.header,{children:(0,o.jsx)(e.h1,{id:"monitoring",children:"Monitoring"})}),"\n",(0,o.jsxs)(e.blockquote,{children:["\n",(0,o.jsx)(e.p,{children:"This document mainly introduces the visualization operation and maintenance monitoring of TuGraph."}),"\n"]}),"\n",(0,o.jsx)(e.h2,{id:"1design-concept",children:"1.Design Concept"}),"\n",(0,o.jsx)(e.p,{children:"Visualization monitoring is not an indispensable part of TuGraph itself. Therefore, in the design, visualization monitoring is regarded as an application in the peripheral ecology of TuGraph to reduce the coupling with TuGraph database and its own impact. TuGraph visualization monitoring adopts the hottest open source solution - TuGraph Monitor + Prometheus + Grafana. Wherein, TuGraph Monitor is the client of TuGraph service, which initiates Procedure requests to TuGraph service through TCP connection. After receiving the request, TuGraph service collects statistics of CPU, memory, disk, IO, and number of requests on its own machine and responds. TuGraph Monitor packages the index data received from TuGraph into the format required by Prometheus and saves it in memory, waiting for Prometheus to obtain it through HTTP request. Prometheus regularly obtains packaged request data from TuGraph Monitor through HTTP requests and saves it in its own time-series database according to the time obtained. Grafana can obtain the statistical data within a certain time period from Prometheus according to user configuration and draw easy-to-understand graphics on the web interface to display the final result. In the entire request chain, the active acquisition, i.e. pull model, is used, which has the advantages of minimizing the coupling between data producers and data consumers, making development simpler, and not requiring data producers to consider the data processing capability of data consumers. Even if the data processing ability of a consumer is weak, it will not be crushed by the data producer producing data too fast. One of the shortcomings of the active pulling model is that the real-time performance of the data is insufficient. However, in this scenario, data does not have high real-time requirements."}),"\n",(0,o.jsx)(e.h3,{id:"11tugraph",children:"1.1.TuGraph"}),"\n",(0,o.jsx)(e.p,{children:"TuGraph database provides the ability to collect multiple data information, such as disk, memory, network IO, and query requests, in the service machine, and provides queries through standard Procedure methods. This action of collecting data only occurs when a user queries through the interface, avoiding the impact of TuGraph monitoring service on user business query requests when users do not need the indicators on TuGraph monitoring service machine."}),"\n",(0,o.jsx)(e.h3,{id:"12tugraph-monitor",children:"1.2.TuGraph Monitor"}),"\n",(0,o.jsx)(e.p,{children:"TuGraph Monitor is a tool in the peripheral ecology of TuGraph. It communicates with TuGraph through C++ RPC Client as one of the many users of TuGraph and queries the performance indicators of the machine where TuGraph service is located through the Procedure query interface. It packages the results returned by TuGraph into the data model required by Prometheus and waits for Prometheus to obtain them. Users can set the query time interval to minimize the impact of obtaining monitoring indicators on business queries."}),"\n",(0,o.jsx)(e.h3,{id:"13prometheus",children:"1.3.Prometheus"}),"\n",(0,o.jsxs)(e.p,{children:["Prometheus is an open-source monitoring platform with a dedicated time-series database. It regularly obtains statistical indicators from the TuGraph Monitor service through HTTP requests and saves them in its own time-series database. For details, please refer to the official website:",(0,o.jsx)(e.a,{href:"https://prometheus.io/docs/introduction/first_steps",children:"https://prometheus.io/docs/introduction/first_steps"})]}),"\n",(0,o.jsx)(e.h3,{id:"14grafana",children:"1.4.Grafana"}),"\n",(0,o.jsxs)(e.p,{children:["Grafana is an open-source visualization and analysis software. It can obtain data from multiple data sources, including Prometheus, and can convert data in the time-series database into tools for beautiful graphics and visual effects. For specific information, please refer to the official website:",(0,o.jsx)(e.a,{href:"https://grafana.com/docs/grafana/v7.5/getting-started/",children:"https://grafana.com/docs/grafana/v7.5/getting-started/"})]}),"\n",(0,o.jsx)(e.h2,{id:"2deployment-solution",children:"2.Deployment Solution"}),"\n",(0,o.jsx)(e.h3,{id:"21step-1",children:"2.1.Step 1"}),"\n",(0,o.jsxs)(e.p,{children:["Start the TuGraph service. For details, please refer to the documentation:",(0,o.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/blob/master/doc/zh-CN/1.guide/3.quick-start.md",children:"https://github.com/TuGraph-db/tugraph-db/blob/master/doc/zh-CN/1.guide/3.quick-start.md"})]}),"\n",(0,o.jsx)(e.h3,{id:"22step-2",children:"2.2.Step 2"}),"\n",(0,o.jsx)(e.p,{children:"Start the TuGraph Monitor tool. The startup command is as follows:"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{className:"language-shell",children:"./lgraph_monitor --server_host 127.0.0.1:9091 -u admin -p your_password \\\n\t\t\t--monitor_host 127.0.0.1:9999 --sampling_interval_ms 1000\n"})}),"\n",(0,o.jsx)(e.p,{children:"The meanings of the parameters are as follows:"}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{className:"language-shell",children:"Available command line options:\n --server_host Host on which the tugraph rpc server runs.\n Default=127.0.0.1:9091.\n -u, --user DB username.\n -p, --password DB password.\n --monitor_host Host on which the monitor restful server runs.\n Default=127.0.0.1:9999.\n --sampling_interval_ms\n sampling interval in millisecond. Default=1.5e2.\n -h, --help Print this help message. Default=0.\n"})}),"\n",(0,o.jsx)(e.h3,{id:"23step-three",children:"2.3.Step Three"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsxs)(e.li,{children:["\n",(0,o.jsxs)(e.p,{children:["Download the Prometheus tarball that matches your machine architecture and system version. Download link:",(0,o.jsx)(e.a,{href:"https://prometheus.io/download/",children:"https://prometheus.io/download/"})]}),"\n"]}),"\n",(0,o.jsxs)(e.li,{children:["\n",(0,o.jsx)(e.p,{children:"Unzip the tarball with the following command:"}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{className:"language-shell",children:"tar -zxvf prometheus-2.37.5.linux-amd64.tar.gz\n"})}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"Modify the configuration file prometheus.yml and add the following configuration to enable Prometheus to scrape performance data packaged by TuGraph Monitor."}),"\n"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{children:"scrape_configs:\n # The job name is added as a label `job=` to any timeseries scraped from this config.\n - job_name: \"tugraph\"\n\n # metrics_path defaults to '/metrics'\n # scheme defaults to 'http'.\n\n static_configs:\n - targets: [\"localhost:9111\"]\n"})}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"Start Prometheus. You can obtain specific startup parameters with the following command:"}),"\n"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{className:"language-shell",children:"./prometheus -h\n"})}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"Verify if the Prometheus service is running properly by logging into the Prometheus service through the web portal, and querying whether the monitoring index resources_report has been obtained. If the data can be successfully queried, the operation is successful."}),"\n"]}),"\n",(0,o.jsx)(e.h3,{id:"24step-four",children:"2.4.Step Four"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsxs)(e.li,{children:["\n",(0,o.jsxs)(e.p,{children:["Download the Grafana installation package that matches your machine architecture and system version. Download link:",(0,o.jsx)(e.a,{href:"https://grafana.com/grafana/download",children:"https://grafana.com/grafana/download"})]}),"\n"]}),"\n",(0,o.jsxs)(e.li,{children:["\n",(0,o.jsxs)(e.p,{children:["Install Grafana. For details, refer to:",(0,o.jsx)(e.a,{href:"https://grafana.com/docs/grafana/v7.5/installation/",children:" https://grafana.com/docs/grafana/v7.5/installation/"})]}),"\n"]}),"\n",(0,o.jsxs)(e.li,{children:["\n",(0,o.jsxs)(e.p,{children:["Start Grafana. For details, refer to:",(0,o.jsx)(e.a,{href:"https://grafana.com/docs/grafana/v7.5/installation/",children:" https://grafana.com/docs/grafana/v7.5/installation/"})]}),"\n"]}),"\n",(0,o.jsxs)(e.li,{children:["\n",(0,o.jsx)(e.p,{children:"Configure Grafana. First, configure the IP address of Prometheus in the data source settings. After the configuration is completed, verify if the data source is connected successfully by testing the connection function. Then, import the following template and modify the correct interface IP and port in the page according to the actual situation. Finally, set the refresh time and monitoring time range according to the actual situation."}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(e.pre,{children:(0,o.jsx)(e.code,{className:"language-json",children:'{\n "annotations": {\n "list": [\n {\n "builtIn": 1,\n "datasource": {\n "type": "grafana",\n },\n "enable": true,\n "hide": true,\n "iconColor": "rgba(0, 211, 255, 1)",\n "name": "Annotations & Alerts",\n "target": {\n "limit": 100,\n "matchAny": false,\n "tags": [],\n "type": "dashboard"\n },\n "type": "dashboard"\n }\n ]\n },\n "editable": true,\n "fiscalYearStartMonth": 0,\n "graphTooltip": 0,\n "id": 2,\n "links": [],\n "liveNow": false,\n "panels": [\n {\n "datasource": {\n "type": "prometheus",\n },\n "fieldConfig": {\n "defaults": {\n "color": {\n "mode": "palette-classic"\n },\n "custom": {\n "hideFrom": {\n "legend": false,\n "tooltip": false,\n "viz": false\n }\n },\n "mappings": [],\n "unit": "kbytes"\n },\n "overrides": [\n {\n "matcher": {\n "id": "byName",\n "options": "D {instance=\\"localhost:7010\\", job=\\"TuGraph\\", resouces_type=\\"memory\\", type=\\"available\\"}"\n },\n "properties": [\n {\n "id": "displayName",\n "value": "others"\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "D {__name__=\\"resources_report\\", instance=\\"localhost:7010\\", job=\\"TuGraph\\", resouces_type=\\"memory\\", type=\\"available\\"}"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-green",\n "mode": "fixed"\n }\n },\n {\n "id": "displayName",\n "value": "others"\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "others"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-blue",\n "mode": "fixed"\n }\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "graph_used"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-orange",\n "mode": "fixed"\n }\n }\n ]\n }\n ]\n },\n "gridPos": {\n "h": 16,\n "w": 6,\n "x": 0,\n "y": 0\n },\n "id": 14,\n "options": {\n "displayLabels": [\n "name",\n "value"\n ],\n "legend": {\n "displayMode": "table",\n "placement": "bottom",\n "values": [\n "percent",\n "value"\n ]\n },\n "pieType": "pie",\n "reduceOptions": {\n "calcs": [\n "lastNotNull"\n ],\n "fields": "",\n "values": false\n },\n "tooltip": {\n "mode": "single",\n "sort": "none"\n }\n },\n "targets": [\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"memory\\",type=\\"self\\"}",\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "A"\n },\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"memory\\",type=\\"available\\"}",\n "hide": false,\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "B"\n },\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"memory\\",type=\\"total\\"}",\n "hide": true,\n "legendFormat": "{{label_name}}",\n "range": true,\n "refId": "C"\n },\n {\n "datasource": {\n "type": "__expr__",\n },\n "expression": "$C -$A - $B",\n "hide": false,\n "refId": "D",\n "type": "math"\n }\n ],\n "title": "memory",\n "type": "piechart"\n },\n {\n "alert": {\n "alertRuleTags": {},\n "conditions": [\n {\n "evaluator": {\n "params": [\n 1000\n ],\n "type": "gt"\n },\n "operator": {\n "type": "and"\n },\n "query": {\n "params": [\n "A",\n "5m",\n "now"\n ]\n },\n "reducer": {\n "params": [],\n "type": "avg"\n },\n "type": "query"\n }\n ],\n "executionErrorState": "alerting",\n "for": "5m",\n "frequency": "1m",\n "handler": 1,\n "message": "[Production Graph Database Grafana] \\n QPS exceeds 1000",\n "name": "Request statistics alert",\n "noDataState": "no_data",\n "notifications": []\n },\n "datasource": {\n "type": "prometheus",\n },\n "fieldConfig": {\n "defaults": {\n "color": {\n "mode": "palette-classic"\n },\n "custom": {\n "axisLabel": "",\n "axisPlacement": "auto",\n "barAlignment": 0,\n "drawStyle": "line",\n "fillOpacity": 7,\n "gradientMode": "none",\n "hideFrom": {\n "legend": false,\n "tooltip": false,\n "viz": false\n },\n "lineInterpolation": "smooth",\n "lineWidth": 1,\n "pointSize": 5,\n "scaleDistribution": {\n "type": "linear"\n },\n "showPoints": "auto",\n "spanNulls": false,\n "stacking": {\n "group": "A",\n "mode": "none"\n },\n "thresholdsStyle": {\n "mode": "off"\n }\n },\n "mappings": [],\n "thresholds": {\n "mode": "absolute",\n "steps": [\n {\n "color": "green",\n "value": null\n },\n {\n "color": "red",\n "value": 80\n }\n ]\n },\n "unit": " "\n },\n "overrides": [\n {\n "matcher": {\n "id": "byName",\n "options": "write"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-blue",\n "mode": "fixed"\n }\n }\n ]\n }\n ]\n },\n "gridPos": {\n "h": 16,\n "w": 12,\n "x": 6,\n "y": 0\n },\n "id": 4,\n "options": {\n "legend": {\n "calcs": [\n "min",\n "max",\n "mean",\n "last"\n ],\n "displayMode": "table",\n "placement": "bottom"\n },\n "tooltip": {\n "mode": "single",\n "sort": "none"\n }\n },\n "targets": [\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "expr": "{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"request\\",type=~\\"total|write\\"}",\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "A"\n }\n ],\n "thresholds": [\n {\n "colorMode": "critical",\n "op": "gt",\n "value": 1000,\n "visible": true\n }\n ],\n "title": "Request statistics",\n "type": "timeseries"\n },\n {\n "datasource": {\n "type": "prometheus",\n },\n "fieldConfig": {\n "defaults": {\n "color": {\n "mode": "palette-classic"\n },\n "custom": {\n "hideFrom": {\n "legend": false,\n "tooltip": false,\n "viz": false\n }\n },\n "mappings": [],\n "unit": "decbits"\n },\n "overrides": [\n {\n "matcher": {\n "id": "byName",\n "options": "graph_used"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-red",\n "mode": "fixed"\n }\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "available"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-orange",\n "mode": "fixed"\n }\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "D"\n },\n "properties": [\n {\n "id": "displayName",\n "value": "other"\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "other"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-purple",\n "mode": "fixed"\n }\n }\n ]\n }\n ]\n },\n "gridPos": {\n "h": 16,\n "w": 6,\n "x": 18,\n "y": 0\n },\n "id": 12,\n "options": {\n "displayLabels": [\n "name",\n "value"\n ],\n "legend": {\n "displayMode": "table",\n "placement": "bottom",\n "sortBy": "Value",\n "sortDesc": true,\n "values": [\n "value",\n "percent"\n ]\n },\n "pieType": "pie",\n "reduceOptions": {\n "calcs": [\n "lastNotNull"\n ],\n "fields": "",\n "values": false\n },\n "tooltip": {\n "mode": "single",\n "sort": "none"\n }\n },\n "targets": [\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "exemplar": false,\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"disk\\",type=\\"available\\"}",\n "format": "time_series",\n "instant": false,\n "interval": "",\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "A"\n },\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"disk\\",type=\\"self\\"}",\n "hide": false,\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "B"\n },\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"disk\\",type=\\"total\\"}",\n "hide": true,\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "C"\n },\n {\n "datasource": {\n "type": "__expr__",\n },\n "expression": "$C - $A - $B",\n "hide": false,\n "refId": "D",\n "type": "math"\n }\n ],\n "title": "disk",\n "transformations": [\n {\n "id": "configFromData",\n "options": {\n "applyTo": {\n "id": "byFrameRefID"\n },\n "configRefId": "config",\n "mappings": []\n }\n }\n ],\n "type": "piechart"\n },\n {\n "alert": {\n "alertRuleTags": {},\n "conditions": [\n {\n "evaluator": {\n "params": [\n 90\n ],\n "type": "gt"\n },\n "operator": {\n "type": "and"\n },\n "query": {\n "params": [\n "A",\n "5m",\n "now"\n ]\n },\n "reducer": {\n "params": [],\n "type": "avg"\n },\n "type": "query"\n }\n ],\n "executionErrorState": "alerting",\n "for": "5m",\n "frequency": "1m",\n "handler": 1,\n "message": "[Production Graph Database Grafana] \\nCPU usage rate exceeds 90%",\n "name": "CPU usage rate alert",\n "noDataState": "no_data",\n "notifications": [\n {\n }\n ]\n },\n "datasource": {\n "type": "prometheus",\n },\n "description": "",\n "fieldConfig": {\n "defaults": {\n "color": {\n "mode": "palette-classic"\n },\n "custom": {\n "axisLabel": "",\n "axisPlacement": "auto",\n "barAlignment": 0,\n "drawStyle": "line",\n "fillOpacity": 4,\n "gradientMode": "none",\n "hideFrom": {\n "legend": false,\n "tooltip": false,\n "viz": false\n },\n "lineInterpolation": "linear",\n "lineWidth": 1,\n "pointSize": 5,\n "scaleDistribution": {\n "type": "linear"\n },\n "showPoints": "auto",\n "spanNulls": false,\n "stacking": {\n "group": "A",\n "mode": "none"\n },\n "thresholdsStyle": {\n "mode": "off"\n }\n },\n "mappings": [],\n "thresholds": {\n "mode": "absolute",\n "steps": [\n {\n "color": "green",\n "value": null\n },\n {\n "color": "red",\n "value": 80\n }\n ]\n },\n "unit": "percent"\n },\n "overrides": [\n {\n "matcher": {\n "id": "byName",\n "options": "graph_used"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-orange",\n "mode": "fixed"\n }\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "total_used"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-purple",\n "mode": "fixed"\n }\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "self"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-green",\n "mode": "fixed"\n }\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "total"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "light-purple",\n "mode": "fixed"\n }\n }\n ]\n }\n ]\n },\n "gridPos": {\n "h": 14,\n "w": 12,\n "x": 0,\n "y": 16\n },\n "id": 6,\n "options": {\n "legend": {\n "calcs": [\n "min",\n "max",\n "mean",\n "last"\n ],\n "displayMode": "table",\n "placement": "bottom"\n },\n "tooltip": {\n "mode": "single",\n "sort": "none"\n }\n },\n "targets": [\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "code",\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"cpu\\",type=~\\"total|self\\"}",\n "hide": false,\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "A"\n }\n ],\n "thresholds": [\n {\n "colorMode": "critical",\n "op": "gt",\n "value": 90,\n "visible": true\n }\n ],\n "title": "CPU usage rate",\n "type": "timeseries"\n },\n {\n "alert": {\n "alertRuleTags": {},\n "conditions": [\n {\n "evaluator": {\n "params": [\n 10000\n ],\n "type": "gt"\n },\n "operator": {\n "type": "and"\n },\n "query": {\n "params": [\n "A",\n "5m",\n "now"\n ]\n },\n "reducer": {\n "params": [],\n "type": "avg"\n },\n "type": "query"\n }\n ],\n "executionErrorState": "alerting",\n "for": "5m",\n "frequency": "1m",\n "handler": 1,\n "message": "[Production Graph Database Grafana] Disk IO exceeds 10MB/S",\n "name": "Disk IO alert",\n "noDataState": "no_data",\n "notifications": []\n },\n "datasource": {\n "type": "prometheus",\n },\n "fieldConfig": {\n "defaults": {\n "color": {\n "mode": "palette-classic"\n },\n "custom": {\n "axisLabel": "",\n "axisPlacement": "auto",\n "barAlignment": 0,\n "drawStyle": "line",\n "fillOpacity": 7,\n "gradientMode": "none",\n "hideFrom": {\n "legend": false,\n "tooltip": false,\n "viz": false\n },\n "lineInterpolation": "smooth",\n "lineWidth": 1,\n "pointSize": 5,\n "scaleDistribution": {\n "type": "linear"\n },\n "showPoints": "auto",\n "spanNulls": false,\n "stacking": {\n "group": "A",\n "mode": "none"\n },\n "thresholdsStyle": {\n "mode": "off"\n }\n },\n "mappings": [],\n "thresholds": {\n "mode": "absolute",\n "steps": [\n {\n "color": "green",\n "value": null\n },\n {\n "color": "red",\n "value": 80\n }\n ]\n },\n "unit": "bps"\n },\n "overrides": [\n {\n "matcher": {\n "id": "byName",\n "options": "read"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "super-light-green",\n "mode": "fixed"\n }\n }\n ]\n },\n {\n "matcher": {\n "id": "byName",\n "options": "write"\n },\n "properties": [\n {\n "id": "color",\n "value": {\n "fixedColor": "super-light-red",\n "mode": "fixed"\n }\n }\n ]\n }\n ]\n },\n "gridPos": {\n "h": 14,\n "w": 12,\n "x": 12,\n "y": 16\n },\n "id": 2,\n "options": {\n "legend": {\n "calcs": [\n "min",\n "max",\n "mean",\n "last"\n ],\n "displayMode": "table",\n "placement": "bottom"\n },\n "tooltip": {\n "mode": "single",\n "sort": "none"\n }\n },\n "targets": [\n {\n "datasource": {\n "type": "prometheus",\n },\n "editorMode": "builder",\n "expr": "resources_report{instance=\\"localhost:7010\\",job=\\"TuGraph\\",resouces_type=\\"disk_rate\\",type=~\\"read|write\\"}",\n "hide": false,\n "legendFormat": "{{type}}",\n "range": true,\n "refId": "A"\n }\n ],\n "thresholds": [\n {\n "colorMode": "critical",\n "op": "gt",\n "value": 10000,\n "visible": true\n }\n ],\n "title": "\u78c1\u76d8IO",\n "type": "timeseries"\n }\n ],\n "refresh": "",\n "schemaVersion": 36,\n "style": "dark",\n "tags": [],\n "templating": {\n "list": []\n },\n "time": {\n "from": "now-24h",\n "to": "now"\n },\n "timepicker": {\n "hidden": false,\n "refresh_intervals": [\n "10s"\n ]\n },\n "timezone": "",\n "title": "TuGraph Monitoring Web",\n "version": 20,\n "weekStart": ""\n}\n'})}),"\n",(0,o.jsx)(e.p,{children:"Verify the effect by refreshing the browser page. If the pie chart and line chart are displayed correctly, the configuration is completed."}),"\n",(0,o.jsx)(e.h2,{id:"3future-plans",children:"3.Future Plans"}),"\n",(0,o.jsx)(e.p,{children:"Currently, visual monitoring only supports single-machine monitoring and can monitor performance indicators such as CPU, disk, network IO, and request QPS of the machine on which the service is located. In the future, monitoring for HA clusters will be implemented, and more meaningful indicators will be included in the monitoring scope."})]})}function p(n={}){const{wrapper:e}={...(0,a.R)(),...n.components};return e?(0,o.jsx)(e,{...n,children:(0,o.jsx)(c,{...n})}):c(n)}},8453:(n,e,t)=>{t.d(e,{R:()=>i,x:()=>s});var o=t(6540);const a={},r=o.createContext(a);function i(n){const e=o.useContext(r);return o.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function s(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(a):n.components||a:i(n.components),o.createElement(r.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/3284e532.11f42682.js b/assets/js/3284e532.ca995ddb.js similarity index 98% rename from assets/js/3284e532.11f42682.js rename to assets/js/3284e532.ca995ddb.js index 07522434b9..6269d4aa0a 100644 --- a/assets/js/3284e532.11f42682.js +++ b/assets/js/3284e532.ca995ddb.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[9577],{8037:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>h,toc:()=>c});var n=a(4848),i=a(8453);const r={},s="What is Graph",h={id:"introduction/what-is-graph",title:"What is Graph",description:"The graph that we're going to introduce today, it's neither a picture, nor a diagram\uff0cit's a class of mathematics called graph theory. We can see on the screen that there are two graphs on the left and right, which represent things and their relationship. We abstract it out in a form, and we call such a form a graph.",source:"@site/../docs/en-US/source/2.introduction/1.what-is-graph.md",sourceDirName:"2.introduction",slug:"/introduction/what-is-graph",permalink:"/tugraph-db/en/introduction/what-is-graph",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Guide",permalink:"/tugraph-db/en/guide"},next:{title:"What is a graph database",permalink:"/tugraph-db/en/introduction/what-is-gdbms"}},o={},c=[];function d(e){const t={h1:"h1",header:"header",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"what-is-graph",children:"What is Graph"})}),"\n",(0,n.jsx)(t.p,{children:"The graph that we're going to introduce today, it's neither a picture, nor a diagram\uff0cit's a class of mathematics called graph theory. We can see on the screen that there are two graphs on the left and right, which represent things and their relationship. We abstract it out in a form, and we call such a form a graph."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"alt what is graph",src:a(2936).A+"",width:"552",height:"296"})}),"\n",(0,n.jsx)(t.p,{children:"The basic elements of a graph are a vertex, and an edge, a vertex is a representation of the thing, of the entity, and an edge is a representation of the relationship between them."}),"\n",(0,n.jsx)(t.p,{children:"We see the graph on the left, the dots have companies, they have employees, and they have projects. What are their sides? The relationship between the company and the employees is an employment relationship, and there can be a friend relationship between the employees, and there can be a participation relationship between the project and the employees. That is, we can use graphs to abstract things and their relationships."}),"\n",(0,n.jsx)(t.p,{children:"The diagram on the right is a schematic diagram of a financial transaction. Each of us has a bank account, and when our bank account makes a consumption or makes a transfer, this account is the point on the graph, and this edge can indicate that there is such a transfer relationship between us."}),"\n",(0,n.jsx)(t.p,{children:"We can also see from this example that edges can attach information and points can attach information. The point can attach which bank this account is in and what the account is. The value of the transaction can be attached to the edge, and many times, if your transaction is large, it indicates that special attention is needed. This edge might not necessarily be the amount of a particular transfer, it might be the amount accumulated over a period of time and so on. Graphs can actually be very expressive."}),"\n",(0,n.jsx)(t.p,{children:"On the other hand, for a graph like finance, it can be very large. There could be more than a billion points, a hundred billion or even a trillion edges. As you can imagine, it's actually quite challenging to actually work with these graphs."})]})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},2936:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/what-is-graph-en-48fc5e7076905ff553e38c0c2e79dca5.png"},8453:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>h});var n=a(6540);const i={},r=n.createContext(i);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function h(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[9577],{8037:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>h,toc:()=>c});var n=a(4848),i=a(8453);const r={},s="What is Graph",h={id:"introduction/what-is-graph",title:"What is Graph",description:"The graph that we're going to introduce today, it's neither a picture, nor a diagram\uff0cit's a class of mathematics called graph theory. We can see on the screen that there are two graphs on the left and right, which represent things and their relationship. We abstract it out in a form, and we call such a form a graph.",source:"@site/../docs/en-US/source/2.introduction/1.what-is-graph.md",sourceDirName:"2.introduction",slug:"/introduction/what-is-graph",permalink:"/tugraph-db/en/introduction/what-is-graph",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Guide",permalink:"/tugraph-db/en/guide"},next:{title:"What is a graph database",permalink:"/tugraph-db/en/introduction/what-is-gdbms"}},o={},c=[];function d(e){const t={h1:"h1",header:"header",img:"img",p:"p",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"what-is-graph",children:"What is Graph"})}),"\n",(0,n.jsx)(t.p,{children:"The graph that we're going to introduce today, it's neither a picture, nor a diagram\uff0cit's a class of mathematics called graph theory. We can see on the screen that there are two graphs on the left and right, which represent things and their relationship. We abstract it out in a form, and we call such a form a graph."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"alt what is graph",src:a(2936).A+"",width:"552",height:"296"})}),"\n",(0,n.jsx)(t.p,{children:"The basic elements of a graph are a vertex, and an edge, a vertex is a representation of the thing, of the entity, and an edge is a representation of the relationship between them."}),"\n",(0,n.jsx)(t.p,{children:"We see the graph on the left, the dots have companies, they have employees, and they have projects. What are their sides? The relationship between the company and the employees is an employment relationship, and there can be a friend relationship between the employees, and there can be a participation relationship between the project and the employees. That is, we can use graphs to abstract things and their relationships."}),"\n",(0,n.jsx)(t.p,{children:"The diagram on the right is a schematic diagram of a financial transaction. Each of us has a bank account, and when our bank account makes a consumption or makes a transfer, this account is the point on the graph, and this edge can indicate that there is such a transfer relationship between us."}),"\n",(0,n.jsx)(t.p,{children:"We can also see from this example that edges can attach information and points can attach information. The point can attach which bank this account is in and what the account is. The value of the transaction can be attached to the edge, and many times, if your transaction is large, it indicates that special attention is needed. This edge might not necessarily be the amount of a particular transfer, it might be the amount accumulated over a period of time and so on. Graphs can actually be very expressive."}),"\n",(0,n.jsx)(t.p,{children:"On the other hand, for a graph like finance, it can be very large. There could be more than a billion points, a hundred billion or even a trillion edges. As you can imagine, it's actually quite challenging to actually work with these graphs."})]})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},2936:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/what-is-graph-en-48fc5e7076905ff553e38c0c2e79dca5.png"},8453:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>h});var n=a(6540);const i={},r=n.createContext(i);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function h(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/34a06ef9.1f99600c.js b/assets/js/34a06ef9.0e0fa98d.js similarity index 99% rename from assets/js/34a06ef9.1f99600c.js rename to assets/js/34a06ef9.0e0fa98d.js index be6ac8647a..47acfc5ebb 100644 --- a/assets/js/34a06ef9.1f99600c.js +++ b/assets/js/34a06ef9.0e0fa98d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3873],{5517:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>h});var i=n(4848),o=n(8453);const r={},a="TuGraph Contribution Guide",s={id:"contributor-manual/contributing",title:"TuGraph Contribution Guide",description:"1. Preface",source:"@site/../docs/en-US/source/12.contributor-manual/1.contributing.md",sourceDirName:"12.contributor-manual",slug:"/contributor-manual/contributing",permalink:"/tugraph-db/en/contributor-manual/contributing",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Integration Testing",permalink:"/tugraph-db/en/quality/integration-testing"},next:{title:"TuGraph community roles",permalink:"/tugraph-db/en/contributor-manual/community-roles"}},c={},h=[{value:"1. Preface",id:"1-preface",level:2},{value:"2. What to contribute",id:"2-what-to-contribute",level:2},{value:"3. Preparation",id:"3-preparation",level:2},{value:"3.1. Knowing TuGraph",id:"31-knowing-tugraph",level:2},{value:"3.2. Environment",id:"32-environment",level:2},{value:"3.3. License Agreement",id:"33-license-agreement",level:2},{value:"4. Contribute code process",id:"4-contribute-code-process",level:2},{value:"4.1. Submit the issue",id:"41-submit-the-issue",level:3},{value:"4.2. Pull the branch",id:"42-pull-the-branch",level:3},{value:"4.3. Configuring Github Information",id:"43-configuring-github-information",level:3},{value:"4.4. Compile and Run",id:"44-compile-and-run",level:3},{value:"4.5. Change the code and submit it locally",id:"45-change-the-code-and-submit-it-locally",level:3},{value:"4.6. Code Review",id:"46-code-review",level:3},{value:"4.7. Merge code into Master",id:"47-merge-code-into-master",level:3}];function u(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"tugraph-contribution-guide",children:"TuGraph Contribution Guide"})}),"\n",(0,i.jsx)(t.h2,{id:"1-preface",children:"1. Preface"}),"\n",(0,i.jsx)(t.p,{children:"Thank you for your contribution to TuGraph. We sincerely hope that more students from the community will join in and build a better graph database project together."}),"\n",(0,i.jsx)(t.p,{children:"For outstanding community contributors, we will award the TuGraph Outstanding Community Contributor Certificate."}),"\n",(0,i.jsx)(t.h2,{id:"2-what-to-contribute",children:"2. What to contribute"}),"\n",(0,i.jsx)(t.p,{children:"We welcome any contribution at any time, whether it's a simple typo fix, bug fix, or new feature addition. Feel free to ask questions or initiate PRs. We also value documentation and integration with other open source projects, and welcome contributions in this regard. For any modification, especially the more complex modification, it is recommended to create an issue and fill it out according to the BUG or PR template."}),"\n",(0,i.jsx)(t.h2,{id:"3-preparation",children:"3. Preparation"}),"\n",(0,i.jsx)(t.h2,{id:"31-knowing-tugraph",children:"3.1. Knowing TuGraph"}),"\n",(0,i.jsxs)(t.p,{children:["You can get start with TuGraph follow instrcutions in ",(0,i.jsx)(t.a,{href:"/tugraph-db/en/guide",children:"Guide Doc"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"32-environment",children:"3.2. Environment"}),"\n",(0,i.jsxs)(t.p,{children:['For document contributions, you can directly modify and submit a pull request by clicking on "Edit on GitHub" in the upper right corner of the ',(0,i.jsx)(t.a,{href:"https://tugraph-db.readthedocs.io/en/latest",children:"documentation"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["For code contributions, it is usually necessary to set up the environment for compilation and execution. You can deploy using ",(0,i.jsx)(t.a,{href:"/tugraph-db/en/installation&running/docker-deployment",children:"Docker"})," or ",(0,i.jsx)(t.a,{href:"/tugraph-db/en/installation&running/local-package-deployment",children:"local package deployment"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"33-license-agreement",children:"3.3. License Agreement"}),"\n",(0,i.jsxs)(t.p,{children:["Before contributing code, please take some time to understand the process of contributing code to TuGraph, and read the ",(0,i.jsx)(t.a,{href:"/tugraph-db/en/contributor-manual/individual-cla",children:"Contributor License Agreement"})," or ",(0,i.jsx)(t.a,{href:"/tugraph-db/en/contributor-manual/corporate-cla",children:"Corporate Contributor License Agreement"}),". Participating in the contribution is deemed to agree to the above agreement."]}),"\n",(0,i.jsx)(t.h2,{id:"4-contribute-code-process",children:"4. Contribute code process"}),"\n",(0,i.jsx)(t.h3,{id:"41-submit-the-issue",children:"4.1. Submit the issue"}),"\n",(0,i.jsx)(t.p,{children:"Whether you are fixing a bug in TuGraph or adding a new feature to TuGraph, before you submit the code, submit an issue on TuGraph's GitHub, describing the problem you want to fix or the function you want to add. There are several advantages to doing this:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"There will be no duplication of work in conflict with other developers or their plans for the project."}),"\n",(0,i.jsx)(t.li,{children:"TuGraph maintainers will discuss the bugs or new features you mentioned to determine whether the modification is necessary, whether there is room for improvement or a better way."}),"\n",(0,i.jsx)(t.li,{children:"After reaching an agreement, develop and submit the code, reducing the cost of communication between the two parties and reducing the rejection of pull requests."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"42-pull-the-branch",children:"4.2. Pull the branch"}),"\n",(0,i.jsx)(t.p,{children:"All modifications of TuGraph are made on branches. After modification, the pull request is submitted and merged into the Master by the project maintenance personnel after Code Review. Therefore, after the source code steps are described, you need:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["Download the code to a local directory. In this step, you can choose git or https. In recent years, github has stricter permission requirements. The git approach, for example, requires the more complex ssh key(",(0,i.jsx)(t.a,{href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent",children:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent"}),"). https authentication cannot be performed using the user name and password. git clone ",(0,i.jsx)(t.a,{href:"https://github.com/",children:"https://github.com/"})," Your account name /tugraph-db"]}),"\n",(0,i.jsx)(t.li,{children:"Pull branch ready to modify code:\ngit branch add_xxx_feature"}),"\n",(0,i.jsx)(t.li,{children:"After executing the above command, your code repository switches to the appropriate branch. Run the following command to view your current branch: git branch -a"}),"\n",(0,i.jsx)(t.li,{children:"If you want to switch back to Master, run the git checkout -b master command"}),"\n",(0,i.jsx)(t.li,{children:'If you want to switch back to branching, run the following command: git checkout -b "branchName"'}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"43-configuring-github-information",children:"4.3. Configuring Github Information"}),"\n",(0,i.jsx)(t.p,{children:"Run git config --list on your machine to view git's global username and mailbox. Check whether the displayed user.name and user.email match your github user name and email address."}),"\n",(0,i.jsx)(t.p,{children:"If a company has its own gitlab in-house or uses other commercial GitLabs, a mismatch may occur. At this point, you need to set up a separate user name and mailbox for the tugraph-db project. For details about how to set the user name and email address, see github's official documentation."}),"\n",(0,i.jsx)(t.h3,{id:"44-compile-and-run",children:"4.4. Compile and Run"}),"\n",(0,i.jsxs)(t.p,{children:["The process of compile and run can reference ",(0,i.jsx)(t.a,{href:"https://github.com/TuGraph-family/tugraph-db/blob/master/ci/github_ci.sh",children:"ci script"})]}),"\n",(0,i.jsx)(t.h3,{id:"45-change-the-code-and-submit-it-locally",children:"4.5. Change the code and submit it locally"}),"\n",(0,i.jsx)(t.p,{children:"Once you've pulled the branch, you're ready to change the code."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Code modification Notes"})}),"\n",(0,i.jsx)(t.p,{children:"Code style consistency: TuGraph uses cpplint to keep code in the same format, and IDE can use.clang to configure the style. Be sure to check the code style locally before submitting it, or ACI will report an error."}),"\n",(0,i.jsx)(t.p,{children:"Add unit test code: New changes should pass through existing unit tests. New unit tests should be provided to prove that there are bugs in the previous code and that the new code has resolved these bugs. You can run all tests with the following command:./unit_test\nIt can also be run with the help of an IDE."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Other precautions"})}),"\n",(0,i.jsx)(t.p,{children:"Please keep the code you are editing in the original style, especially the space feed, etc. For unnecessary comments, delete them directly. Add comments where logic and functionality are not easily understood. Keep documentation up to date. After modifying the code, run the following command to submit all the changes to the local computer:\ngit commit -am '(feat) Add the xx function 'git commit -am '(fix) fix xx problem' '"}),"\n",(0,i.jsx)(t.p,{children:'Submit the code to the remote repository\nAfter the code is committed locally, you can then synchronize the code with the remote repository. Run the following command to submit local changes to github: git push origin "branchname"'}),"\n",(0,i.jsx)(t.p,{children:"If you were forking earlier, the origin here is pushed to your code repository, not TuGraph's."}),"\n",(0,i.jsx)(t.p,{children:"After the code has been submitted to GitHub, you can send a request to merge your changes into the TuGraph Master. At this point, you need to go to your corresponding repository on GitHub and press the pull request button in the upper right corner. Select the target branch, which is usually the master, and the system will notify the TuGraph staff, who will Review your code, and when it meets the requirements, it will join the main branch and become part of TuGraph."}),"\n",(0,i.jsx)(t.p,{children:"Please note that the CI will be automatically checked, as well as all Commits signing the cla, with green signs on the commits."}),"\n",(0,i.jsx)(t.h3,{id:"46-code-review",children:"4.6. Code Review"}),"\n",(0,i.jsx)(t.p,{children:"After you submit your code, your code will be assigned to a maintainer for Review. Please wait patiently. If no one has responded to your submission after two working days, you can leave a message under PR and @ the corresponding person."}),"\n",(0,i.jsx)(t.p,{children:"Comments on code Review will be directly noted to the corresponding PR or Issue. If you find the suggestions reasonable, please update them to your code."}),"\n",(0,i.jsx)(t.h3,{id:"47-merge-code-into-master",children:"4.7. Merge code into Master"}),"\n",(0,i.jsx)(t.p,{children:"After the code Review is approved, the TuGraph maintainer will put it into the Master. During this process, the maintainer may specify a new Reviewer and put forward new comments that need to be revised. Normally this step is omitted, and after the code is merged, you will receive an indication that the merge was successful."})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>s});var i=n(6540);const o={},r=i.createContext(o);function a(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3873],{5517:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>h});var i=n(4848),o=n(8453);const r={},a="TuGraph Contribution Guide",s={id:"contributor-manual/contributing",title:"TuGraph Contribution Guide",description:"1. Preface",source:"@site/../docs/en-US/source/12.contributor-manual/1.contributing.md",sourceDirName:"12.contributor-manual",slug:"/contributor-manual/contributing",permalink:"/tugraph-db/en/contributor-manual/contributing",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Integration Testing",permalink:"/tugraph-db/en/quality/integration-testing"},next:{title:"TuGraph community roles",permalink:"/tugraph-db/en/contributor-manual/community-roles"}},c={},h=[{value:"1. Preface",id:"1-preface",level:2},{value:"2. What to contribute",id:"2-what-to-contribute",level:2},{value:"3. Preparation",id:"3-preparation",level:2},{value:"3.1. Knowing TuGraph",id:"31-knowing-tugraph",level:2},{value:"3.2. Environment",id:"32-environment",level:2},{value:"3.3. License Agreement",id:"33-license-agreement",level:2},{value:"4. Contribute code process",id:"4-contribute-code-process",level:2},{value:"4.1. Submit the issue",id:"41-submit-the-issue",level:3},{value:"4.2. Pull the branch",id:"42-pull-the-branch",level:3},{value:"4.3. Configuring Github Information",id:"43-configuring-github-information",level:3},{value:"4.4. Compile and Run",id:"44-compile-and-run",level:3},{value:"4.5. Change the code and submit it locally",id:"45-change-the-code-and-submit-it-locally",level:3},{value:"4.6. Code Review",id:"46-code-review",level:3},{value:"4.7. Merge code into Master",id:"47-merge-code-into-master",level:3}];function u(e){const t={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"tugraph-contribution-guide",children:"TuGraph Contribution Guide"})}),"\n",(0,i.jsx)(t.h2,{id:"1-preface",children:"1. Preface"}),"\n",(0,i.jsx)(t.p,{children:"Thank you for your contribution to TuGraph. We sincerely hope that more students from the community will join in and build a better graph database project together."}),"\n",(0,i.jsx)(t.p,{children:"For outstanding community contributors, we will award the TuGraph Outstanding Community Contributor Certificate."}),"\n",(0,i.jsx)(t.h2,{id:"2-what-to-contribute",children:"2. What to contribute"}),"\n",(0,i.jsx)(t.p,{children:"We welcome any contribution at any time, whether it's a simple typo fix, bug fix, or new feature addition. Feel free to ask questions or initiate PRs. We also value documentation and integration with other open source projects, and welcome contributions in this regard. For any modification, especially the more complex modification, it is recommended to create an issue and fill it out according to the BUG or PR template."}),"\n",(0,i.jsx)(t.h2,{id:"3-preparation",children:"3. Preparation"}),"\n",(0,i.jsx)(t.h2,{id:"31-knowing-tugraph",children:"3.1. Knowing TuGraph"}),"\n",(0,i.jsxs)(t.p,{children:["You can get start with TuGraph follow instrcutions in ",(0,i.jsx)(t.a,{href:"/tugraph-db/en/guide",children:"Guide Doc"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"32-environment",children:"3.2. Environment"}),"\n",(0,i.jsxs)(t.p,{children:['For document contributions, you can directly modify and submit a pull request by clicking on "Edit on GitHub" in the upper right corner of the ',(0,i.jsx)(t.a,{href:"https://tugraph-db.readthedocs.io/en/latest",children:"documentation"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["For code contributions, it is usually necessary to set up the environment for compilation and execution. You can deploy using ",(0,i.jsx)(t.a,{href:"/tugraph-db/en/installation&running/docker-deployment",children:"Docker"})," or ",(0,i.jsx)(t.a,{href:"/tugraph-db/en/installation&running/local-package-deployment",children:"local package deployment"}),"."]}),"\n",(0,i.jsx)(t.h2,{id:"33-license-agreement",children:"3.3. License Agreement"}),"\n",(0,i.jsxs)(t.p,{children:["Before contributing code, please take some time to understand the process of contributing code to TuGraph, and read the ",(0,i.jsx)(t.a,{href:"/tugraph-db/en/contributor-manual/individual-cla",children:"Contributor License Agreement"})," or ",(0,i.jsx)(t.a,{href:"/tugraph-db/en/contributor-manual/corporate-cla",children:"Corporate Contributor License Agreement"}),". Participating in the contribution is deemed to agree to the above agreement."]}),"\n",(0,i.jsx)(t.h2,{id:"4-contribute-code-process",children:"4. Contribute code process"}),"\n",(0,i.jsx)(t.h3,{id:"41-submit-the-issue",children:"4.1. Submit the issue"}),"\n",(0,i.jsx)(t.p,{children:"Whether you are fixing a bug in TuGraph or adding a new feature to TuGraph, before you submit the code, submit an issue on TuGraph's GitHub, describing the problem you want to fix or the function you want to add. There are several advantages to doing this:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"There will be no duplication of work in conflict with other developers or their plans for the project."}),"\n",(0,i.jsx)(t.li,{children:"TuGraph maintainers will discuss the bugs or new features you mentioned to determine whether the modification is necessary, whether there is room for improvement or a better way."}),"\n",(0,i.jsx)(t.li,{children:"After reaching an agreement, develop and submit the code, reducing the cost of communication between the two parties and reducing the rejection of pull requests."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"42-pull-the-branch",children:"4.2. Pull the branch"}),"\n",(0,i.jsx)(t.p,{children:"All modifications of TuGraph are made on branches. After modification, the pull request is submitted and merged into the Master by the project maintenance personnel after Code Review. Therefore, after the source code steps are described, you need:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["Download the code to a local directory. In this step, you can choose git or https. In recent years, github has stricter permission requirements. The git approach, for example, requires the more complex ssh key(",(0,i.jsx)(t.a,{href:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent",children:"https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent"}),"). https authentication cannot be performed using the user name and password. git clone ",(0,i.jsx)(t.a,{href:"https://github.com/",children:"https://github.com/"})," Your account name /tugraph-db"]}),"\n",(0,i.jsx)(t.li,{children:"Pull branch ready to modify code:\ngit branch add_xxx_feature"}),"\n",(0,i.jsx)(t.li,{children:"After executing the above command, your code repository switches to the appropriate branch. Run the following command to view your current branch: git branch -a"}),"\n",(0,i.jsx)(t.li,{children:"If you want to switch back to Master, run the git checkout -b master command"}),"\n",(0,i.jsx)(t.li,{children:'If you want to switch back to branching, run the following command: git checkout -b "branchName"'}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"43-configuring-github-information",children:"4.3. Configuring Github Information"}),"\n",(0,i.jsx)(t.p,{children:"Run git config --list on your machine to view git's global username and mailbox. Check whether the displayed user.name and user.email match your github user name and email address."}),"\n",(0,i.jsx)(t.p,{children:"If a company has its own gitlab in-house or uses other commercial GitLabs, a mismatch may occur. At this point, you need to set up a separate user name and mailbox for the tugraph-db project. For details about how to set the user name and email address, see github's official documentation."}),"\n",(0,i.jsx)(t.h3,{id:"44-compile-and-run",children:"4.4. Compile and Run"}),"\n",(0,i.jsxs)(t.p,{children:["The process of compile and run can reference ",(0,i.jsx)(t.a,{href:"https://github.com/TuGraph-family/tugraph-db/blob/master/ci/github_ci.sh",children:"ci script"})]}),"\n",(0,i.jsx)(t.h3,{id:"45-change-the-code-and-submit-it-locally",children:"4.5. Change the code and submit it locally"}),"\n",(0,i.jsx)(t.p,{children:"Once you've pulled the branch, you're ready to change the code."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Code modification Notes"})}),"\n",(0,i.jsx)(t.p,{children:"Code style consistency: TuGraph uses cpplint to keep code in the same format, and IDE can use.clang to configure the style. Be sure to check the code style locally before submitting it, or ACI will report an error."}),"\n",(0,i.jsx)(t.p,{children:"Add unit test code: New changes should pass through existing unit tests. New unit tests should be provided to prove that there are bugs in the previous code and that the new code has resolved these bugs. You can run all tests with the following command:./unit_test\nIt can also be run with the help of an IDE."}),"\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Other precautions"})}),"\n",(0,i.jsx)(t.p,{children:"Please keep the code you are editing in the original style, especially the space feed, etc. For unnecessary comments, delete them directly. Add comments where logic and functionality are not easily understood. Keep documentation up to date. After modifying the code, run the following command to submit all the changes to the local computer:\ngit commit -am '(feat) Add the xx function 'git commit -am '(fix) fix xx problem' '"}),"\n",(0,i.jsx)(t.p,{children:'Submit the code to the remote repository\nAfter the code is committed locally, you can then synchronize the code with the remote repository. Run the following command to submit local changes to github: git push origin "branchname"'}),"\n",(0,i.jsx)(t.p,{children:"If you were forking earlier, the origin here is pushed to your code repository, not TuGraph's."}),"\n",(0,i.jsx)(t.p,{children:"After the code has been submitted to GitHub, you can send a request to merge your changes into the TuGraph Master. At this point, you need to go to your corresponding repository on GitHub and press the pull request button in the upper right corner. Select the target branch, which is usually the master, and the system will notify the TuGraph staff, who will Review your code, and when it meets the requirements, it will join the main branch and become part of TuGraph."}),"\n",(0,i.jsx)(t.p,{children:"Please note that the CI will be automatically checked, as well as all Commits signing the cla, with green signs on the commits."}),"\n",(0,i.jsx)(t.h3,{id:"46-code-review",children:"4.6. Code Review"}),"\n",(0,i.jsx)(t.p,{children:"After you submit your code, your code will be assigned to a maintainer for Review. Please wait patiently. If no one has responded to your submission after two working days, you can leave a message under PR and @ the corresponding person."}),"\n",(0,i.jsx)(t.p,{children:"Comments on code Review will be directly noted to the corresponding PR or Issue. If you find the suggestions reasonable, please update them to your code."}),"\n",(0,i.jsx)(t.h3,{id:"47-merge-code-into-master",children:"4.7. Merge code into Master"}),"\n",(0,i.jsx)(t.p,{children:"After the code Review is approved, the TuGraph maintainer will put it into the Master. During this process, the maintainer may specify a new Reviewer and put forward new comments that need to be revised. Normally this step is omitted, and after the code is merged, you will receive an indication that the merge was successful."})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(u,{...e})}):u(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>s});var i=n(6540);const o={},r=i.createContext(o);function a(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/367d0d1d.49b73106.js b/assets/js/367d0d1d.fb92a985.js similarity index 99% rename from assets/js/367d0d1d.49b73106.js rename to assets/js/367d0d1d.fb92a985.js index 5c10d2bbdb..a1a9188556 100644 --- a/assets/js/367d0d1d.49b73106.js +++ b/assets/js/367d0d1d.fb92a985.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[9242],{8346:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>a,contentTitle:()=>o,default:()=>p,frontMatter:()=>d,metadata:()=>i,toc:()=>l});var t=n(4848),s=n(8453);const d={},o="TuGraph Stored Procedure Guide",i={id:"olap&procedure/procedure/procedure",title:"TuGraph Stored Procedure Guide",description:"This document mainly explains the instructions for using the TuGraph stored procedure.",source:"@site/../docs/en-US/source/9.olap&procedure/1.procedure/1.procedure.md",sourceDirName:"9.olap&procedure/1.procedure",slug:"/olap&procedure/procedure/",permalink:"/tugraph-db/en/olap&procedure/procedure/",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"ISO GQL",permalink:"/tugraph-db/en/query/gql"},next:{title:"Traversal API",permalink:"/tugraph-db/en/olap&procedure/procedure/traversal"}},a={},l=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2. Stored Procedure Version",id:"2-stored-procedure-version",level:2},{value:"3. Supported Languages",id:"3-supported-languages",level:2},{value:"4. Procedure v1 Interface",id:"4-procedure-v1-interface",level:2},{value:"4.1.Write stored procedures",id:"41write-stored-procedures",level:2},{value:"4.1.1.Write C++ stored procedure",id:"411write-c-stored-procedure",level:3},{value:"4.1.2 Writing Python stored procedures",id:"412-writing-python-stored-procedures",level:3},{value:"4.2.How to use stored procedures",id:"42how-to-use-stored-procedures",level:2},{value:"4.2.1.Install Stored Procedures",id:"421install-stored-procedures",level:3},{value:"4.2.2.List Stored Procedures",id:"422list-stored-procedures",level:3},{value:"4.2.3.Retrieve Stored Procedures Detail",id:"423retrieve-stored-procedures-detail",level:3},{value:"4.2.4.Call stored procedure",id:"424call-stored-procedure",level:3},{value:"4.2.5.Uninstall Stored Procedures",id:"425uninstall-stored-procedures",level:3},{value:"4.2.6.Upgrade Stored Procedures",id:"426upgrade-stored-procedures",level:3},{value:"5. Procedure v2 Interface",id:"5-procedure-v2-interface",level:2},{value:"5.1.Writing stored procedures",id:"51writing-stored-procedures",level:3},{value:"5.2.Load stored procedure",id:"52load-stored-procedure",level:3},{value:"5.2.1.List loaded stored procedures",id:"521list-loaded-stored-procedures",level:4},{value:"5.2.2.Get stored procedure details",id:"522get-stored-procedure-details",level:4},{value:"5.2.3.Call stored procedure",id:"523call-stored-procedure",level:4},{value:"5.2.4.Delete stored procedure",id:"524delete-stored-procedure",level:4},{value:"5.2.5.Update stored procedure",id:"525update-stored-procedure",level:4}];function c(e){const r={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"tugraph-stored-procedure-guide",children:"TuGraph Stored Procedure Guide"})}),"\n",(0,t.jsxs)(r.blockquote,{children:["\n",(0,t.jsx)(r.p,{children:"This document mainly explains the instructions for using the TuGraph stored procedure."}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,t.jsx)(r.p,{children:"When the query/update logic that users need to express is more complex (such as cannot be described by Cypher or has high performance requirements), compared to calling multiple requests and completing the entire processing flow on the client, the stored procedure provided by TuGraph is a more concise and efficient choice."}),"\n",(0,t.jsx)(r.p,{children:"Similar to traditional databases, the TuGraph stored procedure runs on the server side. Users can encapsulate the processing logic (i.e., multiple operations) into a procedure call, and further improve performance by parallel processing (such as using relevant C++ OLAP interfaces and built-in algorithms) during implementation."}),"\n",(0,t.jsxs)(r.p,{children:["There is a special type of API in the stored procedure for parallel data operations, which we call the Traversal API. Please refer to the ",(0,t.jsx)(r.a,{href:"/tugraph-db/en/olap&procedure/procedure/traversal",children:"documentation"})," for more information."]}),"\n",(0,t.jsx)(r.h2,{id:"2-stored-procedure-version",children:"2. Stored Procedure Version"}),"\n",(0,t.jsx)(r.p,{children:"Currently, TuGraph supports two versions of stored procedures, which are suitable for different scenarios. Version 3.5 only supports v1, which can be directly called through the REST or RPC interface. Starting from version 3.5, v2 is supported, which allows embedding calls in graph query languages \u200b\u200b(such as Cypher). We call it POG (Procedure On Graph query language, APOC)."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{}),(0,t.jsx)(r.th,{children:"Procedure v1"}),(0,t.jsx)(r.th,{children:"Procedure v2"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Applicable Scenarios"}),(0,t.jsx)(r.td,{children:"Extreme performance or complex multi-transaction management scenarios"}),(0,t.jsx)(r.td,{children:"General scenarios, highly integrated with Cypher"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Transaction"}),(0,t.jsx)(r.td,{children:"Created internally in the function, multiple transactions"}),(0,t.jsx)(r.td,{children:"can be freely controlled\tPassed into the external function, single transaction"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Signature (parameter definition)"}),(0,t.jsx)(r.td,{children:"Not required"}),(0,t.jsx)(r.td,{children:"Required"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Input and output parameter types"}),(0,t.jsx)(r.td,{children:"Not required to specify"}),(0,t.jsx)(r.td,{children:"Need to specify parameter types"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Cypher Standalone Call"}),(0,t.jsx)(r.td,{children:"Supported"}),(0,t.jsx)(r.td,{children:"Supported"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Cypher Embeded Call"}),(0,t.jsx)(r.td,{children:"Not supported"}),(0,t.jsx)(r.td,{children:"Supported"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Language"}),(0,t.jsx)(r.td,{children:"C++/Python/Rust"}),(0,t.jsx)(r.td,{children:"C++"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Calling mode"}),(0,t.jsx)(r.td,{children:"Directly pass the string, usually in JSON format"}),(0,t.jsx)(r.td,{children:"Through variables in Cypher statements"})]})]})]}),"\n",(0,t.jsx)(r.p,{children:"In TuGraph, stored procedures v1 and v2 are managed separately, and support for create, delete, and query operations is provided. However, it is still not recommended to have the same name for multiple stored procedures."}),"\n",(0,t.jsx)(r.h2,{id:"3-supported-languages",children:"3. Supported Languages"}),"\n",(0,t.jsx)(r.p,{children:"In TuGraph, users can dynamically load, update, and delete stored procedures. TuGraph supports the use of C++, Python, and Rust languages to write stored procedures. Among them, C++ language has the most complete support and the best performance."}),"\n",(0,t.jsx)(r.p,{children:"Note that the stored procedure is the logic compiled and executed on the server side, which is independent of the language support on the client side."}),"\n",(0,t.jsx)(r.h2,{id:"4-procedure-v1-interface",children:"4. Procedure v1 Interface"}),"\n",(0,t.jsx)(r.h2,{id:"41write-stored-procedures",children:"4.1.Write stored procedures"}),"\n",(0,t.jsx)(r.h3,{id:"411write-c-stored-procedure",children:"4.1.1.Write C++ stored procedure"}),"\n",(0,t.jsx)(r.p,{children:"Users can write C stored procedures by using core API or Traversal API. An example of a simple C stored procedure is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:'#include \n#include "lgraph.h"\nusing namespace lgraph_api;\n\nextern "C" LGAPI bool Process(GraphDB& db, const std::string& request, std::string& response) {\n\tauto txn = db.CreateReadTxn();\n\tsize_t n = 0;\n\tfor (auto vit = txn.GetVertexIterator(); vit.IsValid(); vit.Next()) {\n if (vit.GetLabel() == "student") {\n auto age = vit.GetField("age");\n if (!age.is_null() && age.integer() == 10) n++; ## Count all students whose age is 10\n }\n\t}\n output = std::to_string(n);\n return true;\n}\n'})}),"\n",(0,t.jsxs)(r.p,{children:["From the code, we can see the entry of a TuGraph C++ stored procedure is the ",(0,t.jsx)(r.code,{children:"Process"})," function, with three parameters:"]}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"db"}),": the TuGraph database instance"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"request"}),": the input data, which can be a binary byte array, or any other format such as JSON string."]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"response"}),": the output data, which can be a string or directly return binary data."]}),"\n"]}),"\n",(0,t.jsxs)(r.p,{children:["The return value of the ",(0,t.jsx)(r.code,{children:"Process"})," function is a boolean value. When it returns ",(0,t.jsx)(r.code,{children:"true"}),", it means that the request is successfully completed, otherwise it means that the stored procedure found an error during execution, and the user can return an error message through ",(0,t.jsx)(r.code,{children:"response"})," to facilitate debugging."]}),"\n",(0,t.jsxs)(r.p,{children:["After the C++ stored procedure is written, it needs to be compiled into a dynamic link library. TuGraph provides ",(0,t.jsx)(r.code,{children:"compile.sh"})," script to help users automatically compile stored procedures. The ",(0,t.jsx)(r.code,{children:"compile.sh"})," script has only one parameter, which is the name of the stored procedure, which is ",(0,t.jsx)(r.code,{children:"age_10"})," in the above example. Compile and call the command line as follows:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"g++ -fno-gnu-unique -fPIC -g --std=c++14 -I/usr/local/include/lgraph -rdynamic -O3 -fopenmp -o age_10.so age_10.cpp /usr/local/lib64/liblgraph.so -shared\n"})}),"\n",(0,t.jsx)(r.p,{children:"If the compilation goes well, age_10.so will be generated, which can then be loaded into the server by the user."}),"\n",(0,t.jsx)(r.h3,{id:"412-writing-python-stored-procedures",children:"4.1.2 Writing Python stored procedures"}),"\n",(0,t.jsx)(r.p,{children:"The following snippet does the same thing as the above C++ stored procedure, but via TuGraph Python API:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:"def Process(db, input):\n txn = db.CreateReadTxn()\n it = txn.GetVertexIterator()\n n = 0\n while it.IsValid():\n if it.GetLabel() == 'student' and it['age'] and it['age'] == 10:\n n = n + 1\n it.Next()\n return (True, str(nv))\n"})}),"\n",(0,t.jsxs)(r.p,{children:["The Python stored procedure returns a tuple, the first element of which is a Boolean value indicating whether the stored procedure was successfully executed; the second element is a ",(0,t.jsx)(r.code,{children:"str"}),", which contains the result to be returned."]}),"\n",(0,t.jsx)(r.p,{children:"Python stored procedures do not need to be compiled and can be loaded directly."}),"\n",(0,t.jsx)(r.h2,{id:"42how-to-use-stored-procedures",children:"4.2.How to use stored procedures"}),"\n",(0,t.jsx)(r.h3,{id:"421install-stored-procedures",children:"4.2.1.Install Stored Procedures"}),"\n",(0,t.jsxs)(r.p,{children:["Users can load stored procedures through REST API and RPC. Taking the REST API as an example, the C++ code to load ",(0,t.jsx)(r.code,{children:"age_10.so"})," is as follows:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:"import requests\nimport json\nimport base64\n\ndata = {'name':'age_10'}\nf = open('./age_10.so','rb')\ncontent = f.read()\ndata['code_base64'] = base64.b64encode(content).decode()\ndata['description'] = 'Custom Page Rank Procedure'\ndata['read_only'] = true\ndata['code_type'] = 'so'\njs = json.dumps(data)\nr = requests.post(url='http://127.0.0.1:7071/db/school/cpp_plugin', data=js,\n headers={'Content-Type':'application/json'})\nprint(r.status_code) ## \u6b63\u5e38\u65f6\u8fd4\u56de200\n"})}),"\n",(0,t.jsxs)(r.p,{children:["It should be noted that ",(0,t.jsx)(r.code,{children:"data['code']"})," at this time is a base64-processed string, and the binary code in ",(0,t.jsx)(r.code,{children:"age_10.so"})," cannot be directly transmitted through JSON. In addition, the loading and deletion of stored procedures can only be operated by users with administrator privileges."]}),"\n",(0,t.jsx)(r.p,{children:"After the stored procedure is loaded, it will be saved in the database, and it will be automatically loaded after the server restarts. Also, if an update to the stored procedure is required, the same REST API is called. It is recommended that users update the corresponding descriptions when updating stored procedures, so as to distinguish stored procedures of different versions."}),"\n",(0,t.jsx)(r.h3,{id:"422list-stored-procedures",children:"4.2.2.List Stored Procedures"}),"\n",(0,t.jsx)(r.p,{children:"During the running of the server, the user can obtain the list of stored procedures at any time. Its call is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:'>>> r = requests.get(\'http://127.0.0.1:7071/db/school/cpp_plugin\')\n>>> r.status_code\n200\n>>> r.text\n\'{"plugins":[{"description":"Custom Page Rank Procedure", "name":"age_10", "read_only":true}]}\'\n'})}),"\n",(0,t.jsx)(r.h3,{id:"423retrieve-stored-procedures-detail",children:"4.2.3.Retrieve Stored Procedures Detail"}),"\n",(0,t.jsx)(r.p,{children:"While the server is running, users can obtain the details of a single stored procedure, including codes, at any time. Its call is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:'>>> r = requests.get(\'http://127.0.0.1:7071/db/school/cpp_plugin/age_10\')\n>>> r.status_code\n200\n>>> r.text\n\'{"description":"Custom Page Rank Procedure", "name":"age_10", "read_only":true, "code_base64":, "code_type":"so"}\'\n'})}),"\n",(0,t.jsx)(r.h3,{id:"424call-stored-procedure",children:"4.2.4.Call stored procedure"}),"\n",(0,t.jsx)(r.p,{children:"An example code for calling a stored procedure is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:">>> r = requests.post(url='http://127.0.0.1:7071/db/school/cpp_plugin/age_10', data='',\n headers={'Content-Type':'application/json'})\n>>> r.status_code\n200\n>>> r.text\n9\n"})}),"\n",(0,t.jsx)(r.h3,{id:"425uninstall-stored-procedures",children:"4.2.5.Uninstall Stored Procedures"}),"\n",(0,t.jsx)(r.p,{children:"Deleting a stored procedure requires only the following call:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:">>> r = requests.delete(url='http://127.0.0.1:7071/db/school/cpp_plugin/age_10')\n>>> r.status_code\n200\n"})}),"\n",(0,t.jsx)(r.p,{children:"Similar to loading stored procedures, only admin users can delete stored procedures."}),"\n",(0,t.jsx)(r.h3,{id:"426upgrade-stored-procedures",children:"4.2.6.Upgrade Stored Procedures"}),"\n",(0,t.jsx)(r.p,{children:"You can upgrade a stored procedure with the following two steps:"}),"\n",(0,t.jsxs)(r.ol,{children:["\n",(0,t.jsx)(r.li,{children:"Uninstall the existing one."}),"\n",(0,t.jsx)(r.li,{children:"Install the new on."}),"\n"]}),"\n",(0,t.jsx)(r.p,{children:"TuGraph carefully manages the concurrency of stored procedure operations. Upgrading stored procedures will not affect concurrent runs of existing ones."}),"\n",(0,t.jsx)(r.h2,{id:"5-procedure-v2-interface",children:"5. Procedure v2 Interface"}),"\n",(0,t.jsx)(r.h3,{id:"51writing-stored-procedures",children:"5.1.Writing stored procedures"}),"\n",(0,t.jsx)(r.p,{children:"Users can write C++ stored procedures by using lgraph API. A simple C++ stored procedure example is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-c++",children:'// peek_some_node_salt.cpp\n#include \n#include "lgraph/lgraph.h"\n#include "lgraph/lgraph_types.h"\n#include "lgraph/lgraph_result.h"\n\n#include "tools/json.hpp"\n\nusing json = nlohmann::json;\nusing namespace lgraph_api;\n\nextern "C" LGAPI bool GetSignature(SigSpec &sig_spec) {\n sig_spec.input_list = {\n {.name = "limit", .index = 0, .type = LGraphType::INTEGER},\n };\n sig_spec.result_list = {\n {.name = "node", .index = 0, .type = LGraphType::NODE},\n {.name = "salt", .index = 1, .type = LGraphType::FLOAT}\n };\n return true;\n}\n\nextern "C" LGAPI bool ProcessInTxn(Transaction &txn,\n const std::string &request,\n Result &response) {\n int64_t limit;\n try {\n json input = json::parse(request);\n limit = input["limit"].get();\n } catch (std::exception &e) {\n response.ResetHeader({\n {"errMsg", LGraphType::STRING}\n });\n response.MutableRecord()->Insert(\n "errMsg",\n FieldData::String(std::string("error parsing json: ") + e.what()));\n return false;\n }\n\n response.ResetHeader({\n {"node", LGraphType::NODE},\n {"salt", LGraphType::FLOAT}\n });\n for (size_t i = 0; i < limit; i++) {\n auto r = response.MutableRecord();\n auto vit = txn.GetVertexIterator(i);\n r->Insert("node", vit);\n r->Insert("salt", FieldData::Float(20.23*float(i)));\n }\n return true;\n}\n'})}),"\n",(0,t.jsx)(r.p,{children:"From the code we can see:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:["\n",(0,t.jsxs)(r.p,{children:["The stored procedure defines a method ",(0,t.jsx)(r.code,{children:"GetSignature"})," to get the signature. This method returns the signature of the stored procedure, which includes input parameter names and their types, and return parameters and their types. This enables the Cypher query statement to use the signature information to verify whether the input data and the returned data are reasonable when calling the stored procedure."]}),"\n"]}),"\n",(0,t.jsxs)(r.li,{children:["\n",(0,t.jsxs)(r.p,{children:["The entry function is the ",(0,t.jsx)(r.code,{children:"ProcessInTxn"})," function, which has three parameters, which are:"]}),"\n"]}),"\n",(0,t.jsxs)(r.li,{children:["\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.code,{children:"txn"}),": The transaction of the stored procedure, generally speaking, the transaction of the Cypher statement that calls the stored procedure."]}),"\n"]}),"\n",(0,t.jsxs)(r.li,{children:["\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.code,{children:"request"}),": input data, its content is the string of the input parameter type defined in ",(0,t.jsx)(r.code,{children:"GetSignature"})," and the value passed in the Cypher query statement after json serialization. e.g. ",(0,t.jsx)(r.code,{children:"{num_iteration: 10}"})]}),"\n"]}),"\n",(0,t.jsxs)(r.li,{children:["\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.code,{children:"response"}),": output data, in order to ensure compatibility in the Cypher language, users can write the data processed by the stored procedure to ",(0,t.jsx)(r.code,{children:"lgraph_api::Result"}),", and finally use ",(0,t.jsx)(r.code,{children:"lgraph_api::Result::Dump"})," to serialize it into data in json format."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(r.p,{children:["The return value of the ",(0,t.jsx)(r.code,{children:"ProcessInTxn"})," function is a boolean value. When it returns ",(0,t.jsx)(r.code,{children:"true"}),", it means that the request was successfully completed, otherwise it means that the stored procedure found an error during execution."]}),"\n",(0,t.jsxs)(r.p,{children:["After the C++ stored procedure is written, it needs to be compiled into a dynamic link library. TuGraph provides ",(0,t.jsx)(r.code,{children:"compile.sh"})," script to help users automatically compile stored procedures. The ",(0,t.jsx)(r.code,{children:"compile.sh"})," script has only one parameter, which is the name of the stored procedure, which in the above example is ",(0,t.jsx)(r.code,{children:"custom_pagerank"}),". Compile and call the command line as follows:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"g++ -fno-gnu-unique -fPIC -g --std=c++14 -I/usr/local/include/lgraph -rdynamic -O3 -fopenmp -o custom_pagerank.so custom_pagerank.cpp /usr/local/lib64/liblgraph.so -shared\n"})}),"\n",(0,t.jsx)(r.p,{children:"If the compilation goes well, custom_pagerank.so will be generated, which can then be loaded into the server by the user."}),"\n",(0,t.jsx)(r.h3,{id:"52load-stored-procedure",children:"5.2.Load stored procedure"}),"\n",(0,t.jsxs)(r.p,{children:["Users can load stored procedures through REST API and RPC. Taking the REST API as an example, the C++ code to load ",(0,t.jsx)(r.code,{children:"custom_pagerank.so"})," is as follows:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:"import requests\nimport json\nimport base64\n\ndata = {'name':'custom_pagerank'}\nf = open('./custom_pagerank.so','rb')\ncontent = f.read()\ndata['code_base64'] = base64.b64encode(content).decode()\ndata['description'] = 'Custom Page Rank Procedure'\ndata['read_only'] = true\ndata['code_type'] = 'so'\njs = json.dumps(data)\nr = requests.post(url='http://127.0.0.1:7071/db/school/cpp_plugin', data=js,\n headers={'Content-Type':'application/json'})\nprint(r.status_code) ## \u6b63\u5e38\u65f6\u8fd4\u56de200\n"})}),"\n",(0,t.jsxs)(r.p,{children:["It should be noted that ",(0,t.jsx)(r.code,{children:"data['code']"})," at this time is a base64-processed string, and the binary code in ",(0,t.jsx)(r.code,{children:"custom_pagerank.so"})," cannot be directly transmitted through JSON. In addition, the loading and deletion of stored procedures can only be operated by users with administrator privileges."]}),"\n",(0,t.jsx)(r.p,{children:"After the stored procedure is loaded, it will be saved in the database, and it will be automatically loaded after the server restarts. Also, if an update to the stored procedure is required, the same REST API is called. It is recommended that users update the corresponding descriptions when updating stored procedures, so as to distinguish stored procedures of different versions."}),"\n",(0,t.jsx)(r.h4,{id:"521list-loaded-stored-procedures",children:"5.2.1.List loaded stored procedures"}),"\n",(0,t.jsx)(r.p,{children:"During the running of the server, the user can obtain the list of stored procedures at any time. Its call is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:'>>> r = requests.get(\'http://127.0.0.1:7071/db/school/cpp_plugin\')\n>>> r.status_code\n200\n>>> r.text\n\'{"plugins":[{"description":"Custom Page Rank Procedure", "name":"custom_pagerank", "read_only":true}]}\'\n'})}),"\n",(0,t.jsx)(r.h4,{id:"522get-stored-procedure-details",children:"5.2.2.Get stored procedure details"}),"\n",(0,t.jsx)(r.p,{children:"While the server is running, users can obtain the details of a single stored procedure, including codes, at any time. Its call is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:'>>> r = requests.get(\'http://127.0.0.1:7071/db/school/cpp_plugin/custom_pagerank\')\n>>> r.status_code\n200\n>>> r.text\n\'{"description":"Custom Page Rank Procedure", "name":"custom_pagerank", "read_only":true, "code_base64":, "code_type":"so"}\'\n'})}),"\n",(0,t.jsx)(r.h4,{id:"523call-stored-procedure",children:"5.2.3.Call stored procedure"}),"\n",(0,t.jsx)(r.p,{children:"An example code for calling a stored procedure is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-Cypher",children:"CALL plugin.cpp.custom_pagerank(10)\nYIELD node, pr WITH node, pr\nMATCH(node)-[r]->(n) RETURN node, r, n, pr\n"})}),"\n",(0,t.jsx)(r.h4,{id:"524delete-stored-procedure",children:"5.2.4.Delete stored procedure"}),"\n",(0,t.jsx)(r.p,{children:"Deleting a stored procedure requires only the following call:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:">>> r = requests.delete(url='http://127.0.0.1:7071/db/school/cpp_plugin/custom_pagerank')\n>>> r.status_code\n200\n"})}),"\n",(0,t.jsx)(r.p,{children:"Similar to loading stored procedures, only admin users can delete stored procedures."}),"\n",(0,t.jsx)(r.h4,{id:"525update-stored-procedure",children:"5.2.5.Update stored procedure"}),"\n",(0,t.jsx)(r.p,{children:"Updating a stored procedure requires the following two steps:"}),"\n",(0,t.jsxs)(r.ol,{children:["\n",(0,t.jsx)(r.li,{children:"Delete the existing stored procedure"}),"\n",(0,t.jsx)(r.li,{children:"Install the new stored procedure"}),"\n"]}),"\n",(0,t.jsx)(r.p,{children:"TuGraph carefully manages the concurrency of stored procedure operations, and updating stored procedures will not affect the operation of existing stored procedures."})]})}function p(e={}){const{wrapper:r}={...(0,s.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,r,n)=>{n.d(r,{R:()=>o,x:()=>i});var t=n(6540);const s={},d=t.createContext(s);function o(e){const r=t.useContext(d);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(d.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[9242],{8346:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>a,contentTitle:()=>o,default:()=>p,frontMatter:()=>d,metadata:()=>i,toc:()=>l});var t=n(4848),s=n(8453);const d={},o="TuGraph Stored Procedure Guide",i={id:"olap&procedure/procedure/procedure",title:"TuGraph Stored Procedure Guide",description:"This document mainly explains the instructions for using the TuGraph stored procedure.",source:"@site/../docs/en-US/source/9.olap&procedure/1.procedure/1.procedure.md",sourceDirName:"9.olap&procedure/1.procedure",slug:"/olap&procedure/procedure/",permalink:"/tugraph-db/en/olap&procedure/procedure/",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"ISO GQL",permalink:"/tugraph-db/en/query/gql"},next:{title:"Traversal API",permalink:"/tugraph-db/en/olap&procedure/procedure/traversal"}},a={},l=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2. Stored Procedure Version",id:"2-stored-procedure-version",level:2},{value:"3. Supported Languages",id:"3-supported-languages",level:2},{value:"4. Procedure v1 Interface",id:"4-procedure-v1-interface",level:2},{value:"4.1.Write stored procedures",id:"41write-stored-procedures",level:2},{value:"4.1.1.Write C++ stored procedure",id:"411write-c-stored-procedure",level:3},{value:"4.1.2 Writing Python stored procedures",id:"412-writing-python-stored-procedures",level:3},{value:"4.2.How to use stored procedures",id:"42how-to-use-stored-procedures",level:2},{value:"4.2.1.Install Stored Procedures",id:"421install-stored-procedures",level:3},{value:"4.2.2.List Stored Procedures",id:"422list-stored-procedures",level:3},{value:"4.2.3.Retrieve Stored Procedures Detail",id:"423retrieve-stored-procedures-detail",level:3},{value:"4.2.4.Call stored procedure",id:"424call-stored-procedure",level:3},{value:"4.2.5.Uninstall Stored Procedures",id:"425uninstall-stored-procedures",level:3},{value:"4.2.6.Upgrade Stored Procedures",id:"426upgrade-stored-procedures",level:3},{value:"5. Procedure v2 Interface",id:"5-procedure-v2-interface",level:2},{value:"5.1.Writing stored procedures",id:"51writing-stored-procedures",level:3},{value:"5.2.Load stored procedure",id:"52load-stored-procedure",level:3},{value:"5.2.1.List loaded stored procedures",id:"521list-loaded-stored-procedures",level:4},{value:"5.2.2.Get stored procedure details",id:"522get-stored-procedure-details",level:4},{value:"5.2.3.Call stored procedure",id:"523call-stored-procedure",level:4},{value:"5.2.4.Delete stored procedure",id:"524delete-stored-procedure",level:4},{value:"5.2.5.Update stored procedure",id:"525update-stored-procedure",level:4}];function c(e){const r={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"tugraph-stored-procedure-guide",children:"TuGraph Stored Procedure Guide"})}),"\n",(0,t.jsxs)(r.blockquote,{children:["\n",(0,t.jsx)(r.p,{children:"This document mainly explains the instructions for using the TuGraph stored procedure."}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,t.jsx)(r.p,{children:"When the query/update logic that users need to express is more complex (such as cannot be described by Cypher or has high performance requirements), compared to calling multiple requests and completing the entire processing flow on the client, the stored procedure provided by TuGraph is a more concise and efficient choice."}),"\n",(0,t.jsx)(r.p,{children:"Similar to traditional databases, the TuGraph stored procedure runs on the server side. Users can encapsulate the processing logic (i.e., multiple operations) into a procedure call, and further improve performance by parallel processing (such as using relevant C++ OLAP interfaces and built-in algorithms) during implementation."}),"\n",(0,t.jsxs)(r.p,{children:["There is a special type of API in the stored procedure for parallel data operations, which we call the Traversal API. Please refer to the ",(0,t.jsx)(r.a,{href:"/tugraph-db/en/olap&procedure/procedure/traversal",children:"documentation"})," for more information."]}),"\n",(0,t.jsx)(r.h2,{id:"2-stored-procedure-version",children:"2. Stored Procedure Version"}),"\n",(0,t.jsx)(r.p,{children:"Currently, TuGraph supports two versions of stored procedures, which are suitable for different scenarios. Version 3.5 only supports v1, which can be directly called through the REST or RPC interface. Starting from version 3.5, v2 is supported, which allows embedding calls in graph query languages \u200b\u200b(such as Cypher). We call it POG (Procedure On Graph query language, APOC)."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{}),(0,t.jsx)(r.th,{children:"Procedure v1"}),(0,t.jsx)(r.th,{children:"Procedure v2"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Applicable Scenarios"}),(0,t.jsx)(r.td,{children:"Extreme performance or complex multi-transaction management scenarios"}),(0,t.jsx)(r.td,{children:"General scenarios, highly integrated with Cypher"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Transaction"}),(0,t.jsx)(r.td,{children:"Created internally in the function, multiple transactions"}),(0,t.jsx)(r.td,{children:"can be freely controlled\tPassed into the external function, single transaction"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Signature (parameter definition)"}),(0,t.jsx)(r.td,{children:"Not required"}),(0,t.jsx)(r.td,{children:"Required"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Input and output parameter types"}),(0,t.jsx)(r.td,{children:"Not required to specify"}),(0,t.jsx)(r.td,{children:"Need to specify parameter types"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Cypher Standalone Call"}),(0,t.jsx)(r.td,{children:"Supported"}),(0,t.jsx)(r.td,{children:"Supported"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Cypher Embeded Call"}),(0,t.jsx)(r.td,{children:"Not supported"}),(0,t.jsx)(r.td,{children:"Supported"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Language"}),(0,t.jsx)(r.td,{children:"C++/Python/Rust"}),(0,t.jsx)(r.td,{children:"C++"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Calling mode"}),(0,t.jsx)(r.td,{children:"Directly pass the string, usually in JSON format"}),(0,t.jsx)(r.td,{children:"Through variables in Cypher statements"})]})]})]}),"\n",(0,t.jsx)(r.p,{children:"In TuGraph, stored procedures v1 and v2 are managed separately, and support for create, delete, and query operations is provided. However, it is still not recommended to have the same name for multiple stored procedures."}),"\n",(0,t.jsx)(r.h2,{id:"3-supported-languages",children:"3. Supported Languages"}),"\n",(0,t.jsx)(r.p,{children:"In TuGraph, users can dynamically load, update, and delete stored procedures. TuGraph supports the use of C++, Python, and Rust languages to write stored procedures. Among them, C++ language has the most complete support and the best performance."}),"\n",(0,t.jsx)(r.p,{children:"Note that the stored procedure is the logic compiled and executed on the server side, which is independent of the language support on the client side."}),"\n",(0,t.jsx)(r.h2,{id:"4-procedure-v1-interface",children:"4. Procedure v1 Interface"}),"\n",(0,t.jsx)(r.h2,{id:"41write-stored-procedures",children:"4.1.Write stored procedures"}),"\n",(0,t.jsx)(r.h3,{id:"411write-c-stored-procedure",children:"4.1.1.Write C++ stored procedure"}),"\n",(0,t.jsx)(r.p,{children:"Users can write C stored procedures by using core API or Traversal API. An example of a simple C stored procedure is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:'#include \n#include "lgraph.h"\nusing namespace lgraph_api;\n\nextern "C" LGAPI bool Process(GraphDB& db, const std::string& request, std::string& response) {\n\tauto txn = db.CreateReadTxn();\n\tsize_t n = 0;\n\tfor (auto vit = txn.GetVertexIterator(); vit.IsValid(); vit.Next()) {\n if (vit.GetLabel() == "student") {\n auto age = vit.GetField("age");\n if (!age.is_null() && age.integer() == 10) n++; ## Count all students whose age is 10\n }\n\t}\n output = std::to_string(n);\n return true;\n}\n'})}),"\n",(0,t.jsxs)(r.p,{children:["From the code, we can see the entry of a TuGraph C++ stored procedure is the ",(0,t.jsx)(r.code,{children:"Process"})," function, with three parameters:"]}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"db"}),": the TuGraph database instance"]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"request"}),": the input data, which can be a binary byte array, or any other format such as JSON string."]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"response"}),": the output data, which can be a string or directly return binary data."]}),"\n"]}),"\n",(0,t.jsxs)(r.p,{children:["The return value of the ",(0,t.jsx)(r.code,{children:"Process"})," function is a boolean value. When it returns ",(0,t.jsx)(r.code,{children:"true"}),", it means that the request is successfully completed, otherwise it means that the stored procedure found an error during execution, and the user can return an error message through ",(0,t.jsx)(r.code,{children:"response"})," to facilitate debugging."]}),"\n",(0,t.jsxs)(r.p,{children:["After the C++ stored procedure is written, it needs to be compiled into a dynamic link library. TuGraph provides ",(0,t.jsx)(r.code,{children:"compile.sh"})," script to help users automatically compile stored procedures. The ",(0,t.jsx)(r.code,{children:"compile.sh"})," script has only one parameter, which is the name of the stored procedure, which is ",(0,t.jsx)(r.code,{children:"age_10"})," in the above example. Compile and call the command line as follows:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"g++ -fno-gnu-unique -fPIC -g --std=c++14 -I/usr/local/include/lgraph -rdynamic -O3 -fopenmp -o age_10.so age_10.cpp /usr/local/lib64/liblgraph.so -shared\n"})}),"\n",(0,t.jsx)(r.p,{children:"If the compilation goes well, age_10.so will be generated, which can then be loaded into the server by the user."}),"\n",(0,t.jsx)(r.h3,{id:"412-writing-python-stored-procedures",children:"4.1.2 Writing Python stored procedures"}),"\n",(0,t.jsx)(r.p,{children:"The following snippet does the same thing as the above C++ stored procedure, but via TuGraph Python API:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:"def Process(db, input):\n txn = db.CreateReadTxn()\n it = txn.GetVertexIterator()\n n = 0\n while it.IsValid():\n if it.GetLabel() == 'student' and it['age'] and it['age'] == 10:\n n = n + 1\n it.Next()\n return (True, str(nv))\n"})}),"\n",(0,t.jsxs)(r.p,{children:["The Python stored procedure returns a tuple, the first element of which is a Boolean value indicating whether the stored procedure was successfully executed; the second element is a ",(0,t.jsx)(r.code,{children:"str"}),", which contains the result to be returned."]}),"\n",(0,t.jsx)(r.p,{children:"Python stored procedures do not need to be compiled and can be loaded directly."}),"\n",(0,t.jsx)(r.h2,{id:"42how-to-use-stored-procedures",children:"4.2.How to use stored procedures"}),"\n",(0,t.jsx)(r.h3,{id:"421install-stored-procedures",children:"4.2.1.Install Stored Procedures"}),"\n",(0,t.jsxs)(r.p,{children:["Users can load stored procedures through REST API and RPC. Taking the REST API as an example, the C++ code to load ",(0,t.jsx)(r.code,{children:"age_10.so"})," is as follows:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:"import requests\nimport json\nimport base64\n\ndata = {'name':'age_10'}\nf = open('./age_10.so','rb')\ncontent = f.read()\ndata['code_base64'] = base64.b64encode(content).decode()\ndata['description'] = 'Custom Page Rank Procedure'\ndata['read_only'] = true\ndata['code_type'] = 'so'\njs = json.dumps(data)\nr = requests.post(url='http://127.0.0.1:7071/db/school/cpp_plugin', data=js,\n headers={'Content-Type':'application/json'})\nprint(r.status_code) ## \u6b63\u5e38\u65f6\u8fd4\u56de200\n"})}),"\n",(0,t.jsxs)(r.p,{children:["It should be noted that ",(0,t.jsx)(r.code,{children:"data['code']"})," at this time is a base64-processed string, and the binary code in ",(0,t.jsx)(r.code,{children:"age_10.so"})," cannot be directly transmitted through JSON. In addition, the loading and deletion of stored procedures can only be operated by users with administrator privileges."]}),"\n",(0,t.jsx)(r.p,{children:"After the stored procedure is loaded, it will be saved in the database, and it will be automatically loaded after the server restarts. Also, if an update to the stored procedure is required, the same REST API is called. It is recommended that users update the corresponding descriptions when updating stored procedures, so as to distinguish stored procedures of different versions."}),"\n",(0,t.jsx)(r.h3,{id:"422list-stored-procedures",children:"4.2.2.List Stored Procedures"}),"\n",(0,t.jsx)(r.p,{children:"During the running of the server, the user can obtain the list of stored procedures at any time. Its call is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:'>>> r = requests.get(\'http://127.0.0.1:7071/db/school/cpp_plugin\')\n>>> r.status_code\n200\n>>> r.text\n\'{"plugins":[{"description":"Custom Page Rank Procedure", "name":"age_10", "read_only":true}]}\'\n'})}),"\n",(0,t.jsx)(r.h3,{id:"423retrieve-stored-procedures-detail",children:"4.2.3.Retrieve Stored Procedures Detail"}),"\n",(0,t.jsx)(r.p,{children:"While the server is running, users can obtain the details of a single stored procedure, including codes, at any time. Its call is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:'>>> r = requests.get(\'http://127.0.0.1:7071/db/school/cpp_plugin/age_10\')\n>>> r.status_code\n200\n>>> r.text\n\'{"description":"Custom Page Rank Procedure", "name":"age_10", "read_only":true, "code_base64":, "code_type":"so"}\'\n'})}),"\n",(0,t.jsx)(r.h3,{id:"424call-stored-procedure",children:"4.2.4.Call stored procedure"}),"\n",(0,t.jsx)(r.p,{children:"An example code for calling a stored procedure is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:">>> r = requests.post(url='http://127.0.0.1:7071/db/school/cpp_plugin/age_10', data='',\n headers={'Content-Type':'application/json'})\n>>> r.status_code\n200\n>>> r.text\n9\n"})}),"\n",(0,t.jsx)(r.h3,{id:"425uninstall-stored-procedures",children:"4.2.5.Uninstall Stored Procedures"}),"\n",(0,t.jsx)(r.p,{children:"Deleting a stored procedure requires only the following call:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:">>> r = requests.delete(url='http://127.0.0.1:7071/db/school/cpp_plugin/age_10')\n>>> r.status_code\n200\n"})}),"\n",(0,t.jsx)(r.p,{children:"Similar to loading stored procedures, only admin users can delete stored procedures."}),"\n",(0,t.jsx)(r.h3,{id:"426upgrade-stored-procedures",children:"4.2.6.Upgrade Stored Procedures"}),"\n",(0,t.jsx)(r.p,{children:"You can upgrade a stored procedure with the following two steps:"}),"\n",(0,t.jsxs)(r.ol,{children:["\n",(0,t.jsx)(r.li,{children:"Uninstall the existing one."}),"\n",(0,t.jsx)(r.li,{children:"Install the new on."}),"\n"]}),"\n",(0,t.jsx)(r.p,{children:"TuGraph carefully manages the concurrency of stored procedure operations. Upgrading stored procedures will not affect concurrent runs of existing ones."}),"\n",(0,t.jsx)(r.h2,{id:"5-procedure-v2-interface",children:"5. Procedure v2 Interface"}),"\n",(0,t.jsx)(r.h3,{id:"51writing-stored-procedures",children:"5.1.Writing stored procedures"}),"\n",(0,t.jsx)(r.p,{children:"Users can write C++ stored procedures by using lgraph API. A simple C++ stored procedure example is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-c++",children:'// peek_some_node_salt.cpp\n#include \n#include "lgraph/lgraph.h"\n#include "lgraph/lgraph_types.h"\n#include "lgraph/lgraph_result.h"\n\n#include "tools/json.hpp"\n\nusing json = nlohmann::json;\nusing namespace lgraph_api;\n\nextern "C" LGAPI bool GetSignature(SigSpec &sig_spec) {\n sig_spec.input_list = {\n {.name = "limit", .index = 0, .type = LGraphType::INTEGER},\n };\n sig_spec.result_list = {\n {.name = "node", .index = 0, .type = LGraphType::NODE},\n {.name = "salt", .index = 1, .type = LGraphType::FLOAT}\n };\n return true;\n}\n\nextern "C" LGAPI bool ProcessInTxn(Transaction &txn,\n const std::string &request,\n Result &response) {\n int64_t limit;\n try {\n json input = json::parse(request);\n limit = input["limit"].get();\n } catch (std::exception &e) {\n response.ResetHeader({\n {"errMsg", LGraphType::STRING}\n });\n response.MutableRecord()->Insert(\n "errMsg",\n FieldData::String(std::string("error parsing json: ") + e.what()));\n return false;\n }\n\n response.ResetHeader({\n {"node", LGraphType::NODE},\n {"salt", LGraphType::FLOAT}\n });\n for (size_t i = 0; i < limit; i++) {\n auto r = response.MutableRecord();\n auto vit = txn.GetVertexIterator(i);\n r->Insert("node", vit);\n r->Insert("salt", FieldData::Float(20.23*float(i)));\n }\n return true;\n}\n'})}),"\n",(0,t.jsx)(r.p,{children:"From the code we can see:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:["\n",(0,t.jsxs)(r.p,{children:["The stored procedure defines a method ",(0,t.jsx)(r.code,{children:"GetSignature"})," to get the signature. This method returns the signature of the stored procedure, which includes input parameter names and their types, and return parameters and their types. This enables the Cypher query statement to use the signature information to verify whether the input data and the returned data are reasonable when calling the stored procedure."]}),"\n"]}),"\n",(0,t.jsxs)(r.li,{children:["\n",(0,t.jsxs)(r.p,{children:["The entry function is the ",(0,t.jsx)(r.code,{children:"ProcessInTxn"})," function, which has three parameters, which are:"]}),"\n"]}),"\n",(0,t.jsxs)(r.li,{children:["\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.code,{children:"txn"}),": The transaction of the stored procedure, generally speaking, the transaction of the Cypher statement that calls the stored procedure."]}),"\n"]}),"\n",(0,t.jsxs)(r.li,{children:["\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.code,{children:"request"}),": input data, its content is the string of the input parameter type defined in ",(0,t.jsx)(r.code,{children:"GetSignature"})," and the value passed in the Cypher query statement after json serialization. e.g. ",(0,t.jsx)(r.code,{children:"{num_iteration: 10}"})]}),"\n"]}),"\n",(0,t.jsxs)(r.li,{children:["\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.code,{children:"response"}),": output data, in order to ensure compatibility in the Cypher language, users can write the data processed by the stored procedure to ",(0,t.jsx)(r.code,{children:"lgraph_api::Result"}),", and finally use ",(0,t.jsx)(r.code,{children:"lgraph_api::Result::Dump"})," to serialize it into data in json format."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(r.p,{children:["The return value of the ",(0,t.jsx)(r.code,{children:"ProcessInTxn"})," function is a boolean value. When it returns ",(0,t.jsx)(r.code,{children:"true"}),", it means that the request was successfully completed, otherwise it means that the stored procedure found an error during execution."]}),"\n",(0,t.jsxs)(r.p,{children:["After the C++ stored procedure is written, it needs to be compiled into a dynamic link library. TuGraph provides ",(0,t.jsx)(r.code,{children:"compile.sh"})," script to help users automatically compile stored procedures. The ",(0,t.jsx)(r.code,{children:"compile.sh"})," script has only one parameter, which is the name of the stored procedure, which in the above example is ",(0,t.jsx)(r.code,{children:"custom_pagerank"}),". Compile and call the command line as follows:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-bash",children:"g++ -fno-gnu-unique -fPIC -g --std=c++14 -I/usr/local/include/lgraph -rdynamic -O3 -fopenmp -o custom_pagerank.so custom_pagerank.cpp /usr/local/lib64/liblgraph.so -shared\n"})}),"\n",(0,t.jsx)(r.p,{children:"If the compilation goes well, custom_pagerank.so will be generated, which can then be loaded into the server by the user."}),"\n",(0,t.jsx)(r.h3,{id:"52load-stored-procedure",children:"5.2.Load stored procedure"}),"\n",(0,t.jsxs)(r.p,{children:["Users can load stored procedures through REST API and RPC. Taking the REST API as an example, the C++ code to load ",(0,t.jsx)(r.code,{children:"custom_pagerank.so"})," is as follows:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:"import requests\nimport json\nimport base64\n\ndata = {'name':'custom_pagerank'}\nf = open('./custom_pagerank.so','rb')\ncontent = f.read()\ndata['code_base64'] = base64.b64encode(content).decode()\ndata['description'] = 'Custom Page Rank Procedure'\ndata['read_only'] = true\ndata['code_type'] = 'so'\njs = json.dumps(data)\nr = requests.post(url='http://127.0.0.1:7071/db/school/cpp_plugin', data=js,\n headers={'Content-Type':'application/json'})\nprint(r.status_code) ## \u6b63\u5e38\u65f6\u8fd4\u56de200\n"})}),"\n",(0,t.jsxs)(r.p,{children:["It should be noted that ",(0,t.jsx)(r.code,{children:"data['code']"})," at this time is a base64-processed string, and the binary code in ",(0,t.jsx)(r.code,{children:"custom_pagerank.so"})," cannot be directly transmitted through JSON. In addition, the loading and deletion of stored procedures can only be operated by users with administrator privileges."]}),"\n",(0,t.jsx)(r.p,{children:"After the stored procedure is loaded, it will be saved in the database, and it will be automatically loaded after the server restarts. Also, if an update to the stored procedure is required, the same REST API is called. It is recommended that users update the corresponding descriptions when updating stored procedures, so as to distinguish stored procedures of different versions."}),"\n",(0,t.jsx)(r.h4,{id:"521list-loaded-stored-procedures",children:"5.2.1.List loaded stored procedures"}),"\n",(0,t.jsx)(r.p,{children:"During the running of the server, the user can obtain the list of stored procedures at any time. Its call is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:'>>> r = requests.get(\'http://127.0.0.1:7071/db/school/cpp_plugin\')\n>>> r.status_code\n200\n>>> r.text\n\'{"plugins":[{"description":"Custom Page Rank Procedure", "name":"custom_pagerank", "read_only":true}]}\'\n'})}),"\n",(0,t.jsx)(r.h4,{id:"522get-stored-procedure-details",children:"5.2.2.Get stored procedure details"}),"\n",(0,t.jsx)(r.p,{children:"While the server is running, users can obtain the details of a single stored procedure, including codes, at any time. Its call is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:'>>> r = requests.get(\'http://127.0.0.1:7071/db/school/cpp_plugin/custom_pagerank\')\n>>> r.status_code\n200\n>>> r.text\n\'{"description":"Custom Page Rank Procedure", "name":"custom_pagerank", "read_only":true, "code_base64":, "code_type":"so"}\'\n'})}),"\n",(0,t.jsx)(r.h4,{id:"523call-stored-procedure",children:"5.2.3.Call stored procedure"}),"\n",(0,t.jsx)(r.p,{children:"An example code for calling a stored procedure is as follows:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-Cypher",children:"CALL plugin.cpp.custom_pagerank(10)\nYIELD node, pr WITH node, pr\nMATCH(node)-[r]->(n) RETURN node, r, n, pr\n"})}),"\n",(0,t.jsx)(r.h4,{id:"524delete-stored-procedure",children:"5.2.4.Delete stored procedure"}),"\n",(0,t.jsx)(r.p,{children:"Deleting a stored procedure requires only the following call:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-python",children:">>> r = requests.delete(url='http://127.0.0.1:7071/db/school/cpp_plugin/custom_pagerank')\n>>> r.status_code\n200\n"})}),"\n",(0,t.jsx)(r.p,{children:"Similar to loading stored procedures, only admin users can delete stored procedures."}),"\n",(0,t.jsx)(r.h4,{id:"525update-stored-procedure",children:"5.2.5.Update stored procedure"}),"\n",(0,t.jsx)(r.p,{children:"Updating a stored procedure requires the following two steps:"}),"\n",(0,t.jsxs)(r.ol,{children:["\n",(0,t.jsx)(r.li,{children:"Delete the existing stored procedure"}),"\n",(0,t.jsx)(r.li,{children:"Install the new stored procedure"}),"\n"]}),"\n",(0,t.jsx)(r.p,{children:"TuGraph carefully manages the concurrency of stored procedure operations, and updating stored procedures will not affect the operation of existing stored procedures."})]})}function p(e={}){const{wrapper:r}={...(0,s.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,r,n)=>{n.d(r,{R:()=>o,x:()=>i});var t=n(6540);const s={},d=t.createContext(s);function o(e){const r=t.useContext(d);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(d.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/36a5b4e6.7eed2b49.js b/assets/js/36a5b4e6.e5329f6b.js similarity index 99% rename from assets/js/36a5b4e6.7eed2b49.js rename to assets/js/36a5b4e6.e5329f6b.js index a72fb85f0e..bdcc97c4c4 100644 --- a/assets/js/36a5b4e6.7eed2b49.js +++ b/assets/js/36a5b4e6.e5329f6b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5017],{5478:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>s,default:()=>c,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var i=n(4848),o=n(8453);const r={},s="Token Usage Guide",a={id:"permission/token",title:"Token Usage Guide",description:"1. Introduction to Token",source:"@site/../docs/en-US/source/10.permission/2.token.md",sourceDirName:"10.permission",slug:"/permission/token",permalink:"/tugraph-db/en/permission/token",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Privilege",permalink:"/tugraph-db/en/permission/privilege"},next:{title:"Forgot Admin Password",permalink:"/tugraph-db/en/permission/reset_admin_password"}},d={},l=[{value:"1. Introduction to Token",id:"1-introduction-to-token",level:2},{value:"2. Token Expiration",id:"2-token-expiration",level:2},{value:"2.1. Browser Token Interaction Logic",id:"21-browser-token-interaction-logic",level:3},{value:"2.3. Token Expiration Refresh Mechanism",id:"23-token-expiration-refresh-mechanism",level:3},{value:"2.4. Token Expiration Modification",id:"24-token-expiration-modification",level:3},{value:"3. Introduction to Token-Related Requests Sent by Clients",id:"3-introduction-to-token-related-requests-sent-by-clients",level:2},{value:"3.1. REST",id:"31-rest",level:3},{value:"3.2. RPC",id:"32-rpc",level:3},{value:"4. Token upper limit",id:"4-token-upper-limit",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"token-usage-guide",children:"Token Usage Guide"})}),"\n",(0,i.jsx)(t.h2,{id:"1-introduction-to-token",children:"1. Introduction to Token"}),"\n",(0,i.jsx)(t.p,{children:"JWT (JSON Web Token) is an open standard used for authentication and authorization. It is based on the JSON (JavaScript Object Notation) format and is designed for securely transmitting claim information between network applications."}),"\n",(0,i.jsx)(t.p,{children:"JWT consists of three parts: the header, payload, and signature. The header contains the type of JWT and the signature algorithm used, the payload contains the information to be transmitted, and the signature is used to verify the integrity and authenticity of the JWT."}),"\n",(0,i.jsx)(t.p,{children:"In TuGraph, JWT is used to implement a stateless authentication and authorization mechanism. After a user logs in successfully, the server generates a JWT and returns it to the client. The client passes this JWT as an identity credential in subsequent requests to the server. Upon receiving the JWT, the server verifies the signature and parses the information in the payload to determine the user's identity and permissions, and decides whether to allow the execution of the request."}),"\n",(0,i.jsx)(t.h2,{id:"2-token-expiration",children:"2. Token Expiration"}),"\n",(0,i.jsx)(t.h3,{id:"21-browser-token-interaction-logic",children:"2.1. Browser Token Interaction Logic"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsx)(t.li,{children:"The user opens the browser, enters the username and password, and clicks login."}),"\n",(0,i.jsx)(t.li,{children:"The frontend calls the login interface and inputs the account and password to the backend."}),"\n",(0,i.jsx)(t.li,{children:"After receiving the account and password, the backend verifies them and returns a Token."}),"\n",(0,i.jsx)(t.li,{children:"The frontend stores the Token in the browser cache, and all subsequent requests must carry this Token."}),"\n",(0,i.jsx)(t.li,{children:"If the frontend actively clicks logout or closes the page, it should actively call the logout interface and pass the Token to the backend."}),"\n",(0,i.jsx)(t.li,{children:'After receiving the Token, the backend invalidates it, returns a status code 200, and "logout successful". After receiving the message, the frontend clears the Token in the browser memory, and returns to the login page.'}),"\n",(0,i.jsx)(t.li,{children:"The Token expires (initially set to 24 hours), and the user needs to log in again."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"23-token-expiration-refresh-mechanism",children:"2.3. Token Expiration Refresh Mechanism"}),"\n",(0,i.jsx)(t.p,{children:"Token expiration has a refresh mechanism that is turned off by default. If turned on, the security of the Token will be higher, and there will be two timestamps."}),"\n",(0,i.jsxs)(t.p,{children:["The first timestamp ",(0,i.jsx)(t.code,{children:"refresh_time"})," is used to determine whether the Token has expired (default 24 hours): after expiration, the refresh interface can be called to obtain a new Token, which can be set to a shorter time, such as 1 hour."]}),"\n",(0,i.jsxs)(t.p,{children:["The second timestamp ",(0,i.jsx)(t.code,{children:"expire_time"})," is the forced expiration timestamp (default 24 hours): after expiration, the user must log in again."]}),"\n",(0,i.jsx)(t.h3,{id:"24-token-expiration-modification",children:"2.4. Token Expiration Modification"}),"\n",(0,i.jsx)(t.p,{children:"To facilitate developers to develop on their own, TuGraph provides two ways to modify the expiration time, both of which require admin privileges."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Set through the interface call. The interfaces involved in modifying the expiration time are ",(0,i.jsx)(t.code,{children:"update_token_time"})," and ",(0,i.jsx)(t.code,{children:"get_token_time"})," for querying the expiration time. For details, please refer to the ",(0,i.jsx)(t.a,{href:"/tugraph-db/en/client-tools/restful-api-legacy",children:"REST interface document"}),"."]}),"\n",(0,i.jsxs)(t.li,{children:["Set through startup parameters. When the server-side is started, adding the parameter ",(0,i.jsx)(t.code,{children:"-unlimited_token 1"})," can set the Token to be unlimited. Please refer to the ",(0,i.jsx)(t.a,{href:"/tugraph-db/en/installation&running/tugraph-running",children:"service running document"})," for details."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"3-introduction-to-token-related-requests-sent-by-clients",children:"3. Introduction to Token-Related Requests Sent by Clients"}),"\n",(0,i.jsx)(t.p,{children:"The client handles two types of protocol-related requests: REST and RPC."}),"\n",(0,i.jsx)(t.h3,{id:"31-rest",children:"3.1. REST"}),"\n",(0,i.jsx)(t.p,{children:"If the client uses the REST protocol (including the browser), because it is a short connection, Token needs to be carried in every request, and a new Token needs to be obtained after it expires."}),"\n",(0,i.jsx)(t.p,{children:"For self-developed clients, if the REST protocol is used, Token logic needs to be considered."}),"\n",(0,i.jsx)(t.h3,{id:"32-rpc",children:"3.2. RPC"}),"\n",(0,i.jsx)(t.p,{children:"If the client uses the RPC protocol (including the official C++/Java/Python), it uses a long connection to maintain, and no Token operation is involved after login."}),"\n",(0,i.jsx)(t.h2,{id:"4-token-upper-limit",children:"4. Token upper limit"}),"\n",(0,i.jsx)(t.p,{children:"The upper limit of Token refers to the maximum number of Tokens that a user can own at the same time. To prevent unlimited logins, the upper limit of Token is 10000 by default. Since the token generation logic is strongly related to time, a token will be generated for storage every time you log in. The validity period of the token is 24 hours by default. Therefore, it is recommended to log out the unused token in time after login."})]})}function c(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var i=n(6540);const o={},r=i.createContext(o);function s(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5017],{5478:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>s,default:()=>c,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var i=n(4848),o=n(8453);const r={},s="Token Usage Guide",a={id:"permission/token",title:"Token Usage Guide",description:"1. Introduction to Token",source:"@site/../docs/en-US/source/10.permission/2.token.md",sourceDirName:"10.permission",slug:"/permission/token",permalink:"/tugraph-db/en/permission/token",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Privilege",permalink:"/tugraph-db/en/permission/privilege"},next:{title:"Forgot Admin Password",permalink:"/tugraph-db/en/permission/reset_admin_password"}},d={},l=[{value:"1. Introduction to Token",id:"1-introduction-to-token",level:2},{value:"2. Token Expiration",id:"2-token-expiration",level:2},{value:"2.1. Browser Token Interaction Logic",id:"21-browser-token-interaction-logic",level:3},{value:"2.3. Token Expiration Refresh Mechanism",id:"23-token-expiration-refresh-mechanism",level:3},{value:"2.4. Token Expiration Modification",id:"24-token-expiration-modification",level:3},{value:"3. Introduction to Token-Related Requests Sent by Clients",id:"3-introduction-to-token-related-requests-sent-by-clients",level:2},{value:"3.1. REST",id:"31-rest",level:3},{value:"3.2. RPC",id:"32-rpc",level:3},{value:"4. Token upper limit",id:"4-token-upper-limit",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"token-usage-guide",children:"Token Usage Guide"})}),"\n",(0,i.jsx)(t.h2,{id:"1-introduction-to-token",children:"1. Introduction to Token"}),"\n",(0,i.jsx)(t.p,{children:"JWT (JSON Web Token) is an open standard used for authentication and authorization. It is based on the JSON (JavaScript Object Notation) format and is designed for securely transmitting claim information between network applications."}),"\n",(0,i.jsx)(t.p,{children:"JWT consists of three parts: the header, payload, and signature. The header contains the type of JWT and the signature algorithm used, the payload contains the information to be transmitted, and the signature is used to verify the integrity and authenticity of the JWT."}),"\n",(0,i.jsx)(t.p,{children:"In TuGraph, JWT is used to implement a stateless authentication and authorization mechanism. After a user logs in successfully, the server generates a JWT and returns it to the client. The client passes this JWT as an identity credential in subsequent requests to the server. Upon receiving the JWT, the server verifies the signature and parses the information in the payload to determine the user's identity and permissions, and decides whether to allow the execution of the request."}),"\n",(0,i.jsx)(t.h2,{id:"2-token-expiration",children:"2. Token Expiration"}),"\n",(0,i.jsx)(t.h3,{id:"21-browser-token-interaction-logic",children:"2.1. Browser Token Interaction Logic"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsx)(t.li,{children:"The user opens the browser, enters the username and password, and clicks login."}),"\n",(0,i.jsx)(t.li,{children:"The frontend calls the login interface and inputs the account and password to the backend."}),"\n",(0,i.jsx)(t.li,{children:"After receiving the account and password, the backend verifies them and returns a Token."}),"\n",(0,i.jsx)(t.li,{children:"The frontend stores the Token in the browser cache, and all subsequent requests must carry this Token."}),"\n",(0,i.jsx)(t.li,{children:"If the frontend actively clicks logout or closes the page, it should actively call the logout interface and pass the Token to the backend."}),"\n",(0,i.jsx)(t.li,{children:'After receiving the Token, the backend invalidates it, returns a status code 200, and "logout successful". After receiving the message, the frontend clears the Token in the browser memory, and returns to the login page.'}),"\n",(0,i.jsx)(t.li,{children:"The Token expires (initially set to 24 hours), and the user needs to log in again."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"23-token-expiration-refresh-mechanism",children:"2.3. Token Expiration Refresh Mechanism"}),"\n",(0,i.jsx)(t.p,{children:"Token expiration has a refresh mechanism that is turned off by default. If turned on, the security of the Token will be higher, and there will be two timestamps."}),"\n",(0,i.jsxs)(t.p,{children:["The first timestamp ",(0,i.jsx)(t.code,{children:"refresh_time"})," is used to determine whether the Token has expired (default 24 hours): after expiration, the refresh interface can be called to obtain a new Token, which can be set to a shorter time, such as 1 hour."]}),"\n",(0,i.jsxs)(t.p,{children:["The second timestamp ",(0,i.jsx)(t.code,{children:"expire_time"})," is the forced expiration timestamp (default 24 hours): after expiration, the user must log in again."]}),"\n",(0,i.jsx)(t.h3,{id:"24-token-expiration-modification",children:"2.4. Token Expiration Modification"}),"\n",(0,i.jsx)(t.p,{children:"To facilitate developers to develop on their own, TuGraph provides two ways to modify the expiration time, both of which require admin privileges."}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Set through the interface call. The interfaces involved in modifying the expiration time are ",(0,i.jsx)(t.code,{children:"update_token_time"})," and ",(0,i.jsx)(t.code,{children:"get_token_time"})," for querying the expiration time. For details, please refer to the ",(0,i.jsx)(t.a,{href:"/tugraph-db/en/client-tools/restful-api-legacy",children:"REST interface document"}),"."]}),"\n",(0,i.jsxs)(t.li,{children:["Set through startup parameters. When the server-side is started, adding the parameter ",(0,i.jsx)(t.code,{children:"-unlimited_token 1"})," can set the Token to be unlimited. Please refer to the ",(0,i.jsx)(t.a,{href:"/tugraph-db/en/installation&running/tugraph-running",children:"service running document"})," for details."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"3-introduction-to-token-related-requests-sent-by-clients",children:"3. Introduction to Token-Related Requests Sent by Clients"}),"\n",(0,i.jsx)(t.p,{children:"The client handles two types of protocol-related requests: REST and RPC."}),"\n",(0,i.jsx)(t.h3,{id:"31-rest",children:"3.1. REST"}),"\n",(0,i.jsx)(t.p,{children:"If the client uses the REST protocol (including the browser), because it is a short connection, Token needs to be carried in every request, and a new Token needs to be obtained after it expires."}),"\n",(0,i.jsx)(t.p,{children:"For self-developed clients, if the REST protocol is used, Token logic needs to be considered."}),"\n",(0,i.jsx)(t.h3,{id:"32-rpc",children:"3.2. RPC"}),"\n",(0,i.jsx)(t.p,{children:"If the client uses the RPC protocol (including the official C++/Java/Python), it uses a long connection to maintain, and no Token operation is involved after login."}),"\n",(0,i.jsx)(t.h2,{id:"4-token-upper-limit",children:"4. Token upper limit"}),"\n",(0,i.jsx)(t.p,{children:"The upper limit of Token refers to the maximum number of Tokens that a user can own at the same time. To prevent unlimited logins, the upper limit of Token is 10000 by default. Since the token generation logic is strongly related to time, a token will be generated for storage every time you log in. The validity period of the token is 24 hours by default. Therefore, it is recommended to log out the unused token in time after login."})]})}function c(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>a});var i=n(6540);const o={},r=i.createContext(o);function s(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/36b9e001.5ab6650e.js b/assets/js/36b9e001.790d4006.js similarity index 99% rename from assets/js/36b9e001.5ab6650e.js rename to assets/js/36b9e001.790d4006.js index 8b02ecf04c..38695c632f 100644 --- a/assets/js/36b9e001.5ab6650e.js +++ b/assets/js/36b9e001.790d4006.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3213],{8528:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>d});var r=n(4848),s=n(8453);const l={},o="TuGraph Python SDK",i={id:"client-tools/python-client",title:"TuGraph Python SDK",description:"This document is the usage instruction of TuGraph Python SDK",source:"@site/../docs/en-US/source/7.client-tools/1.python-client.md",sourceDirName:"7.client-tools",slug:"/client-tools/python-client",permalink:"/tugraph-db/en/client-tools/python-client",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Explorer",permalink:"/tugraph-db/en/utility-tools/tugraph-explorer"},next:{title:"TuGraph C++ SDK",permalink:"/tugraph-db/en/client-tools/cpp-client"}},c={},d=[{value:"1.Overview",id:"1overview",level:2},{value:"2.RESTful Client",id:"2restful-client",level:2},{value:"2.1. Install Client",id:"21-install-client",level:3},{value:"2.2.Call cypher",id:"22call-cypher",level:3},{value:"2.3.Call stored procedure",id:"23call-stored-procedure",level:3},{value:"3.RPC Client",id:"3rpc-client",level:2},{value:"3.1.Instantiate the client object",id:"31instantiate-the-client-object",level:3},{value:"3.1.1.Instantiate a single node client object",id:"311instantiate-a-single-node-client-object",level:4},{value:"3.1.2.Instantiate the HA cluster to directly connect to the client object",id:"312instantiate-the-ha-cluster-to-directly-connect-to-the-client-object",level:4},{value:"3.1.3.Instantiate the HA cluster to indirectly connect to the client object",id:"313instantiate-the-ha-cluster-to-indirectly-connect-to-the-client-object",level:4},{value:"3.2.Call cypher",id:"32call-cypher",level:3},{value:"3.3.Send cypher request to leader",id:"33send-cypher-request-to-leader",level:3},{value:"3.4.Call GQL",id:"34call-gql",level:3},{value:"3.5.Send GQL request to leader",id:"35send-gql-request-to-leader",level:3},{value:"3.6.Calling stored procedures",id:"36calling-stored-procedures",level:3},{value:"3.7.Call the stored procedure to the leader",id:"37call-the-stored-procedure-to-the-leader",level:3},{value:"3.8.Load stored procedure",id:"38load-stored-procedure",level:3},{value:"3.9.List stored procedures",id:"39list-stored-procedures",level:3},{value:"3.10.Delete stored procedures",id:"310delete-stored-procedures",level:3},{value:"3.11.Import schema from byte stream",id:"311import-schema-from-byte-stream",level:3},{value:"3.12.Import edge data from byte stream",id:"312import-edge-data-from-byte-stream",level:3},{value:"3.13.Import schema from file",id:"313import-schema-from-file",level:3},{value:"3.14.Import point and edge data from file",id:"314import-point-and-edge-data-from-file",level:3}];function a(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"tugraph-python-sdk",children:"TuGraph Python SDK"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"This document is the usage instruction of TuGraph Python SDK"}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"1overview",children:"1.Overview"}),"\n",(0,r.jsx)(t.p,{children:"There are two kinds of Python's TuGraph Client. One is the RESTful Client, which uses the HTTP method to send requests to the server. The other is the RPC Client, which uses the RPC method to call the server remote service. Both have their own advantages and disadvantages. The RESTful client is simple to use. You can find the source code file of the Client in the src/client/python/TuGraphClient directory of the project. You can install it directly into the user environment and use it. However, it supports fewer functions and its performance is not high. RPC Client supports both stand-alone servers and high-availability clusters and load balancing. It has many interfaces and powerful functions. However, the usage is more complicated. Users need to compile the TuGraph project themselves to obtain liblgraph_client_python.so, or directly find the dependent library in the /usr/local/lib64 directory when using the runtime image, and introduce it into the python project for normal use. Next, the usage of these two Clients will be introduced in detail."}),"\n",(0,r.jsx)(t.h2,{id:"2restful-client",children:"2.RESTful Client"}),"\n",(0,r.jsx)(t.h3,{id:"21-install-client",children:"2.1. Install Client"}),"\n",(0,r.jsx)(t.p,{children:"TuGraph's Python RESTful client uses the setuptools tool for packaging and distribution. Users can install the client directly into the local environment and introduce it directly when using it."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"cd src/client/python/TuGraphClient\npython3 setup.py build\npython3 setup.py install\n"})}),"\n",(0,r.jsx)(t.p,{children:"Note: When using the setuptools tool to install the python client, dependencies such as httpx will be installed and need to be executed in an environment with external network access."}),"\n",(0,r.jsx)(t.h3,{id:"22call-cypher",children:"2.2.Call cypher"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'from TuGraphClient import TuGraphClient, AsyncTuGraphClient\n\nclient = TuGraphClient("127.0.0.1:7071" , "admin", "73@TuGraph")\ncypher = "match (n) return properties(n) limit 1"\nres = client.call_cypher(cypher)\nprint(res)\n'})}),"\n",(0,r.jsx)(t.h3,{id:"23call-stored-procedure",children:"2.3.Call stored procedure"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'from TuGraphClient import TuGraphClient, AsyncTuGraphClient\n\nclient = TuGraphClient("127.0.0.1:7071" , "admin", "73@TuGraph")\nplugin_type = "cpp"\nplugin_name = "khop"\nplugin_input = "{\\"root\\": 10, \\"hop\\": 3}"\nres = client.call_plugin(plugin_type, plguin_name, plugin_input)\nprint(res)\n'})}),"\n",(0,r.jsx)(t.h2,{id:"3rpc-client",children:"3.RPC Client"}),"\n",(0,r.jsx)(t.p,{children:"Python's TuGraph Rpc Client is a CPP Client SDK packaged using pybind11. The following table lists the correspondence between Python and CPP Client SDK."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Python Client SDK"}),(0,r.jsx)(t.th,{children:"CPP Client SDK"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"client(self: liblgraph_client_python.client, url: str, user: str, password: str)"}),(0,r.jsx)(t.td,{children:"RpcClient(const std::string& url, const std::string& user, const std::string& password)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"client(self: liblgraph_client_python.client, urls: list, user: str, password: str)"}),(0,r.jsxs)(t.td,{children:["RpcClient(std::vector",(0,r.jsx)(t.a,{href:"std::string",children:"std::string"}),"& urls, std::string user, std::string password)"]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"callCypher(self: liblgraph_client_python.client, cypher: str, graph: str, json_format: bool, timeout: float, url: str) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool CallCypher(std::string& result, const std::string& cypher, const std::string& graph, bool json_format, double timeout, const std::string& url)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"callCypherToLeader(self: liblgraph_client_python.client, cypher: str, graph: str, json_format: bool, timeout: float) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool CallCypherToLeader(std::string& result, const std::string& cypher, const std::string& graph, bool json_format, double timeout)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"callGql(self: liblgraph_client_python.client, gql: str, graph: str, json_format: bool, timeout: float, url: str) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool CallGql(std::string& result, const std::string& gql, const std::string& graph, bool json_format, double timeout, const std::string& url)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"callGqlToLeader(self: liblgraph_client_python.client, gql: str, graph: str, json_format: bool, timeout: float) -> (bool, str)"}),(0,r.jsx)(t.td,{children:'bool CallGqlToLeader(std::string& result, const std::string& gql, const std::string& graph = "default", bool json_format = true, double timeout = 0)'})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"callProcedure(self: liblgraph_client_python.client, procedure_type: str, procedure_name: str, param: str, procedure_time_out: float, in_process: bool, graph: str, json_format: bool, url: str) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool CallProcedure(std::string& result, const std::string& procedure_type, const std::string& procedure_name, const std::string& param, double procedure_time_out, bool in_process, const std::string& graph, bool json_format, const std::string& url)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"callProcedureToLeader(self: liblgraph_client_python.client, procedure_type: str, procedure_name: str, param: str, procedure_time_out: float, in_process: bool, graph: str, json_format: bool) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"CallProcedureToLeader(std::string& result, const std::string& procedure_type, const std::string& procedure_name, const std::string& param, double procedure_time_out, bool in_process, const std::string& graph, bool json_format)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"loadProcedure(self: liblgraph_client_python.client, source_file: str, procedure_type: str, procedure_name: str, code_type: str, procedure_description: str, read_only: bool, version: str, graph: str) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool LoadProcedure(std::string& result, const std::string& source_file, const std::string& procedure_type, const std::string& procedure_name, const std::string& code_type, const std::string& procedure_description, bool read_only, const std::string& version, const std::string& graph)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"listProcedures(self: liblgraph_client_python.client, procedure_type: str, version: str, graph: str, url: str) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool ListProcedures(std::string& result, const std::string& procedure_type, const std::string& version, const std::string& graph, const std::string& url)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"deleteProcedure(self: liblgraph_client_python.client, procedure_type: str, procedure_name: str, graph: str) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool DeleteProcedure(std::string& result, const std::string& procedure_type, const std::string& procedure_name, const std::string& graph)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"importSchemaFromContent(self: liblgraph_client_python.client, schema: str, graph: str, json_format: bool, timeout: float) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool ImportSchemaFromContent(std::string& result, const std::string& schema, const std::string& graph, bool json_format, double timeout)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"importDataFromContent(self: liblgraph_client_python.client, desc: str, data: str, delimiter: str, continue_on_error: bool, thread_nums: int, graph: str, json_format: bool, timeout: float) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"ImportDataFromContent(std::string& result, const std::string& desc, const std::string& data, const std::string& delimiter, bool continue_on_error, int thread_nums, const std::string& graph, bool json_format, double timeout)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"importSchemaFromFile(self: liblgraph_client_python.client, schema_file: str, graph: str, json_format: bool, timeout: float) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"ImportSchemaFromFile(std::string& result, const std::string& schema_file, const std::string& graph, bool json_format, double timeout)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"importDataFromFile(self: liblgraph_client_python.client, conf_file: str, delimiter: str, continue_on_error: bool, thread_nums: int, skip_packages: int, graph: str, json_format: bool, timeout: float) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"ImportDataFromFile(std::string& result, const std::string& conf_file, const std::string& delimiter, bool continue_on_error, int thread_nums, int skip_packages, const std::string& graph, bool json_format, double timeout)"})]})]})]}),"\n",(0,r.jsx)(t.p,{children:"The use of Python RPC Client is more complicated. Users can compile TuGraph in the local environment to get liblgraph_client_python.so, or they can use the official runtime image. The dependent library can be found directly in the /usr/local/lib64 directory in the image. It can be used after introducing the user project."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:"import liblgraph_client_python\n"})}),"\n",(0,r.jsx)(t.h3,{id:"31instantiate-the-client-object",children:"3.1.Instantiate the client object"}),"\n",(0,r.jsx)(t.h4,{id:"311instantiate-a-single-node-client-object",children:"3.1.1.Instantiate a single node client object"}),"\n",(0,r.jsx)(t.p,{children:"When starting the server in single-node mode, the client is instantiated in the following format"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'client = liblgraph_client_python.client("127.0.0.1:19099", "admin", "73@TuGraph")\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"client(self: liblgraph_client_python.client, url: str, user: str, password: str)\n"})}),"\n",(0,r.jsx)(t.h4,{id:"312instantiate-the-ha-cluster-to-directly-connect-to-the-client-object",children:"3.1.2.Instantiate the HA cluster to directly connect to the client object"}),"\n",(0,r.jsx)(t.p,{children:"When the HA cluster deployed on the server can be directly connected using the URL configured in ha_conf, the client is instantiated according to the following format"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'client = liblgraph_client_python.client("127.0.0.1:19099", "admin", "73@TuGraph")\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"client(self: liblgraph_client_python.client, url: str, user: str, password: str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"The user only needs to pass in the url of any node in the HA cluster, and the client will automatically maintain the connection pool based on the query information returned by the server, and there is no need to manually restart the client when the HA cluster expands horizontally."}),"\n",(0,r.jsx)(t.h4,{id:"313instantiate-the-ha-cluster-to-indirectly-connect-to-the-client-object",children:"3.1.3.Instantiate the HA cluster to indirectly connect to the client object"}),"\n",(0,r.jsx)(t.p,{children:"When the HA cluster deployed on the server cannot use the URL configured in ha_conf to connect directly but must use an indirect URL (such as the Alibaba Cloud public network URL), the client is instantiated according to the following format."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'client = liblgraph_client_python.client(["189.33.97.23:9091","189.33.97.24:9091", "189.33.97.25:9091"], "admin", "73@TuGraph")\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"client(self: liblgraph_client_python.client, urls: list, user: str, password: str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"Because the URL that the user connects to is different from the information configured when the server starts, the client connection pool cannot be automatically updated by sending a request to the cluster, so it is necessary to manually pass in the URLs of all nodes in the cluster when starting the client, and when the cluster node changes Manually restart the client."}),"\n",(0,r.jsx)(t.h3,{id:"32call-cypher",children:"3.2.Call cypher"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.callCypher("CALL db.edgeLabels()", "default", 10)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"callCypher(self: liblgraph_client_python.client, cypher: str, graph: str, json_format: bool, timeout: float, url: str) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"33send-cypher-request-to-leader",children:"3.3.Send cypher request to leader"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.callCypherToLeader("CALL db.edgeLabels()", "default", 10)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"callCypherToLeader(self: liblgraph_client_python.client, cypher: str, graph: str, json_format: bool, timeout: float) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface only supports use in HA mode. In the client in HA mode, in order to prevent requests from being sent to followers with unsynchronized data,\nUsers can directly send requests to the leader, and the leader is elected by the cluster."}),"\n",(0,r.jsx)(t.h3,{id:"34call-gql",children:"3.4.Call GQL"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.callGql("CALL db.edgeLabels()", "default", 10)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"callGql(self: liblgraph_client_python.client, gql: str, graph: str, json_format: bool, timeout: float, url: str) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"35send-gql-request-to-leader",children:"3.5.Send GQL request to leader"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.callGqlToLeader("CALL db.edgeLabels()", "default", 10)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"callGqlToLeader(self: liblgraph_client_python.client, gql: str, graph: str, json_format: bool, timeout: float) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface only supports use in HA mode. In the client in HA mode, in order to prevent requests from being sent to followers with unsynchronized data,\nUsers can directly send requests to the leader, and the leader is elected by the cluster."}),"\n",(0,r.jsx)(t.h3,{id:"36calling-stored-procedures",children:"3.6.Calling stored procedures"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.callProcedure("CPP", "test_plugin1", "bcefg", 1000, False, "default")\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"callProcedure(self: liblgraph_client_python.client, procedure_type: str, procedure_name: str, param: str, procedure_time_out: float, in_process: bool, graph: str, json_format: bool, url: str) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. By default, the execution result of the stored procedure is directly returned in string format. Specifying jsonFormat as true can return the execution result in json format.\nAmong them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"37call-the-stored-procedure-to-the-leader",children:"3.7.Call the stored procedure to the leader"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.callProcedureToLeader("CPP", "khop", kHopParamGen(), 1000, false, "default")\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"callProcedureToLeader(self: liblgraph_client_python.client, procedure_type: str, procedure_name: str, param: str, procedure_time_out: float, in_process: bool, graph: str, json_format: bool) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in HA mode. By default, the execution result of the stored procedure is directly returned in string format. Specifying jsonFormat as true can return the execution result in json format."}),"\n",(0,r.jsx)(t.h3,{id:"38load-stored-procedure",children:"3.8.Load stored procedure"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.loadProcedure("./test/procedure/khop.so", "CPP", "khop", "SO", "test loadprocedure", true, "v1", "default");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"loadProcedure(self: liblgraph_client_python.client, source_file: str, procedure_type: str, procedure_name: str, code_type: str, procedure_description: str, read_only: bool, version: str, graph: str) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since loading a stored procedure is a write request, the client in HA mode can only send a request to load a stored procedure to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"39list-stored-procedures",children:"3.9.List stored procedures"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.listProcedures("CPP", "any", "default")\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"listProcedures(self: liblgraph_client_python.client, procedure_type: str, version: str, graph: str, url: str) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"310delete-stored-procedures",children:"3.10.Delete stored procedures"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.deleteProcedure("CPP", "sortstr", "default")\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"deleteProcedure(self: liblgraph_client_python.client, procedure_type: str, procedure_name: str, graph: str) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since deleting a stored procedure is a write request, the client in HA mode can only send a delete request to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"311import-schema-from-byte-stream",children:"3.11.Import schema from byte stream"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.importSchemaFromContent(schema, "default", 1000)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"importSchemaFromContent(self: liblgraph_client_python.client, schema: str, graph: str, json_format: bool, timeout: float) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing schema is a write request, the client in HA mode can only send an import schema request to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"312import-edge-data-from-byte-stream",children:"3.12.Import edge data from byte stream"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.importDataFromContent(personDesc, person, ",", true, 16, "default", 1000)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"importDataFromContent(self: liblgraph_client_python.client, desc: str, data: str, delimiter: str, continue_on_error: bool, thread_nums: int, graph: str, json_format: bool, timeout: float) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing point and edge data is a write request, the client in HA mode can only send a request to import point and edge data to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"313import-schema-from-file",children:"3.13.Import schema from file"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.importSchemaFromFile("./test/data/yago.conf", "default", 1000)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"importSchemaFromFile(self: liblgraph_client_python.client, schema_file: str, graph: str, json_format: bool, timeout: float) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing schema is a write request, the client in HA mode can only send an import schema request to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"314import-point-and-edge-data-from-file",children:"3.14.Import point and edge data from file"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.importDataFromFile("./test/data/yago.conf", ",", true, 16, 0, "default", 1000000000)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"importDataFromFile(self: liblgraph_client_python.client, conf_file: str, delimiter: str, continue_on_error: bool, thread_nums: int, skip_packages: int, graph: str, json_format: bool, timeout: float) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing point and edge data is a write request, the client in HA mode can only send a request to import point and edge data to the leader."})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>i});var r=n(6540);const s={},l=r.createContext(s);function o(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3213],{8528:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>i,toc:()=>d});var r=n(4848),s=n(8453);const l={},o="TuGraph Python SDK",i={id:"client-tools/python-client",title:"TuGraph Python SDK",description:"This document is the usage instruction of TuGraph Python SDK",source:"@site/../docs/en-US/source/7.client-tools/1.python-client.md",sourceDirName:"7.client-tools",slug:"/client-tools/python-client",permalink:"/tugraph-db/en/client-tools/python-client",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Explorer",permalink:"/tugraph-db/en/utility-tools/tugraph-explorer"},next:{title:"TuGraph C++ SDK",permalink:"/tugraph-db/en/client-tools/cpp-client"}},c={},d=[{value:"1.Overview",id:"1overview",level:2},{value:"2.RESTful Client",id:"2restful-client",level:2},{value:"2.1. Install Client",id:"21-install-client",level:3},{value:"2.2.Call cypher",id:"22call-cypher",level:3},{value:"2.3.Call stored procedure",id:"23call-stored-procedure",level:3},{value:"3.RPC Client",id:"3rpc-client",level:2},{value:"3.1.Instantiate the client object",id:"31instantiate-the-client-object",level:3},{value:"3.1.1.Instantiate a single node client object",id:"311instantiate-a-single-node-client-object",level:4},{value:"3.1.2.Instantiate the HA cluster to directly connect to the client object",id:"312instantiate-the-ha-cluster-to-directly-connect-to-the-client-object",level:4},{value:"3.1.3.Instantiate the HA cluster to indirectly connect to the client object",id:"313instantiate-the-ha-cluster-to-indirectly-connect-to-the-client-object",level:4},{value:"3.2.Call cypher",id:"32call-cypher",level:3},{value:"3.3.Send cypher request to leader",id:"33send-cypher-request-to-leader",level:3},{value:"3.4.Call GQL",id:"34call-gql",level:3},{value:"3.5.Send GQL request to leader",id:"35send-gql-request-to-leader",level:3},{value:"3.6.Calling stored procedures",id:"36calling-stored-procedures",level:3},{value:"3.7.Call the stored procedure to the leader",id:"37call-the-stored-procedure-to-the-leader",level:3},{value:"3.8.Load stored procedure",id:"38load-stored-procedure",level:3},{value:"3.9.List stored procedures",id:"39list-stored-procedures",level:3},{value:"3.10.Delete stored procedures",id:"310delete-stored-procedures",level:3},{value:"3.11.Import schema from byte stream",id:"311import-schema-from-byte-stream",level:3},{value:"3.12.Import edge data from byte stream",id:"312import-edge-data-from-byte-stream",level:3},{value:"3.13.Import schema from file",id:"313import-schema-from-file",level:3},{value:"3.14.Import point and edge data from file",id:"314import-point-and-edge-data-from-file",level:3}];function a(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"tugraph-python-sdk",children:"TuGraph Python SDK"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"This document is the usage instruction of TuGraph Python SDK"}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"1overview",children:"1.Overview"}),"\n",(0,r.jsx)(t.p,{children:"There are two kinds of Python's TuGraph Client. One is the RESTful Client, which uses the HTTP method to send requests to the server. The other is the RPC Client, which uses the RPC method to call the server remote service. Both have their own advantages and disadvantages. The RESTful client is simple to use. You can find the source code file of the Client in the src/client/python/TuGraphClient directory of the project. You can install it directly into the user environment and use it. However, it supports fewer functions and its performance is not high. RPC Client supports both stand-alone servers and high-availability clusters and load balancing. It has many interfaces and powerful functions. However, the usage is more complicated. Users need to compile the TuGraph project themselves to obtain liblgraph_client_python.so, or directly find the dependent library in the /usr/local/lib64 directory when using the runtime image, and introduce it into the python project for normal use. Next, the usage of these two Clients will be introduced in detail."}),"\n",(0,r.jsx)(t.h2,{id:"2restful-client",children:"2.RESTful Client"}),"\n",(0,r.jsx)(t.h3,{id:"21-install-client",children:"2.1. Install Client"}),"\n",(0,r.jsx)(t.p,{children:"TuGraph's Python RESTful client uses the setuptools tool for packaging and distribution. Users can install the client directly into the local environment and introduce it directly when using it."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-shell",children:"cd src/client/python/TuGraphClient\npython3 setup.py build\npython3 setup.py install\n"})}),"\n",(0,r.jsx)(t.p,{children:"Note: When using the setuptools tool to install the python client, dependencies such as httpx will be installed and need to be executed in an environment with external network access."}),"\n",(0,r.jsx)(t.h3,{id:"22call-cypher",children:"2.2.Call cypher"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'from TuGraphClient import TuGraphClient, AsyncTuGraphClient\n\nclient = TuGraphClient("127.0.0.1:7071" , "admin", "73@TuGraph")\ncypher = "match (n) return properties(n) limit 1"\nres = client.call_cypher(cypher)\nprint(res)\n'})}),"\n",(0,r.jsx)(t.h3,{id:"23call-stored-procedure",children:"2.3.Call stored procedure"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'from TuGraphClient import TuGraphClient, AsyncTuGraphClient\n\nclient = TuGraphClient("127.0.0.1:7071" , "admin", "73@TuGraph")\nplugin_type = "cpp"\nplugin_name = "khop"\nplugin_input = "{\\"root\\": 10, \\"hop\\": 3}"\nres = client.call_plugin(plugin_type, plguin_name, plugin_input)\nprint(res)\n'})}),"\n",(0,r.jsx)(t.h2,{id:"3rpc-client",children:"3.RPC Client"}),"\n",(0,r.jsx)(t.p,{children:"Python's TuGraph Rpc Client is a CPP Client SDK packaged using pybind11. The following table lists the correspondence between Python and CPP Client SDK."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Python Client SDK"}),(0,r.jsx)(t.th,{children:"CPP Client SDK"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"client(self: liblgraph_client_python.client, url: str, user: str, password: str)"}),(0,r.jsx)(t.td,{children:"RpcClient(const std::string& url, const std::string& user, const std::string& password)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"client(self: liblgraph_client_python.client, urls: list, user: str, password: str)"}),(0,r.jsxs)(t.td,{children:["RpcClient(std::vector",(0,r.jsx)(t.a,{href:"std::string",children:"std::string"}),"& urls, std::string user, std::string password)"]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"callCypher(self: liblgraph_client_python.client, cypher: str, graph: str, json_format: bool, timeout: float, url: str) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool CallCypher(std::string& result, const std::string& cypher, const std::string& graph, bool json_format, double timeout, const std::string& url)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"callCypherToLeader(self: liblgraph_client_python.client, cypher: str, graph: str, json_format: bool, timeout: float) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool CallCypherToLeader(std::string& result, const std::string& cypher, const std::string& graph, bool json_format, double timeout)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"callGql(self: liblgraph_client_python.client, gql: str, graph: str, json_format: bool, timeout: float, url: str) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool CallGql(std::string& result, const std::string& gql, const std::string& graph, bool json_format, double timeout, const std::string& url)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"callGqlToLeader(self: liblgraph_client_python.client, gql: str, graph: str, json_format: bool, timeout: float) -> (bool, str)"}),(0,r.jsx)(t.td,{children:'bool CallGqlToLeader(std::string& result, const std::string& gql, const std::string& graph = "default", bool json_format = true, double timeout = 0)'})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"callProcedure(self: liblgraph_client_python.client, procedure_type: str, procedure_name: str, param: str, procedure_time_out: float, in_process: bool, graph: str, json_format: bool, url: str) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool CallProcedure(std::string& result, const std::string& procedure_type, const std::string& procedure_name, const std::string& param, double procedure_time_out, bool in_process, const std::string& graph, bool json_format, const std::string& url)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"callProcedureToLeader(self: liblgraph_client_python.client, procedure_type: str, procedure_name: str, param: str, procedure_time_out: float, in_process: bool, graph: str, json_format: bool) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"CallProcedureToLeader(std::string& result, const std::string& procedure_type, const std::string& procedure_name, const std::string& param, double procedure_time_out, bool in_process, const std::string& graph, bool json_format)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"loadProcedure(self: liblgraph_client_python.client, source_file: str, procedure_type: str, procedure_name: str, code_type: str, procedure_description: str, read_only: bool, version: str, graph: str) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool LoadProcedure(std::string& result, const std::string& source_file, const std::string& procedure_type, const std::string& procedure_name, const std::string& code_type, const std::string& procedure_description, bool read_only, const std::string& version, const std::string& graph)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"listProcedures(self: liblgraph_client_python.client, procedure_type: str, version: str, graph: str, url: str) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool ListProcedures(std::string& result, const std::string& procedure_type, const std::string& version, const std::string& graph, const std::string& url)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"deleteProcedure(self: liblgraph_client_python.client, procedure_type: str, procedure_name: str, graph: str) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool DeleteProcedure(std::string& result, const std::string& procedure_type, const std::string& procedure_name, const std::string& graph)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"importSchemaFromContent(self: liblgraph_client_python.client, schema: str, graph: str, json_format: bool, timeout: float) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"bool ImportSchemaFromContent(std::string& result, const std::string& schema, const std::string& graph, bool json_format, double timeout)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"importDataFromContent(self: liblgraph_client_python.client, desc: str, data: str, delimiter: str, continue_on_error: bool, thread_nums: int, graph: str, json_format: bool, timeout: float) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"ImportDataFromContent(std::string& result, const std::string& desc, const std::string& data, const std::string& delimiter, bool continue_on_error, int thread_nums, const std::string& graph, bool json_format, double timeout)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"importSchemaFromFile(self: liblgraph_client_python.client, schema_file: str, graph: str, json_format: bool, timeout: float) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"ImportSchemaFromFile(std::string& result, const std::string& schema_file, const std::string& graph, bool json_format, double timeout)"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"importDataFromFile(self: liblgraph_client_python.client, conf_file: str, delimiter: str, continue_on_error: bool, thread_nums: int, skip_packages: int, graph: str, json_format: bool, timeout: float) -> (bool, str)"}),(0,r.jsx)(t.td,{children:"ImportDataFromFile(std::string& result, const std::string& conf_file, const std::string& delimiter, bool continue_on_error, int thread_nums, int skip_packages, const std::string& graph, bool json_format, double timeout)"})]})]})]}),"\n",(0,r.jsx)(t.p,{children:"The use of Python RPC Client is more complicated. Users can compile TuGraph in the local environment to get liblgraph_client_python.so, or they can use the official runtime image. The dependent library can be found directly in the /usr/local/lib64 directory in the image. It can be used after introducing the user project."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:"import liblgraph_client_python\n"})}),"\n",(0,r.jsx)(t.h3,{id:"31instantiate-the-client-object",children:"3.1.Instantiate the client object"}),"\n",(0,r.jsx)(t.h4,{id:"311instantiate-a-single-node-client-object",children:"3.1.1.Instantiate a single node client object"}),"\n",(0,r.jsx)(t.p,{children:"When starting the server in single-node mode, the client is instantiated in the following format"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'client = liblgraph_client_python.client("127.0.0.1:19099", "admin", "73@TuGraph")\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"client(self: liblgraph_client_python.client, url: str, user: str, password: str)\n"})}),"\n",(0,r.jsx)(t.h4,{id:"312instantiate-the-ha-cluster-to-directly-connect-to-the-client-object",children:"3.1.2.Instantiate the HA cluster to directly connect to the client object"}),"\n",(0,r.jsx)(t.p,{children:"When the HA cluster deployed on the server can be directly connected using the URL configured in ha_conf, the client is instantiated according to the following format"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'client = liblgraph_client_python.client("127.0.0.1:19099", "admin", "73@TuGraph")\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"client(self: liblgraph_client_python.client, url: str, user: str, password: str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"The user only needs to pass in the url of any node in the HA cluster, and the client will automatically maintain the connection pool based on the query information returned by the server, and there is no need to manually restart the client when the HA cluster expands horizontally."}),"\n",(0,r.jsx)(t.h4,{id:"313instantiate-the-ha-cluster-to-indirectly-connect-to-the-client-object",children:"3.1.3.Instantiate the HA cluster to indirectly connect to the client object"}),"\n",(0,r.jsx)(t.p,{children:"When the HA cluster deployed on the server cannot use the URL configured in ha_conf to connect directly but must use an indirect URL (such as the Alibaba Cloud public network URL), the client is instantiated according to the following format."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'client = liblgraph_client_python.client(["189.33.97.23:9091","189.33.97.24:9091", "189.33.97.25:9091"], "admin", "73@TuGraph")\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"client(self: liblgraph_client_python.client, urls: list, user: str, password: str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"Because the URL that the user connects to is different from the information configured when the server starts, the client connection pool cannot be automatically updated by sending a request to the cluster, so it is necessary to manually pass in the URLs of all nodes in the cluster when starting the client, and when the cluster node changes Manually restart the client."}),"\n",(0,r.jsx)(t.h3,{id:"32call-cypher",children:"3.2.Call cypher"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.callCypher("CALL db.edgeLabels()", "default", 10)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"callCypher(self: liblgraph_client_python.client, cypher: str, graph: str, json_format: bool, timeout: float, url: str) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"33send-cypher-request-to-leader",children:"3.3.Send cypher request to leader"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.callCypherToLeader("CALL db.edgeLabels()", "default", 10)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"callCypherToLeader(self: liblgraph_client_python.client, cypher: str, graph: str, json_format: bool, timeout: float) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface only supports use in HA mode. In the client in HA mode, in order to prevent requests from being sent to followers with unsynchronized data,\nUsers can directly send requests to the leader, and the leader is elected by the cluster."}),"\n",(0,r.jsx)(t.h3,{id:"34call-gql",children:"3.4.Call GQL"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.callGql("CALL db.edgeLabels()", "default", 10)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"callGql(self: liblgraph_client_python.client, gql: str, graph: str, json_format: bool, timeout: float, url: str) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"35send-gql-request-to-leader",children:"3.5.Send GQL request to leader"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.callGqlToLeader("CALL db.edgeLabels()", "default", 10)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"callGqlToLeader(self: liblgraph_client_python.client, gql: str, graph: str, json_format: bool, timeout: float) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface only supports use in HA mode. In the client in HA mode, in order to prevent requests from being sent to followers with unsynchronized data,\nUsers can directly send requests to the leader, and the leader is elected by the cluster."}),"\n",(0,r.jsx)(t.h3,{id:"36calling-stored-procedures",children:"3.6.Calling stored procedures"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.callProcedure("CPP", "test_plugin1", "bcefg", 1000, False, "default")\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"callProcedure(self: liblgraph_client_python.client, procedure_type: str, procedure_name: str, param: str, procedure_time_out: float, in_process: bool, graph: str, json_format: bool, url: str) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. By default, the execution result of the stored procedure is directly returned in string format. Specifying jsonFormat as true can return the execution result in json format.\nAmong them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"37call-the-stored-procedure-to-the-leader",children:"3.7.Call the stored procedure to the leader"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.callProcedureToLeader("CPP", "khop", kHopParamGen(), 1000, false, "default")\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"callProcedureToLeader(self: liblgraph_client_python.client, procedure_type: str, procedure_name: str, param: str, procedure_time_out: float, in_process: bool, graph: str, json_format: bool) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in HA mode. By default, the execution result of the stored procedure is directly returned in string format. Specifying jsonFormat as true can return the execution result in json format."}),"\n",(0,r.jsx)(t.h3,{id:"38load-stored-procedure",children:"3.8.Load stored procedure"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.loadProcedure("./test/procedure/khop.so", "CPP", "khop", "SO", "test loadprocedure", true, "v1", "default");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"loadProcedure(self: liblgraph_client_python.client, source_file: str, procedure_type: str, procedure_name: str, code_type: str, procedure_description: str, read_only: bool, version: str, graph: str) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since loading a stored procedure is a write request, the client in HA mode can only send a request to load a stored procedure to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"39list-stored-procedures",children:"3.9.List stored procedures"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.listProcedures("CPP", "any", "default")\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"listProcedures(self: liblgraph_client_python.client, procedure_type: str, version: str, graph: str, url: str) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"310delete-stored-procedures",children:"3.10.Delete stored procedures"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.deleteProcedure("CPP", "sortstr", "default")\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"deleteProcedure(self: liblgraph_client_python.client, procedure_type: str, procedure_name: str, graph: str) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since deleting a stored procedure is a write request, the client in HA mode can only send a delete request to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"311import-schema-from-byte-stream",children:"3.11.Import schema from byte stream"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.importSchemaFromContent(schema, "default", 1000)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"importSchemaFromContent(self: liblgraph_client_python.client, schema: str, graph: str, json_format: bool, timeout: float) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing schema is a write request, the client in HA mode can only send an import schema request to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"312import-edge-data-from-byte-stream",children:"3.12.Import edge data from byte stream"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.importDataFromContent(personDesc, person, ",", true, 16, "default", 1000)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"importDataFromContent(self: liblgraph_client_python.client, desc: str, data: str, delimiter: str, continue_on_error: bool, thread_nums: int, graph: str, json_format: bool, timeout: float) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing point and edge data is a write request, the client in HA mode can only send a request to import point and edge data to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"313import-schema-from-file",children:"3.13.Import schema from file"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.importSchemaFromFile("./test/data/yago.conf", "default", 1000)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"importSchemaFromFile(self: liblgraph_client_python.client, schema_file: str, graph: str, json_format: bool, timeout: float) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing schema is a write request, the client in HA mode can only send an import schema request to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"314import-point-and-edge-data-from-file",children:"3.14.Import point and edge data from file"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-python",children:'ret, res = client.importDataFromFile("./test/data/yago.conf", ",", true, 16, 0, "default", 1000000000)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"importDataFromFile(self: liblgraph_client_python.client, conf_file: str, delimiter: str, continue_on_error: bool, thread_nums: int, skip_packages: int, graph: str, json_format: bool, timeout: float) -> (bool, str)\n"})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing point and edge data is a write request, the client in HA mode can only send a request to import point and edge data to the leader."})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>i});var r=n(6540);const s={},l=r.createContext(s);function o(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/37536724.ea29d1e3.js b/assets/js/37536724.b0b07329.js similarity index 98% rename from assets/js/37536724.ea29d1e3.js rename to assets/js/37536724.b0b07329.js index a555d05460..3e4b5cd599 100644 --- a/assets/js/37536724.ea29d1e3.js +++ b/assets/js/37536724.b0b07329.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8206],{1653:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var t=i(4848),a=i(8453);const r={},o="What is TuGraph",s={id:"introduction/what-is-tugraph",title:"What is TuGraph",description:"This document mainly introduces the main features and characteristics of TuGraph Community Edition, as well as the differences between TuGraph Enterprise Edition and Community Edition.",source:"@site/../docs/en-US/source/2.introduction/3.what-is-tugraph.md",sourceDirName:"2.introduction",slug:"/introduction/what-is-tugraph",permalink:"/tugraph-db/en/introduction/what-is-tugraph",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"What is a graph database",permalink:"/tugraph-db/en/introduction/what-is-gdbms"},next:{title:"TuGraph schema Instructions",permalink:"/tugraph-db/en/introduction/schema"}},l={},c=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.TuGraph Community Edition",id:"2tugraph-community-edition",level:2},{value:"3.TuGraph features",id:"3tugraph-features",level:2},{value:"4.TuGraph Enterprise Edition",id:"4tugraph-enterprise-edition",level:2}];function d(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"what-is-tugraph",children:"What is TuGraph"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document mainly introduces the main features and characteristics of TuGraph Community Edition, as well as the differences between TuGraph Enterprise Edition and Community Edition."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,t.jsx)(n.p,{children:"Graph database is a non-relational database that stores data by vertices and edges. It can be used to store complex data network models, such as social networks and transaction networks. TuGraph is a graph database developed by Ant Group. This manual introduces the functions and usage of TuGraph."}),"\n",(0,t.jsx)(n.h2,{id:"2tugraph-community-edition",children:"2.TuGraph Community Edition"}),"\n",(0,t.jsx)(n.p,{children:"The Community Edition is a fully functional version of TuGraph, suitable for single-instance deployment. It provides complete basic fuctions of graph database, such as ACID-compatible transactions, programming APIs, and associated tools. It is ideal for learning TuGraph and implementing small projects."}),"\n",(0,t.jsx)(n.h2,{id:"3tugraph-features",children:"3.TuGraph features"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph is a large-scale graph computing system independently developed by Ant Group, providing graph database engine and graph analysis engine. Its main features are large data storage and computation, high throughput, and flexible API, while supporting efficient online transaction processing (OLTP) and online analytical processing (OLAP). LightGraph and GeaGraph are former names of TuGraph."}),"\n",(0,t.jsx)(n.p,{children:"The main functional features include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Labeled property graph model"}),"\n",(0,t.jsx)(n.li,{children:"Support multiple Graphs"}),"\n",(0,t.jsx)(n.li,{children:"Full ACID transaction processing"}),"\n",(0,t.jsx)(n.li,{children:"Built-in 34 graph analysis algorithm"}),"\n",(0,t.jsx)(n.li,{children:"Graph visualization tool based on Web client"}),"\n",(0,t.jsx)(n.li,{children:"RESTful API and RPC are supported"}),"\n",(0,t.jsx)(n.li,{children:"OpenCypher graph query language"}),"\n",(0,t.jsx)(n.li,{children:"Stored procedure based on C++/Python/Java"}),"\n",(0,t.jsx)(n.li,{children:"The Traversal API for efficient graph algorithm development"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Performance and scalability features include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"TB large capacity"}),"\n",(0,t.jsx)(n.li,{children:"High throughput of ten million vertices per second"}),"\n",(0,t.jsx)(n.li,{children:"High Availability Support (Enterprise Edition)"}),"\n",(0,t.jsx)(n.li,{children:"High-performance Batch Import"}),"\n",(0,t.jsx)(n.li,{children:"Online/offline backup"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"4tugraph-enterprise-edition",children:"4.TuGraph Enterprise Edition"}),"\n",(0,t.jsx)(n.p,{children:"The Enterprise Edition has more comprehensive support for commercial features, including distributed cluster architecture, a one-stop graph platform covering exploration, research and development, service and operation and maintenance throughout the lifecycle, online, near-line, and offline graph computing engines, support for streaming and big data data sources, multi-site and multi-center deployment, making it an ideal choice for commercial solutions."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:" If you need to implement production-level high-availability cluster architecture, operation and maintenance and other enterprise-level services, please contact us to obtain commercial support:\n Email:tugraph@service.alipay.com\n Tel:0571-85022088,extension number 83789993#\n"})})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>s});var t=i(6540);const a={},r=t.createContext(a);function o(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8206],{1653:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>c});var t=i(4848),a=i(8453);const r={},o="What is TuGraph",s={id:"introduction/what-is-tugraph",title:"What is TuGraph",description:"This document mainly introduces the main features and characteristics of TuGraph Community Edition, as well as the differences between TuGraph Enterprise Edition and Community Edition.",source:"@site/../docs/en-US/source/2.introduction/3.what-is-tugraph.md",sourceDirName:"2.introduction",slug:"/introduction/what-is-tugraph",permalink:"/tugraph-db/en/introduction/what-is-tugraph",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"What is a graph database",permalink:"/tugraph-db/en/introduction/what-is-gdbms"},next:{title:"TuGraph schema Instructions",permalink:"/tugraph-db/en/introduction/schema"}},l={},c=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.TuGraph Community Edition",id:"2tugraph-community-edition",level:2},{value:"3.TuGraph features",id:"3tugraph-features",level:2},{value:"4.TuGraph Enterprise Edition",id:"4tugraph-enterprise-edition",level:2}];function d(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"what-is-tugraph",children:"What is TuGraph"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document mainly introduces the main features and characteristics of TuGraph Community Edition, as well as the differences between TuGraph Enterprise Edition and Community Edition."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,t.jsx)(n.p,{children:"Graph database is a non-relational database that stores data by vertices and edges. It can be used to store complex data network models, such as social networks and transaction networks. TuGraph is a graph database developed by Ant Group. This manual introduces the functions and usage of TuGraph."}),"\n",(0,t.jsx)(n.h2,{id:"2tugraph-community-edition",children:"2.TuGraph Community Edition"}),"\n",(0,t.jsx)(n.p,{children:"The Community Edition is a fully functional version of TuGraph, suitable for single-instance deployment. It provides complete basic fuctions of graph database, such as ACID-compatible transactions, programming APIs, and associated tools. It is ideal for learning TuGraph and implementing small projects."}),"\n",(0,t.jsx)(n.h2,{id:"3tugraph-features",children:"3.TuGraph features"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph is a large-scale graph computing system independently developed by Ant Group, providing graph database engine and graph analysis engine. Its main features are large data storage and computation, high throughput, and flexible API, while supporting efficient online transaction processing (OLTP) and online analytical processing (OLAP). LightGraph and GeaGraph are former names of TuGraph."}),"\n",(0,t.jsx)(n.p,{children:"The main functional features include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Labeled property graph model"}),"\n",(0,t.jsx)(n.li,{children:"Support multiple Graphs"}),"\n",(0,t.jsx)(n.li,{children:"Full ACID transaction processing"}),"\n",(0,t.jsx)(n.li,{children:"Built-in 34 graph analysis algorithm"}),"\n",(0,t.jsx)(n.li,{children:"Graph visualization tool based on Web client"}),"\n",(0,t.jsx)(n.li,{children:"RESTful API and RPC are supported"}),"\n",(0,t.jsx)(n.li,{children:"OpenCypher graph query language"}),"\n",(0,t.jsx)(n.li,{children:"Stored procedure based on C++/Python/Java"}),"\n",(0,t.jsx)(n.li,{children:"The Traversal API for efficient graph algorithm development"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Performance and scalability features include:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"TB large capacity"}),"\n",(0,t.jsx)(n.li,{children:"High throughput of ten million vertices per second"}),"\n",(0,t.jsx)(n.li,{children:"High Availability Support (Enterprise Edition)"}),"\n",(0,t.jsx)(n.li,{children:"High-performance Batch Import"}),"\n",(0,t.jsx)(n.li,{children:"Online/offline backup"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"4tugraph-enterprise-edition",children:"4.TuGraph Enterprise Edition"}),"\n",(0,t.jsx)(n.p,{children:"The Enterprise Edition has more comprehensive support for commercial features, including distributed cluster architecture, a one-stop graph platform covering exploration, research and development, service and operation and maintenance throughout the lifecycle, online, near-line, and offline graph computing engines, support for streaming and big data data sources, multi-site and multi-center deployment, making it an ideal choice for commercial solutions."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:" If you need to implement production-level high-availability cluster architecture, operation and maintenance and other enterprise-level services, please contact us to obtain commercial support:\n Email:tugraph@service.alipay.com\n Tel:0571-85022088,extension number 83789993#\n"})})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>s});var t=i(6540);const a={},r=t.createContext(a);function o(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/37590f4c.dffbc72f.js b/assets/js/37590f4c.a0703510.js similarity index 99% rename from assets/js/37590f4c.dffbc72f.js rename to assets/js/37590f4c.a0703510.js index d5e2f6640f..8dc8e0bb2b 100644 --- a/assets/js/37590f4c.dffbc72f.js +++ b/assets/js/37590f4c.a0703510.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8478],{1549:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var r=a(4848),n=a(8453);const i={},o="Performance Oriented",s={id:"introduction/characteristics/performance-oriented",title:"Performance Oriented",description:"This document mainly introduces TuGraph's performance-oriented design philosophy as an open-source graph database.",source:"@site/../docs/en-US/source/2.introduction/5.characteristics/1.performance-oriented.md",sourceDirName:"2.introduction/5.characteristics",slug:"/introduction/characteristics/performance-oriented",permalink:"/tugraph-db/en/introduction/characteristics/performance-oriented",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph schema Instructions",permalink:"/tugraph-db/en/introduction/schema"},next:{title:"Multi Level Interfaces",permalink:"/tugraph-db/en/introduction/characteristics/multi-level-Interfaces"}},c={},d=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Characteristics of Graph Operations",id:"2characteristics-of-graph-operations",level:2},{value:"3.Storage Data Structures",id:"3storage-data-structures",level:2},{value:"4.Data Encoding",id:"4data-encoding",level:2}];function h(e){const t={blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"performance-oriented",children:"Performance Oriented"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"This document mainly introduces TuGraph's performance-oriented design philosophy as an open-source graph database."}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,r.jsx)(t.p,{children:"TuGraph is currently the fastest graph database in the world, ranking first in the LDBC SNB Interactive graph database standard evaluation (March 2023). The design of TuGraph is based on performance optimization, and is committed to building a high-performance single-machine graph database. This document describes the core design of TuGraph's storage layer based on performance optimization."}),"\n",(0,r.jsx)(t.h2,{id:"2characteristics-of-graph-operations",children:"2.Characteristics of Graph Operations"}),"\n",(0,r.jsx)(t.p,{children:"Operations on property graphs involve reading, writing, and their attributes, and the access patterns of some special attributes such as timestamps can also affect overall performance. Here, by summarizing the regularities of some graph operation characteristics, we can guide the final performance."}),"\n",(0,r.jsx)(t.p,{children:"We observe that many graph applications have similar data access patterns. For example, in credit risk control, we use recursive path filtering to search for many-to-one patterns to find suspicious credit fraud users and behaviors. For online gambling, we can identify gambling-related fund accounts by recognizing multiple fund transfers in a short period of time. The equity penetration scenario recursively calculates the equity relationship between entities. These scenarios have common patterns such as multi-hop entity and relationship access, time window constraints, and read/write transactions.\nFurthermore, from the discussion in the introduction and the analysis of graph workloads, the following characteristics can be summarized:"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Characteristic 1"})," KHop is the most typical operation in a graph, based on the data access pattern of the graph topology of points and edges, and has essential differences from relational databases. The typicality of KHop is not only reflected in the different data access patterns, but it is also the performance point that graph databases need to pay attention to the most."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Characteristic 2"})," Data access of graph workloads has a certain degree of locality on the topology, and the edges of the same point are usually accessed simultaneously. When the labels of these edges are the same, there is a greater probability of simultaneous access."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Characteristic 3"})," When accessing points and edges in graph workloads, their corresponding attributes are usually accessed as a traversal filter condition."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Characteristic 4"})," In time-based graph workloads, filtering of points and edges is usually within a certain time range, such as the past week."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Characteristic 5"})," Write operations may be accompanied by a large number of read operations, which need to be processed in a single transaction cycle."]}),"\n",(0,r.jsx)(t.p,{children:"Through the analysis of actual online graph applications, the read/write ratio of graph workloads is about 20:1, although the scenarios are limited to the financial field and the number of clusters is also limited, the scale of the data involved and the number of users are very large, which is representative to some extent. The 20:1 read/write ratio of graph workloads indicates that the impact of read workload on overall performance is greater, and the performance of write workload cannot be ignored either."}),"\n",(0,r.jsx)(t.h2,{id:"3storage-data-structures",children:"3.Storage Data Structures"}),"\n",(0,r.jsx)(t.p,{children:"TuGraph uses B+ trees as the underlying data structure to support real-time transactional operations for insertion, deletion, querying, and updating."}),"\n",(0,r.jsx)(t.p,{children:"In sorting tree data structures, B+ trees and LSM trees are the main representatives. B+ trees use a split and merge method to update sorted data in tree nodes, while LSM trees append updates to logs for delayed data merging. B+ trees were originally used in file system implementations, solving the problem of differences in performance between sequential and random operations on hard disks by storing data in adaptive-length leaf nodes, and have a relatively balanced read/write performance. The main advantage of LSM trees is to use WAL (Write Ahead Log) to perform updates, which turns update operations into sequential operations, especially in the case of small key-value pairs. WAL means that the update of data is deferred until it is merged in batches, which can improve the comprehensive efficiency of batch updates, but also makes the system scheduling more complicated. If the update merge is not completed, and the data is read again, LSM trees need to read several levels of locally merged logs, which will cause read amplification and space amplification, thereby affecting read efficiency."}),"\n",(0,r.jsx)(t.p,{children:"To sum up, B+ trees have better sequential read/write performance, while LSM trees have advantages in random write data. In addition, the way of LSM trees using background merging makes the performance fluctuation difficult to predict, and the correlation between performance fluctuation and upper-level storage and computation is weak, which increases the overall design cost. Considering the above factors, TuGraph chooses B+ trees as the implementation for read performance optimization."}),"\n",(0,r.jsx)(t.h2,{id:"4data-encoding",children:"4.Data Encoding"}),"\n",(0,r.jsx)(t.p,{children:"For property graph models, in addition to graph topology encoding, property data also greatly affects functionality and performance. We first discuss how property data can be encoded together with topology data. From current research, there are two ways of encoding properties: discrete encoding, which stores property data separately based on pointer indexes, and compact encoding, which packs property data and topology data together. Discrete encoding can store each property separately or pack each edge's properties separately, and the following discussion applies to both situations."}),"\n",(0,r.jsx)(t.p,{children:"Vertex Query: Property encoding mainly focuses on edges and does not involve vertex queries."}),"\n",(0,r.jsx)(t.p,{children:"Single-Edge Query: Discrete encoding locates edges through pointers, while compact encoding requires binary search to locate the edge position. Discrete encoding has a slight advantage."}),"\n",(0,r.jsx)(t.p,{children:"Edge Traversal: Discrete encoding requires constant random access through pointer jumps during edge traversal, while compact encoding arranges data together in advance, greatly improving efficiency due to its sequential access feature. Since edge traversal operations are common according to Rule 3, compact encoding has obvious advantages in edge traversal."}),"\n",(0,r.jsx)(t.p,{children:"Single-Edge Update: Discrete encoding only requires finding the corresponding pointer position and modifying the pointer's location before and after inserting data. Compact encoding needs to re-encode the compactly arranged data and rewrite the entire edge value, resulting in significant overhead compared to discrete encoding."}),"\n",(0,r.jsx)(t.p,{children:"Batch Edge Update: Batch updates can pre-build all edge properties for a vertex in memory and write them in one encoding, making both discrete encoding and compact encoding equivalent. However, compact encoding does not require storing pointer variables, so it has higher storage space efficiency."}),"\n",(0,r.jsx)(t.p,{children:"The performance issues of discrete encoding and compact encoding for a certain type of query discussed above can be alleviated through optimization. Overall, due to the 20:1 read-write load of graphs and the characteristics of property access revealed by Rule 3, TuGraph tends to use compact encoding to ensure read performance. Its main weakness is the overhead of re-encoding during single-edge updates, which can be solved using adaptive mapping technology."})]})}function l(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,t,a)=>{a.d(t,{R:()=>o,x:()=>s});var r=a(6540);const n={},i=r.createContext(n);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8478],{1549:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>l,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var r=a(4848),n=a(8453);const i={},o="Performance Oriented",s={id:"introduction/characteristics/performance-oriented",title:"Performance Oriented",description:"This document mainly introduces TuGraph's performance-oriented design philosophy as an open-source graph database.",source:"@site/../docs/en-US/source/2.introduction/5.characteristics/1.performance-oriented.md",sourceDirName:"2.introduction/5.characteristics",slug:"/introduction/characteristics/performance-oriented",permalink:"/tugraph-db/en/introduction/characteristics/performance-oriented",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph schema Instructions",permalink:"/tugraph-db/en/introduction/schema"},next:{title:"Multi Level Interfaces",permalink:"/tugraph-db/en/introduction/characteristics/multi-level-Interfaces"}},c={},d=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Characteristics of Graph Operations",id:"2characteristics-of-graph-operations",level:2},{value:"3.Storage Data Structures",id:"3storage-data-structures",level:2},{value:"4.Data Encoding",id:"4data-encoding",level:2}];function h(e){const t={blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,n.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"performance-oriented",children:"Performance Oriented"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"This document mainly introduces TuGraph's performance-oriented design philosophy as an open-source graph database."}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,r.jsx)(t.p,{children:"TuGraph is currently the fastest graph database in the world, ranking first in the LDBC SNB Interactive graph database standard evaluation (March 2023). The design of TuGraph is based on performance optimization, and is committed to building a high-performance single-machine graph database. This document describes the core design of TuGraph's storage layer based on performance optimization."}),"\n",(0,r.jsx)(t.h2,{id:"2characteristics-of-graph-operations",children:"2.Characteristics of Graph Operations"}),"\n",(0,r.jsx)(t.p,{children:"Operations on property graphs involve reading, writing, and their attributes, and the access patterns of some special attributes such as timestamps can also affect overall performance. Here, by summarizing the regularities of some graph operation characteristics, we can guide the final performance."}),"\n",(0,r.jsx)(t.p,{children:"We observe that many graph applications have similar data access patterns. For example, in credit risk control, we use recursive path filtering to search for many-to-one patterns to find suspicious credit fraud users and behaviors. For online gambling, we can identify gambling-related fund accounts by recognizing multiple fund transfers in a short period of time. The equity penetration scenario recursively calculates the equity relationship between entities. These scenarios have common patterns such as multi-hop entity and relationship access, time window constraints, and read/write transactions.\nFurthermore, from the discussion in the introduction and the analysis of graph workloads, the following characteristics can be summarized:"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Characteristic 1"})," KHop is the most typical operation in a graph, based on the data access pattern of the graph topology of points and edges, and has essential differences from relational databases. The typicality of KHop is not only reflected in the different data access patterns, but it is also the performance point that graph databases need to pay attention to the most."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Characteristic 2"})," Data access of graph workloads has a certain degree of locality on the topology, and the edges of the same point are usually accessed simultaneously. When the labels of these edges are the same, there is a greater probability of simultaneous access."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Characteristic 3"})," When accessing points and edges in graph workloads, their corresponding attributes are usually accessed as a traversal filter condition."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Characteristic 4"})," In time-based graph workloads, filtering of points and edges is usually within a certain time range, such as the past week."]}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Characteristic 5"})," Write operations may be accompanied by a large number of read operations, which need to be processed in a single transaction cycle."]}),"\n",(0,r.jsx)(t.p,{children:"Through the analysis of actual online graph applications, the read/write ratio of graph workloads is about 20:1, although the scenarios are limited to the financial field and the number of clusters is also limited, the scale of the data involved and the number of users are very large, which is representative to some extent. The 20:1 read/write ratio of graph workloads indicates that the impact of read workload on overall performance is greater, and the performance of write workload cannot be ignored either."}),"\n",(0,r.jsx)(t.h2,{id:"3storage-data-structures",children:"3.Storage Data Structures"}),"\n",(0,r.jsx)(t.p,{children:"TuGraph uses B+ trees as the underlying data structure to support real-time transactional operations for insertion, deletion, querying, and updating."}),"\n",(0,r.jsx)(t.p,{children:"In sorting tree data structures, B+ trees and LSM trees are the main representatives. B+ trees use a split and merge method to update sorted data in tree nodes, while LSM trees append updates to logs for delayed data merging. B+ trees were originally used in file system implementations, solving the problem of differences in performance between sequential and random operations on hard disks by storing data in adaptive-length leaf nodes, and have a relatively balanced read/write performance. The main advantage of LSM trees is to use WAL (Write Ahead Log) to perform updates, which turns update operations into sequential operations, especially in the case of small key-value pairs. WAL means that the update of data is deferred until it is merged in batches, which can improve the comprehensive efficiency of batch updates, but also makes the system scheduling more complicated. If the update merge is not completed, and the data is read again, LSM trees need to read several levels of locally merged logs, which will cause read amplification and space amplification, thereby affecting read efficiency."}),"\n",(0,r.jsx)(t.p,{children:"To sum up, B+ trees have better sequential read/write performance, while LSM trees have advantages in random write data. In addition, the way of LSM trees using background merging makes the performance fluctuation difficult to predict, and the correlation between performance fluctuation and upper-level storage and computation is weak, which increases the overall design cost. Considering the above factors, TuGraph chooses B+ trees as the implementation for read performance optimization."}),"\n",(0,r.jsx)(t.h2,{id:"4data-encoding",children:"4.Data Encoding"}),"\n",(0,r.jsx)(t.p,{children:"For property graph models, in addition to graph topology encoding, property data also greatly affects functionality and performance. We first discuss how property data can be encoded together with topology data. From current research, there are two ways of encoding properties: discrete encoding, which stores property data separately based on pointer indexes, and compact encoding, which packs property data and topology data together. Discrete encoding can store each property separately or pack each edge's properties separately, and the following discussion applies to both situations."}),"\n",(0,r.jsx)(t.p,{children:"Vertex Query: Property encoding mainly focuses on edges and does not involve vertex queries."}),"\n",(0,r.jsx)(t.p,{children:"Single-Edge Query: Discrete encoding locates edges through pointers, while compact encoding requires binary search to locate the edge position. Discrete encoding has a slight advantage."}),"\n",(0,r.jsx)(t.p,{children:"Edge Traversal: Discrete encoding requires constant random access through pointer jumps during edge traversal, while compact encoding arranges data together in advance, greatly improving efficiency due to its sequential access feature. Since edge traversal operations are common according to Rule 3, compact encoding has obvious advantages in edge traversal."}),"\n",(0,r.jsx)(t.p,{children:"Single-Edge Update: Discrete encoding only requires finding the corresponding pointer position and modifying the pointer's location before and after inserting data. Compact encoding needs to re-encode the compactly arranged data and rewrite the entire edge value, resulting in significant overhead compared to discrete encoding."}),"\n",(0,r.jsx)(t.p,{children:"Batch Edge Update: Batch updates can pre-build all edge properties for a vertex in memory and write them in one encoding, making both discrete encoding and compact encoding equivalent. However, compact encoding does not require storing pointer variables, so it has higher storage space efficiency."}),"\n",(0,r.jsx)(t.p,{children:"The performance issues of discrete encoding and compact encoding for a certain type of query discussed above can be alleviated through optimization. Overall, due to the 20:1 read-write load of graphs and the characteristics of property access revealed by Rule 3, TuGraph tends to use compact encoding to ensure read performance. Its main weakness is the overhead of re-encoding during single-edge updates, which can be solved using adaptive mapping technology."})]})}function l(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,t,a)=>{a.d(t,{R:()=>o,x:()=>s});var r=a(6540);const n={},i=r.createContext(n);function o(e){const t=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/388c432b.bdb1f719.js b/assets/js/388c432b.5cb4f18e.js similarity index 98% rename from assets/js/388c432b.bdb1f719.js rename to assets/js/388c432b.5cb4f18e.js index 15c7483bc0..1e7463d696 100644 --- a/assets/js/388c432b.bdb1f719.js +++ b/assets/js/388c432b.5cb4f18e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[2402],{8922:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>n,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var r=o(4848),i=o(8453);const a={},n="Data Export",s={id:"utility-tools/data-export",title:"Data Export",description:"This document mainly introduces the data export function of TuGraph.",source:"@site/../docs/en-US/source/6.utility-tools/2.data-export.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/data-export",permalink:"/tugraph-db/en/utility-tools/data-export",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Data Importing",permalink:"/tugraph-db/en/utility-tools/data-import"},next:{title:"Backup and Restore",permalink:"/tugraph-db/en/utility-tools/backup-and-restore"}},d={},l=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Data Export",id:"2data-export",level:2}];function c(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"data-export",children:"Data Export"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"This document mainly introduces the data export function of TuGraph."}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,r.jsxs)(t.p,{children:["TuGraph can use the tool ",(0,r.jsx)(t.code,{children:"lgraph_export"})," to export data from the database that has been imported successfully. The 'lgraph_export' tool can export the data of the specified TuGraph database to the specified directory in the form of 'csv' or 'json' file, and export the configuration file 'import.config'. That required for re-importing the data."]}),"\n",(0,r.jsx)(t.h2,{id:"2data-export",children:"2.Data Export"}),"\n",(0,r.jsx)(t.p,{children:"The following is an example of a command for the tool:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"$ lgraph_export -d {database_dir} -e {export_destination_dir} -g {graph_to_use} -u {username} -p {password} -f {output_format}\n"})}),"\n",(0,r.jsx)(t.p,{children:"Details:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-d {database_dir}"})," specifies the directory of the database from which the data will be exported. The default value is./testdb '."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-e {export_destination_dir}"})," specifies the directory where the export file is stored. The default value is./exportdir."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-g {graph_to_use}"})," specifies the type of graph database. default is' default '."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-u {username}"})," Specifies the name of the user who performs the export operation."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-p {password}"})," Specifies the password of the user who performs the export operation."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-s {field_separator}"})," specifies the separator for the exported file. The default is comma."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-f {output_format}"})," specifies the format of the exported data. It can be 'json' or 'csv'."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-h"})," In addition to the specified parameters, you can also use this parameter to view the help of the tool."]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>n,x:()=>s});var r=o(6540);const i={},a=r.createContext(i);function n(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:n(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[2402],{8922:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>n,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var r=o(4848),i=o(8453);const a={},n="Data Export",s={id:"utility-tools/data-export",title:"Data Export",description:"This document mainly introduces the data export function of TuGraph.",source:"@site/../docs/en-US/source/6.utility-tools/2.data-export.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/data-export",permalink:"/tugraph-db/en/utility-tools/data-export",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Data Importing",permalink:"/tugraph-db/en/utility-tools/data-import"},next:{title:"Backup and Restore",permalink:"/tugraph-db/en/utility-tools/backup-and-restore"}},d={},l=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Data Export",id:"2data-export",level:2}];function c(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"data-export",children:"Data Export"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"This document mainly introduces the data export function of TuGraph."}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,r.jsxs)(t.p,{children:["TuGraph can use the tool ",(0,r.jsx)(t.code,{children:"lgraph_export"})," to export data from the database that has been imported successfully. The 'lgraph_export' tool can export the data of the specified TuGraph database to the specified directory in the form of 'csv' or 'json' file, and export the configuration file 'import.config'. That required for re-importing the data."]}),"\n",(0,r.jsx)(t.h2,{id:"2data-export",children:"2.Data Export"}),"\n",(0,r.jsx)(t.p,{children:"The following is an example of a command for the tool:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-bash",children:"$ lgraph_export -d {database_dir} -e {export_destination_dir} -g {graph_to_use} -u {username} -p {password} -f {output_format}\n"})}),"\n",(0,r.jsx)(t.p,{children:"Details:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-d {database_dir}"})," specifies the directory of the database from which the data will be exported. The default value is./testdb '."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-e {export_destination_dir}"})," specifies the directory where the export file is stored. The default value is./exportdir."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-g {graph_to_use}"})," specifies the type of graph database. default is' default '."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-u {username}"})," Specifies the name of the user who performs the export operation."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-p {password}"})," Specifies the password of the user who performs the export operation."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-s {field_separator}"})," specifies the separator for the exported file. The default is comma."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-f {output_format}"})," specifies the format of the exported data. It can be 'json' or 'csv'."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"-h"})," In addition to the specified parameters, you can also use this parameter to view the help of the tool."]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,o)=>{o.d(t,{R:()=>n,x:()=>s});var r=o(6540);const i={},a=r.createContext(i);function n(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:n(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/39e34d9b.3e2e9ce4.js b/assets/js/39e34d9b.c26d1deb.js similarity index 99% rename from assets/js/39e34d9b.3e2e9ce4.js rename to assets/js/39e34d9b.c26d1deb.js index b0a122aa10..8b89a0a0f4 100644 --- a/assets/js/39e34d9b.3e2e9ce4.js +++ b/assets/js/39e34d9b.c26d1deb.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[7742],{7759:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>t,contentTitle:()=>a,default:()=>o,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var i=r(4848),l=r(8453);const s={},a="ISO GQL",d={id:"query/gql",title:"ISO GQL",description:"1.Introduction to ISO GQL",source:"@site/../docs/en-US/source/8.query/2.gql.md",sourceDirName:"8.query",slug:"/query/gql",permalink:"/tugraph-db/en/query/gql",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Cypher API",permalink:"/tugraph-db/en/query/cypher"},next:{title:"TuGraph Stored Procedure Guide",permalink:"/tugraph-db/en/olap&procedure/procedure/"}},t={},c=[{value:"1.Introduction to ISO GQL",id:"1introduction-to-iso-gql",level:2},{value:"2.List of Clauses",id:"2list-of-clauses",level:2},{value:"2.1.MATCH",id:"21match",level:3},{value:"Vertex basics",id:"vertex-basics",level:4},{value:"Get all vertices",id:"get-all-vertices",level:5},{value:"Get all vertices with a label",id:"get-all-vertices-with-a-label",level:5},{value:"Vertex matching with property",id:"vertex-matching-with-property",level:5},{value:"Vertex matching with filter",id:"vertex-matching-with-filter",level:5},{value:"Edge basics",id:"edge-basics",level:4},{value:"Edge pointing right",id:"edge-pointing-right",level:5},{value:"Edge pointing left",id:"edge-pointing-left",level:5},{value:"Edge matching with filter",id:"edge-matching-with-filter",level:5},{value:"Path matching",id:"path-matching",level:4},{value:"Variable length",id:"variable-length",level:5},{value:"2.2.OPTIONAL MATCH",id:"22optional-match",level:3},{value:"Match found",id:"match-found",level:4},{value:"Match Not Found",id:"match-not-found",level:4},{value:"2.3.RETURN",id:"23return",level:3},{value:"Return vertices",id:"return-vertices",level:4},{value:"Return edges",id:"return-edges",level:4},{value:"Return property",id:"return-property",level:4},{value:"Uncommon string used as variable name",id:"uncommon-string-used-as-variable-name",level:4},{value:"Alias",id:"alias",level:4},{value:"Optional property",id:"optional-property",level:4},{value:"Other expressions",id:"other-expressions",level:4},{value:"Distinct",id:"distinct",level:4},{value:"2.4.NEXT",id:"24next",level:3},{value:"Connecting MATCH clauses",id:"connecting-match-clauses",level:4},{value:"2.5.WHERE",id:"25where",level:3},{value:"Filter vertex",id:"filter-vertex",level:4},{value:"Filter edge",id:"filter-edge",level:4},{value:"Boolean expressions",id:"boolean-expressions",level:4},{value:"2.6.ORDER BY",id:"26order-by",level:3},{value:"Sorting the Result",id:"sorting-the-result",level:4},{value:"2.7.SKIP",id:"27skip",level:3},{value:"Without SKIP",id:"without-skip",level:4},{value:"Using SKIP",id:"using-skip",level:4},{value:"2.8.LIMIT",id:"28limit",level:3},{value:"Using LIMIT",id:"using-limit",level:4}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,l.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"iso-gql",children:"ISO GQL"})}),"\n",(0,i.jsx)(n.h2,{id:"1introduction-to-iso-gql",children:"1.Introduction to ISO GQL"}),"\n",(0,i.jsxs)(n.p,{children:["Graph Query Language (GQL) is an upcoming International Standard language for property graph querying. It builds on the foundations of SQL and integrates proven ideas from the existing ",(0,i.jsx)(n.a,{href:"https://gql.today/comparing-cypher-pgql-and-g-core/",children:"openCypher, PGQL, GSQL, and G-CORE"})," languages. The standard is currently in the draft stage."]}),"\n",(0,i.jsxs)(n.p,{children:["TuGraph has implemented GQL based on the ",(0,i.jsx)(n.a,{href:"https://github.com/TuGraph-family/gql-grammar",children:"ISO GQL (ISO/IEC 39075) Antlr4 grammar file"}),". It includes some extensions and modifications. Not all GQL syntax is fully supported at the moment, but we will continue to improve and enhance it in the future."]}),"\n",(0,i.jsx)(n.h2,{id:"2list-of-clauses",children:"2.List of Clauses"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Category"}),(0,i.jsx)(n.th,{children:"Clauses"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Reading clauses"}),(0,i.jsx)(n.td,{children:"MATCH"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"OPTIONAL MATCH"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Projecting clauses"}),(0,i.jsx)(n.td,{children:"RETURN"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"NEXT"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Reading sub-clauses"}),(0,i.jsx)(n.td,{children:"WHERE"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"ORDER BY"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"SKIP"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"LIMIT"})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"21match",children:"2.1.MATCH"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"MATCH"})," clause is the most basic clause in GQL, and almost all queries are expanded through ",(0,i.jsx)(n.code,{children:"MATCH"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"MATCH"})," clause is used to specify the matching pattern to search in the graph, to match vertices or paths that meet certain conditions."]}),"\n",(0,i.jsx)(n.h4,{id:"vertex-basics",children:"Vertex basics"}),"\n",(0,i.jsx)(n.h5,{id:"get-all-vertices",children:"Get all vertices"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n)\nRETURN n\n"})}),"\n",(0,i.jsx)(n.h5,{id:"get-all-vertices-with-a-label",children:"Get all vertices with a label"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nRETURN n\n"})}),"\n",(0,i.jsx)(n.h5,{id:"vertex-matching-with-property",children:"Vertex matching with property"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person{name:'Michael Redgrave'})\nRETURN n.birthyear\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.birthyear":1908}]\n'})}),"\n",(0,i.jsx)(n.h5,{id:"vertex-matching-with-filter",children:"Vertex matching with filter"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person WHERE n.birthyear > 1910)\nRETURN n.name LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.name":"Christopher Nolan"},{"n.name":"Corin Redgrave"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"edge-basics",children:"Edge basics"}),"\n",(0,i.jsx)(n.h5,{id:"edge-pointing-right",children:"Edge pointing right"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person WHERE n.birthyear = 1970)-[e]->(m)\nRETURN n.name, label(e), m.name\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"label(e)":"BORN_IN","m.name":"London","n.name":"Christopher Nolan"},{"label(e)":"DIRECTED","m.name":null,"n.name":"Christopher Nolan"}]\n'})}),"\n",(0,i.jsx)(n.h5,{id:"edge-pointing-left",children:"Edge pointing left"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person WHERE n.birthyear = 1939)<-[e]-(m)\nRETURN n.name, label(e), m.name\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"label(e)":"HAS_CHILD","m.name":"Rachel Kempson","n.name":"Corin Redgrave"},{"label(e)":"HAS_CHILD","m.name":"Michael Redgrave","n.name":"Corin Redgrave"}]\n'})}),"\n",(0,i.jsx)(n.h5,{id:"edge-matching-with-filter",children:"Edge matching with filter"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)-[e:BORN_IN WHERE e.weight > 20]->(m)\nRETURN n.name, e.weight, m.name\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"e.weight":20.549999237060547,"m.name":"New York","n.name":"John Williams"},{"e.weight":20.6200008392334,"m.name":"New York","n.name":"Lindsay Lohan"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"path-matching",children:"Path matching"}),"\n",(0,i.jsx)(n.h5,{id:"variable-length",children:"Variable length"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)-[e]->{2,3}(m:Person)\nRETURN m.name LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"m.name":"Liam Neeson"},{"m.name":"Natasha Richardson"}]\n'})}),"\n",(0,i.jsx)(n.h3,{id:"22optional-match",children:"2.2.OPTIONAL MATCH"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"OPTIONAL MATCH"})," clause matches a graph pattern and returns ",(0,i.jsx)(n.code,{children:"null"})," if there is no match."]}),"\n",(0,i.jsx)(n.h4,{id:"match-found",children:"Match found"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"OPTIONAL MATCH (n:Person{name:'Michael Redgrave'})\nRETURN n.birthyear\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.birthyear":1908}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"match-not-found",children:"Match Not Found"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"OPTIONAL MATCH (n:Person{name:'Redgrave Michael'})\nRETURN n.birthyear\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.birthyear":null}]\n'})}),"\n",(0,i.jsx)(n.h3,{id:"23return",children:"2.3.RETURN"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"RETURN"})," clause specifies the results to be returned, including vertices, edges, paths, properties, etc."]}),"\n",(0,i.jsx)(n.h4,{id:"return-vertices",children:"Return vertices"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n)\nRETURN n LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n":{"identity":0,"label":"Person","properties":{"birthyear":1910,"name":"Rachel Kempson"}}},{"n":{"identity":1,"label":"Person","properties":{"birthyear":1908,"name":"Michael Redgrave"}}}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"return-edges",children:"Return edges"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n)-[e]->(m)\nRETURN e LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"e":{"dst":2,"forward":false,"identity":0,"label":"HAS_CHILD","label_id":0,"src":0,"temporal_id":0}},{"e":{"dst":3,"forward":false,"identity":0,"label":"HAS_CHILD","label_id":0,"src":0,"temporal_id":0}}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"return-property",children:"Return property"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nRETURN n.name LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.name":"Christopher Nolan"},{"n.name":"Corin Redgrave"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"uncommon-string-used-as-variable-name",children:"Uncommon string used as variable name"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (`/uncommon variable`:Person)\nRETURN `/uncommon variable`.name LIMIT 3\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"`/uncommon variable`.name":"Christopher Nolan"},{"`/uncommon variable`.name":"Corin Redgrave"},{"`/uncommon variable`.name":"Dennis Quaid"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"alias",children:"Alias"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nRETURN n.name AS nname LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"nname":"Christopher Nolan"},{"nname":"Corin Redgrave"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"optional-property",children:"Optional property"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nRETURN n.age LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.age":null},{"n.age":null}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"other-expressions",children:"Other expressions"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'MATCH (n:Person)\nRETURN n.birthyear > 1970, "I\'m a literal", 1 + 2, abs(-2)\nLIMIT 2\n'})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"\\"I\'m a literal\\"":"I\'m a literal","1 + 2":3,"abs(-2)":2,"n.birthyear > 1970":false},{"\\"I\'m a literal\\"":"I\'m a literal","1 + 2":3,"abs(-2)":2,"n.birthyear > 1970":false}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"distinct",children:"Distinct"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n)\nRETURN DISTINCT label(n) AS label\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"label":"Person"},{"label":"City"},{"label":"Film"}]\n'})}),"\n",(0,i.jsx)(n.h3,{id:"24next",children:"2.4.NEXT"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"NEXT"})," clause is used to connect multiple clauses."]}),"\n",(0,i.jsx)(n.h4,{id:"connecting-match-clauses",children:"Connecting MATCH clauses"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person) WHERE n.birthyear = 1970\nRETURN n\nNEXT\nMATCH (m:Person) WHERE m.birthyear < 1968\nRETURN n.name, n.birthyear, m.name LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"m.name":"Rachel Kempson","n.birthyear":1970,"n.name":"Christopher Nolan"},{"m.name":"Michael Redgrave","n.birthyear":1970,"n.name":"Christopher Nolan"}]\n'})}),"\n",(0,i.jsx)(n.h3,{id:"25where",children:"2.5.WHERE"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"WHERE"})," clause is used to filter records."]}),"\n",(0,i.jsx)(n.h4,{id:"filter-vertex",children:"Filter vertex"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person WHERE n.birthyear > 1965)\nRETURN n.name\n"})}),"\n",(0,i.jsx)(n.p,{children:"returns"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.name":"Christopher Nolan"},{"n.name":"Lindsay Lohan"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"filter-edge",children:"Filter edge"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person WHERE n.birthyear > 1965)-[e:ACTED_IN]->(m:Film)\nWHERE e.charactername = 'Halle/Annie'\nRETURN m.title\n"})}),"\n",(0,i.jsx)(n.p,{children:"returns"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"m.title":"The Parent Trap"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"boolean-expressions",children:"Boolean expressions"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"AND"}),", ",(0,i.jsx)(n.code,{children:"OR"}),", ",(0,i.jsx)(n.code,{children:"XOR"}),", and ",(0,i.jsx)(n.code,{children:"NOT"})," Boolean expressions can be used in the ",(0,i.jsx)(n.code,{children:"WHERE"})," clause to filter data."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nWHERE\n\tn.birthyear > 1930 AND (n.birthyear < 1950 OR n.name = 'Corin Redgrave')\nRETURN n LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"returns"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n":{"identity":3,"label":"Person","properties":{"birthyear":1939,"name":"Corin Redgrave"}}},{"n":{"identity":11,"label":"Person","properties":{"birthyear":1932,"name":"John Williams"}}}]\n'})}),"\n",(0,i.jsx)(n.h3,{id:"26order-by",children:"2.6.ORDER BY"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"ORDER BY"})," is a clause of ",(0,i.jsx)(n.code,{children:"RETURN"})," that sorts the output result."]}),"\n",(0,i.jsx)(n.h4,{id:"sorting-the-result",children:"Sorting the Result"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person WHERE n.birthyear < 1970)\nRETURN n.birthyear AS q\nORDER BY q ASC\nLIMIT 5\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"q":1873},{"q":1908},{"q":1910},{"q":1930},{"q":1932}]\n'})}),"\n",(0,i.jsx)(n.h3,{id:"27skip",children:"2.7.SKIP"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"SKIP"})," specifies the offset of the result rows."]}),"\n",(0,i.jsx)(n.h4,{id:"without-skip",children:"Without SKIP"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nRETURN n.name LIMIT 3\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.name":"Christopher Nolan"},{"n.name":"Corin Redgrave"},{"n.name":"Dennis Quaid"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"using-skip",children:"Using SKIP"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nRETURN n.name SKIP 1 LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.name":"Corin Redgrave"},{"n.name":"Dennis Quaid"}]\n'})}),"\n",(0,i.jsx)(n.h3,{id:"28limit",children:"2.8.LIMIT"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"LIMIT"})," clause is used to limit the number of rows in the result."]}),"\n",(0,i.jsx)(n.h4,{id:"using-limit",children:"Using LIMIT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nRETURN n.name LIMIT 2;\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.name":"Christopher Nolan"},{"n.name":"Corin Redgrave"}]\n'})})]})}function o(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>a,x:()=>d});var i=r(6540);const l={},s=i.createContext(l);function a(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[7742],{7759:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>t,contentTitle:()=>a,default:()=>o,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var i=r(4848),l=r(8453);const s={},a="ISO GQL",d={id:"query/gql",title:"ISO GQL",description:"1.Introduction to ISO GQL",source:"@site/../docs/en-US/source/8.query/2.gql.md",sourceDirName:"8.query",slug:"/query/gql",permalink:"/tugraph-db/en/query/gql",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Cypher API",permalink:"/tugraph-db/en/query/cypher"},next:{title:"TuGraph Stored Procedure Guide",permalink:"/tugraph-db/en/olap&procedure/procedure/"}},t={},c=[{value:"1.Introduction to ISO GQL",id:"1introduction-to-iso-gql",level:2},{value:"2.List of Clauses",id:"2list-of-clauses",level:2},{value:"2.1.MATCH",id:"21match",level:3},{value:"Vertex basics",id:"vertex-basics",level:4},{value:"Get all vertices",id:"get-all-vertices",level:5},{value:"Get all vertices with a label",id:"get-all-vertices-with-a-label",level:5},{value:"Vertex matching with property",id:"vertex-matching-with-property",level:5},{value:"Vertex matching with filter",id:"vertex-matching-with-filter",level:5},{value:"Edge basics",id:"edge-basics",level:4},{value:"Edge pointing right",id:"edge-pointing-right",level:5},{value:"Edge pointing left",id:"edge-pointing-left",level:5},{value:"Edge matching with filter",id:"edge-matching-with-filter",level:5},{value:"Path matching",id:"path-matching",level:4},{value:"Variable length",id:"variable-length",level:5},{value:"2.2.OPTIONAL MATCH",id:"22optional-match",level:3},{value:"Match found",id:"match-found",level:4},{value:"Match Not Found",id:"match-not-found",level:4},{value:"2.3.RETURN",id:"23return",level:3},{value:"Return vertices",id:"return-vertices",level:4},{value:"Return edges",id:"return-edges",level:4},{value:"Return property",id:"return-property",level:4},{value:"Uncommon string used as variable name",id:"uncommon-string-used-as-variable-name",level:4},{value:"Alias",id:"alias",level:4},{value:"Optional property",id:"optional-property",level:4},{value:"Other expressions",id:"other-expressions",level:4},{value:"Distinct",id:"distinct",level:4},{value:"2.4.NEXT",id:"24next",level:3},{value:"Connecting MATCH clauses",id:"connecting-match-clauses",level:4},{value:"2.5.WHERE",id:"25where",level:3},{value:"Filter vertex",id:"filter-vertex",level:4},{value:"Filter edge",id:"filter-edge",level:4},{value:"Boolean expressions",id:"boolean-expressions",level:4},{value:"2.6.ORDER BY",id:"26order-by",level:3},{value:"Sorting the Result",id:"sorting-the-result",level:4},{value:"2.7.SKIP",id:"27skip",level:3},{value:"Without SKIP",id:"without-skip",level:4},{value:"Using SKIP",id:"using-skip",level:4},{value:"2.8.LIMIT",id:"28limit",level:3},{value:"Using LIMIT",id:"using-limit",level:4}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,l.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"iso-gql",children:"ISO GQL"})}),"\n",(0,i.jsx)(n.h2,{id:"1introduction-to-iso-gql",children:"1.Introduction to ISO GQL"}),"\n",(0,i.jsxs)(n.p,{children:["Graph Query Language (GQL) is an upcoming International Standard language for property graph querying. It builds on the foundations of SQL and integrates proven ideas from the existing ",(0,i.jsx)(n.a,{href:"https://gql.today/comparing-cypher-pgql-and-g-core/",children:"openCypher, PGQL, GSQL, and G-CORE"})," languages. The standard is currently in the draft stage."]}),"\n",(0,i.jsxs)(n.p,{children:["TuGraph has implemented GQL based on the ",(0,i.jsx)(n.a,{href:"https://github.com/TuGraph-family/gql-grammar",children:"ISO GQL (ISO/IEC 39075) Antlr4 grammar file"}),". It includes some extensions and modifications. Not all GQL syntax is fully supported at the moment, but we will continue to improve and enhance it in the future."]}),"\n",(0,i.jsx)(n.h2,{id:"2list-of-clauses",children:"2.List of Clauses"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Category"}),(0,i.jsx)(n.th,{children:"Clauses"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Reading clauses"}),(0,i.jsx)(n.td,{children:"MATCH"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"OPTIONAL MATCH"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Projecting clauses"}),(0,i.jsx)(n.td,{children:"RETURN"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"NEXT"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Reading sub-clauses"}),(0,i.jsx)(n.td,{children:"WHERE"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"ORDER BY"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"SKIP"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"LIMIT"})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"21match",children:"2.1.MATCH"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"MATCH"})," clause is the most basic clause in GQL, and almost all queries are expanded through ",(0,i.jsx)(n.code,{children:"MATCH"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"MATCH"})," clause is used to specify the matching pattern to search in the graph, to match vertices or paths that meet certain conditions."]}),"\n",(0,i.jsx)(n.h4,{id:"vertex-basics",children:"Vertex basics"}),"\n",(0,i.jsx)(n.h5,{id:"get-all-vertices",children:"Get all vertices"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n)\nRETURN n\n"})}),"\n",(0,i.jsx)(n.h5,{id:"get-all-vertices-with-a-label",children:"Get all vertices with a label"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nRETURN n\n"})}),"\n",(0,i.jsx)(n.h5,{id:"vertex-matching-with-property",children:"Vertex matching with property"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person{name:'Michael Redgrave'})\nRETURN n.birthyear\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.birthyear":1908}]\n'})}),"\n",(0,i.jsx)(n.h5,{id:"vertex-matching-with-filter",children:"Vertex matching with filter"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person WHERE n.birthyear > 1910)\nRETURN n.name LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.name":"Christopher Nolan"},{"n.name":"Corin Redgrave"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"edge-basics",children:"Edge basics"}),"\n",(0,i.jsx)(n.h5,{id:"edge-pointing-right",children:"Edge pointing right"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person WHERE n.birthyear = 1970)-[e]->(m)\nRETURN n.name, label(e), m.name\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"label(e)":"BORN_IN","m.name":"London","n.name":"Christopher Nolan"},{"label(e)":"DIRECTED","m.name":null,"n.name":"Christopher Nolan"}]\n'})}),"\n",(0,i.jsx)(n.h5,{id:"edge-pointing-left",children:"Edge pointing left"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person WHERE n.birthyear = 1939)<-[e]-(m)\nRETURN n.name, label(e), m.name\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"label(e)":"HAS_CHILD","m.name":"Rachel Kempson","n.name":"Corin Redgrave"},{"label(e)":"HAS_CHILD","m.name":"Michael Redgrave","n.name":"Corin Redgrave"}]\n'})}),"\n",(0,i.jsx)(n.h5,{id:"edge-matching-with-filter",children:"Edge matching with filter"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)-[e:BORN_IN WHERE e.weight > 20]->(m)\nRETURN n.name, e.weight, m.name\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"e.weight":20.549999237060547,"m.name":"New York","n.name":"John Williams"},{"e.weight":20.6200008392334,"m.name":"New York","n.name":"Lindsay Lohan"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"path-matching",children:"Path matching"}),"\n",(0,i.jsx)(n.h5,{id:"variable-length",children:"Variable length"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)-[e]->{2,3}(m:Person)\nRETURN m.name LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"m.name":"Liam Neeson"},{"m.name":"Natasha Richardson"}]\n'})}),"\n",(0,i.jsx)(n.h3,{id:"22optional-match",children:"2.2.OPTIONAL MATCH"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"OPTIONAL MATCH"})," clause matches a graph pattern and returns ",(0,i.jsx)(n.code,{children:"null"})," if there is no match."]}),"\n",(0,i.jsx)(n.h4,{id:"match-found",children:"Match found"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"OPTIONAL MATCH (n:Person{name:'Michael Redgrave'})\nRETURN n.birthyear\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.birthyear":1908}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"match-not-found",children:"Match Not Found"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"OPTIONAL MATCH (n:Person{name:'Redgrave Michael'})\nRETURN n.birthyear\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.birthyear":null}]\n'})}),"\n",(0,i.jsx)(n.h3,{id:"23return",children:"2.3.RETURN"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"RETURN"})," clause specifies the results to be returned, including vertices, edges, paths, properties, etc."]}),"\n",(0,i.jsx)(n.h4,{id:"return-vertices",children:"Return vertices"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n)\nRETURN n LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n":{"identity":0,"label":"Person","properties":{"birthyear":1910,"name":"Rachel Kempson"}}},{"n":{"identity":1,"label":"Person","properties":{"birthyear":1908,"name":"Michael Redgrave"}}}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"return-edges",children:"Return edges"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n)-[e]->(m)\nRETURN e LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"e":{"dst":2,"forward":false,"identity":0,"label":"HAS_CHILD","label_id":0,"src":0,"temporal_id":0}},{"e":{"dst":3,"forward":false,"identity":0,"label":"HAS_CHILD","label_id":0,"src":0,"temporal_id":0}}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"return-property",children:"Return property"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nRETURN n.name LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.name":"Christopher Nolan"},{"n.name":"Corin Redgrave"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"uncommon-string-used-as-variable-name",children:"Uncommon string used as variable name"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (`/uncommon variable`:Person)\nRETURN `/uncommon variable`.name LIMIT 3\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"`/uncommon variable`.name":"Christopher Nolan"},{"`/uncommon variable`.name":"Corin Redgrave"},{"`/uncommon variable`.name":"Dennis Quaid"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"alias",children:"Alias"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nRETURN n.name AS nname LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"nname":"Christopher Nolan"},{"nname":"Corin Redgrave"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"optional-property",children:"Optional property"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nRETURN n.age LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.age":null},{"n.age":null}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"other-expressions",children:"Other expressions"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'MATCH (n:Person)\nRETURN n.birthyear > 1970, "I\'m a literal", 1 + 2, abs(-2)\nLIMIT 2\n'})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"\\"I\'m a literal\\"":"I\'m a literal","1 + 2":3,"abs(-2)":2,"n.birthyear > 1970":false},{"\\"I\'m a literal\\"":"I\'m a literal","1 + 2":3,"abs(-2)":2,"n.birthyear > 1970":false}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"distinct",children:"Distinct"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n)\nRETURN DISTINCT label(n) AS label\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"label":"Person"},{"label":"City"},{"label":"Film"}]\n'})}),"\n",(0,i.jsx)(n.h3,{id:"24next",children:"2.4.NEXT"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"NEXT"})," clause is used to connect multiple clauses."]}),"\n",(0,i.jsx)(n.h4,{id:"connecting-match-clauses",children:"Connecting MATCH clauses"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person) WHERE n.birthyear = 1970\nRETURN n\nNEXT\nMATCH (m:Person) WHERE m.birthyear < 1968\nRETURN n.name, n.birthyear, m.name LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"m.name":"Rachel Kempson","n.birthyear":1970,"n.name":"Christopher Nolan"},{"m.name":"Michael Redgrave","n.birthyear":1970,"n.name":"Christopher Nolan"}]\n'})}),"\n",(0,i.jsx)(n.h3,{id:"25where",children:"2.5.WHERE"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"WHERE"})," clause is used to filter records."]}),"\n",(0,i.jsx)(n.h4,{id:"filter-vertex",children:"Filter vertex"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person WHERE n.birthyear > 1965)\nRETURN n.name\n"})}),"\n",(0,i.jsx)(n.p,{children:"returns"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.name":"Christopher Nolan"},{"n.name":"Lindsay Lohan"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"filter-edge",children:"Filter edge"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person WHERE n.birthyear > 1965)-[e:ACTED_IN]->(m:Film)\nWHERE e.charactername = 'Halle/Annie'\nRETURN m.title\n"})}),"\n",(0,i.jsx)(n.p,{children:"returns"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"m.title":"The Parent Trap"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"boolean-expressions",children:"Boolean expressions"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"AND"}),", ",(0,i.jsx)(n.code,{children:"OR"}),", ",(0,i.jsx)(n.code,{children:"XOR"}),", and ",(0,i.jsx)(n.code,{children:"NOT"})," Boolean expressions can be used in the ",(0,i.jsx)(n.code,{children:"WHERE"})," clause to filter data."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nWHERE\n\tn.birthyear > 1930 AND (n.birthyear < 1950 OR n.name = 'Corin Redgrave')\nRETURN n LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"returns"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n":{"identity":3,"label":"Person","properties":{"birthyear":1939,"name":"Corin Redgrave"}}},{"n":{"identity":11,"label":"Person","properties":{"birthyear":1932,"name":"John Williams"}}}]\n'})}),"\n",(0,i.jsx)(n.h3,{id:"26order-by",children:"2.6.ORDER BY"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"ORDER BY"})," is a clause of ",(0,i.jsx)(n.code,{children:"RETURN"})," that sorts the output result."]}),"\n",(0,i.jsx)(n.h4,{id:"sorting-the-result",children:"Sorting the Result"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person WHERE n.birthyear < 1970)\nRETURN n.birthyear AS q\nORDER BY q ASC\nLIMIT 5\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"q":1873},{"q":1908},{"q":1910},{"q":1930},{"q":1932}]\n'})}),"\n",(0,i.jsx)(n.h3,{id:"27skip",children:"2.7.SKIP"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"SKIP"})," specifies the offset of the result rows."]}),"\n",(0,i.jsx)(n.h4,{id:"without-skip",children:"Without SKIP"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nRETURN n.name LIMIT 3\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.name":"Christopher Nolan"},{"n.name":"Corin Redgrave"},{"n.name":"Dennis Quaid"}]\n'})}),"\n",(0,i.jsx)(n.h4,{id:"using-skip",children:"Using SKIP"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nRETURN n.name SKIP 1 LIMIT 2\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.name":"Corin Redgrave"},{"n.name":"Dennis Quaid"}]\n'})}),"\n",(0,i.jsx)(n.h3,{id:"28limit",children:"2.8.LIMIT"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"LIMIT"})," clause is used to limit the number of rows in the result."]}),"\n",(0,i.jsx)(n.h4,{id:"using-limit",children:"Using LIMIT"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"MATCH (n:Person)\nRETURN n.name LIMIT 2;\n"})}),"\n",(0,i.jsx)(n.p,{children:"return"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-JSON",children:'[{"n.name":"Christopher Nolan"},{"n.name":"Corin Redgrave"}]\n'})})]})}function o(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>a,x:()=>d});var i=r(6540);const l={},s=i.createContext(l);function a(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3fac061c.c7403e38.js b/assets/js/3fac061c.c2b4a952.js similarity index 99% rename from assets/js/3fac061c.c7403e38.js rename to assets/js/3fac061c.c2b4a952.js index 2899801d99..f9a2ea7657 100644 --- a/assets/js/3fac061c.c7403e38.js +++ b/assets/js/3fac061c.c2b4a952.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8054],{9479:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var t=n(4848),r=n(8453);const i={},o="Functionality",s={id:"introduction/functionality",title:"Functionality",description:"This document mainly introduces the main functions and features of TuGraph.",source:"@site/../docs/en-US/source/2.introduction/7.functionality.md",sourceDirName:"2.introduction",slug:"/introduction/functionality",permalink:"/tugraph-db/en/introduction/functionality",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:7,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Architecture",permalink:"/tugraph-db/en/introduction/architecture"},next:{title:"Scenarios",permalink:"/tugraph-db/en/introduction/scenarios"}},l={},d=[{value:"1.Installation",id:"1installation",level:2},{value:"1.1.Installation",id:"11installation",level:2},{value:"1.2.Software and Hardware Environment",id:"12software-and-hardware-environment",level:2},{value:"2.Storage layer",id:"2storage-layer",level:2},{value:"3.Calculation layer",id:"3calculation-layer",level:2},{value:"4.Core Features",id:"4core-features",level:2},{value:"4.1.Query Language",id:"41query-language",level:3},{value:"4.2.Stored Procedures",id:"42stored-procedures",level:3},{value:"4.3.Data Import/Export",id:"43data-importexport",level:3},{value:"4.4.Backup and Restore",id:"44backup-and-restore",level:3},{value:"4.5 Data Warmup",id:"45-data-warmup",level:3},{value:"4.6 High Availability Mode",id:"46-high-availability-mode",level:3},{value:"5.Client Tools",id:"5client-tools",level:2},{value:"6.Ecological Tools",id:"6ecological-tools",level:2},{value:"6.1.TuGraph DataX",id:"61tugraph-datax",level:3},{value:"6.2.Visual Interaction",id:"62visual-interaction",level:3},{value:"6.3.Monitoring",id:"63monitoring",level:3}];function c(e){const a={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.header,{children:(0,t.jsx)(a.h1,{id:"functionality",children:"Functionality"})}),"\n",(0,t.jsxs)(a.blockquote,{children:["\n",(0,t.jsx)(a.p,{children:"This document mainly introduces the main functions and features of TuGraph."}),"\n"]}),"\n",(0,t.jsx)(a.h2,{id:"1installation",children:"1.Installation"}),"\n",(0,t.jsx)(a.h2,{id:"11installation",children:"1.1.Installation"}),"\n",(0,t.jsx)(a.p,{children:"Deployment methods TuGraph currently provides three deployment methods: cloud deployment, Docker deployment, and local package deployment. Users can choose the appropriate deployment method according to their actual situation."}),"\n",(0,t.jsx)(a.h2,{id:"12software-and-hardware-environment",children:"1.2.Software and Hardware Environment"}),"\n",(0,t.jsx)(a.p,{children:"TuGraph core is developed in C++, and the default compiler used is GCC8.4, using c++14 standard. Some functions use other compilers, such as ApacheLucene-based full-text indexing, which uses JNI interface and requires a Java compiler. In addition, the Python Procedure API is provided in the stored procedure, which requires a Python environment. TuGraph does not require special hardware such as GPUs, and can naturally adapt to general hardware upgrades such as RDMA and HBM with high latency and low bandwidth."}),"\n",(0,t.jsx)(a.p,{children:"TuGraph has been tested on CPUs based on X86 and ARM, including Intel, AMD, Kunpeng, Hygon, Feiteng, etc., and also runs on multiple operating systems, including mainstream versions of Ubuntu, CentOS, SUSE, Galaxy Kylin, Zhongbiao Kylin, and UOS, without special requirements for operating systems and CPUs."}),"\n",(0,t.jsx)(a.p,{children:"The software and hardware environment also includes the environment of dependent libraries. Since the default KV storage in TuGraph's storage layer is LMDB, the file system needs to support POSIX interfaces. The compilation and parameter configuration in different environments will be slightly different. For example, in the packaging of point-edge data in graph storage, it should match the page table size of the operating system, which is 4KB by default, and it is recommended to set the system's page table size to 4KB."}),"\n",(0,t.jsx)(a.h2,{id:"2storage-layer",children:"2.Storage layer"}),"\n",(0,t.jsx)(a.p,{children:"In the graph data model, TUGraph supports the attribute graph model, which can be divided into subgraphs, tags (including vertex tags and edge tags), and attributes according to the hierarchy."}),"\n",(0,t.jsx)(a.p,{children:"From the perspective of the storage layer, TuGraph uses an intuitive multi-layered tree model, without tags across subgraphs or attributes across tags, and only retains the core logic of the graph model. In terms of subgraph storage, TuGraph has performed data physical isolation for multiple graphs, and each graph corresponds to an instance of LMDB. The metadata description information of multiple graphs is saved in a special public LMDB instance called meta. The storage of vertex and edge tags and their attributes maps graph data adaptively to KV key-value pairs, maximizing read performance. At the same time, multi-threaded writing is implemented at the KV layer, solving the disadvantage of low write performance of LMDB. Primary key indexes and secondary indexes correspond to B+ tables in LMDB, supporting index value addition, deletion, query, and modification based on comparison."}),"\n",(0,t.jsx)(a.p,{children:"The storage layer also retains some other non-core functional data, including permission data, pre-compiled plugin data, and monitoring data."}),"\n",(0,t.jsx)(a.h2,{id:"3calculation-layer",children:"3.Calculation layer"}),"\n",(0,t.jsx)(a.p,{children:"The calculation layer is divided into three parts in terms of function, including the TP-class graph transaction engine, the AP-class graph analysis engine, and the graph neural network engine."}),"\n",(0,t.jsxs)(a.p,{children:[(0,t.jsx)(a.strong,{children:"The graph transaction engine"})," is mainly used to process concurrent graph operations, including single-point queries, neighbor queries, and path traversal. The graph transaction engine focuses on ACID transactions of concurrent operations, ensuring that the operation logic will not interfere with each other. The main performance indicator is QPS, which is the number of completed queries per second."]}),"\n",(0,t.jsxs)(a.p,{children:[(0,t.jsx)(a.strong,{children:"The graph analysis engine"})," usually operates as a full-graph iteration. Some simple analysis tasks (such as SPSP) can be completed by the graph transaction engine, and complex analysis tasks are completed by the graph analysis engine, which usually takes several seconds to several hours for a single task. Therefore, a single graph analysis task should use all hardware resources in parallel, and the performance indicator is the total time for completing the task."]}),"\n",(0,t.jsxs)(a.p,{children:[(0,t.jsx)(a.strong,{children:"The graph neural network engine"})," usually operates as a full-graph iteration. In addition to graph topology-based operations, the graph neural network engine also needs to integrate a machine learning framework to handle vector operations, such as PyTorch, MXNet, and TenserFlow."]}),"\n",(0,t.jsx)(a.p,{children:"The logic of the three engines is different and independently configured for resource pools. The graph transaction engine sets up a thread pool based on RPC operations. For each operation received from the client, a thread is taken from the pool to process it, and the number of concurrent executions is equal to the capacity of the RPC thread pool, which is usually configured as the number of server cores. The graph analysis engine has an analysis thread pool, and each graph analysis task is executed concurrently, that is, all threads are used to execute a task to speed up the performance of the operation. The serial execution feature of TuGraph graph analysis operations will restrict the user experience to a certain extent. The demand for concurrent graph analysis can be processed by deploying high-availability, increasing machine resources, or connecting to an external task scheduler to transfer data to a container for real-time scheduling and calculation. Graph neural network operations will reuse the resources of the graph transaction"}),"\n",(0,t.jsx)(a.h2,{id:"4core-features",children:"4.Core Features"}),"\n",(0,t.jsx)(a.h3,{id:"41query-language",children:"4.1.Query Language"}),"\n",(0,t.jsx)(a.p,{children:"TuGraph provides Cypher graph query language that follows the OpenCypher standard."}),"\n",(0,t.jsxs)(a.ul,{children:["\n",(0,t.jsx)(a.li,{children:"Supports Procedure embedding."}),"\n",(0,t.jsx)(a.li,{children:"Supports pluggable optimization frameworks with various optimization features."}),"\n",(0,t.jsx)(a.li,{children:"Supports extensible security check framework for Cypher."}),"\n"]}),"\n",(0,t.jsx)(a.h3,{id:"42stored-procedures",children:"4.2.Stored Procedures"}),"\n",(0,t.jsx)(a.p,{children:"When users need to express complex query/update logic that Cypher cannot describe, or when high performance is required, TuGraph's stored procedures (Procedure) is a more concise and efficient choice than calling multiple REST requests and completing the entire processing flow on the client-side."}),"\n",(0,t.jsx)(a.h3,{id:"43data-importexport",children:"4.3.Data Import/Export"}),"\n",(0,t.jsx)(a.p,{children:"Although TuGraph supports data insertion, batch import can greatly improve efficiency. The import function can be divided into importing into an empty database (offline import) and incremental import. The former refers to importing when the subgraph is empty, and the additional assumption can greatly improve the import performance. In TuGraph, the throughput rate of empty database import and incremental import differs by 10 times. Data consistency needs to be considered in data export, which is based on exporting data based on a snapshot."}),"\n",(0,t.jsxs)(a.p,{children:["TuGraph can perform data export on graph data already stored in TuGraph using the command-line tool ",(0,t.jsx)(a.code,{children:"lgraph_export"}),". The export format supports CSV and JSON."]}),"\n",(0,t.jsx)(a.h3,{id:"44backup-and-restore",children:"4.4.Backup and Restore"}),"\n",(0,t.jsx)(a.p,{children:"TuGraph's backup function can be divided into active/scheduled, offline/online, and full/incremental backup. The goal is to complete the backup with the smallest storage and computing costs possible. The Restore function can restore to the latest state or a historical marked time point, ensuring that the database is in a consistent state."}),"\n",(0,t.jsx)(a.h3,{id:"45-data-warmup",children:"4.5 Data Warmup"}),"\n",(0,t.jsx)(a.p,{children:"TuGraph is a disk-based graph database, and data is loaded into memory only when it is accessed. Therefore, system performance may deteriorate due to frequent IO operations in the first period after the server is opened. We can improve this problem by preheating the data in advance."}),"\n",(0,t.jsx)(a.h3,{id:"46-high-availability-mode",children:"4.6 High Availability Mode"}),"\n",(0,t.jsx)(a.p,{children:"High availability means that by configuring a cluster, real-time multi-replica data hot backup can be achieved, and the cluster can still provide services when some replicas are not in use. TuGraph uses the multi-machine hot backup mechanism of the RAFT protocol, which can reduce RPO to near 0. Data synchronization is performed at the computation layer through RPC interfaces for write operations. The high availability cluster of TuGraph adopts a master-slave mode, where only the master node processes write requests, and both master and slave nodes can process read requests. The write request processing of the master node needs to be synchronized to more than half of the total nodes. The write request is considered complete when the majority of the nodes have written successfully."}),"\n",(0,t.jsx)(a.h2,{id:"5client-tools",children:"5.Client Tools"}),"\n",(0,t.jsx)(a.p,{children:"Client Tools Client tools mainly include SDKs for various programming languages, OGM, and command-line tools."}),"\n",(0,t.jsx)(a.p,{children:"The client SDK is mainly used for secondary development and can be linked to the server through RPC or REST protocols. RPC has better performance based on long links, and data needs to be uniformly serialized through protobuf. TuGraph uses brpc, which supports rpc clients in Java, Python, and C++. REST's protocol is more flexible and can be easily adapted to more diverse environments, and different programming languages can easily connect. TuGraph provides a Python REST client instance, and command-line interaction is also implemented using REST."}),"\n",(0,t.jsx)(a.p,{children:"OGM (Object Graph Mapping) is a graph object mapping tool for TuGraph, which supports mapping JAVA objects (POJO) to TuGraph. Classes in JAVA are mapped to nodes in the graph, collections in classes are mapped to edges, and properties of classes are mapped to properties of graph objects. It also provides corresponding function to operate the graph database. Therefore, JAVA developers can easily use TuGraph database in a familiar ecosystem."}),"\n",(0,t.jsxs)(a.p,{children:["The command-line tool ",(0,t.jsx)(a.code,{children:"lgraph_cypher"})," is a query client that can be used to submit OpenCypher requests to the TuGraph server. ",(0,t.jsx)(a.code,{children:"lgraph_cypher"})," client has two execution modes: single-command mode and interactive mode."]}),"\n",(0,t.jsx)(a.h2,{id:"6ecological-tools",children:"6.Ecological Tools"}),"\n",(0,t.jsx)(a.p,{children:"Ecological tools are a crucial component of enterprise-level databases, and a rich array of ecological tools can greatly enhance the usability and stability of graph databases."}),"\n",(0,t.jsx)(a.h3,{id:"61tugraph-datax",children:"6.1.TuGraph DataX"}),"\n",(0,t.jsx)(a.p,{children:(0,t.jsx)(a.img,{alt:"Import&Export",src:n(5018).A+"",width:"1288",height:"404"})}),"\n",(0,t.jsx)(a.p,{children:"TuGraph's core supports importing and exporting CSV and JSON data, offering both full database and incremental importing modes. In practice, there may be a need to import from multiple data sources such as MySQL, Kafka, and Hive, and TuGraph connects to these sources using DataX. Due to the differences between relational and graph models, data cleaning processes can be quickly processed using SparkSQL. TuGraph focuses only on the reliability and performance of simple CSV and JSON scenario imports."}),"\n",(0,t.jsx)(a.h3,{id:"62visual-interaction",children:"6.2.Visual Interaction"}),"\n",(0,t.jsx)(a.p,{children:"TuGraph Browser is a visual interface for direct users of graph databases, covering most of TuGraph's capabilities, including data import, graph model building, data addition/deletion/query/modify, and monitoring and maintenance operations."}),"\n",(0,t.jsx)(a.h3,{id:"63monitoring",children:"6.3.Monitoring"}),"\n",(0,t.jsx)(a.p,{children:"TuGraph uses the Prometheus + Grafana monitoring framework in a loosely coupled manner. Prometheus obtains monitoring information from TuGraph's monitoring interface, stores it in a local time-series database, and then displays it interactively on the web using Grafana."}),"\n",(0,t.jsx)(a.p,{children:"The monitoring states provided by TuGraph include the state of the graph database and the state of the server. The former includes the database-side status such as read/write load and number of vertices/edges, while the latter includes the real-time status of the server's memory, CPU, and hard disk. If some monitoring state exceeds the expected threshold, proactive alerts are necessary, usually requiring integration with other operations and control systems such as group messaging and email alerts."})]})}function h(e={}){const{wrapper:a}={...(0,r.R)(),...e.components};return a?(0,t.jsx)(a,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},5018:(e,a,n)=>{n.d(a,{A:()=>t});const t=n.p+"assets/images/tugraph-datax-0f6f140ea310beb2c90460c3d6d0c08d.png"},8453:(e,a,n)=>{n.d(a,{R:()=>o,x:()=>s});var t=n(6540);const r={},i=t.createContext(r);function o(e){const a=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function s(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(i.Provider,{value:a},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8054],{9479:(e,a,n)=>{n.r(a),n.d(a,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var t=n(4848),r=n(8453);const i={},o="Functionality",s={id:"introduction/functionality",title:"Functionality",description:"This document mainly introduces the main functions and features of TuGraph.",source:"@site/../docs/en-US/source/2.introduction/7.functionality.md",sourceDirName:"2.introduction",slug:"/introduction/functionality",permalink:"/tugraph-db/en/introduction/functionality",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:7,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Architecture",permalink:"/tugraph-db/en/introduction/architecture"},next:{title:"Scenarios",permalink:"/tugraph-db/en/introduction/scenarios"}},l={},d=[{value:"1.Installation",id:"1installation",level:2},{value:"1.1.Installation",id:"11installation",level:2},{value:"1.2.Software and Hardware Environment",id:"12software-and-hardware-environment",level:2},{value:"2.Storage layer",id:"2storage-layer",level:2},{value:"3.Calculation layer",id:"3calculation-layer",level:2},{value:"4.Core Features",id:"4core-features",level:2},{value:"4.1.Query Language",id:"41query-language",level:3},{value:"4.2.Stored Procedures",id:"42stored-procedures",level:3},{value:"4.3.Data Import/Export",id:"43data-importexport",level:3},{value:"4.4.Backup and Restore",id:"44backup-and-restore",level:3},{value:"4.5 Data Warmup",id:"45-data-warmup",level:3},{value:"4.6 High Availability Mode",id:"46-high-availability-mode",level:3},{value:"5.Client Tools",id:"5client-tools",level:2},{value:"6.Ecological Tools",id:"6ecological-tools",level:2},{value:"6.1.TuGraph DataX",id:"61tugraph-datax",level:3},{value:"6.2.Visual Interaction",id:"62visual-interaction",level:3},{value:"6.3.Monitoring",id:"63monitoring",level:3}];function c(e){const a={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.header,{children:(0,t.jsx)(a.h1,{id:"functionality",children:"Functionality"})}),"\n",(0,t.jsxs)(a.blockquote,{children:["\n",(0,t.jsx)(a.p,{children:"This document mainly introduces the main functions and features of TuGraph."}),"\n"]}),"\n",(0,t.jsx)(a.h2,{id:"1installation",children:"1.Installation"}),"\n",(0,t.jsx)(a.h2,{id:"11installation",children:"1.1.Installation"}),"\n",(0,t.jsx)(a.p,{children:"Deployment methods TuGraph currently provides three deployment methods: cloud deployment, Docker deployment, and local package deployment. Users can choose the appropriate deployment method according to their actual situation."}),"\n",(0,t.jsx)(a.h2,{id:"12software-and-hardware-environment",children:"1.2.Software and Hardware Environment"}),"\n",(0,t.jsx)(a.p,{children:"TuGraph core is developed in C++, and the default compiler used is GCC8.4, using c++14 standard. Some functions use other compilers, such as ApacheLucene-based full-text indexing, which uses JNI interface and requires a Java compiler. In addition, the Python Procedure API is provided in the stored procedure, which requires a Python environment. TuGraph does not require special hardware such as GPUs, and can naturally adapt to general hardware upgrades such as RDMA and HBM with high latency and low bandwidth."}),"\n",(0,t.jsx)(a.p,{children:"TuGraph has been tested on CPUs based on X86 and ARM, including Intel, AMD, Kunpeng, Hygon, Feiteng, etc., and also runs on multiple operating systems, including mainstream versions of Ubuntu, CentOS, SUSE, Galaxy Kylin, Zhongbiao Kylin, and UOS, without special requirements for operating systems and CPUs."}),"\n",(0,t.jsx)(a.p,{children:"The software and hardware environment also includes the environment of dependent libraries. Since the default KV storage in TuGraph's storage layer is LMDB, the file system needs to support POSIX interfaces. The compilation and parameter configuration in different environments will be slightly different. For example, in the packaging of point-edge data in graph storage, it should match the page table size of the operating system, which is 4KB by default, and it is recommended to set the system's page table size to 4KB."}),"\n",(0,t.jsx)(a.h2,{id:"2storage-layer",children:"2.Storage layer"}),"\n",(0,t.jsx)(a.p,{children:"In the graph data model, TUGraph supports the attribute graph model, which can be divided into subgraphs, tags (including vertex tags and edge tags), and attributes according to the hierarchy."}),"\n",(0,t.jsx)(a.p,{children:"From the perspective of the storage layer, TuGraph uses an intuitive multi-layered tree model, without tags across subgraphs or attributes across tags, and only retains the core logic of the graph model. In terms of subgraph storage, TuGraph has performed data physical isolation for multiple graphs, and each graph corresponds to an instance of LMDB. The metadata description information of multiple graphs is saved in a special public LMDB instance called meta. The storage of vertex and edge tags and their attributes maps graph data adaptively to KV key-value pairs, maximizing read performance. At the same time, multi-threaded writing is implemented at the KV layer, solving the disadvantage of low write performance of LMDB. Primary key indexes and secondary indexes correspond to B+ tables in LMDB, supporting index value addition, deletion, query, and modification based on comparison."}),"\n",(0,t.jsx)(a.p,{children:"The storage layer also retains some other non-core functional data, including permission data, pre-compiled plugin data, and monitoring data."}),"\n",(0,t.jsx)(a.h2,{id:"3calculation-layer",children:"3.Calculation layer"}),"\n",(0,t.jsx)(a.p,{children:"The calculation layer is divided into three parts in terms of function, including the TP-class graph transaction engine, the AP-class graph analysis engine, and the graph neural network engine."}),"\n",(0,t.jsxs)(a.p,{children:[(0,t.jsx)(a.strong,{children:"The graph transaction engine"})," is mainly used to process concurrent graph operations, including single-point queries, neighbor queries, and path traversal. The graph transaction engine focuses on ACID transactions of concurrent operations, ensuring that the operation logic will not interfere with each other. The main performance indicator is QPS, which is the number of completed queries per second."]}),"\n",(0,t.jsxs)(a.p,{children:[(0,t.jsx)(a.strong,{children:"The graph analysis engine"})," usually operates as a full-graph iteration. Some simple analysis tasks (such as SPSP) can be completed by the graph transaction engine, and complex analysis tasks are completed by the graph analysis engine, which usually takes several seconds to several hours for a single task. Therefore, a single graph analysis task should use all hardware resources in parallel, and the performance indicator is the total time for completing the task."]}),"\n",(0,t.jsxs)(a.p,{children:[(0,t.jsx)(a.strong,{children:"The graph neural network engine"})," usually operates as a full-graph iteration. In addition to graph topology-based operations, the graph neural network engine also needs to integrate a machine learning framework to handle vector operations, such as PyTorch, MXNet, and TenserFlow."]}),"\n",(0,t.jsx)(a.p,{children:"The logic of the three engines is different and independently configured for resource pools. The graph transaction engine sets up a thread pool based on RPC operations. For each operation received from the client, a thread is taken from the pool to process it, and the number of concurrent executions is equal to the capacity of the RPC thread pool, which is usually configured as the number of server cores. The graph analysis engine has an analysis thread pool, and each graph analysis task is executed concurrently, that is, all threads are used to execute a task to speed up the performance of the operation. The serial execution feature of TuGraph graph analysis operations will restrict the user experience to a certain extent. The demand for concurrent graph analysis can be processed by deploying high-availability, increasing machine resources, or connecting to an external task scheduler to transfer data to a container for real-time scheduling and calculation. Graph neural network operations will reuse the resources of the graph transaction"}),"\n",(0,t.jsx)(a.h2,{id:"4core-features",children:"4.Core Features"}),"\n",(0,t.jsx)(a.h3,{id:"41query-language",children:"4.1.Query Language"}),"\n",(0,t.jsx)(a.p,{children:"TuGraph provides Cypher graph query language that follows the OpenCypher standard."}),"\n",(0,t.jsxs)(a.ul,{children:["\n",(0,t.jsx)(a.li,{children:"Supports Procedure embedding."}),"\n",(0,t.jsx)(a.li,{children:"Supports pluggable optimization frameworks with various optimization features."}),"\n",(0,t.jsx)(a.li,{children:"Supports extensible security check framework for Cypher."}),"\n"]}),"\n",(0,t.jsx)(a.h3,{id:"42stored-procedures",children:"4.2.Stored Procedures"}),"\n",(0,t.jsx)(a.p,{children:"When users need to express complex query/update logic that Cypher cannot describe, or when high performance is required, TuGraph's stored procedures (Procedure) is a more concise and efficient choice than calling multiple REST requests and completing the entire processing flow on the client-side."}),"\n",(0,t.jsx)(a.h3,{id:"43data-importexport",children:"4.3.Data Import/Export"}),"\n",(0,t.jsx)(a.p,{children:"Although TuGraph supports data insertion, batch import can greatly improve efficiency. The import function can be divided into importing into an empty database (offline import) and incremental import. The former refers to importing when the subgraph is empty, and the additional assumption can greatly improve the import performance. In TuGraph, the throughput rate of empty database import and incremental import differs by 10 times. Data consistency needs to be considered in data export, which is based on exporting data based on a snapshot."}),"\n",(0,t.jsxs)(a.p,{children:["TuGraph can perform data export on graph data already stored in TuGraph using the command-line tool ",(0,t.jsx)(a.code,{children:"lgraph_export"}),". The export format supports CSV and JSON."]}),"\n",(0,t.jsx)(a.h3,{id:"44backup-and-restore",children:"4.4.Backup and Restore"}),"\n",(0,t.jsx)(a.p,{children:"TuGraph's backup function can be divided into active/scheduled, offline/online, and full/incremental backup. The goal is to complete the backup with the smallest storage and computing costs possible. The Restore function can restore to the latest state or a historical marked time point, ensuring that the database is in a consistent state."}),"\n",(0,t.jsx)(a.h3,{id:"45-data-warmup",children:"4.5 Data Warmup"}),"\n",(0,t.jsx)(a.p,{children:"TuGraph is a disk-based graph database, and data is loaded into memory only when it is accessed. Therefore, system performance may deteriorate due to frequent IO operations in the first period after the server is opened. We can improve this problem by preheating the data in advance."}),"\n",(0,t.jsx)(a.h3,{id:"46-high-availability-mode",children:"4.6 High Availability Mode"}),"\n",(0,t.jsx)(a.p,{children:"High availability means that by configuring a cluster, real-time multi-replica data hot backup can be achieved, and the cluster can still provide services when some replicas are not in use. TuGraph uses the multi-machine hot backup mechanism of the RAFT protocol, which can reduce RPO to near 0. Data synchronization is performed at the computation layer through RPC interfaces for write operations. The high availability cluster of TuGraph adopts a master-slave mode, where only the master node processes write requests, and both master and slave nodes can process read requests. The write request processing of the master node needs to be synchronized to more than half of the total nodes. The write request is considered complete when the majority of the nodes have written successfully."}),"\n",(0,t.jsx)(a.h2,{id:"5client-tools",children:"5.Client Tools"}),"\n",(0,t.jsx)(a.p,{children:"Client Tools Client tools mainly include SDKs for various programming languages, OGM, and command-line tools."}),"\n",(0,t.jsx)(a.p,{children:"The client SDK is mainly used for secondary development and can be linked to the server through RPC or REST protocols. RPC has better performance based on long links, and data needs to be uniformly serialized through protobuf. TuGraph uses brpc, which supports rpc clients in Java, Python, and C++. REST's protocol is more flexible and can be easily adapted to more diverse environments, and different programming languages can easily connect. TuGraph provides a Python REST client instance, and command-line interaction is also implemented using REST."}),"\n",(0,t.jsx)(a.p,{children:"OGM (Object Graph Mapping) is a graph object mapping tool for TuGraph, which supports mapping JAVA objects (POJO) to TuGraph. Classes in JAVA are mapped to nodes in the graph, collections in classes are mapped to edges, and properties of classes are mapped to properties of graph objects. It also provides corresponding function to operate the graph database. Therefore, JAVA developers can easily use TuGraph database in a familiar ecosystem."}),"\n",(0,t.jsxs)(a.p,{children:["The command-line tool ",(0,t.jsx)(a.code,{children:"lgraph_cypher"})," is a query client that can be used to submit OpenCypher requests to the TuGraph server. ",(0,t.jsx)(a.code,{children:"lgraph_cypher"})," client has two execution modes: single-command mode and interactive mode."]}),"\n",(0,t.jsx)(a.h2,{id:"6ecological-tools",children:"6.Ecological Tools"}),"\n",(0,t.jsx)(a.p,{children:"Ecological tools are a crucial component of enterprise-level databases, and a rich array of ecological tools can greatly enhance the usability and stability of graph databases."}),"\n",(0,t.jsx)(a.h3,{id:"61tugraph-datax",children:"6.1.TuGraph DataX"}),"\n",(0,t.jsx)(a.p,{children:(0,t.jsx)(a.img,{alt:"Import&Export",src:n(5018).A+"",width:"1288",height:"404"})}),"\n",(0,t.jsx)(a.p,{children:"TuGraph's core supports importing and exporting CSV and JSON data, offering both full database and incremental importing modes. In practice, there may be a need to import from multiple data sources such as MySQL, Kafka, and Hive, and TuGraph connects to these sources using DataX. Due to the differences between relational and graph models, data cleaning processes can be quickly processed using SparkSQL. TuGraph focuses only on the reliability and performance of simple CSV and JSON scenario imports."}),"\n",(0,t.jsx)(a.h3,{id:"62visual-interaction",children:"6.2.Visual Interaction"}),"\n",(0,t.jsx)(a.p,{children:"TuGraph Browser is a visual interface for direct users of graph databases, covering most of TuGraph's capabilities, including data import, graph model building, data addition/deletion/query/modify, and monitoring and maintenance operations."}),"\n",(0,t.jsx)(a.h3,{id:"63monitoring",children:"6.3.Monitoring"}),"\n",(0,t.jsx)(a.p,{children:"TuGraph uses the Prometheus + Grafana monitoring framework in a loosely coupled manner. Prometheus obtains monitoring information from TuGraph's monitoring interface, stores it in a local time-series database, and then displays it interactively on the web using Grafana."}),"\n",(0,t.jsx)(a.p,{children:"The monitoring states provided by TuGraph include the state of the graph database and the state of the server. The former includes the database-side status such as read/write load and number of vertices/edges, while the latter includes the real-time status of the server's memory, CPU, and hard disk. If some monitoring state exceeds the expected threshold, proactive alerts are necessary, usually requiring integration with other operations and control systems such as group messaging and email alerts."})]})}function h(e={}){const{wrapper:a}={...(0,r.R)(),...e.components};return a?(0,t.jsx)(a,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},5018:(e,a,n)=>{n.d(a,{A:()=>t});const t=n.p+"assets/images/tugraph-datax-0f6f140ea310beb2c90460c3d6d0c08d.png"},8453:(e,a,n)=>{n.d(a,{R:()=>o,x:()=>s});var t=n(6540);const r={},i=t.createContext(r);function o(e){const a=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function s(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(i.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/418c52d8.d2d5a54f.js b/assets/js/418c52d8.36a7ae91.js similarity index 99% rename from assets/js/418c52d8.d2d5a54f.js rename to assets/js/418c52d8.36a7ae91.js index 659b8876d6..e5cebc254f 100644 --- a/assets/js/418c52d8.d2d5a54f.js +++ b/assets/js/418c52d8.36a7ae91.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5932],{7928:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>h,toc:()=>o});var n=i(4848),r=i(8453);const a={},l="TuGraph Built-in Algorithm Description",h={id:"olap&procedure/olap/algorithms",title:"TuGraph Built-in Algorithm Description",description:"This document mainly introduces the TuGraph built-in algorithm program in detail, the community version of 6 algorithms can refer to the basic algorithm newspaper",source:"@site/../docs/en-US/source/9.olap&procedure/2.olap/6.algorithms.md",sourceDirName:"9.olap&procedure/2.olap",slug:"/olap&procedure/olap/algorithms",permalink:"/tugraph-db/en/olap&procedure/olap/algorithms",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:6,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Python Olap API",permalink:"/tugraph-db/en/olap&procedure/olap/python-api"},next:{title:"Learning Tutorial",permalink:"/tugraph-db/en/olap&procedure/learn/tutorial"}},s={},o=[{value:"1.Introduction",id:"1introduction",level:2},{value:"1.1.Basic algorithms:",id:"11basic-algorithms",level:3},{value:"1.2.Extended algorithms:",id:"12extended-algorithms",level:3},{value:"2.Basic algorithms",id:"2basic-algorithms",level:2},{value:"2.1.Breadth-First Search",id:"21breadth-first-search",level:3},{value:"2.2.Pagerank",id:"22pagerank",level:3},{value:"2.3.Single-Source Shortest Path",id:"23single-source-shortest-path",level:3},{value:"2.4.Weakly Connected Components",id:"24weakly-connected-components",level:3},{value:"2.5.Local Clustering Coefficient",id:"25local-clustering-coefficient",level:3},{value:"2.6.Label Propagation Algorithm",id:"26label-propagation-algorithm",level:3},{value:"3.Extended algorithms",id:"3extended-algorithms",level:2},{value:"3.1.All-Pair Shortest Path",id:"31all-pair-shortest-path",level:3},{value:"3.2.Betweenness Centrality",id:"32betweenness-centrality",level:3},{value:"3.3.Belief Propagation",id:"33belief-propagation",level:3},{value:"3.4.Closeness Centrality",id:"34closeness-centrality",level:3},{value:"3.5.Common Neighborhood",id:"35common-neighborhood",level:3},{value:"3.6.Degree Correlation",id:"36degree-correlation",level:3},{value:"3.7.Dimension Estimation",id:"37dimension-estimation",level:3},{value:"3.8.EgoNet",id:"38egonet",level:3},{value:"3.9.Hyperlink-Induced Topic Search",id:"39hyperlink-induced-topic-search",level:3},{value:"3.10.Jaccard Index",id:"310jaccard-index",level:3},{value:"3.11.K-core",id:"311k-core",level:3},{value:"3.12.Louvain",id:"312louvain",level:3},{value:"3.13.Multiple-source Shortest Paths",id:"313multiple-source-shortest-paths",level:3},{value:"3.14.Personalized PageRank",id:"314personalized-pagerank",level:3},{value:"3.15.Strongly Connected Components",id:"315strongly-connected-components",level:3},{value:"3.16.Speaker-listener Label Propagation Algorithm",id:"316speaker-listener-label-propagation-algorithm",level:3},{value:"3.17.Single-Pair Shortest Path",id:"317single-pair-shortest-path",level:3},{value:"3.18.Triangle Counting",id:"318triangle-counting",level:3},{value:"3.19.Trustrank",id:"319trustrank",level:3},{value:"3.20.Weighted Label Propagation Algorithm",id:"320weighted-label-propagation-algorithm",level:3},{value:"3.21.Weighted Pagerank Algorithm",id:"321weighted-pagerank-algorithm",level:3},{value:"3.22.Maximal independent set",id:"322maximal-independent-set",level:3},{value:"3.23.Sybil Rank",id:"323sybil-rank",level:3},{value:"3.24.Subgraph Isomorphism",id:"324subgraph-isomorphism",level:3},{value:"3.25.Motif",id:"325motif",level:3},{value:"3.26.Kcliques",id:"326kcliques",level:3},{value:"3.27.Ktruss",id:"327ktruss",level:3},{value:"3.28.Leiden",id:"328leiden",level:3}];function c(e){const t={a:"a",blockquote:"blockquote",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"tugraph-built-in-algorithm-description",children:"TuGraph Built-in Algorithm Description"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"This document mainly introduces the TuGraph built-in algorithm program in detail, the community version of 6 algorithms can refer to the basic algorithm newspaper"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,n.jsx)(t.p,{children:"TuGraph currently contains the following 6 basic algorithms and 28 extended algorithms, a total of 34 graph algorithms:"}),"\n",(0,n.jsx)(t.h3,{id:"11basic-algorithms",children:"1.1.Basic algorithms:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Algorithm name"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"The program name"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Breadth-First Search"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"bfs"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Pagerank"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"pagerank"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Single-Source Shortest Path"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"sssp"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Weakly Connected Components"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"wcc"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Local Clustering Coefficient"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"lcc"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Label Propagation Algorithm"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"lpa"})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"12extended-algorithms",children:"1.2.Extended algorithms:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Algorithm name"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"The program name"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"All-Pair Shortest Path"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"apsp"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Betweenness Centrality"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"bc"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Belief Propagation"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"bp"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Closeness Centrality"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"clce"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Common Neighborhood"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"cn"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Degree Correlation"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"dc"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Dimension Estimation"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"de"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"EgoNet"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"en"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Hyperlink-Induced Topic Search"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"hits"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Jaccard Index"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"ji"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"K-core"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"kcore"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Louvain"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"louvain"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Multiple-source Shortest Paths"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"mssp"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Personalized PageRank"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"ppr"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Strongly Connected Components"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"scc"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Speaker-listener Label Propagation Algorithm"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"slpa"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Single-Pair Shortest Path"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"spsp"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Triangle Counting"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"triangle"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Trustrank"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"trustrank"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Weighted Label Propagation Algorithm"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"wlpa"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Weighted Pagerank Algorithm"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"wpagerank"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Maximal independent set"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"mis"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Sybil Rank"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"sybilrank"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Subgraph Isomorphism"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"subgraph_isomorphism"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Motif"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"motif"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Kcliques"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"kcliques"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Ktruss"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"ktruss"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Leiden"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"leiden"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"2basic-algorithms",children:"2.Basic algorithms"}),"\n",(0,n.jsx)(t.h3,{id:"21breadth-first-search",children:"2.1.Breadth-First Search"}),"\n",(0,n.jsxs)(t.p,{children:["Breadth first Search implements the Breadth-first Search algorithm, which starts from the root vertex and traverses all accessible vertices along the width of the graph. Returns the number of vertices traversed. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Breadth-first_search",title:"bfs wiki",children:"https://en.wikipedia.org/wiki/Breadth-first_search"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"22pagerank",children:"2.2.Pagerank"}),"\n",(0,n.jsxs)(t.p,{children:["Web page sorting program to achieve the commonly used Pagerank algorithm. The algorithm calculates the importance ranking of all vertices according to the edge and edge weight in the graph. The higher the PageRank value, the higher the importance of the vertex in the graph. The reciprocal of the number of vertices is used as the initial Rank value of each vertex, and then the Rank value of the vertices is transferred to the adjacent vertices on average according to the outgoing edges, and the transfer process is repeated until the given convergence threshold is met or the given number of iterations is reached. At the end of each pass round, a certain proportion of the Rank values of all vertices will be randomly transferred to any vertex. Please refer to the algorithm content ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/PageRank",title:"pagerank wiki",children:"https://en.wikipedia.org/wiki/PageRank"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"23single-source-shortest-path",children:"2.3.Single-Source Shortest Path"}),"\n",(0,n.jsxs)(t.p,{children:["The Single Source Shortest Path algorithm realizes the Single Source Shortest Path algorithm. It calculates the shortest path length from a given source vertex to any other vertex. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Shortest_path_problem",title:"shortest path wiki",children:"https://en.wikipedia.org/wiki/Shortest_path_problem"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"24weakly-connected-components",children:"2.4.Weakly Connected Components"}),"\n",(0,n.jsxs)(t.p,{children:["The program of Weakly Connected Components has implemented the algorithm. It can calculate all the weakly connected components in the graph. A weakly connected component is a subgraph of a graph in which reachable paths exist between any two points. Please refer to the algorithm content",(0,n.jsxs)(t.a,{href:"https://en.wikipedia.org/wiki/Connected_component_(graph_theory)",title:"scc wiki",children:["https://en.wikipedia.org/wiki/Connected",(0,n.jsx)(t.em,{children:"component"}),"(graph_theory)"]}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"25local-clustering-coefficient",children:"2.5.Local Clustering Coefficient"}),"\n",(0,n.jsxs)(t.p,{children:["The average Clustering Coefficient program implements the Local Clustering Coefficient algorithm to calculate the coefficient of the degree of clustering between vertices in the graph. The returned results include the overall clustering coefficient and the vertex clustering coefficient. The overall agglomeration coefficient reflects the evaluation of the overall agglomeration degree in the graph, and the vertex agglomeration coefficient includes the agglomeration coefficient of any vertex, which reflects the agglomeration degree near the vertex. The higher the agglomeration coefficient, the higher the agglomeration degree. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Clustering_coefficient",title:"lcc wiki",children:"https://en.wikipedia.org/wiki/Clustering_coefficient"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"26label-propagation-algorithm",children:"2.6.Label Propagation Algorithm"}),"\n",(0,n.jsxs)(t.p,{children:["The program implements Label Propagation Algorithm. This algorithm is a community discovery algorithm based on tag propagation and computes unauthorised graphs. In label passing, each vertex adds up all the labels received, and randomly selects one of the labels with the highest sum. The iteration converges or the algorithm terminates after a given number of rounds. The final output is a label for each vertex, and vertices with the same label value are considered to be in the same community. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Label_Propagation_Algorithm",title:"lpa wiki",children:"https://en.wikipedia.org/wiki/Label_Propagation_Algorithm"}),"\u3002"]}),"\n",(0,n.jsx)(t.h2,{id:"3extended-algorithms",children:"3.Extended algorithms"}),"\n",(0,n.jsx)(t.h3,{id:"31all-pair-shortest-path",children:"3.1.All-Pair Shortest Path"}),"\n",(0,n.jsxs)(t.p,{children:["The All-Pair Shortest Path program realizes the all-pair Shortest Path algorithm and calculates the shortest path between any two points in the graph. Returns the shortest path length between any pair of vertices where the path exists. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Floyd-Warshall_algorithm",title:"Floyd-Warshall algorighm wiki",children:"https://en.wikipedia.org/wiki/Floyd-Warshall_algorithm"})]}),"\n",(0,n.jsx)(t.h3,{id:"32betweenness-centrality",children:"3.2.Betweenness Centrality"}),"\n",(0,n.jsxs)(t.p,{children:["Betweenness Centrality algorithm is implemented in Betweenness centrality program to estimate the betweenness centrality value of all vertices in a graph. The value of intermediate centrality reflects the possibility that any shortest path in the graph passes through the vertex, and the higher the value, the more shortest paths pass through the vertex. During calculation, the number of sampling points should be given, and the calculation should be carried out based on these sampling points. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Betweenness_centrality",title:"bc wiki",children:"https://en.wikipedia.org/wiki/Betweenness_centrality"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"33belief-propagation",children:"3.3.Belief Propagation"}),"\n",(0,n.jsxs)(t.p,{children:["The Belief Propagation algorithm is implemented in the confidence propagation program. Given the edge distribution of the observed vertices, the algorithm estimates the edge distribution of the unobserved vertices by using the mechanism of passing messages among vertices. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Belief_propagation",children:"https://en.wikipedia.org/wiki/Belief_propagation"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"34closeness-centrality",children:"3.4.Closeness Centrality"}),"\n",(0,n.jsxs)(t.p,{children:["The Distance Centrality program implements the Closeness Centrality algorithm, which estimates the average shortest path length from any node to other nodes in the graph. A smaller distance centrality value indicates that the node has a smaller average shortest distance to other nodes, meaning it is more centrally located in the graph from a geometric perspective. The calculation requires specifying the number of sampling points, and the algorithm computes the centrality values for each of these sampling points. For the algorithm content, please refer to ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Closeness_centrality",title:"clce wiki",children:"https://en.wikipedia.org/wiki/Closeness_centrality"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"35common-neighborhood",children:"3.5.Common Neighborhood"}),"\n",(0,n.jsx)(t.p,{children:"The Common Neighborhood program implements the common Neighborhood algorithm to count the number of common neighbors between any given pair of neighboring vertices. Given several pairs of vertices to be queried, the result is the number of common neighbors of any pair of vertices to be queried."}),"\n",(0,n.jsx)(t.h3,{id:"36degree-correlation",children:"3.6.Degree Correlation"}),"\n",(0,n.jsxs)(t.p,{children:["The Degree Correlation algorithm is implemented in the degree correlation program. It calculates the degree correlation degree of a graph by calculating the Pearson correlation coefficient between any adjacent vertex pairs, which can be used to characterize the correlation degree between high-degree vertices in the graph. A higher degree of correlation indicates a higher degree of correlation between vertices of higher degree in the graph. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Pearson_correlation_coefficient",title:"dc wiki",children:"https://en.wikipedia.org/wiki/Pearson_correlation_coefficient"})]}),"\n",(0,n.jsx)(t.h3,{id:"37dimension-estimation",children:"3.7.Dimension Estimation"}),"\n",(0,n.jsxs)(t.p,{children:["The diameter Estimation program implements the Dimension Estimation algorithm. The algorithm calculates the length of the longest shortest path in the graph, which is used to characterize the diameter of the graph. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"http://mathworld.wolfram.com/GraphDiameter.html",title:"graph diameter",children:"http://mathworld.wolfram.com/GraphDiameter.html"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"38egonet",children:"3.8.EgoNet"}),"\n",(0,n.jsx)(t.p,{children:"The EgoNet algorithm requires a given root vertex and K value, and takes the root vertex as the source vertex to conduct a width-first search to find the subgraph composed of all neighbors within K degrees. The found subgraph is called the EgoNet of the root vertex."}),"\n",(0,n.jsx)(t.h3,{id:"39hyperlink-induced-topic-search",children:"3.9.Hyperlink-Induced Topic Search"}),"\n",(0,n.jsxs)(t.p,{children:["The Hyperlink Topic Search algorithm implements the Hyperlink-induced topic search algorithm, which assumes that each vertex has two attributes: Authority and Hub. A good hub vertex should point to many vertices with high authority. And a good authority vertex should be pointed to by many vertices of high pivot type. The algorithm returns the authority value and the hub value for each vertex. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/HITS_algorithm",title:"HITS algorithm",children:"https://en.wikipedia.org/wiki/HITS_algorithm"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"310jaccard-index",children:"3.10.Jaccard Index"}),"\n",(0,n.jsxs)(t.p,{children:["The Jaccard coefficient program implements the Jaccard Index algorithm. The algorithm calculates the Jaccard coefficient between a given pair of vertices, which can be used to represent the similarity of the two vertices. A higher Jaccard coefficient indicates a higher degree of similarity between pairs of vertices. Given several pairs of vertices with the query, the Jaccard coefficients of these pairs are returned. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Jaccard_index",title:"ji wiki",children:"https://en.wikipedia.org/wiki/Jaccard_index"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"311k-core",children:"3.11.K-core"}),"\n",(0,n.jsxs)(t.p,{children:["k accounting method implements k-core algorithm. The algorithm computes the number of kernels of all vertices, or finds all K-nucleon graphs in the graph. K-nucleon graph is a special subgraph in which the degree of any vertex is not less than a given K value. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Degeneracy_(graph_theory)",title:"kcore wiki",children:"https://en.wikipedia.org/wiki/Degeneracy_(graph_theory)"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"312louvain",children:"3.12.Louvain"}),"\n",(0,n.jsxs)(t.p,{children:["The Louvain community discovery program implements the Fast-unfolding algorithm. The algorithm is a community discovery algorithm based on modularity. It maximizes the modularity of the graph by constantly merging vertex communities, and can discover the hierarchical community structure. Please refer to the algorithm content ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Louvain_Modularity",title:"louvain modularity wiki",children:"https://en.wikipedia.org/wiki/Louvain_Modularity"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"313multiple-source-shortest-paths",children:"3.13.Multiple-source Shortest Paths"}),"\n",(0,n.jsxs)(t.p,{children:["The multisource Shortest Paths program implements the multiple-source Shortest Paths algorithm to calculate the shortest path value to any vertex from the given Multiple source vertices. Where, the shortest path value of multiple source vertices to a vertex is the minimum value of the shortest path from each source vertex to the vertex. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Shortest_path_problem",title:"shortest path wiki",children:"https://en.wikipedia.org/wiki/Shortest_path_problem"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"314personalized-pagerank",children:"3.14.Personalized PageRank"}),"\n",(0,n.jsxs)(t.p,{children:["Personalized web ranking program has Personalized PageRank algorithm. According to the given source vertex, the algorithm calculates the importance ranking of all vertices to the source vertex based on the source vertex. The higher the Rank value, the more important the vertex is to the source vertex. Unlike PageRank, the source vertex Rank value is 1, the rest of the vertex Rank value is 0; And a certain proportion of Rank value will be immediately transferred back to the source vertex after each round of transmission. Please refer to the algorithm content ",(0,n.jsx)(t.a,{href:"https://cs.stanford.edu/people/plofgren/Fast-PPR_KDD_Talk.pdf",children:"https://cs.stanford.edu/people/plofgren/Fast-PPR_KDD_Talk.pdf"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"315strongly-connected-components",children:"3.15.Strongly Connected Components"}),"\n",(0,n.jsxs)(t.p,{children:["Strongly Connected component program realizes the Strongly Connected Components algorithm. The algorithm computes all strongly connected components of the graph, which is a subgraph of the graph that can start from any vertex to any other vertex. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Strongly_connected_component",title:"scc wiki",children:"https://en.wikipedia.org/wiki/Strongly_connected_component"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"316speaker-listener-label-propagation-algorithm",children:"3.16.Speaker-listener Label Propagation Algorithm"}),"\n",(0,n.jsx)(t.p,{children:"The program realizes the Speaker-listener Label Propagation Algorithm. This algorithm is a community discovery algorithm based on tag propagation and historical tag record, which is an extension of tag propagation algorithm. Different from the label propagation algorithm, this algorithm records the historical labels of all vertices. When the labels are accumulated in the iteration, the historical labels are also counted. The final output is all the historical label records for each vertex. Please refer to the paper for the algorithm content:\u201cSLPA: Uncovering Overlapping Communities in Social Networks via a Speaker-Listener Interaction Dynamic Process\u201d\u3002"}),"\n",(0,n.jsx)(t.h3,{id:"317single-pair-shortest-path",children:"3.17.Single-Pair Shortest Path"}),"\n",(0,n.jsxs)(t.p,{children:["The program of the shortest path between two points implements the Bidirectional point-first Search algorithm. It searches forward width First along the outgoing edge from the starting point and reverse width first along the incoming edge from the end point on the directed undirected graph. The shortest path length from the starting point to the ending point is determined by traversing the vertices of the starting point and the ending point together. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Bidirectional_search",title:"Bidirectional search",children:"https://en.wikipedia.org/wiki/Bidirectional_search"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"318triangle-counting",children:"3.18.Triangle Counting"}),"\n",(0,n.jsx)(t.p,{children:'The Triangle-counting algorithm is implemented to calculate the number of triangles in an undirected graph, which can be used to characterize the correlation degree of the vertices in the graph. The higher the number of triangles, the higher the degree of correlation of the vertices in the graph. For the algorithm content, please refer to the paper, "Finding, Counting and Listing All Triangles in Large Graphs, an Experimental Study".'}),"\n",(0,n.jsx)(t.h3,{id:"319trustrank",children:"3.19.Trustrank"}),"\n",(0,n.jsxs)(t.p,{children:["The Trust Index Sorting Algorithm implements the Trustrank algorithm, which can calculate the Trust Index of any vertex based on a given whitelist. The higher the trust score, the less likely the vertex is to be illegal. Please refer to the algorithm content for details. ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/TrustRank",title:"trustrank wiki",children:"https://en.wikipedia.org/wiki/TrustRank"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"320weighted-label-propagation-algorithm",children:"3.20.Weighted Label Propagation Algorithm"}),"\n",(0,n.jsxs)(t.p,{children:["Weighted Label Propagation Algorithm is implemented in the program. = Different from the label propagation algorithm, the label transmission is related to the weight of the edge. During label transmission, the weight of each vertex will be accumulated according to the incoming edge of the label, and the label with the highest sum will be randomly selected. Please refer to the algorithm content ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Label_Propagation_Algorithm",title:"lpa wiki",children:"https://en.wikipedia.org/wiki/Label_Propagation_Algorithm"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"321weighted-pagerank-algorithm",children:"3.21.Weighted Pagerank Algorithm"}),"\n",(0,n.jsxs)(t.p,{children:["Weighted Pagerank is implemented in the weighted Pagerank algorithm. Different from PageRank algorithm, the transfer of Rank value is related to the weight of the edge. The Rank value of the vertex will be transferred to the adjacent vertices according to the weight of the edge. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/PageRank",children:"https://en.wikipedia.org/wiki/PageRank"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"322maximal-independent-set",children:"3.22.Maximal independent set"}),"\n",(0,n.jsxs)(t.p,{children:["Maximal independent set algorithm implements Maximal Independent Set algorithm. A maximum independent set means that there are no vertices outside the independent set that can join it. A graph may have many MIS that vary greatly in size, and the algorithm finds one of them. Please refer to the algorithm content ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Maximal_independent_set#Sequential_algorithm",title:"Maximal independent set wiki",children:"https://en.wikipedia.org/wiki/Maximal_independent_set#Sequential_algorithm"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"323sybil-rank",children:"3.23.Sybil Rank"}),"\n",(0,n.jsx)(t.p,{children:"Sybil detection algorithm implements Sybil Rank algorithm. The SybilRank algorithm starts from non-Sybil nodes and performs a random walk with premature termination. Please refer to the paper for the algorithm content:\u201cAiding the Detection of Fake Accounts in Large Scale Social Online Services\u201d\u3002"}),"\n",(0,n.jsx)(t.h3,{id:"324subgraph-isomorphism",children:"3.24.Subgraph Isomorphism"}),"\n",(0,n.jsxs)(t.p,{children:["The subgraph matching algorithm implements the subgraph_isomorphism algorithm. The subgraph_isomorphism algorithm matches all nodes in the whole graph and outputs the number of times each node is matched. Algorithm Content Reference ",(0,n.jsx)(t.a,{href:"https://www.jsjkx.com/CN/article/openArticlePDF.jsp?id=18105",children:"https://www.jsjkx.com/CN/article/openArticlePDF.jsp?id=18105"})]}),"\n",(0,n.jsx)(t.h3,{id:"325motif",children:"3.25.Motif"}),"\n",(0,n.jsxs)(t.p,{children:["Pattern matching algorithm implements motif algorithm. motif algorithm matches k-order subgraphs for the specified nodes, and finally outputs the number of each kind of K-order subgraphs for each specified node. Each K-order subgraph is represented by a 64-bit integer, and the $i \\times k + j$bit is 1, indicating that there is an edge i->j in the subgraph. Algorithm Content Reference ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Network_motif#mfinder",children:"https://en.wikipedia.org/wiki/Network_motif#mfinder"})]}),"\n",(0,n.jsx)(t.h3,{id:"326kcliques",children:"3.26.Kcliques"}),"\n",(0,n.jsxs)(t.p,{children:["The K-order clique counting algorithm implements the k-cliques algorithm. The k-cliques algorithm calculates the number of all K-order complete subgraphs in the graph, and finally outputs the number of k-order complete subgraphs of each node. Algorithm Content Reference ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Clique_problem#Cliques_of_fixed_size",children:"https://en.wikipedia.org/wiki/Clique_problem#Cliques_of_fixed_size"})]}),"\n",(0,n.jsx)(t.h3,{id:"327ktruss",children:"3.27.Ktruss"}),"\n",(0,n.jsxs)(t.p,{children:["The k-order truss counting algorithm implements the k-truss algorithm. A k-truss is a subgraph in which each edge is the edge of at least k-2 triangles. The k-truss algorithm finds out the k-truss subgraph of the graph, and finally outputs the neighbor node list of each node in the subgraph. Algorithm Content Reference",(0,n.jsx)(t.a,{href:"https://louridas.github.io/rwa/assignments/finding-trusses/",children:"https://louridas.github.io/rwa/assignments/finding-trusses/"})]}),"\n",(0,n.jsx)(t.h3,{id:"328leiden",children:"3.28.Leiden"}),"\n",(0,n.jsxs)(t.p,{children:["Leiden algorithm implements Leiden's algorithm. leiden algorithm is a community discovery algorithm based on modularity. Compared with louvain algorithm, leiden algorithm has the advantage that Leiden algorithm detects the broken links in the community to ensure that each community has good connectivity. Algorithm Content Reference ",(0,n.jsx)(t.a,{href:"https://www.nature.com/articles/s41598-019-41695-z#Sec4",children:"https://www.nature.com/articles/s41598-019-41695-z#Sec4"})]})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>l,x:()=>h});var n=i(6540);const r={},a=n.createContext(r);function l(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function h(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5932],{7928:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>h,toc:()=>o});var n=i(4848),r=i(8453);const a={},l="TuGraph Built-in Algorithm Description",h={id:"olap&procedure/olap/algorithms",title:"TuGraph Built-in Algorithm Description",description:"This document mainly introduces the TuGraph built-in algorithm program in detail, the community version of 6 algorithms can refer to the basic algorithm newspaper",source:"@site/../docs/en-US/source/9.olap&procedure/2.olap/6.algorithms.md",sourceDirName:"9.olap&procedure/2.olap",slug:"/olap&procedure/olap/algorithms",permalink:"/tugraph-db/en/olap&procedure/olap/algorithms",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:6,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Python Olap API",permalink:"/tugraph-db/en/olap&procedure/olap/python-api"},next:{title:"Learning Tutorial",permalink:"/tugraph-db/en/olap&procedure/learn/tutorial"}},s={},o=[{value:"1.Introduction",id:"1introduction",level:2},{value:"1.1.Basic algorithms:",id:"11basic-algorithms",level:3},{value:"1.2.Extended algorithms:",id:"12extended-algorithms",level:3},{value:"2.Basic algorithms",id:"2basic-algorithms",level:2},{value:"2.1.Breadth-First Search",id:"21breadth-first-search",level:3},{value:"2.2.Pagerank",id:"22pagerank",level:3},{value:"2.3.Single-Source Shortest Path",id:"23single-source-shortest-path",level:3},{value:"2.4.Weakly Connected Components",id:"24weakly-connected-components",level:3},{value:"2.5.Local Clustering Coefficient",id:"25local-clustering-coefficient",level:3},{value:"2.6.Label Propagation Algorithm",id:"26label-propagation-algorithm",level:3},{value:"3.Extended algorithms",id:"3extended-algorithms",level:2},{value:"3.1.All-Pair Shortest Path",id:"31all-pair-shortest-path",level:3},{value:"3.2.Betweenness Centrality",id:"32betweenness-centrality",level:3},{value:"3.3.Belief Propagation",id:"33belief-propagation",level:3},{value:"3.4.Closeness Centrality",id:"34closeness-centrality",level:3},{value:"3.5.Common Neighborhood",id:"35common-neighborhood",level:3},{value:"3.6.Degree Correlation",id:"36degree-correlation",level:3},{value:"3.7.Dimension Estimation",id:"37dimension-estimation",level:3},{value:"3.8.EgoNet",id:"38egonet",level:3},{value:"3.9.Hyperlink-Induced Topic Search",id:"39hyperlink-induced-topic-search",level:3},{value:"3.10.Jaccard Index",id:"310jaccard-index",level:3},{value:"3.11.K-core",id:"311k-core",level:3},{value:"3.12.Louvain",id:"312louvain",level:3},{value:"3.13.Multiple-source Shortest Paths",id:"313multiple-source-shortest-paths",level:3},{value:"3.14.Personalized PageRank",id:"314personalized-pagerank",level:3},{value:"3.15.Strongly Connected Components",id:"315strongly-connected-components",level:3},{value:"3.16.Speaker-listener Label Propagation Algorithm",id:"316speaker-listener-label-propagation-algorithm",level:3},{value:"3.17.Single-Pair Shortest Path",id:"317single-pair-shortest-path",level:3},{value:"3.18.Triangle Counting",id:"318triangle-counting",level:3},{value:"3.19.Trustrank",id:"319trustrank",level:3},{value:"3.20.Weighted Label Propagation Algorithm",id:"320weighted-label-propagation-algorithm",level:3},{value:"3.21.Weighted Pagerank Algorithm",id:"321weighted-pagerank-algorithm",level:3},{value:"3.22.Maximal independent set",id:"322maximal-independent-set",level:3},{value:"3.23.Sybil Rank",id:"323sybil-rank",level:3},{value:"3.24.Subgraph Isomorphism",id:"324subgraph-isomorphism",level:3},{value:"3.25.Motif",id:"325motif",level:3},{value:"3.26.Kcliques",id:"326kcliques",level:3},{value:"3.27.Ktruss",id:"327ktruss",level:3},{value:"3.28.Leiden",id:"328leiden",level:3}];function c(e){const t={a:"a",blockquote:"blockquote",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"tugraph-built-in-algorithm-description",children:"TuGraph Built-in Algorithm Description"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"This document mainly introduces the TuGraph built-in algorithm program in detail, the community version of 6 algorithms can refer to the basic algorithm newspaper"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,n.jsx)(t.p,{children:"TuGraph currently contains the following 6 basic algorithms and 28 extended algorithms, a total of 34 graph algorithms:"}),"\n",(0,n.jsx)(t.h3,{id:"11basic-algorithms",children:"1.1.Basic algorithms:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Algorithm name"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"The program name"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Breadth-First Search"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"bfs"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Pagerank"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"pagerank"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Single-Source Shortest Path"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"sssp"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Weakly Connected Components"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"wcc"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Local Clustering Coefficient"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"lcc"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Label Propagation Algorithm"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"lpa"})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"12extended-algorithms",children:"1.2.Extended algorithms:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Algorithm name"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"The program name"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"All-Pair Shortest Path"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"apsp"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Betweenness Centrality"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"bc"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Belief Propagation"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"bp"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Closeness Centrality"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"clce"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Common Neighborhood"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"cn"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Degree Correlation"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"dc"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Dimension Estimation"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"de"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"EgoNet"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"en"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Hyperlink-Induced Topic Search"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"hits"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Jaccard Index"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"ji"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"K-core"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"kcore"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Louvain"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"louvain"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Multiple-source Shortest Paths"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"mssp"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Personalized PageRank"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"ppr"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Strongly Connected Components"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"scc"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Speaker-listener Label Propagation Algorithm"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"slpa"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Single-Pair Shortest Path"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"spsp"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Triangle Counting"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"triangle"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Trustrank"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"trustrank"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Weighted Label Propagation Algorithm"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"wlpa"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Weighted Pagerank Algorithm"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"wpagerank"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Maximal independent set"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"mis"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Sybil Rank"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"sybilrank"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Subgraph Isomorphism"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"subgraph_isomorphism"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Motif"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"motif"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Kcliques"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"kcliques"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Ktruss"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"ktruss"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Leiden"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"leiden"})]})]})]}),"\n",(0,n.jsx)(t.h2,{id:"2basic-algorithms",children:"2.Basic algorithms"}),"\n",(0,n.jsx)(t.h3,{id:"21breadth-first-search",children:"2.1.Breadth-First Search"}),"\n",(0,n.jsxs)(t.p,{children:["Breadth first Search implements the Breadth-first Search algorithm, which starts from the root vertex and traverses all accessible vertices along the width of the graph. Returns the number of vertices traversed. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Breadth-first_search",title:"bfs wiki",children:"https://en.wikipedia.org/wiki/Breadth-first_search"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"22pagerank",children:"2.2.Pagerank"}),"\n",(0,n.jsxs)(t.p,{children:["Web page sorting program to achieve the commonly used Pagerank algorithm. The algorithm calculates the importance ranking of all vertices according to the edge and edge weight in the graph. The higher the PageRank value, the higher the importance of the vertex in the graph. The reciprocal of the number of vertices is used as the initial Rank value of each vertex, and then the Rank value of the vertices is transferred to the adjacent vertices on average according to the outgoing edges, and the transfer process is repeated until the given convergence threshold is met or the given number of iterations is reached. At the end of each pass round, a certain proportion of the Rank values of all vertices will be randomly transferred to any vertex. Please refer to the algorithm content ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/PageRank",title:"pagerank wiki",children:"https://en.wikipedia.org/wiki/PageRank"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"23single-source-shortest-path",children:"2.3.Single-Source Shortest Path"}),"\n",(0,n.jsxs)(t.p,{children:["The Single Source Shortest Path algorithm realizes the Single Source Shortest Path algorithm. It calculates the shortest path length from a given source vertex to any other vertex. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Shortest_path_problem",title:"shortest path wiki",children:"https://en.wikipedia.org/wiki/Shortest_path_problem"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"24weakly-connected-components",children:"2.4.Weakly Connected Components"}),"\n",(0,n.jsxs)(t.p,{children:["The program of Weakly Connected Components has implemented the algorithm. It can calculate all the weakly connected components in the graph. A weakly connected component is a subgraph of a graph in which reachable paths exist between any two points. Please refer to the algorithm content",(0,n.jsxs)(t.a,{href:"https://en.wikipedia.org/wiki/Connected_component_(graph_theory)",title:"scc wiki",children:["https://en.wikipedia.org/wiki/Connected",(0,n.jsx)(t.em,{children:"component"}),"(graph_theory)"]}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"25local-clustering-coefficient",children:"2.5.Local Clustering Coefficient"}),"\n",(0,n.jsxs)(t.p,{children:["The average Clustering Coefficient program implements the Local Clustering Coefficient algorithm to calculate the coefficient of the degree of clustering between vertices in the graph. The returned results include the overall clustering coefficient and the vertex clustering coefficient. The overall agglomeration coefficient reflects the evaluation of the overall agglomeration degree in the graph, and the vertex agglomeration coefficient includes the agglomeration coefficient of any vertex, which reflects the agglomeration degree near the vertex. The higher the agglomeration coefficient, the higher the agglomeration degree. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Clustering_coefficient",title:"lcc wiki",children:"https://en.wikipedia.org/wiki/Clustering_coefficient"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"26label-propagation-algorithm",children:"2.6.Label Propagation Algorithm"}),"\n",(0,n.jsxs)(t.p,{children:["The program implements Label Propagation Algorithm. This algorithm is a community discovery algorithm based on tag propagation and computes unauthorised graphs. In label passing, each vertex adds up all the labels received, and randomly selects one of the labels with the highest sum. The iteration converges or the algorithm terminates after a given number of rounds. The final output is a label for each vertex, and vertices with the same label value are considered to be in the same community. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Label_Propagation_Algorithm",title:"lpa wiki",children:"https://en.wikipedia.org/wiki/Label_Propagation_Algorithm"}),"\u3002"]}),"\n",(0,n.jsx)(t.h2,{id:"3extended-algorithms",children:"3.Extended algorithms"}),"\n",(0,n.jsx)(t.h3,{id:"31all-pair-shortest-path",children:"3.1.All-Pair Shortest Path"}),"\n",(0,n.jsxs)(t.p,{children:["The All-Pair Shortest Path program realizes the all-pair Shortest Path algorithm and calculates the shortest path between any two points in the graph. Returns the shortest path length between any pair of vertices where the path exists. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Floyd-Warshall_algorithm",title:"Floyd-Warshall algorighm wiki",children:"https://en.wikipedia.org/wiki/Floyd-Warshall_algorithm"})]}),"\n",(0,n.jsx)(t.h3,{id:"32betweenness-centrality",children:"3.2.Betweenness Centrality"}),"\n",(0,n.jsxs)(t.p,{children:["Betweenness Centrality algorithm is implemented in Betweenness centrality program to estimate the betweenness centrality value of all vertices in a graph. The value of intermediate centrality reflects the possibility that any shortest path in the graph passes through the vertex, and the higher the value, the more shortest paths pass through the vertex. During calculation, the number of sampling points should be given, and the calculation should be carried out based on these sampling points. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Betweenness_centrality",title:"bc wiki",children:"https://en.wikipedia.org/wiki/Betweenness_centrality"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"33belief-propagation",children:"3.3.Belief Propagation"}),"\n",(0,n.jsxs)(t.p,{children:["The Belief Propagation algorithm is implemented in the confidence propagation program. Given the edge distribution of the observed vertices, the algorithm estimates the edge distribution of the unobserved vertices by using the mechanism of passing messages among vertices. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Belief_propagation",children:"https://en.wikipedia.org/wiki/Belief_propagation"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"34closeness-centrality",children:"3.4.Closeness Centrality"}),"\n",(0,n.jsxs)(t.p,{children:["The Distance Centrality program implements the Closeness Centrality algorithm, which estimates the average shortest path length from any node to other nodes in the graph. A smaller distance centrality value indicates that the node has a smaller average shortest distance to other nodes, meaning it is more centrally located in the graph from a geometric perspective. The calculation requires specifying the number of sampling points, and the algorithm computes the centrality values for each of these sampling points. For the algorithm content, please refer to ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Closeness_centrality",title:"clce wiki",children:"https://en.wikipedia.org/wiki/Closeness_centrality"}),"."]}),"\n",(0,n.jsx)(t.h3,{id:"35common-neighborhood",children:"3.5.Common Neighborhood"}),"\n",(0,n.jsx)(t.p,{children:"The Common Neighborhood program implements the common Neighborhood algorithm to count the number of common neighbors between any given pair of neighboring vertices. Given several pairs of vertices to be queried, the result is the number of common neighbors of any pair of vertices to be queried."}),"\n",(0,n.jsx)(t.h3,{id:"36degree-correlation",children:"3.6.Degree Correlation"}),"\n",(0,n.jsxs)(t.p,{children:["The Degree Correlation algorithm is implemented in the degree correlation program. It calculates the degree correlation degree of a graph by calculating the Pearson correlation coefficient between any adjacent vertex pairs, which can be used to characterize the correlation degree between high-degree vertices in the graph. A higher degree of correlation indicates a higher degree of correlation between vertices of higher degree in the graph. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Pearson_correlation_coefficient",title:"dc wiki",children:"https://en.wikipedia.org/wiki/Pearson_correlation_coefficient"})]}),"\n",(0,n.jsx)(t.h3,{id:"37dimension-estimation",children:"3.7.Dimension Estimation"}),"\n",(0,n.jsxs)(t.p,{children:["The diameter Estimation program implements the Dimension Estimation algorithm. The algorithm calculates the length of the longest shortest path in the graph, which is used to characterize the diameter of the graph. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"http://mathworld.wolfram.com/GraphDiameter.html",title:"graph diameter",children:"http://mathworld.wolfram.com/GraphDiameter.html"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"38egonet",children:"3.8.EgoNet"}),"\n",(0,n.jsx)(t.p,{children:"The EgoNet algorithm requires a given root vertex and K value, and takes the root vertex as the source vertex to conduct a width-first search to find the subgraph composed of all neighbors within K degrees. The found subgraph is called the EgoNet of the root vertex."}),"\n",(0,n.jsx)(t.h3,{id:"39hyperlink-induced-topic-search",children:"3.9.Hyperlink-Induced Topic Search"}),"\n",(0,n.jsxs)(t.p,{children:["The Hyperlink Topic Search algorithm implements the Hyperlink-induced topic search algorithm, which assumes that each vertex has two attributes: Authority and Hub. A good hub vertex should point to many vertices with high authority. And a good authority vertex should be pointed to by many vertices of high pivot type. The algorithm returns the authority value and the hub value for each vertex. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/HITS_algorithm",title:"HITS algorithm",children:"https://en.wikipedia.org/wiki/HITS_algorithm"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"310jaccard-index",children:"3.10.Jaccard Index"}),"\n",(0,n.jsxs)(t.p,{children:["The Jaccard coefficient program implements the Jaccard Index algorithm. The algorithm calculates the Jaccard coefficient between a given pair of vertices, which can be used to represent the similarity of the two vertices. A higher Jaccard coefficient indicates a higher degree of similarity between pairs of vertices. Given several pairs of vertices with the query, the Jaccard coefficients of these pairs are returned. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Jaccard_index",title:"ji wiki",children:"https://en.wikipedia.org/wiki/Jaccard_index"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"311k-core",children:"3.11.K-core"}),"\n",(0,n.jsxs)(t.p,{children:["k accounting method implements k-core algorithm. The algorithm computes the number of kernels of all vertices, or finds all K-nucleon graphs in the graph. K-nucleon graph is a special subgraph in which the degree of any vertex is not less than a given K value. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Degeneracy_(graph_theory)",title:"kcore wiki",children:"https://en.wikipedia.org/wiki/Degeneracy_(graph_theory)"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"312louvain",children:"3.12.Louvain"}),"\n",(0,n.jsxs)(t.p,{children:["The Louvain community discovery program implements the Fast-unfolding algorithm. The algorithm is a community discovery algorithm based on modularity. It maximizes the modularity of the graph by constantly merging vertex communities, and can discover the hierarchical community structure. Please refer to the algorithm content ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Louvain_Modularity",title:"louvain modularity wiki",children:"https://en.wikipedia.org/wiki/Louvain_Modularity"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"313multiple-source-shortest-paths",children:"3.13.Multiple-source Shortest Paths"}),"\n",(0,n.jsxs)(t.p,{children:["The multisource Shortest Paths program implements the multiple-source Shortest Paths algorithm to calculate the shortest path value to any vertex from the given Multiple source vertices. Where, the shortest path value of multiple source vertices to a vertex is the minimum value of the shortest path from each source vertex to the vertex. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Shortest_path_problem",title:"shortest path wiki",children:"https://en.wikipedia.org/wiki/Shortest_path_problem"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"314personalized-pagerank",children:"3.14.Personalized PageRank"}),"\n",(0,n.jsxs)(t.p,{children:["Personalized web ranking program has Personalized PageRank algorithm. According to the given source vertex, the algorithm calculates the importance ranking of all vertices to the source vertex based on the source vertex. The higher the Rank value, the more important the vertex is to the source vertex. Unlike PageRank, the source vertex Rank value is 1, the rest of the vertex Rank value is 0; And a certain proportion of Rank value will be immediately transferred back to the source vertex after each round of transmission. Please refer to the algorithm content ",(0,n.jsx)(t.a,{href:"https://cs.stanford.edu/people/plofgren/Fast-PPR_KDD_Talk.pdf",children:"https://cs.stanford.edu/people/plofgren/Fast-PPR_KDD_Talk.pdf"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"315strongly-connected-components",children:"3.15.Strongly Connected Components"}),"\n",(0,n.jsxs)(t.p,{children:["Strongly Connected component program realizes the Strongly Connected Components algorithm. The algorithm computes all strongly connected components of the graph, which is a subgraph of the graph that can start from any vertex to any other vertex. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Strongly_connected_component",title:"scc wiki",children:"https://en.wikipedia.org/wiki/Strongly_connected_component"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"316speaker-listener-label-propagation-algorithm",children:"3.16.Speaker-listener Label Propagation Algorithm"}),"\n",(0,n.jsx)(t.p,{children:"The program realizes the Speaker-listener Label Propagation Algorithm. This algorithm is a community discovery algorithm based on tag propagation and historical tag record, which is an extension of tag propagation algorithm. Different from the label propagation algorithm, this algorithm records the historical labels of all vertices. When the labels are accumulated in the iteration, the historical labels are also counted. The final output is all the historical label records for each vertex. Please refer to the paper for the algorithm content:\u201cSLPA: Uncovering Overlapping Communities in Social Networks via a Speaker-Listener Interaction Dynamic Process\u201d\u3002"}),"\n",(0,n.jsx)(t.h3,{id:"317single-pair-shortest-path",children:"3.17.Single-Pair Shortest Path"}),"\n",(0,n.jsxs)(t.p,{children:["The program of the shortest path between two points implements the Bidirectional point-first Search algorithm. It searches forward width First along the outgoing edge from the starting point and reverse width first along the incoming edge from the end point on the directed undirected graph. The shortest path length from the starting point to the ending point is determined by traversing the vertices of the starting point and the ending point together. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Bidirectional_search",title:"Bidirectional search",children:"https://en.wikipedia.org/wiki/Bidirectional_search"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"318triangle-counting",children:"3.18.Triangle Counting"}),"\n",(0,n.jsx)(t.p,{children:'The Triangle-counting algorithm is implemented to calculate the number of triangles in an undirected graph, which can be used to characterize the correlation degree of the vertices in the graph. The higher the number of triangles, the higher the degree of correlation of the vertices in the graph. For the algorithm content, please refer to the paper, "Finding, Counting and Listing All Triangles in Large Graphs, an Experimental Study".'}),"\n",(0,n.jsx)(t.h3,{id:"319trustrank",children:"3.19.Trustrank"}),"\n",(0,n.jsxs)(t.p,{children:["The Trust Index Sorting Algorithm implements the Trustrank algorithm, which can calculate the Trust Index of any vertex based on a given whitelist. The higher the trust score, the less likely the vertex is to be illegal. Please refer to the algorithm content for details. ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/TrustRank",title:"trustrank wiki",children:"https://en.wikipedia.org/wiki/TrustRank"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"320weighted-label-propagation-algorithm",children:"3.20.Weighted Label Propagation Algorithm"}),"\n",(0,n.jsxs)(t.p,{children:["Weighted Label Propagation Algorithm is implemented in the program. = Different from the label propagation algorithm, the label transmission is related to the weight of the edge. During label transmission, the weight of each vertex will be accumulated according to the incoming edge of the label, and the label with the highest sum will be randomly selected. Please refer to the algorithm content ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Label_Propagation_Algorithm",title:"lpa wiki",children:"https://en.wikipedia.org/wiki/Label_Propagation_Algorithm"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"321weighted-pagerank-algorithm",children:"3.21.Weighted Pagerank Algorithm"}),"\n",(0,n.jsxs)(t.p,{children:["Weighted Pagerank is implemented in the weighted Pagerank algorithm. Different from PageRank algorithm, the transfer of Rank value is related to the weight of the edge. The Rank value of the vertex will be transferred to the adjacent vertices according to the weight of the edge. Please refer to the algorithm content",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/PageRank",children:"https://en.wikipedia.org/wiki/PageRank"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"322maximal-independent-set",children:"3.22.Maximal independent set"}),"\n",(0,n.jsxs)(t.p,{children:["Maximal independent set algorithm implements Maximal Independent Set algorithm. A maximum independent set means that there are no vertices outside the independent set that can join it. A graph may have many MIS that vary greatly in size, and the algorithm finds one of them. Please refer to the algorithm content ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Maximal_independent_set#Sequential_algorithm",title:"Maximal independent set wiki",children:"https://en.wikipedia.org/wiki/Maximal_independent_set#Sequential_algorithm"}),"\u3002"]}),"\n",(0,n.jsx)(t.h3,{id:"323sybil-rank",children:"3.23.Sybil Rank"}),"\n",(0,n.jsx)(t.p,{children:"Sybil detection algorithm implements Sybil Rank algorithm. The SybilRank algorithm starts from non-Sybil nodes and performs a random walk with premature termination. Please refer to the paper for the algorithm content:\u201cAiding the Detection of Fake Accounts in Large Scale Social Online Services\u201d\u3002"}),"\n",(0,n.jsx)(t.h3,{id:"324subgraph-isomorphism",children:"3.24.Subgraph Isomorphism"}),"\n",(0,n.jsxs)(t.p,{children:["The subgraph matching algorithm implements the subgraph_isomorphism algorithm. The subgraph_isomorphism algorithm matches all nodes in the whole graph and outputs the number of times each node is matched. Algorithm Content Reference ",(0,n.jsx)(t.a,{href:"https://www.jsjkx.com/CN/article/openArticlePDF.jsp?id=18105",children:"https://www.jsjkx.com/CN/article/openArticlePDF.jsp?id=18105"})]}),"\n",(0,n.jsx)(t.h3,{id:"325motif",children:"3.25.Motif"}),"\n",(0,n.jsxs)(t.p,{children:["Pattern matching algorithm implements motif algorithm. motif algorithm matches k-order subgraphs for the specified nodes, and finally outputs the number of each kind of K-order subgraphs for each specified node. Each K-order subgraph is represented by a 64-bit integer, and the $i \\times k + j$bit is 1, indicating that there is an edge i->j in the subgraph. Algorithm Content Reference ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Network_motif#mfinder",children:"https://en.wikipedia.org/wiki/Network_motif#mfinder"})]}),"\n",(0,n.jsx)(t.h3,{id:"326kcliques",children:"3.26.Kcliques"}),"\n",(0,n.jsxs)(t.p,{children:["The K-order clique counting algorithm implements the k-cliques algorithm. The k-cliques algorithm calculates the number of all K-order complete subgraphs in the graph, and finally outputs the number of k-order complete subgraphs of each node. Algorithm Content Reference ",(0,n.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Clique_problem#Cliques_of_fixed_size",children:"https://en.wikipedia.org/wiki/Clique_problem#Cliques_of_fixed_size"})]}),"\n",(0,n.jsx)(t.h3,{id:"327ktruss",children:"3.27.Ktruss"}),"\n",(0,n.jsxs)(t.p,{children:["The k-order truss counting algorithm implements the k-truss algorithm. A k-truss is a subgraph in which each edge is the edge of at least k-2 triangles. The k-truss algorithm finds out the k-truss subgraph of the graph, and finally outputs the neighbor node list of each node in the subgraph. Algorithm Content Reference",(0,n.jsx)(t.a,{href:"https://louridas.github.io/rwa/assignments/finding-trusses/",children:"https://louridas.github.io/rwa/assignments/finding-trusses/"})]}),"\n",(0,n.jsx)(t.h3,{id:"328leiden",children:"3.28.Leiden"}),"\n",(0,n.jsxs)(t.p,{children:["Leiden algorithm implements Leiden's algorithm. leiden algorithm is a community discovery algorithm based on modularity. Compared with louvain algorithm, leiden algorithm has the advantage that Leiden algorithm detects the broken links in the community to ensure that each community has good connectivity. Algorithm Content Reference ",(0,n.jsx)(t.a,{href:"https://www.nature.com/articles/s41598-019-41695-z#Sec4",children:"https://www.nature.com/articles/s41598-019-41695-z#Sec4"})]})]})}function d(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,i)=>{i.d(t,{R:()=>l,x:()=>h});var n=i(6540);const r={},a=n.createContext(r);function l(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function h(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/43d06d47.c66955a5.js b/assets/js/43d06d47.b9218c16.js similarity index 98% rename from assets/js/43d06d47.c66955a5.js rename to assets/js/43d06d47.b9218c16.js index 1b6c5ba6ac..f6ef066995 100644 --- a/assets/js/43d06d47.c66955a5.js +++ b/assets/js/43d06d47.b9218c16.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[2953],{5340:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var r=s(4848),t=s(8453);const o={},a="Glossary",i={id:"introduction/glossary",title:"Glossary",description:"1.Graph Technology",source:"@site/../docs/en-US/source/2.introduction/9.glossary.md",sourceDirName:"2.introduction",slug:"/introduction/glossary",permalink:"/tugraph-db/en/introduction/glossary",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:9,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Scenarios",permalink:"/tugraph-db/en/introduction/scenarios"},next:{title:"Quick Start",permalink:"/tugraph-db/en/quick-start/preparation"}},c={},l=[{value:"1.Graph Technology",id:"1graph-technology",level:2},{value:"2.Specific Concepts",id:"2specific-concepts",level:2}];function d(e){const n={blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"glossary",children:"Glossary"})}),"\n",(0,r.jsx)(n.h2,{id:"1graph-technology",children:"1.Graph Technology"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Graph Computing"}),":Generalized graph computing, including graph databases, graph analysis, and graph learning; Narrowly defined graph computing only includes graph analysis. The generalized definition is used by default."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Graph Database"}),":Focuses on operations such as adding, deleting, modifying, querying, and transaction processing for graph data, such as TuGraph DB."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Graph Analysis"}),":Focuses on algorithmic analysis and pattern analysis of entire graph data, such as TuGraph Analytics."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Graph Learning"}),":Refers to the same meaning as graph neural networks and graph machine learning, such as TuGraph Learn."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Graph Intelligence"}),":Same as generalized graph computing, including graph databases, graph analysis, and graph learning. It is usually used for conceptual promotion and not for products."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"2specific-concepts",children:"2.Specific Concepts"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Vertex"}),':Also known as node or point. Avoid using the term "node" as it is often used to refer to the number of servers and can be easily confused. "Node" refers to the meaning of combination, intersection, and crossing; "node" can refer to a milestone on a timeline (key node) or a processing entity in a computer system (such as a server in a computer network).']}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Edge"}),":Refers to the connection between two vertices."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Degree"}),':Refers to the number of incoming or outgoing edges on a vertex. Note that in non-graph theory scenarios, "hops" are often referred to as "degrees".']}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Hop"}),':Refers to the number of vertices between two vertices on a path (excluding the starting point and including the endpoint). "K-Hop" in the algorithm performance test refers to this meaning.']}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Vertex Label"}),":Refers to the type of a vertex, also known as a point label."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Edge Label"}),":Refers to the type of an edge, also known as an edge label."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>i});var r=s(6540);const t={},o=r.createContext(t);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[2953],{5340:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var r=s(4848),t=s(8453);const o={},a="Glossary",i={id:"introduction/glossary",title:"Glossary",description:"1.Graph Technology",source:"@site/../docs/en-US/source/2.introduction/9.glossary.md",sourceDirName:"2.introduction",slug:"/introduction/glossary",permalink:"/tugraph-db/en/introduction/glossary",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:9,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Scenarios",permalink:"/tugraph-db/en/introduction/scenarios"},next:{title:"Quick Start",permalink:"/tugraph-db/en/quick-start/preparation"}},c={},l=[{value:"1.Graph Technology",id:"1graph-technology",level:2},{value:"2.Specific Concepts",id:"2specific-concepts",level:2}];function d(e){const n={blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"glossary",children:"Glossary"})}),"\n",(0,r.jsx)(n.h2,{id:"1graph-technology",children:"1.Graph Technology"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Graph Computing"}),":Generalized graph computing, including graph databases, graph analysis, and graph learning; Narrowly defined graph computing only includes graph analysis. The generalized definition is used by default."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Graph Database"}),":Focuses on operations such as adding, deleting, modifying, querying, and transaction processing for graph data, such as TuGraph DB."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Graph Analysis"}),":Focuses on algorithmic analysis and pattern analysis of entire graph data, such as TuGraph Analytics."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Graph Learning"}),":Refers to the same meaning as graph neural networks and graph machine learning, such as TuGraph Learn."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Graph Intelligence"}),":Same as generalized graph computing, including graph databases, graph analysis, and graph learning. It is usually used for conceptual promotion and not for products."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"2specific-concepts",children:"2.Specific Concepts"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Vertex"}),':Also known as node or point. Avoid using the term "node" as it is often used to refer to the number of servers and can be easily confused. "Node" refers to the meaning of combination, intersection, and crossing; "node" can refer to a milestone on a timeline (key node) or a processing entity in a computer system (such as a server in a computer network).']}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Edge"}),":Refers to the connection between two vertices."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Degree"}),':Refers to the number of incoming or outgoing edges on a vertex. Note that in non-graph theory scenarios, "hops" are often referred to as "degrees".']}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Hop"}),':Refers to the number of vertices between two vertices on a path (excluding the starting point and including the endpoint). "K-Hop" in the algorithm performance test refers to this meaning.']}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Vertex Label"}),":Refers to the type of a vertex, also known as a point label."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Edge Label"}),":Refers to the type of an edge, also known as an edge label."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>i});var r=s(6540);const t={},o=r.createContext(t);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4930370d.dea89834.js b/assets/js/4930370d.28d38979.js similarity index 99% rename from assets/js/4930370d.dea89834.js rename to assets/js/4930370d.28d38979.js index a7c1c0d0db..73913df7ec 100644 --- a/assets/js/4930370d.dea89834.js +++ b/assets/js/4930370d.28d38979.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6481],{279:(s,e,t)=>{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>h,default:()=>a,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var n=t(4848),i=t(8453);const r={},h="FAQ",o={id:"faq",title:"FAQ",description:"During the use of TuGraph, if you encounter problems, you can first check User Documentation. Second, check to see if the FAQ list below matches your question.",source:"@site/../docs/en-US/source/14.faq.md",sourceDirName:".",slug:"/faq",permalink:"/tugraph-db/en/faq",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:14,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Examples of geospatial data type usage",permalink:"/tugraph-db/en/best-practices/spatial"},next:{title:"Contacts",permalink:"/tugraph-db/en/contacts"}},c={},d=[];function u(s){const e={a:"a",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,i.R)(),...s.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.header,{children:(0,n.jsx)(e.h1,{id:"faq",children:"FAQ"})}),"\n",(0,n.jsxs)(e.p,{children:["During the use of TuGraph, if you encounter problems, you can first check ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/tree/master/doc/zh-CN",children:"User Documentation"}),". Second, check to see if the FAQ list below matches your question."]}),"\n",(0,n.jsxs)(e.ol,{children:["\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/113#discussion-4575385",children:"Kernel Engine QA Summary"})})}),"\n",(0,n.jsxs)(e.p,{children:["1.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/113#discussioncomment-4165379",children:"Does the edge of TuGraph support index? "})]}),"\n",(0,n.jsxs)(e.p,{children:["1.2 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/113#discussioncomment-4165388",children:"What is the QPS of a single TuGraph machine? "})]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/111#discussion-4575381",children:"TuGraph Browser QA Summary"})})}),"\n",(0,n.jsxs)(e.p,{children:["2.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/111#discussioncomment-4165364",children:"How to update the tugraph service after the visualization file is built? "})]}),"\n",(0,n.jsxs)(e.p,{children:["2.2 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/111#discussioncomment-4165366",children:"How to connect the existing tugraph service through npm run dev? "})]}),"\n",(0,n.jsxs)(e.p,{children:["2.3 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/82#discussion-4465791",children:"TuGraph Browser version 3.3.0 failed to delete node label? "})]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/109#discussion-4575378",children:"Client QA Summary"})})}),"\n",(0,n.jsxs)(e.p,{children:["3.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/109#discussioncomment-4165351",children:"What programming languages \u200b\u200bdoes the client currently have, and does it support node js? "})]}),"\n",(0,n.jsxs)(e.p,{children:["3.2 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/109#discussioncomment-4165353",children:"Does the python client support pip install? Where is the client referenced? "})]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/107#discussion-4575373",children:"Data Import QA Summary"})})}),"\n",(0,n.jsxs)(e.p,{children:["4.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/107#discussioncomment-4165335",children:"Which common databases can TuGraph connect to? "})]}),"\n",(0,n.jsxs)(e.p,{children:["4.2 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/107#discussioncomment-4165336",children:"How to import data? "})]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/105#discussion-4575369",children:"Stored Procedure QA Summary"})})}),"\n",(0,n.jsxs)(e.p,{children:["5.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/105#discussioncomment-4165313",children:"How to load stored procedure or algorithm package? "})]}),"\n",(0,n.jsxs)(e.p,{children:["5.2 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/105#discussioncomment-4165317",children:"How to call or execute the stored procedure? "})]}),"\n",(0,n.jsxs)(e.p,{children:["5.3 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/105#discussioncomment-4165322",children:"Where is the open source built-in algorithm package? "})]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/103#discussion-4575364",children:"Installation and deployment QA summary"})})}),"\n",(0,n.jsxs)(e.p,{children:["6.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/103#discussioncomment-4165287",children:"How to install using docker image? "})]}),"\n",(0,n.jsxs)(e.p,{children:["6.2 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/103#discussioncomment-4165289",children:"After the rpm package and deb package are installed, start the lgraph_server service. Prompt missing 'liblgraph.so' error? "})]}),"\n",(0,n.jsxs)(e.p,{children:["6.3 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/47#discussion-4393165",children:"How to compile TuGraph on Mac's M1 chip? "})]}),"\n",(0,n.jsxs)(e.p,{children:["6.4 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-family/tugraph-db/issues/477",children:"How to Handle Error: 'jemalloc: Unsupported system page size'? "})]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/102#discussion-4575018",children:"Cypher QA Summary"})})}),"\n",(0,n.jsxs)(e.p,{children:["7.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/102#discussioncomment-4165252",children:"Does it support conditional query of indefinite length? "})]}),"\n",(0,n.jsxs)(e.p,{children:["7.2 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/102#discussioncomment-4165256",children:"How to query the shortest path, how to use the shortestPath function? "})]}),"\n",(0,n.jsxs)(e.p,{children:["7.3 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/102#discussioncomment-4165260",children:"Using and after the query statement Where to splice the query speed is slow, how should the statement be optimized and improved? "})]}),"\n",(0,n.jsxs)(e.p,{children:["7.4 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/102#discussioncomment-4165262",children:"How to query the edge of any jump? "})]}),"\n",(0,n.jsxs)(e.p,{children:["7.5 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/91#discussion-4482858",children:"Is there a date() function in Cypher? "})]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-family/tugraph-db/discussions/282#discussion-5574402",children:"Jwt Token QA Summay"})})}),"\n",(0,n.jsxs)(e.p,{children:["8.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-family/tugraph-db/discussions/282#discussioncomment-6861785",children:'What should I do after the error "User has reached the maximum number of tokens" is reported? '})]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(e.p,{children:"If the problem is still not resolved, we recommend you follow up or create a new thread describing your problem. At the same time, the TuGraph QA summary will be updated regularly based on the posts initiated by everyone in the discussion area."})]})}function a(s={}){const{wrapper:e}={...(0,i.R)(),...s.components};return e?(0,n.jsx)(e,{...s,children:(0,n.jsx)(u,{...s})}):u(s)}},8453:(s,e,t)=>{t.d(e,{R:()=>h,x:()=>o});var n=t(6540);const i={},r=n.createContext(i);function h(s){const e=n.useContext(r);return n.useMemo((function(){return"function"==typeof s?s(e):{...e,...s}}),[e,s])}function o(s){let e;return e=s.disableParentContext?"function"==typeof s.components?s.components(i):s.components||i:h(s.components),n.createElement(r.Provider,{value:e},s.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6481],{279:(s,e,t)=>{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>h,default:()=>a,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var n=t(4848),i=t(8453);const r={},h="FAQ",o={id:"faq",title:"FAQ",description:"During the use of TuGraph, if you encounter problems, you can first check User Documentation. Second, check to see if the FAQ list below matches your question.",source:"@site/../docs/en-US/source/14.faq.md",sourceDirName:".",slug:"/faq",permalink:"/tugraph-db/en/faq",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:14,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Examples of geospatial data type usage",permalink:"/tugraph-db/en/best-practices/spatial"},next:{title:"Contacts",permalink:"/tugraph-db/en/contacts"}},c={},d=[];function u(s){const e={a:"a",h1:"h1",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",...(0,i.R)(),...s.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.header,{children:(0,n.jsx)(e.h1,{id:"faq",children:"FAQ"})}),"\n",(0,n.jsxs)(e.p,{children:["During the use of TuGraph, if you encounter problems, you can first check ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/tree/master/doc/zh-CN",children:"User Documentation"}),". Second, check to see if the FAQ list below matches your question."]}),"\n",(0,n.jsxs)(e.ol,{children:["\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/113#discussion-4575385",children:"Kernel Engine QA Summary"})})}),"\n",(0,n.jsxs)(e.p,{children:["1.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/113#discussioncomment-4165379",children:"Does the edge of TuGraph support index? "})]}),"\n",(0,n.jsxs)(e.p,{children:["1.2 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/113#discussioncomment-4165388",children:"What is the QPS of a single TuGraph machine? "})]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/111#discussion-4575381",children:"TuGraph Browser QA Summary"})})}),"\n",(0,n.jsxs)(e.p,{children:["2.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/111#discussioncomment-4165364",children:"How to update the tugraph service after the visualization file is built? "})]}),"\n",(0,n.jsxs)(e.p,{children:["2.2 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/111#discussioncomment-4165366",children:"How to connect the existing tugraph service through npm run dev? "})]}),"\n",(0,n.jsxs)(e.p,{children:["2.3 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/82#discussion-4465791",children:"TuGraph Browser version 3.3.0 failed to delete node label? "})]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/109#discussion-4575378",children:"Client QA Summary"})})}),"\n",(0,n.jsxs)(e.p,{children:["3.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/109#discussioncomment-4165351",children:"What programming languages \u200b\u200bdoes the client currently have, and does it support node js? "})]}),"\n",(0,n.jsxs)(e.p,{children:["3.2 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/109#discussioncomment-4165353",children:"Does the python client support pip install? Where is the client referenced? "})]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/107#discussion-4575373",children:"Data Import QA Summary"})})}),"\n",(0,n.jsxs)(e.p,{children:["4.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/107#discussioncomment-4165335",children:"Which common databases can TuGraph connect to? "})]}),"\n",(0,n.jsxs)(e.p,{children:["4.2 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/107#discussioncomment-4165336",children:"How to import data? "})]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/105#discussion-4575369",children:"Stored Procedure QA Summary"})})}),"\n",(0,n.jsxs)(e.p,{children:["5.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/105#discussioncomment-4165313",children:"How to load stored procedure or algorithm package? "})]}),"\n",(0,n.jsxs)(e.p,{children:["5.2 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/105#discussioncomment-4165317",children:"How to call or execute the stored procedure? "})]}),"\n",(0,n.jsxs)(e.p,{children:["5.3 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/105#discussioncomment-4165322",children:"Where is the open source built-in algorithm package? "})]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/103#discussion-4575364",children:"Installation and deployment QA summary"})})}),"\n",(0,n.jsxs)(e.p,{children:["6.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/103#discussioncomment-4165287",children:"How to install using docker image? "})]}),"\n",(0,n.jsxs)(e.p,{children:["6.2 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/103#discussioncomment-4165289",children:"After the rpm package and deb package are installed, start the lgraph_server service. Prompt missing 'liblgraph.so' error? "})]}),"\n",(0,n.jsxs)(e.p,{children:["6.3 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/47#discussion-4393165",children:"How to compile TuGraph on Mac's M1 chip? "})]}),"\n",(0,n.jsxs)(e.p,{children:["6.4 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-family/tugraph-db/issues/477",children:"How to Handle Error: 'jemalloc: Unsupported system page size'? "})]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/102#discussion-4575018",children:"Cypher QA Summary"})})}),"\n",(0,n.jsxs)(e.p,{children:["7.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/102#discussioncomment-4165252",children:"Does it support conditional query of indefinite length? "})]}),"\n",(0,n.jsxs)(e.p,{children:["7.2 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/102#discussioncomment-4165256",children:"How to query the shortest path, how to use the shortestPath function? "})]}),"\n",(0,n.jsxs)(e.p,{children:["7.3 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/102#discussioncomment-4165260",children:"Using and after the query statement Where to splice the query speed is slow, how should the statement be optimized and improved? "})]}),"\n",(0,n.jsxs)(e.p,{children:["7.4 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/102#discussioncomment-4165262",children:"How to query the edge of any jump? "})]}),"\n",(0,n.jsxs)(e.p,{children:["7.5 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions/91#discussion-4482858",children:"Is there a date() function in Cypher? "})]}),"\n"]}),"\n",(0,n.jsxs)(e.li,{children:["\n",(0,n.jsx)(e.p,{children:(0,n.jsx)(e.strong,{children:(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-family/tugraph-db/discussions/282#discussion-5574402",children:"Jwt Token QA Summay"})})}),"\n",(0,n.jsxs)(e.p,{children:["8.1 ",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-family/tugraph-db/discussions/282#discussioncomment-6861785",children:'What should I do after the error "User has reached the maximum number of tokens" is reported? '})]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(e.p,{children:"If the problem is still not resolved, we recommend you follow up or create a new thread describing your problem. At the same time, the TuGraph QA summary will be updated regularly based on the posts initiated by everyone in the discussion area."})]})}function a(s={}){const{wrapper:e}={...(0,i.R)(),...s.components};return e?(0,n.jsx)(e,{...s,children:(0,n.jsx)(u,{...s})}):u(s)}},8453:(s,e,t)=>{t.d(e,{R:()=>h,x:()=>o});var n=t(6540);const i={},r=n.createContext(i);function h(s){const e=n.useContext(r);return n.useMemo((function(){return"function"==typeof s?s(e):{...e,...s}}),[e,s])}function o(s){let e;return e=s.disableParentContext?"function"==typeof s.components?s.components(i):s.components||i:h(s.components),n.createElement(r.Provider,{value:e},s.children)}}}]); \ No newline at end of file diff --git a/assets/js/4e149bf8.74d3a2c0.js b/assets/js/4e149bf8.0555ee2f.js similarity index 99% rename from assets/js/4e149bf8.74d3a2c0.js rename to assets/js/4e149bf8.0555ee2f.js index f416497aef..2295894bac 100644 --- a/assets/js/4e149bf8.74d3a2c0.js +++ b/assets/js/4e149bf8.0555ee2f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3906],{2158:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var i=t(4848),a=t(8453);const s={},r="Scenarios",o={id:"introduction/scenarios",title:"Scenarios",description:"This document mainly introduces the application scenarios of graph databases.",source:"@site/../docs/en-US/source/2.introduction/8.scenarios.md",sourceDirName:"2.introduction",slug:"/introduction/scenarios",permalink:"/tugraph-db/en/introduction/scenarios",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:8,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Functionality",permalink:"/tugraph-db/en/introduction/functionality"},next:{title:"Glossary",permalink:"/tugraph-db/en/introduction/glossary"}},d={},c=[{value:"1.Financial Industry",id:"1financial-industry",level:2},{value:"2.Industrial Industry",id:"2industrial-industry",level:2},{value:"3.Smart City",id:"3smart-city",level:2},{value:"4.Social Governance",id:"4social-governance",level:2},{value:"5.Internet",id:"5internet",level:2}];function l(e){const n={blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"scenarios",children:"Scenarios"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"This document mainly introduces the application scenarios of graph databases."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"1financial-industry",children:"1.Financial Industry"}),"\n",(0,i.jsx)(n.p,{children:"The entities in the financial industry mainly involve people, companies, accounts, products, etc., and their relationships include transaction relationships, logging relationships, equity relationships, employment relationships, etc. These entities form a financial graph data network. By applying graph databases, we can discover a lot of useful information from the financial graph data network, which helps us make more accurate financial decisions."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Scenario"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Loan review"}),(0,i.jsx)(n.td,{children:"By analyzing the applicant's relationship and transaction history, etc., it is auxiliary to judge the applicant's repayment ability and willingness. It can be applied to retail loan review, small and micro loan review, supply chain finance, etc. This method can complement the traditional audit mechanism based on the applicant's own information, which is particularly useful for small and micro loan audits with low individual information coverage."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Post-loan"}),(0,i.jsx)(n.td,{children:"By analyzing the borrower's transaction history, it assists in analyzing whether the borrower has default risk. Compared with the traditional method of issuing alerts only when loan funds flow to specific users, this method can assign a risk value to each account and issue warnings when the loan flows to high-risk accounts."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Missing recovery"}),(0,i.jsx)(n.td,{children:"By analyzing the social and shopping data of missing borrowers, other contact methods can be found. This method can significantly improve the recovery rate of missing borrowers."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Guarantor loop detection"}),(0,i.jsx)(n.td,{children:"Special guarantee structures such as cyclic, chain, family-style, and cross can be found in the guarantee relationship graph to expose potential risks. Compared with the JOIN method of a relational database, the solution based on graph algorithms is more efficient, can detect any length of guarantee loop, and can achieve more complex limited condition detection."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Credit card fraud detection"}),(0,i.jsx)(n.td,{children:"A relationship network of addresses, contact information, etc. in credit card application information is constructed, and a community discovery algorithm is run in the application relationship network to detect suspected fraudulent gangs, thereby rejecting suspected fraudulent applications and reducing economic losses."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Anti-money laundering"}),(0,i.jsx)(n.td,{children:"Suspected money laundering behaviors and links can be found through the transaction network and medium network. Money laundering is a complex process involving multiple parties. By conducting graph analysis in transaction and social networks, we can more accurately detect money laundering behaviors."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Car insurance anti-fraud"}),(0,i.jsx)(n.td,{children:"For insurance fraud involving repair shops, by analyzing the relationship between the insured person, the case location, and the repair shop, fraudulent claims can be more accurately identified, reducing economic losses."})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"2industrial-industry",children:"2.Industrial Industry"}),"\n",(0,i.jsx)(n.p,{children:"A large amount of heterogeneous data will be generated in the production and manufacturing process, and how to effectively organize and manage these data is one of the most important issues in industrial big data. These data include design documents, equipment data, simulation plans and results, experimental results, experience documents, etc. The relationships between these data are complex, and traditional data management systems can only accumulate data, and they are often unable to search for related materials. Using graph models, these different types of data are organized into a network, which makes it easy to browse and search for data."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Scenario"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Supply chain management"}),(0,i.jsx)(n.td,{children:"Supply chain data mainly concerns the correspondence between products, components, and parts, the correspondence between parts and suppliers, and sensitive components in parts. Compared with the traditional BOM system, the solution using graph databases can more conveniently maintain complex networks of multiple component levels and multiple supplier levels, thereby providing basic support for a through supply chain."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Document management"}),(0,i.jsx)(n.td,{children:"Using graph databases can organize different types of documents together organically according to different relationships. For example, design documents for components, component-part relationships, component test documents, relevant experience documents, etc. can be organized together so that all relevant information for the component can be obtained easily when needed."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"R&D process management"}),(0,i.jsx)(n.td,{children:"A large amount of simulation, experimentation, and testing needs to be performed in the product development and verification process. Each test process involves many different steps, the connection between the steps, the data versions used in each step, and the algorithm versions all make up a complicated relationship network. Using graph databases can better manage this relationship network, providing a good foundation for data reuse and process improvement in the R&D process."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Equipment information management"}),(0,i.jsx)(n.td,{children:"Manufacturing requires the management of a large number of devices, which are interrelated (power supply, feeding, spatial relationship) to form a complex network. Traditional databases are difficult to reflect this complex relationship. Using graph databases can easily represent these relationships, thereby better managing equipment information."})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"3smart-city",children:"3.Smart City"}),"\n",(0,i.jsx)(n.p,{children:"With the development of technology, intelligent management of cities has become a major trend. Intelligent management requires a strong system software to support it, built on a good information management platform. In an intelligent city management system, an intelligent decision-making system needs to make decisions based on a large amount of different information, including various topology information (such as roads, pipelines, etc.), supply and demand information (such as electricity transmission, drinking water supply, sewage discharge, etc.), environmental information (such as temperature, humidity, rainfall, etc.), and so on. To manage these complex and heterogeneous data organically and make decisions based on them, a mature system is needed. Traditional data management systems based on relational data models are not suitable for managing such complex and heterogeneous data. Using a graph model can solve this problem well. If we manage these different data using a graph database, we can achieve many complex intelligent management scenarios."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Scenario"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Smart Traffic"}),(0,i.jsx)(n.td,{children:"Based on road topology, road capacity, and current traffic flow, intelligent traffic signal scheduling can be performed to improve traffic efficiency."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Smart Drainage"}),(0,i.jsx)(n.td,{children:"Based on drainage system information and current rainfall, the drainage system can be scheduled to reduce the occurrence of waterlogging."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Pipeline Management"}),(0,i.jsx)(n.td,{children:"Organizing the production, installation, topology information, and historical status information of pipelines can help us manage the pipelines throughout their lifecycle, including fault diagnosis, life assessment, etc."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Crowd Evacuation"}),(0,i.jsx)(n.td,{children:"When a large number of people need to be evacuated, multiple transportation modes such as buses, subways, taxis, shared bicycles, etc., need to be considered, as well as the road carrying capacity. Using a graph database to organically integrate this information can help us make better decisions and provide better support for large public events."})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"4social-governance",children:"4.Social Governance"}),"\n",(0,i.jsx)(n.p,{children:"Social governance involves public safety, legal affairs, public opinion, network security, and more. Social governance is a comprehensive, multi-system linkage problem. It requires the synthesis of a large amount of data and global considerations to make better decisions. In this multidimensional and complex data problem, the graph data model can provide better adaptability and provide a solid foundation for intelligent social governance decision-making platforms."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Scenario"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Criminal Gang"}),(0,i.jsx)(n.td,{children:"Conspiratorial gangs will inevitably make contact through some means, including face-to-face meetings (appearing in the same place), phone calls, or internet contacts, and they may also have economic exchanges. If we store all of this data in a unified graph, we can use graph analysis algorithms to identify closely connected groups and then discover and identify the entire criminal gang."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Stakeholder Case Investigation"}),(0,i.jsx)(n.td,{children:"Stakeholder cases, especially stakeholder economic cases, often involve a large number of personnel and elements (money, location, events, etc.). How to effectively organize this information to provide evidence for handling cases is a difficulty in stakeholder case investigation. Using graph databases to store and analyze this information can help us quickly locate the data, analyze the personnel structure, and provide better technical support for case investigation."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Illegal Website Identification"}),(0,i.jsx)(n.td,{children:'Illegal websites, phishing websites, yellow websites, and so on, often use different domain names and IPs to avoid being blocked. The filter method based on a blacklist can only block known illegal websites and cannot effectively identify new domain names and IPs. Based on the IP-domain name network mapping relationship, we can create a graph and then use graph calculations to establish a "trustworthiness" model for domain names and IPs to determine whether a website belongs to an illegal website.'})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Court File Management"}),(0,i.jsx)(n.td,{children:"Case files are often complex, and different cases may be linked through parties, locations, case nature, judges, and so on. These links constitute a complex network. Using a graph database, we can more conveniently manage these complex relationships and improve case handling and query efficiency."})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"5internet",children:"5.Internet"}),"\n",(0,i.jsx)(n.p,{children:"Social networks and person-product purchase relationships can all form a network. By analyzing this network data, we can provide users with better services, including relevant recommendations, user information collection, important user identification, and spam user identification, and so on."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Scenario"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ID-Mapping"}),(0,i.jsx)(n.td,{children:"Graph databases can store all user-related information, including the relationships between users, in one database, and can also use these relationships to identify situations where one person has multiple accounts or multiple people share an account, thus providing decision support for future risk control, recommendations, and other businesses."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Friend Recommendation"}),(0,i.jsx)(n.td,{children:'Based on the analysis of social networks, we can provide friend recommendations such as "friends of friends" and "common friends".'})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Product Recommendation"}),(0,i.jsx)(n.td,{children:"Based on the user-product relationship graph, we can find users with similar interests and recommend other products that similar users have chosen."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Spam User Identification"}),(0,i.jsx)(n.td,{children:"Traditional spam user identification is mainly based on user account information, such as registration information and posting information, but these types of information are relatively easy to forge. On the other hand, network-based information doesn't have this problem: it's difficult to forge. Therefore, spam user identification based on network information can be more accurate and efficient."})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>o});var i=t(6540);const a={},s=i.createContext(a);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3906],{2158:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var i=t(4848),a=t(8453);const s={},r="Scenarios",o={id:"introduction/scenarios",title:"Scenarios",description:"This document mainly introduces the application scenarios of graph databases.",source:"@site/../docs/en-US/source/2.introduction/8.scenarios.md",sourceDirName:"2.introduction",slug:"/introduction/scenarios",permalink:"/tugraph-db/en/introduction/scenarios",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:8,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Functionality",permalink:"/tugraph-db/en/introduction/functionality"},next:{title:"Glossary",permalink:"/tugraph-db/en/introduction/glossary"}},d={},c=[{value:"1.Financial Industry",id:"1financial-industry",level:2},{value:"2.Industrial Industry",id:"2industrial-industry",level:2},{value:"3.Smart City",id:"3smart-city",level:2},{value:"4.Social Governance",id:"4social-governance",level:2},{value:"5.Internet",id:"5internet",level:2}];function l(e){const n={blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"scenarios",children:"Scenarios"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"This document mainly introduces the application scenarios of graph databases."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"1financial-industry",children:"1.Financial Industry"}),"\n",(0,i.jsx)(n.p,{children:"The entities in the financial industry mainly involve people, companies, accounts, products, etc., and their relationships include transaction relationships, logging relationships, equity relationships, employment relationships, etc. These entities form a financial graph data network. By applying graph databases, we can discover a lot of useful information from the financial graph data network, which helps us make more accurate financial decisions."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Scenario"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Loan review"}),(0,i.jsx)(n.td,{children:"By analyzing the applicant's relationship and transaction history, etc., it is auxiliary to judge the applicant's repayment ability and willingness. It can be applied to retail loan review, small and micro loan review, supply chain finance, etc. This method can complement the traditional audit mechanism based on the applicant's own information, which is particularly useful for small and micro loan audits with low individual information coverage."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Post-loan"}),(0,i.jsx)(n.td,{children:"By analyzing the borrower's transaction history, it assists in analyzing whether the borrower has default risk. Compared with the traditional method of issuing alerts only when loan funds flow to specific users, this method can assign a risk value to each account and issue warnings when the loan flows to high-risk accounts."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Missing recovery"}),(0,i.jsx)(n.td,{children:"By analyzing the social and shopping data of missing borrowers, other contact methods can be found. This method can significantly improve the recovery rate of missing borrowers."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Guarantor loop detection"}),(0,i.jsx)(n.td,{children:"Special guarantee structures such as cyclic, chain, family-style, and cross can be found in the guarantee relationship graph to expose potential risks. Compared with the JOIN method of a relational database, the solution based on graph algorithms is more efficient, can detect any length of guarantee loop, and can achieve more complex limited condition detection."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Credit card fraud detection"}),(0,i.jsx)(n.td,{children:"A relationship network of addresses, contact information, etc. in credit card application information is constructed, and a community discovery algorithm is run in the application relationship network to detect suspected fraudulent gangs, thereby rejecting suspected fraudulent applications and reducing economic losses."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Anti-money laundering"}),(0,i.jsx)(n.td,{children:"Suspected money laundering behaviors and links can be found through the transaction network and medium network. Money laundering is a complex process involving multiple parties. By conducting graph analysis in transaction and social networks, we can more accurately detect money laundering behaviors."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Car insurance anti-fraud"}),(0,i.jsx)(n.td,{children:"For insurance fraud involving repair shops, by analyzing the relationship between the insured person, the case location, and the repair shop, fraudulent claims can be more accurately identified, reducing economic losses."})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"2industrial-industry",children:"2.Industrial Industry"}),"\n",(0,i.jsx)(n.p,{children:"A large amount of heterogeneous data will be generated in the production and manufacturing process, and how to effectively organize and manage these data is one of the most important issues in industrial big data. These data include design documents, equipment data, simulation plans and results, experimental results, experience documents, etc. The relationships between these data are complex, and traditional data management systems can only accumulate data, and they are often unable to search for related materials. Using graph models, these different types of data are organized into a network, which makes it easy to browse and search for data."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Scenario"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Supply chain management"}),(0,i.jsx)(n.td,{children:"Supply chain data mainly concerns the correspondence between products, components, and parts, the correspondence between parts and suppliers, and sensitive components in parts. Compared with the traditional BOM system, the solution using graph databases can more conveniently maintain complex networks of multiple component levels and multiple supplier levels, thereby providing basic support for a through supply chain."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Document management"}),(0,i.jsx)(n.td,{children:"Using graph databases can organize different types of documents together organically according to different relationships. For example, design documents for components, component-part relationships, component test documents, relevant experience documents, etc. can be organized together so that all relevant information for the component can be obtained easily when needed."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"R&D process management"}),(0,i.jsx)(n.td,{children:"A large amount of simulation, experimentation, and testing needs to be performed in the product development and verification process. Each test process involves many different steps, the connection between the steps, the data versions used in each step, and the algorithm versions all make up a complicated relationship network. Using graph databases can better manage this relationship network, providing a good foundation for data reuse and process improvement in the R&D process."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Equipment information management"}),(0,i.jsx)(n.td,{children:"Manufacturing requires the management of a large number of devices, which are interrelated (power supply, feeding, spatial relationship) to form a complex network. Traditional databases are difficult to reflect this complex relationship. Using graph databases can easily represent these relationships, thereby better managing equipment information."})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"3smart-city",children:"3.Smart City"}),"\n",(0,i.jsx)(n.p,{children:"With the development of technology, intelligent management of cities has become a major trend. Intelligent management requires a strong system software to support it, built on a good information management platform. In an intelligent city management system, an intelligent decision-making system needs to make decisions based on a large amount of different information, including various topology information (such as roads, pipelines, etc.), supply and demand information (such as electricity transmission, drinking water supply, sewage discharge, etc.), environmental information (such as temperature, humidity, rainfall, etc.), and so on. To manage these complex and heterogeneous data organically and make decisions based on them, a mature system is needed. Traditional data management systems based on relational data models are not suitable for managing such complex and heterogeneous data. Using a graph model can solve this problem well. If we manage these different data using a graph database, we can achieve many complex intelligent management scenarios."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Scenario"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Smart Traffic"}),(0,i.jsx)(n.td,{children:"Based on road topology, road capacity, and current traffic flow, intelligent traffic signal scheduling can be performed to improve traffic efficiency."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Smart Drainage"}),(0,i.jsx)(n.td,{children:"Based on drainage system information and current rainfall, the drainage system can be scheduled to reduce the occurrence of waterlogging."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Pipeline Management"}),(0,i.jsx)(n.td,{children:"Organizing the production, installation, topology information, and historical status information of pipelines can help us manage the pipelines throughout their lifecycle, including fault diagnosis, life assessment, etc."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Crowd Evacuation"}),(0,i.jsx)(n.td,{children:"When a large number of people need to be evacuated, multiple transportation modes such as buses, subways, taxis, shared bicycles, etc., need to be considered, as well as the road carrying capacity. Using a graph database to organically integrate this information can help us make better decisions and provide better support for large public events."})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"4social-governance",children:"4.Social Governance"}),"\n",(0,i.jsx)(n.p,{children:"Social governance involves public safety, legal affairs, public opinion, network security, and more. Social governance is a comprehensive, multi-system linkage problem. It requires the synthesis of a large amount of data and global considerations to make better decisions. In this multidimensional and complex data problem, the graph data model can provide better adaptability and provide a solid foundation for intelligent social governance decision-making platforms."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Scenario"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Criminal Gang"}),(0,i.jsx)(n.td,{children:"Conspiratorial gangs will inevitably make contact through some means, including face-to-face meetings (appearing in the same place), phone calls, or internet contacts, and they may also have economic exchanges. If we store all of this data in a unified graph, we can use graph analysis algorithms to identify closely connected groups and then discover and identify the entire criminal gang."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Stakeholder Case Investigation"}),(0,i.jsx)(n.td,{children:"Stakeholder cases, especially stakeholder economic cases, often involve a large number of personnel and elements (money, location, events, etc.). How to effectively organize this information to provide evidence for handling cases is a difficulty in stakeholder case investigation. Using graph databases to store and analyze this information can help us quickly locate the data, analyze the personnel structure, and provide better technical support for case investigation."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Illegal Website Identification"}),(0,i.jsx)(n.td,{children:'Illegal websites, phishing websites, yellow websites, and so on, often use different domain names and IPs to avoid being blocked. The filter method based on a blacklist can only block known illegal websites and cannot effectively identify new domain names and IPs. Based on the IP-domain name network mapping relationship, we can create a graph and then use graph calculations to establish a "trustworthiness" model for domain names and IPs to determine whether a website belongs to an illegal website.'})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Court File Management"}),(0,i.jsx)(n.td,{children:"Case files are often complex, and different cases may be linked through parties, locations, case nature, judges, and so on. These links constitute a complex network. Using a graph database, we can more conveniently manage these complex relationships and improve case handling and query efficiency."})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"5internet",children:"5.Internet"}),"\n",(0,i.jsx)(n.p,{children:"Social networks and person-product purchase relationships can all form a network. By analyzing this network data, we can provide users with better services, including relevant recommendations, user information collection, important user identification, and spam user identification, and so on."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Scenario"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"ID-Mapping"}),(0,i.jsx)(n.td,{children:"Graph databases can store all user-related information, including the relationships between users, in one database, and can also use these relationships to identify situations where one person has multiple accounts or multiple people share an account, thus providing decision support for future risk control, recommendations, and other businesses."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Friend Recommendation"}),(0,i.jsx)(n.td,{children:'Based on the analysis of social networks, we can provide friend recommendations such as "friends of friends" and "common friends".'})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Product Recommendation"}),(0,i.jsx)(n.td,{children:"Based on the user-product relationship graph, we can find users with similar interests and recommend other products that similar users have chosen."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Spam User Identification"}),(0,i.jsx)(n.td,{children:"Traditional spam user identification is mainly based on user account information, such as registration information and posting information, but these types of information are relatively easy to forge. On the other hand, network-based information doesn't have this problem: it's difficult to forge. Therefore, spam user identification based on network information can be more accurate and efficient."})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>o});var i=t(6540);const a={},s=i.createContext(a);function r(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/50b94c42.d8f0a772.js b/assets/js/50b94c42.52a29011.js similarity index 99% rename from assets/js/50b94c42.d8f0a772.js rename to assets/js/50b94c42.52a29011.js index 08f072e0e8..f573037ed1 100644 --- a/assets/js/50b94c42.d8f0a772.js +++ b/assets/js/50b94c42.52a29011.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[7462],{2624:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var n=t(4848),a=t(8453);const o={},i="TuGraph Java SDK",l={id:"client-tools/java-client",title:"TuGraph Java SDK",description:"This document primarily provides usage instructions for the TuGraph Java SDK. It is crucial to note that the TuGraph Java SDK will no longer receive updates or maintenance in the future. Users are strongly advised to utilize bolt instead.",source:"@site/../docs/en-US/source/7.client-tools/3.java-client.md",sourceDirName:"7.client-tools",slug:"/client-tools/java-client",permalink:"/tugraph-db/en/client-tools/java-client",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph C++ SDK",permalink:"/tugraph-db/en/client-tools/cpp-client"},next:{title:"TuGraph-OGM",permalink:"/tugraph-db/en/client-tools/tugraph-ogm"}},s={},d=[{value:"1.Compile java client code",id:"1compile-java-client-code",level:2},{value:"2.Demo",id:"2demo",level:2},{value:"2.1.Instantiate the client object",id:"21instantiate-the-client-object",level:3},{value:"2.1.1.Instantiate a single node client object",id:"211instantiate-a-single-node-client-object",level:4},{value:"2.1.2.Instantiate the HA cluster to directly connect to the client object",id:"212instantiate-the-ha-cluster-to-directly-connect-to-the-client-object",level:4},{value:"2.1.3.Instantiate the HA cluster to indirectly connect to the client object",id:"213instantiate-the-ha-cluster-to-indirectly-connect-to-the-client-object",level:4},{value:"2.2.Call cypher",id:"22call-cypher",level:3},{value:"2.3. Send cypher request to leader",id:"23-send-cypher-request-to-leader",level:3},{value:"2.4. Call GQL",id:"24-call-gql",level:3},{value:"2.5. Send GQL request to leader",id:"25-send-gql-request-to-leader",level:3},{value:"2.6. Calling stored procedures",id:"26-calling-stored-procedures",level:3},{value:"2.7. Call the stored procedure to the leader",id:"27-call-the-stored-procedure-to-the-leader",level:3},{value:"2.8. Load stored procedure",id:"28-load-stored-procedure",level:3},{value:"2.9. List stored procedures",id:"29-list-stored-procedures",level:3},{value:"2.10. Delete stored procedures",id:"210-delete-stored-procedures",level:3},{value:"2.11. Import schema from byte stream",id:"211-import-schema-from-byte-stream",level:3},{value:"2.12. Import edge data from byte stream",id:"212-import-edge-data-from-byte-stream",level:3},{value:"2.13. Import schema from file",id:"213-import-schema-from-file",level:3},{value:"2.14. Import point and edge data from file",id:"214-import-point-and-edge-data-from-file",level:3}];function c(e){const r={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.header,{children:(0,n.jsx)(r.h1,{id:"tugraph-java-sdk",children:"TuGraph Java SDK"})}),"\n",(0,n.jsxs)(r.blockquote,{children:["\n",(0,n.jsxs)(r.p,{children:["This document primarily provides usage instructions for the TuGraph Java SDK. It is crucial to note that the TuGraph Java SDK will no longer receive updates or maintenance in the future. Users are strongly advised to utilize ",(0,n.jsx)(r.a,{href:"/tugraph-db/en/client-tools/bolt-client",children:"bolt"})," instead."]}),"\n"]}),"\n",(0,n.jsx)(r.h2,{id:"1compile-java-client-code",children:"1.Compile java client code"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-shell",children:"cd deps/tugraph-db-client-java\nsh local_build.sh\n"})}),"\n",(0,n.jsx)(r.h2,{id:"2demo",children:"2.Demo"}),"\n",(0,n.jsx)(r.h3,{id:"21instantiate-the-client-object",children:"2.1.Instantiate the client object"}),"\n",(0,n.jsx)(r.p,{children:"Adding maven dependencies"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-xml",children:"\n com.antgroup.tugraph\n tugraph-db-java-rpc-client\n 1.4.1\n\n"})}),"\n",(0,n.jsx)(r.p,{children:"Introduce dependencies"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:"import com.antgroup.tugraph.TuGraphDbRpcClient;\n"})}),"\n",(0,n.jsx)(r.h4,{id:"211instantiate-a-single-node-client-object",children:"2.1.1.Instantiate a single node client object"}),"\n",(0,n.jsx)(r.p,{children:"When starting the server in single-node mode, the client is instantiated in the following format"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'TuGraphDbRpcClient client = new TuGraphDbRpcClient("127.0.0.1:19099", "admin", "73@TuGraph");\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:"public TuGraphDbRpcClient(String url, String user, String pass)\n@param url: tugraph host looks like ip:port\n@param user: login user name\n@param password: login password\n"})}),"\n",(0,n.jsx)(r.h4,{id:"212instantiate-the-ha-cluster-to-directly-connect-to-the-client-object",children:"2.1.2.Instantiate the HA cluster to directly connect to the client object"}),"\n",(0,n.jsx)(r.p,{children:"When the HA cluster deployed on the server can be directly connected using the URL configured in ha_conf, the client is instantiated according to the following format"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'TuGraphDbRpcClient client = new TuGraphDbRpcClient("127.0.0.1:19099", "admin", "73@TuGraph");\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:"public TuGraphDbRpcClient(String url, String user, String pass)\n@param url: tugraph host looks like ip:port\n@param user: login user name\n@param password: login password\n"})}),"\n",(0,n.jsx)(r.p,{children:"The user only needs to pass in the url of any node in the HA cluster, and the client will automatically maintain the connection pool based on the query information returned by the server, and there is no need to manually restart the client when the HA cluster expands horizontally."}),"\n",(0,n.jsx)(r.h4,{id:"213instantiate-the-ha-cluster-to-indirectly-connect-to-the-client-object",children:"2.1.3.Instantiate the HA cluster to indirectly connect to the client object"}),"\n",(0,n.jsx)(r.p,{children:"When the HA cluster deployed on the server cannot use the URL configured in ha_conf to connect directly but must use an indirect URL (such as the Alibaba Cloud public network URL), the client is instantiated according to the following format."}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'List urls = new ArrayList<>();\nurls.add("189.33.97.23:9091");\nurls.add("189.33.97.24:9091");\nurls.add("189.33.97.25:9091");\nTuGraphDbRpcClient client = new TuGraphDbRpcClient(urls, "admin", "73@TuGraph");\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:"public TuGraphDbRpcClient(List urls, String user, String password)\n@param urls: tugraph host list\n@param user: login user name\n@param password: login password\n"})}),"\n",(0,n.jsx)(r.p,{children:"Because the URL that the user connects to is different from the information configured when the server starts, the client connection pool cannot be automatically updated by sending a request to the cluster, so it is necessary to manually pass in the URLs of all nodes in the cluster when starting the client, and when the cluster node changes Manually restart the client."}),"\n",(0,n.jsx)(r.h3,{id:"22call-cypher",children:"2.2.Call cypher"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String res = client.callCypher("CALL db.edgeLabels()", "default", 10);\n log.info("db.edgeLabels() : " + res);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param cypher: inquire statement.\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @param url: (Optional) Node address of calling cypher\n @return: the result of cypher query execution\n public String callCypher(String cypher, String graph, double timeout, String url)\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter.\nNote: JAVA does not support default parameters, therefore, default parameters in JAVA are implemented using overloaded functions."}),"\n",(0,n.jsx)(r.h3,{id:"23-send-cypher-request-to-leader",children:"2.3. Send cypher request to leader"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String res = client.callCypherToLeader("CALL db.edgeLabels()", "default", 10);\n log.info("db.edgeLabels() : " + res);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param cypher: inquire statement.\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @return: the result of cypher query execution\n public String callCypherToLeader(String cypher, String graph, double timeout)\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface only supports use in HA mode. In the client in HA mode, in order to prevent requests from being sent to followers with unsynchronized data,\nUsers can directly send requests to the leader, and the leader is elected by the cluster."}),"\n",(0,n.jsx)(r.h3,{id:"24-call-gql",children:"2.4. Call GQL"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String res = client.callGql("CALL db.edgeLabels()", "default", 10);\n log.info("db.edgeLabels() : " + res);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param gql: inquire statement.\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @param url: (Optional) Node address of calling GQL\n @return: the result of GQL query execution\n public String callGql(String gql, String graph, double timeout, String url)\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter.\nNote: JAVA does not support default parameters, therefore, default parameters in JAVA are implemented using overloaded functions."}),"\n",(0,n.jsx)(r.h3,{id:"25-send-gql-request-to-leader",children:"2.5. Send GQL request to leader"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String res = client.callGqlToLeader("CALL db.edgeLabels()", "default", 10);\n log.info("db.edgeLabels() : " + res);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param gql: inquire statement.\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @return: the result of cypher query execution\n public String callGqlToLeader(String cypher, String graph, double timeout)\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface only supports use in HA mode. In the client in HA mode, in order to prevent requests from being sent to followers with unsynchronized data,\nUsers can directly send requests to the leader, and the leader is elected by the cluster."}),"\n",(0,n.jsx)(r.h3,{id:"26-calling-stored-procedures",children:"2.6. Calling stored procedures"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String result = client.callProcedure("CPP", "khop", kHopParamGen(), 1000, false, "default");\n log.info("testCallProcedure : " + result);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param procedureType: the procedure type, currently supported CPP and PY\n @param procedureName: procedure name\n @param param: the execution parameters\n @param procedureTimeOut: Maximum execution time, overruns will be interrupted\n @param inProcess: Running query or not\n @param graph: the graph to query\n @param jsonFormat: (Optional) Return format of calling stored procedure\n @param url: (Optional) Node address of calling procedure\n @return: the result of procedure execution\n public String callProcedure(String procedureType, String procedureName, String param, double procedureTimeOut,\n boolean inProcess, String graph, String url)\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. By default, the execution result of the stored procedure is directly returned in string format. Specifying jsonFormat as true can return the execution result in json format.\nAmong them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,n.jsx)(r.h3,{id:"27-call-the-stored-procedure-to-the-leader",children:"2.7. Call the stored procedure to the leader"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String result = client.callProcedureToLeader("CPP", "khop", kHopParamGen(), 1000, false, "default");\n log.info("testCallProcedureToLeader : " + result);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param procedureType: the procedure type, currently supported CPP and PY\n @param procedureName: procedure name\n @param param: the execution parameters\n @param procedureTimeOut: Maximum execution time, overruns will be interrupted\n @param inProcess: Running query or not\n @param graph: the graph to query\n @param jsonFormat: (Optional) Return format of calling stored procedure\n @return: the result of procedure execution\n public String callProcedureToLeader(String procedureType, String procedureName, String param, double procedureTimeOut,\n boolean inProcess, String graph)\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in HA mode. By default, the execution result of the stored procedure is directly returned in string format. Specifying jsonFormat as true can return the execution result in json format."}),"\n",(0,n.jsx)(r.h3,{id:"28-load-stored-procedure",children:"2.8. Load stored procedure"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' boolean result = client.loadProcedure("./test/procedure/khop.so", "CPP", "khop", "SO", "test loadprocedure", true, "v1", "default");\n log.info("loadProcedure : " + result);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param sourceFile: the source_file contains procedure code\n @param procedureType: the procedure type, currently supported CPP and PY\n @param procedureName: procedure name\n @param codeType: code type, currently supported PY, SO, CPP, ZIP\n @param procedureDescription: procedure description\n @param readOnly: procedure is read only or not\n @param version: The version of procedure\n @param graph: the graph to query.\n @return: the result of procedure execution\n public boolean loadProcedure(String sourceFile, String procedureType, String procedureName, String codeType,\n String procedureDescription, boolean readOnly, String version, String graph) throws Exception\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since loading a stored procedure is a write request, the client in HA mode can only send a request to load a stored procedure to the leader."}),"\n",(0,n.jsx)(r.h3,{id:"29-list-stored-procedures",children:"2.9. List stored procedures"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String result = client.listProcedures("CPP", "any", "default");\n log.info("listProcedures : " + result);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param procedureType: the procedure type, currently supported CPP and PY\n @param version: The version of procedure\n @param graph: the graph to query.\n @param url: (Optional) Node address of listing procedure\n @return: the list of procedures\n public String listProcedures(String procedureType, String version, String graph, String url) throws Exception\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,n.jsx)(r.h3,{id:"210-delete-stored-procedures",children:"2.10. Delete stored procedures"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String result = client.deleteProcedure("CPP", "sortstr", "default");\n log.info("loadProcedure : " + result);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param procedureType: the procedure type, currently supported CPP and PY\n @param procedureName: procedure name\n @param graph: the graph to query.\n @return: the result of procedure execution\n public boolean deleteProcedure(String procedureType, String procedureName, String graph) throws Exception\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since deleting a stored procedure is a write request, the client in HA mode can only send a delete request to the leader."}),"\n",(0,n.jsx)(r.h3,{id:"211-import-schema-from-byte-stream",children:"2.11. Import schema from byte stream"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' boolean ret = client.importSchemaFromContent(schema, "default", 1000);\n log.info("importSchemaFromContent : " + ret);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param schema: the schema to be imported\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @return: the result of import schema\n public boolean importSchemaFromContent(String schema, String graph, double timeout) throws UnsupportedEncodingException\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing schema is a write request, the client in HA mode can only send an import schema request to the leader."}),"\n",(0,n.jsx)(r.h3,{id:"212-import-edge-data-from-byte-stream",children:"2.12. Import edge data from byte stream"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' boolean ret = client.importDataFromContent(personDesc, person, ",", true, 16, "default", 1000);\n log.info("importDataFromContent : " + ret);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param desc: data format description\n @param data: the data to be imported\n @param delimiter: data separator\n @param continueOnError: whether to continue when importing data fails\n @param threadNums: maximum number of threads\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @return: the result of import data\n public boolean importDataFromContent(String desc, String data, String delimiter, boolean continueOnError,\n int threadNums, String graph, double timeout) throws UnsupportedEncodingException\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing point and edge data is a write request, the client in HA mode can only send a request to import point and edge data to the leader."}),"\n",(0,n.jsx)(r.h3,{id:"213-import-schema-from-file",children:"2.13. Import schema from file"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' boolean ret = client.importSchemaFromFile("./test/data/yago.conf", "default", 1000);\n log.info("importSchemaFromFile : " + ret);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param schemaFile: the schema_file contains schema\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @return: the result of import schema\n public boolean importSchemaFromFile(String schemaFile, String graph, double timeout)\n throws UnsupportedEncodingException, IOException\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing schema is a write request, the client in HA mode can only send an import schema request to the leader."}),"\n",(0,n.jsx)(r.h3,{id:"214-import-point-and-edge-data-from-file",children:"2.14. Import point and edge data from file"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' boolean ret = client.importDataFromFile("./test/data/yago.conf", ",", true, 16, 0, "default", 1000000000);\n log.info("importDataFromFile : " + ret);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param confFile: data file contains format description and data\n @param delimiter: data separator\n @param continueOnError: whether to continue when importing data fails\n @param threadNums: maximum number of threads\n @param skipPackages: skip packages number\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @return: the result of import data\n public boolean importDataFromFile(String confFile, String delimiter, boolean continueOnError, int threadNums,\n int skipPackages, String graph, double timeout) throws IOException, UnsupportedEncodingException\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing point and edge data is a write request, the client in HA mode can only send a request to import point and edge data to the leader."})]})}function u(e={}){const{wrapper:r}={...(0,a.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,r,t)=>{t.d(r,{R:()=>i,x:()=>l});var n=t(6540);const a={},o=n.createContext(a);function i(e){const r=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function l(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(o.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[7462],{2624:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var n=t(4848),a=t(8453);const o={},i="TuGraph Java SDK",l={id:"client-tools/java-client",title:"TuGraph Java SDK",description:"This document primarily provides usage instructions for the TuGraph Java SDK. It is crucial to note that the TuGraph Java SDK will no longer receive updates or maintenance in the future. Users are strongly advised to utilize bolt instead.",source:"@site/../docs/en-US/source/7.client-tools/3.java-client.md",sourceDirName:"7.client-tools",slug:"/client-tools/java-client",permalink:"/tugraph-db/en/client-tools/java-client",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph C++ SDK",permalink:"/tugraph-db/en/client-tools/cpp-client"},next:{title:"TuGraph-OGM",permalink:"/tugraph-db/en/client-tools/tugraph-ogm"}},s={},d=[{value:"1.Compile java client code",id:"1compile-java-client-code",level:2},{value:"2.Demo",id:"2demo",level:2},{value:"2.1.Instantiate the client object",id:"21instantiate-the-client-object",level:3},{value:"2.1.1.Instantiate a single node client object",id:"211instantiate-a-single-node-client-object",level:4},{value:"2.1.2.Instantiate the HA cluster to directly connect to the client object",id:"212instantiate-the-ha-cluster-to-directly-connect-to-the-client-object",level:4},{value:"2.1.3.Instantiate the HA cluster to indirectly connect to the client object",id:"213instantiate-the-ha-cluster-to-indirectly-connect-to-the-client-object",level:4},{value:"2.2.Call cypher",id:"22call-cypher",level:3},{value:"2.3. Send cypher request to leader",id:"23-send-cypher-request-to-leader",level:3},{value:"2.4. Call GQL",id:"24-call-gql",level:3},{value:"2.5. Send GQL request to leader",id:"25-send-gql-request-to-leader",level:3},{value:"2.6. Calling stored procedures",id:"26-calling-stored-procedures",level:3},{value:"2.7. Call the stored procedure to the leader",id:"27-call-the-stored-procedure-to-the-leader",level:3},{value:"2.8. Load stored procedure",id:"28-load-stored-procedure",level:3},{value:"2.9. List stored procedures",id:"29-list-stored-procedures",level:3},{value:"2.10. Delete stored procedures",id:"210-delete-stored-procedures",level:3},{value:"2.11. Import schema from byte stream",id:"211-import-schema-from-byte-stream",level:3},{value:"2.12. Import edge data from byte stream",id:"212-import-edge-data-from-byte-stream",level:3},{value:"2.13. Import schema from file",id:"213-import-schema-from-file",level:3},{value:"2.14. Import point and edge data from file",id:"214-import-point-and-edge-data-from-file",level:3}];function c(e){const r={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.header,{children:(0,n.jsx)(r.h1,{id:"tugraph-java-sdk",children:"TuGraph Java SDK"})}),"\n",(0,n.jsxs)(r.blockquote,{children:["\n",(0,n.jsxs)(r.p,{children:["This document primarily provides usage instructions for the TuGraph Java SDK. It is crucial to note that the TuGraph Java SDK will no longer receive updates or maintenance in the future. Users are strongly advised to utilize ",(0,n.jsx)(r.a,{href:"/tugraph-db/en/client-tools/bolt-client",children:"bolt"})," instead."]}),"\n"]}),"\n",(0,n.jsx)(r.h2,{id:"1compile-java-client-code",children:"1.Compile java client code"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-shell",children:"cd deps/tugraph-db-client-java\nsh local_build.sh\n"})}),"\n",(0,n.jsx)(r.h2,{id:"2demo",children:"2.Demo"}),"\n",(0,n.jsx)(r.h3,{id:"21instantiate-the-client-object",children:"2.1.Instantiate the client object"}),"\n",(0,n.jsx)(r.p,{children:"Adding maven dependencies"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-xml",children:"\n com.antgroup.tugraph\n tugraph-db-java-rpc-client\n 1.4.1\n\n"})}),"\n",(0,n.jsx)(r.p,{children:"Introduce dependencies"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:"import com.antgroup.tugraph.TuGraphDbRpcClient;\n"})}),"\n",(0,n.jsx)(r.h4,{id:"211instantiate-a-single-node-client-object",children:"2.1.1.Instantiate a single node client object"}),"\n",(0,n.jsx)(r.p,{children:"When starting the server in single-node mode, the client is instantiated in the following format"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'TuGraphDbRpcClient client = new TuGraphDbRpcClient("127.0.0.1:19099", "admin", "73@TuGraph");\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:"public TuGraphDbRpcClient(String url, String user, String pass)\n@param url: tugraph host looks like ip:port\n@param user: login user name\n@param password: login password\n"})}),"\n",(0,n.jsx)(r.h4,{id:"212instantiate-the-ha-cluster-to-directly-connect-to-the-client-object",children:"2.1.2.Instantiate the HA cluster to directly connect to the client object"}),"\n",(0,n.jsx)(r.p,{children:"When the HA cluster deployed on the server can be directly connected using the URL configured in ha_conf, the client is instantiated according to the following format"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'TuGraphDbRpcClient client = new TuGraphDbRpcClient("127.0.0.1:19099", "admin", "73@TuGraph");\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:"public TuGraphDbRpcClient(String url, String user, String pass)\n@param url: tugraph host looks like ip:port\n@param user: login user name\n@param password: login password\n"})}),"\n",(0,n.jsx)(r.p,{children:"The user only needs to pass in the url of any node in the HA cluster, and the client will automatically maintain the connection pool based on the query information returned by the server, and there is no need to manually restart the client when the HA cluster expands horizontally."}),"\n",(0,n.jsx)(r.h4,{id:"213instantiate-the-ha-cluster-to-indirectly-connect-to-the-client-object",children:"2.1.3.Instantiate the HA cluster to indirectly connect to the client object"}),"\n",(0,n.jsx)(r.p,{children:"When the HA cluster deployed on the server cannot use the URL configured in ha_conf to connect directly but must use an indirect URL (such as the Alibaba Cloud public network URL), the client is instantiated according to the following format."}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:'List urls = new ArrayList<>();\nurls.add("189.33.97.23:9091");\nurls.add("189.33.97.24:9091");\nurls.add("189.33.97.25:9091");\nTuGraphDbRpcClient client = new TuGraphDbRpcClient(urls, "admin", "73@TuGraph");\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:"public TuGraphDbRpcClient(List urls, String user, String password)\n@param urls: tugraph host list\n@param user: login user name\n@param password: login password\n"})}),"\n",(0,n.jsx)(r.p,{children:"Because the URL that the user connects to is different from the information configured when the server starts, the client connection pool cannot be automatically updated by sending a request to the cluster, so it is necessary to manually pass in the URLs of all nodes in the cluster when starting the client, and when the cluster node changes Manually restart the client."}),"\n",(0,n.jsx)(r.h3,{id:"22call-cypher",children:"2.2.Call cypher"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String res = client.callCypher("CALL db.edgeLabels()", "default", 10);\n log.info("db.edgeLabels() : " + res);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param cypher: inquire statement.\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @param url: (Optional) Node address of calling cypher\n @return: the result of cypher query execution\n public String callCypher(String cypher, String graph, double timeout, String url)\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter.\nNote: JAVA does not support default parameters, therefore, default parameters in JAVA are implemented using overloaded functions."}),"\n",(0,n.jsx)(r.h3,{id:"23-send-cypher-request-to-leader",children:"2.3. Send cypher request to leader"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String res = client.callCypherToLeader("CALL db.edgeLabels()", "default", 10);\n log.info("db.edgeLabels() : " + res);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param cypher: inquire statement.\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @return: the result of cypher query execution\n public String callCypherToLeader(String cypher, String graph, double timeout)\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface only supports use in HA mode. In the client in HA mode, in order to prevent requests from being sent to followers with unsynchronized data,\nUsers can directly send requests to the leader, and the leader is elected by the cluster."}),"\n",(0,n.jsx)(r.h3,{id:"24-call-gql",children:"2.4. Call GQL"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String res = client.callGql("CALL db.edgeLabels()", "default", 10);\n log.info("db.edgeLabels() : " + res);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param gql: inquire statement.\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @param url: (Optional) Node address of calling GQL\n @return: the result of GQL query execution\n public String callGql(String gql, String graph, double timeout, String url)\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter.\nNote: JAVA does not support default parameters, therefore, default parameters in JAVA are implemented using overloaded functions."}),"\n",(0,n.jsx)(r.h3,{id:"25-send-gql-request-to-leader",children:"2.5. Send GQL request to leader"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String res = client.callGqlToLeader("CALL db.edgeLabels()", "default", 10);\n log.info("db.edgeLabels() : " + res);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param gql: inquire statement.\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @return: the result of cypher query execution\n public String callGqlToLeader(String cypher, String graph, double timeout)\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface only supports use in HA mode. In the client in HA mode, in order to prevent requests from being sent to followers with unsynchronized data,\nUsers can directly send requests to the leader, and the leader is elected by the cluster."}),"\n",(0,n.jsx)(r.h3,{id:"26-calling-stored-procedures",children:"2.6. Calling stored procedures"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String result = client.callProcedure("CPP", "khop", kHopParamGen(), 1000, false, "default");\n log.info("testCallProcedure : " + result);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param procedureType: the procedure type, currently supported CPP and PY\n @param procedureName: procedure name\n @param param: the execution parameters\n @param procedureTimeOut: Maximum execution time, overruns will be interrupted\n @param inProcess: Running query or not\n @param graph: the graph to query\n @param jsonFormat: (Optional) Return format of calling stored procedure\n @param url: (Optional) Node address of calling procedure\n @return: the result of procedure execution\n public String callProcedure(String procedureType, String procedureName, String param, double procedureTimeOut,\n boolean inProcess, String graph, String url)\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. By default, the execution result of the stored procedure is directly returned in string format. Specifying jsonFormat as true can return the execution result in json format.\nAmong them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,n.jsx)(r.h3,{id:"27-call-the-stored-procedure-to-the-leader",children:"2.7. Call the stored procedure to the leader"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String result = client.callProcedureToLeader("CPP", "khop", kHopParamGen(), 1000, false, "default");\n log.info("testCallProcedureToLeader : " + result);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param procedureType: the procedure type, currently supported CPP and PY\n @param procedureName: procedure name\n @param param: the execution parameters\n @param procedureTimeOut: Maximum execution time, overruns will be interrupted\n @param inProcess: Running query or not\n @param graph: the graph to query\n @param jsonFormat: (Optional) Return format of calling stored procedure\n @return: the result of procedure execution\n public String callProcedureToLeader(String procedureType, String procedureName, String param, double procedureTimeOut,\n boolean inProcess, String graph)\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in HA mode. By default, the execution result of the stored procedure is directly returned in string format. Specifying jsonFormat as true can return the execution result in json format."}),"\n",(0,n.jsx)(r.h3,{id:"28-load-stored-procedure",children:"2.8. Load stored procedure"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' boolean result = client.loadProcedure("./test/procedure/khop.so", "CPP", "khop", "SO", "test loadprocedure", true, "v1", "default");\n log.info("loadProcedure : " + result);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param sourceFile: the source_file contains procedure code\n @param procedureType: the procedure type, currently supported CPP and PY\n @param procedureName: procedure name\n @param codeType: code type, currently supported PY, SO, CPP, ZIP\n @param procedureDescription: procedure description\n @param readOnly: procedure is read only or not\n @param version: The version of procedure\n @param graph: the graph to query.\n @return: the result of procedure execution\n public boolean loadProcedure(String sourceFile, String procedureType, String procedureName, String codeType,\n String procedureDescription, boolean readOnly, String version, String graph) throws Exception\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since loading a stored procedure is a write request, the client in HA mode can only send a request to load a stored procedure to the leader."}),"\n",(0,n.jsx)(r.h3,{id:"29-list-stored-procedures",children:"2.9. List stored procedures"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String result = client.listProcedures("CPP", "any", "default");\n log.info("listProcedures : " + result);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param procedureType: the procedure type, currently supported CPP and PY\n @param version: The version of procedure\n @param graph: the graph to query.\n @param url: (Optional) Node address of listing procedure\n @return: the list of procedures\n public String listProcedures(String procedureType, String version, String graph, String url) throws Exception\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,n.jsx)(r.h3,{id:"210-delete-stored-procedures",children:"2.10. Delete stored procedures"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' String result = client.deleteProcedure("CPP", "sortstr", "default");\n log.info("loadProcedure : " + result);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param procedureType: the procedure type, currently supported CPP and PY\n @param procedureName: procedure name\n @param graph: the graph to query.\n @return: the result of procedure execution\n public boolean deleteProcedure(String procedureType, String procedureName, String graph) throws Exception\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since deleting a stored procedure is a write request, the client in HA mode can only send a delete request to the leader."}),"\n",(0,n.jsx)(r.h3,{id:"211-import-schema-from-byte-stream",children:"2.11. Import schema from byte stream"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' boolean ret = client.importSchemaFromContent(schema, "default", 1000);\n log.info("importSchemaFromContent : " + ret);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param schema: the schema to be imported\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @return: the result of import schema\n public boolean importSchemaFromContent(String schema, String graph, double timeout) throws UnsupportedEncodingException\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing schema is a write request, the client in HA mode can only send an import schema request to the leader."}),"\n",(0,n.jsx)(r.h3,{id:"212-import-edge-data-from-byte-stream",children:"2.12. Import edge data from byte stream"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' boolean ret = client.importDataFromContent(personDesc, person, ",", true, 16, "default", 1000);\n log.info("importDataFromContent : " + ret);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param desc: data format description\n @param data: the data to be imported\n @param delimiter: data separator\n @param continueOnError: whether to continue when importing data fails\n @param threadNums: maximum number of threads\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @return: the result of import data\n public boolean importDataFromContent(String desc, String data, String delimiter, boolean continueOnError,\n int threadNums, String graph, double timeout) throws UnsupportedEncodingException\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing point and edge data is a write request, the client in HA mode can only send a request to import point and edge data to the leader."}),"\n",(0,n.jsx)(r.h3,{id:"213-import-schema-from-file",children:"2.13. Import schema from file"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' boolean ret = client.importSchemaFromFile("./test/data/yago.conf", "default", 1000);\n log.info("importSchemaFromFile : " + ret);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param schemaFile: the schema_file contains schema\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @return: the result of import schema\n public boolean importSchemaFromFile(String schemaFile, String graph, double timeout)\n throws UnsupportedEncodingException, IOException\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing schema is a write request, the client in HA mode can only send an import schema request to the leader."}),"\n",(0,n.jsx)(r.h3,{id:"214-import-point-and-edge-data-from-file",children:"2.14. Import point and edge data from file"}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{className:"language-java",children:' boolean ret = client.importDataFromFile("./test/data/yago.conf", ",", true, 16, 0, "default", 1000000000);\n log.info("importDataFromFile : " + ret);\n'})}),"\n",(0,n.jsx)(r.pre,{children:(0,n.jsx)(r.code,{children:" @param confFile: data file contains format description and data\n @param delimiter: data separator\n @param continueOnError: whether to continue when importing data fails\n @param threadNums: maximum number of threads\n @param skipPackages: skip packages number\n @param graph: the graph to query.\n @param timeout: Maximum execution time, overruns will be interrupted\n @return: the result of import data\n public boolean importDataFromFile(String confFile, String delimiter, boolean continueOnError, int threadNums,\n int skipPackages, String graph, double timeout) throws IOException, UnsupportedEncodingException\n"})}),"\n",(0,n.jsx)(r.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing point and edge data is a write request, the client in HA mode can only send a request to import point and edge data to the leader."})]})}function u(e={}){const{wrapper:r}={...(0,a.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,r,t)=>{t.d(r,{R:()=>i,x:()=>l});var n=t(6540);const a={},o=n.createContext(a);function i(e){const r=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function l(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(o.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5189e784.c209ae45.js b/assets/js/5189e784.98484c1b.js similarity index 99% rename from assets/js/5189e784.c209ae45.js rename to assets/js/5189e784.98484c1b.js index 07524935d0..2614deb989 100644 --- a/assets/js/5189e784.c209ae45.js +++ b/assets/js/5189e784.98484c1b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3916],{8406:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=t(4848),o=t(8453);const i={},s="TuGraph console client",l={id:"client-tools/bolt-console-client",title:"TuGraph console client",description:"lgraph_cli is a console client based on the bolt protocol, written in c++, which requires a connection to tugraph's bolt port.",source:"@site/../docs/en-US/source/7.client-tools/6.bolt-console-client.md",sourceDirName:"7.client-tools",slug:"/client-tools/bolt-console-client",permalink:"/tugraph-db/en/client-tools/bolt-console-client",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:6,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Bolt client",permalink:"/tugraph-db/en/client-tools/bolt-client"},next:{title:"TuGraph RESTful API",permalink:"/tugraph-db/en/client-tools/restful-api"}},a={},c=[{value:"lgraph_cli",id:"lgraph_cli",level:2},{value:"online export",id:"online-export",level:2},{value:"csv",id:"csv",level:3},{value:"json",id:"json",level:3}];function p(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"tugraph-console-client",children:"TuGraph console client"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"lgraph_cli"})," is a console client based on the bolt protocol, written in c++, which requires a connection to tugraph's bolt port."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"lgraph_cypher"})," is a console client based on http, written in python, which requires a connection to tugraph's http port."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"lgraph_cypher"})," needs some python libraries to be installed."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"lgraph_cli"})," is a binary executable file that has no dependencies on other dynamic libraries and can be executed by copying it to a linux server."]}),"\n",(0,r.jsx)(n.h2,{id:"lgraph_cli",children:(0,r.jsx)(n.code,{children:"lgraph_cli"})}),"\n",(0,r.jsxs)(n.p,{children:["The statement ends with a semicolon, type ",(0,r.jsx)(n.code,{children:"exit"}),", ",(0,r.jsx)(n.code,{children:"quit"})," or Ctrl-C to exit the client."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-powershell",children:"lgraph_cli --ip 127.0.0.1 --port 7687 --graph default --user admin --password 73@TuGraph\n\nWelcome to the TuGraph console client. Commands end with ';'.\nCopyright(C) 2018-2023 Ant Group. All rights reserved.\nType 'exit', 'quit' or Ctrl-C to exit.\n\nTuGraph> match(n) return n limit 1;\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| n |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| (:person {id:2,born:1961,poster_image:\"https://image.tmdb.org/t/p/w185/mh0lZ1XsT84FayMNiT6Erh91mVu.jpg\",name:\"Laurence Fishburne\"}) |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n\nTuGraph>\n"})}),"\n",(0,r.jsx)(n.p,{children:"The statement can be inputed on more than one line."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'TuGraph> match(n)\n -> return n\n -> limit 1;\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| n |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| (:person {id:2,born:1961,poster_image:"https://image.tmdb.org/t/p/w185/mh0lZ1XsT84FayMNiT6Erh91mVu.jpg",name:"Laurence Fishburne"}) |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n\nTuGraph>\n'})}),"\n",(0,r.jsx)(n.p,{children:"non-interactive"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-powershell",children:'\necho "match(n) return n limit 1;" | lgraph_cli --ip 127.0.0.1 --port 7687 --graph default --user admin --password 73@TuGraph\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| n |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| (:person {id:2,born:1961,poster_image:"https://image.tmdb.org/t/p/w185/mh0lZ1XsT84FayMNiT6Erh91mVu.jpg",name:"Laurence Fishburne"}) |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n1 rows\n\n'})}),"\n",(0,r.jsx)(n.p,{children:"read statements from file"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-powershell",children:'\ncat query.txt\nmatch(n) return n limit 1;\nmatch(n) return n limit 1;\n\nlgraph_cli --ip 127.0.0.1 --port 7687 --graph default --user admin --password 73@TuGraph < query.txt\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| n |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| (:person {id:2,born:1961,poster_image:"https://image.tmdb.org/t/p/w185/mh0lZ1XsT84FayMNiT6Erh91mVu.jpg",name:"Laurence Fishburne"}) |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| (:person {id:3,born:1967,poster_image:"https://image.tmdb.org/t/p/w185/8iATAc5z5XOKFFARLsvaawa8MTY.jpg",name:"Carrie-Anne Moss"}) |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n2 rows\n\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| n |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| (:person {id:2,born:1961,poster_image:"https://image.tmdb.org/t/p/w185/mh0lZ1XsT84FayMNiT6Erh91mVu.jpg",name:"Laurence Fishburne"}) |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| (:person {id:3,born:1967,poster_image:"https://image.tmdb.org/t/p/w185/8iATAc5z5XOKFFARLsvaawa8MTY.jpg",name:"Carrie-Anne Moss"}) |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n2 rows\n'})}),"\n",(0,r.jsx)(n.h2,{id:"online-export",children:"online export"}),"\n",(0,r.jsx)(n.p,{children:"lgraph_cli supports streaming read, so just redirect the output to a file. The output format supports csv and json"}),"\n",(0,r.jsx)(n.h3,{id:"csv",children:"csv"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-powershell",children:'\necho "match(n) return n.id, n.name;" | lgraph_cli --ip 127.0.0.1 --port 7687 --graph default --user admin --password 73@TuGraph --format csv > output.txt\n\n'})}),"\n",(0,r.jsx)(n.h3,{id:"json",children:"json"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-powershell",children:'\necho "match(n) return n.id, n.name;" | lgraph_cli --ip 127.0.0.1 --port 7687 --graph default --user admin --password 73@TuGraph --format json > output.txt\n\n'})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>l});var r=t(6540);const o={},i=r.createContext(o);function s(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3916],{8406:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=t(4848),o=t(8453);const i={},s="TuGraph console client",l={id:"client-tools/bolt-console-client",title:"TuGraph console client",description:"lgraph_cli is a console client based on the bolt protocol, written in c++, which requires a connection to tugraph's bolt port.",source:"@site/../docs/en-US/source/7.client-tools/6.bolt-console-client.md",sourceDirName:"7.client-tools",slug:"/client-tools/bolt-console-client",permalink:"/tugraph-db/en/client-tools/bolt-console-client",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:6,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Bolt client",permalink:"/tugraph-db/en/client-tools/bolt-client"},next:{title:"TuGraph RESTful API",permalink:"/tugraph-db/en/client-tools/restful-api"}},a={},c=[{value:"lgraph_cli",id:"lgraph_cli",level:2},{value:"online export",id:"online-export",level:2},{value:"csv",id:"csv",level:3},{value:"json",id:"json",level:3}];function p(e){const n={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"tugraph-console-client",children:"TuGraph console client"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"lgraph_cli"})," is a console client based on the bolt protocol, written in c++, which requires a connection to tugraph's bolt port."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"lgraph_cypher"})," is a console client based on http, written in python, which requires a connection to tugraph's http port."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"lgraph_cypher"})," needs some python libraries to be installed."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"lgraph_cli"})," is a binary executable file that has no dependencies on other dynamic libraries and can be executed by copying it to a linux server."]}),"\n",(0,r.jsx)(n.h2,{id:"lgraph_cli",children:(0,r.jsx)(n.code,{children:"lgraph_cli"})}),"\n",(0,r.jsxs)(n.p,{children:["The statement ends with a semicolon, type ",(0,r.jsx)(n.code,{children:"exit"}),", ",(0,r.jsx)(n.code,{children:"quit"})," or Ctrl-C to exit the client."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-powershell",children:"lgraph_cli --ip 127.0.0.1 --port 7687 --graph default --user admin --password 73@TuGraph\n\nWelcome to the TuGraph console client. Commands end with ';'.\nCopyright(C) 2018-2023 Ant Group. All rights reserved.\nType 'exit', 'quit' or Ctrl-C to exit.\n\nTuGraph> match(n) return n limit 1;\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| n |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| (:person {id:2,born:1961,poster_image:\"https://image.tmdb.org/t/p/w185/mh0lZ1XsT84FayMNiT6Erh91mVu.jpg\",name:\"Laurence Fishburne\"}) |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n\nTuGraph>\n"})}),"\n",(0,r.jsx)(n.p,{children:"The statement can be inputed on more than one line."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:'TuGraph> match(n)\n -> return n\n -> limit 1;\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| n |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| (:person {id:2,born:1961,poster_image:"https://image.tmdb.org/t/p/w185/mh0lZ1XsT84FayMNiT6Erh91mVu.jpg",name:"Laurence Fishburne"}) |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n\nTuGraph>\n'})}),"\n",(0,r.jsx)(n.p,{children:"non-interactive"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-powershell",children:'\necho "match(n) return n limit 1;" | lgraph_cli --ip 127.0.0.1 --port 7687 --graph default --user admin --password 73@TuGraph\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| n |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| (:person {id:2,born:1961,poster_image:"https://image.tmdb.org/t/p/w185/mh0lZ1XsT84FayMNiT6Erh91mVu.jpg",name:"Laurence Fishburne"}) |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n1 rows\n\n'})}),"\n",(0,r.jsx)(n.p,{children:"read statements from file"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-powershell",children:'\ncat query.txt\nmatch(n) return n limit 1;\nmatch(n) return n limit 1;\n\nlgraph_cli --ip 127.0.0.1 --port 7687 --graph default --user admin --password 73@TuGraph < query.txt\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| n |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| (:person {id:2,born:1961,poster_image:"https://image.tmdb.org/t/p/w185/mh0lZ1XsT84FayMNiT6Erh91mVu.jpg",name:"Laurence Fishburne"}) |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| (:person {id:3,born:1967,poster_image:"https://image.tmdb.org/t/p/w185/8iATAc5z5XOKFFARLsvaawa8MTY.jpg",name:"Carrie-Anne Moss"}) |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n2 rows\n\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| n |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| (:person {id:2,born:1961,poster_image:"https://image.tmdb.org/t/p/w185/mh0lZ1XsT84FayMNiT6Erh91mVu.jpg",name:"Laurence Fishburne"}) |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n| (:person {id:3,born:1967,poster_image:"https://image.tmdb.org/t/p/w185/8iATAc5z5XOKFFARLsvaawa8MTY.jpg",name:"Carrie-Anne Moss"}) |\n+-------------------------------------------------------------------------------------------------------------------------------------+\n2 rows\n'})}),"\n",(0,r.jsx)(n.h2,{id:"online-export",children:"online export"}),"\n",(0,r.jsx)(n.p,{children:"lgraph_cli supports streaming read, so just redirect the output to a file. The output format supports csv and json"}),"\n",(0,r.jsx)(n.h3,{id:"csv",children:"csv"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-powershell",children:'\necho "match(n) return n.id, n.name;" | lgraph_cli --ip 127.0.0.1 --port 7687 --graph default --user admin --password 73@TuGraph --format csv > output.txt\n\n'})}),"\n",(0,r.jsx)(n.h3,{id:"json",children:"json"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-powershell",children:'\necho "match(n) return n.id, n.name;" | lgraph_cli --ip 127.0.0.1 --port 7687 --graph default --user admin --password 73@TuGraph --format json > output.txt\n\n'})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>l});var r=t(6540);const o={},i=r.createContext(o);function s(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/54acc636.35f642d9.js b/assets/js/54acc636.b4d5e407.js similarity index 99% rename from assets/js/54acc636.35f642d9.js rename to assets/js/54acc636.b4d5e407.js index 6656cc9a87..78e26e46fa 100644 --- a/assets/js/54acc636.35f642d9.js +++ b/assets/js/54acc636.b4d5e407.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6944],{7220:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>o,toc:()=>d});var r=n(4848),s=n(8453);const a={},i="TuGraph C++ SDK",o={id:"client-tools/cpp-client",title:"TuGraph C++ SDK",description:"This document is the usage instruction of TuGraph C++ SDK",source:"@site/../docs/en-US/source/7.client-tools/2.cpp-client.md",sourceDirName:"7.client-tools",slug:"/client-tools/cpp-client",permalink:"/tugraph-db/en/client-tools/cpp-client",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Python SDK",permalink:"/tugraph-db/en/client-tools/python-client"},next:{title:"TuGraph Java SDK",permalink:"/tugraph-db/en/client-tools/java-client"}},l={},d=[{value:"1.Instructions",id:"1instructions",level:2},{value:"2.Demo",id:"2demo",level:2},{value:"2.1.Instantiate the client object",id:"21instantiate-the-client-object",level:3},{value:"2.1.1. Instantiate a single node client object",id:"211-instantiate-a-single-node-client-object",level:4},{value:"2.1.2. Instantiate the HA cluster to directly connect to the client object",id:"212-instantiate-the-ha-cluster-to-directly-connect-to-the-client-object",level:4},{value:"2.1.3. Instantiate the HA cluster to indirectly connect to the client object",id:"213-instantiate-the-ha-cluster-to-indirectly-connect-to-the-client-object",level:4},{value:"2.2.Call cypher",id:"22call-cypher",level:3},{value:"2.3. Send cypher request to leader",id:"23-send-cypher-request-to-leader",level:3},{value:"2.4. Call GQL",id:"24-call-gql",level:3},{value:"2.5. Send GQL request to leader",id:"25-send-gql-request-to-leader",level:3},{value:"2.6. Calling stored procedures",id:"26-calling-stored-procedures",level:3},{value:"2.7. Call the stored procedure to the leader",id:"27-call-the-stored-procedure-to-the-leader",level:3},{value:"2.8. Load stored procedure",id:"28-load-stored-procedure",level:3},{value:"2.9. List stored procedures",id:"29-list-stored-procedures",level:3},{value:"2.10. Delete stored procedures",id:"210-delete-stored-procedures",level:3},{value:"2.11. Import schema from byte stream",id:"211-import-schema-from-byte-stream",level:3},{value:"2.12. Import edge data from byte stream",id:"212-import-edge-data-from-byte-stream",level:3},{value:"2.13. Import schema from file",id:"213-import-schema-from-file",level:3},{value:"2.14. Import point and edge data from file",id:"214-import-point-and-edge-data-from-file",level:3}];function c(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"tugraph-c-sdk",children:"TuGraph C++ SDK"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"This document is the usage instruction of TuGraph C++ SDK"}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"1instructions",children:"1.Instructions"}),"\n",(0,r.jsx)(t.p,{children:"C++ Client can use RPC to connect to lgraph_server to import data, execute stored procedures, call Cypher and other operations."}),"\n",(0,r.jsx)(t.h2,{id:"2demo",children:"2.Demo"}),"\n",(0,r.jsx)(t.h3,{id:"21instantiate-the-client-object",children:"2.1.Instantiate the client object"}),"\n",(0,r.jsx)(t.p,{children:"Introduce dependencies and instantiate"}),"\n",(0,r.jsx)(t.h4,{id:"211-instantiate-a-single-node-client-object",children:"2.1.1. Instantiate a single node client object"}),"\n",(0,r.jsx)(t.p,{children:"When starting the server in single-node mode, the client is instantiated in the following format"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:'RpcClient client("127.0.0.1:19099", "admin", "73@TuGraph");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"RpcClient(const std::string& url, const std::string& user, const std::string& password);\n@param url: tugraph host looks like ip:port\n@param user: login user name\n@param password: login password\n"})}),"\n",(0,r.jsx)(t.h4,{id:"212-instantiate-the-ha-cluster-to-directly-connect-to-the-client-object",children:"2.1.2. Instantiate the HA cluster to directly connect to the client object"}),"\n",(0,r.jsx)(t.p,{children:"When the HA cluster deployed on the server can be directly connected using the URL configured in ha_conf, the client is instantiated according to the following format"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:'RpcClient client("127.0.0.1:19099", "admin", "73@TuGraph");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"RpcClient(const std::string& url, const std::string& user, const std::string& password);\n@param url: tugraph host looks like ip:port\n@param user: login user name\n@param password: login password\n"})}),"\n",(0,r.jsx)(t.p,{children:"The user only needs to pass in the url of any node in the HA cluster, and the client will automatically maintain the connection pool based on the query information returned by the server, and there is no need to manually restart the client when the HA cluster expands horizontally."}),"\n",(0,r.jsx)(t.h4,{id:"213-instantiate-the-ha-cluster-to-indirectly-connect-to-the-client-object",children:"2.1.3. Instantiate the HA cluster to indirectly connect to the client object"}),"\n",(0,r.jsx)(t.p,{children:"When the HA cluster deployed on the server cannot use the URL configured in ha_conf to connect directly but must use an indirect URL (such as the Alibaba Cloud public network URL), the client is instantiated according to the following format."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-java",children:'std::vector urls = {"189.33.97.23:9091", "189.33.97.24:9091", "189.33.97.25:9091"};\nTuGraphDbRpcClient client = new TuGraphDbRpcClient(urls, "admin", "73@TuGraph");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"RpcClient(std::vector& urls, std::string user, std::string password)\n@param urls: tugraph host list\n@param user: login user name\n@param password: login password\n"})}),"\n",(0,r.jsx)(t.p,{children:"Because the URL that the user connects to is different from the information configured when the server starts, the client connection pool cannot be automatically updated by sending a request to the cluster, so it is necessary to manually pass in the URLs of all nodes in the cluster when starting the client, and when the cluster node changes Manually restart the client."}),"\n",(0,r.jsx)(t.h3,{id:"22call-cypher",children:"2.2.Call cypher"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:" std::string str;\n bool ret = client.CallCypher(str,\n \"CALL db.createVertexLabel('actor', 'name', 'name', string, false, 'age', int8, true)\");\n\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool CallCypher(std::string& result, const std::string& cypher,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0, const std::string& url = "");\n @param [out] result The result.\n @param [in] cypher inquire statement.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format\uff0c true is json\uff0cOtherwise, binary\n format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be interrupted.\n @param [in] url (Optional) Node address of calling cypher.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"23-send-cypher-request-to-leader",children:"2.3. Send cypher request to leader"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:" std::string str;\n bool ret = client.CallCypherToLeader(str,\n \"CALL db.createVertexLabel('actor', 'name', 'name', string, false, 'age', int8, true)\");\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool CallCypherToLeader(std::string& result, const std::string& cypher,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0);\n @param [out] result The result.\n @param [in] cypher inquire statement.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, otherwise, binary\n format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be interrupted.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface only supports use in HA mode. In the client in HA mode, in order to prevent requests from being sent to followers with unsynchronized data,\nUsers can directly send requests to the leader, and the leader is elected by the cluster."}),"\n",(0,r.jsx)(t.h3,{id:"24-call-gql",children:"2.4. Call GQL"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:" std::string str;\n bool ret = client.CallGql(str,\n \"CALL db.createVertexLabel('actor', 'name', 'name', string, false, 'age', int8, true)\");\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool CallGql(std::string& result, const std::string& gql,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0, const std::string& url = "");\n @param [out] result The result.\n @param [in] gql inquire statement.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, otherwise, binary\n format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be interrupted.\n @param [in] url (Optional) Node address of calling gql.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"25-send-gql-request-to-leader",children:"2.5. Send GQL request to leader"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:" std::string str;\n bool ret = client.CallGqlToLeader(str,\n \"CALL db.createVertexLabel('actor', 'name', 'name', string, false, 'age', int8, true)\");\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool CallGqlToLeader(std::string& result, const std::string& gql,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0);\n @param [out] result The result.\n @param [in] gql inquire statement.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, otherwise, binary\n format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be interrupted.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface only supports use in HA mode. In the client in HA mode, in order to prevent requests from being sent to followers with unsynchronized data,\nUsers can directly send requests to the leader, and the leader is elected by the cluster."}),"\n",(0,r.jsx)(t.h3,{id:"26-calling-stored-procedures",children:"2.6. Calling stored procedures"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string str;\n bool ret = client.CallProcedure(str, "CPP", "test_plugin1", "bcefg");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool CallProcedure(std::string& result, const std::string& procedure_type,\n const std::string& procedure_name, const std::string& param,\n double procedure_time_out = 0.0, bool in_process = false,\n const std::string& graph = "default", bool json_format = true,\n const std::string& url = "");\n @param [out] result The result.\n @param [in] procedure_type the procedure type, currently supported CPP and PY.\n @param [in] procedure_name procedure name.\n @param [in] param the execution parameters.\n @param [in] procedure_time_out (Optional) Maximum execution time, overruns will be\n interrupted.\n @param [in] in_process (Optional) support in future.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, Otherwise,\n binary format.\n @param [in] url (Optional) Node address of calling procedure.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. By default, the execution result of the stored procedure is directly returned in json format. Specifying jsonFormat as false can return the execution result in string format.\nAmong them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"27-call-the-stored-procedure-to-the-leader",children:"2.7. Call the stored procedure to the leader"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string str;\n bool ret = client.CallProcedureToLeader(str, "CPP", "test_plugin1", "bcefg");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool CallProcedureToLeader(std::string& result, const std::string& procedure_type,\n const std::string& procedure_name, const std::string& param,\n double procedure_time_out = 0.0, bool in_process = false,\n const std::string& graph = "default", bool json_format = true);\n @param [out] result The result.\n @param [in] procedure_type the procedure type, currently supported CPP and PY.\n @param [in] procedure_name procedure name.\n @param [in] param the execution parameters.\n @param [in] procedure_time_out (Optional) Maximum execution time, overruns will be\n interrupted.\n @param [in] in_process (Optional) support in future.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, Otherwise,\n binary format.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in HA mode. By default, the execution result of the stored procedure is directly returned in json format. Specifying jsonFormat as false can return the execution result in string format."}),"\n",(0,r.jsx)(t.h3,{id:"28-load-stored-procedure",children:"2.8. Load stored procedure"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string str;\n bool ret = client.LoadProcedure(str, code_sleep, "PY", "python_plugin1", "PY", "this is a test plugin", true)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool LoadProcedure(std::string& result, const std::string& source_file,\n const std::string& procedure_type, const std::string& procedure_name,\n const std::string& code_type, const std::string& procedure_description,\n bool read_only, const std::string& version = "v1",\n const std::string& graph = "default");\n @param [out] result The result.\n @param [in] source_file the source_file contain procedure code.\n @param [in] procedure_type the procedure type, currently supported CPP and PY.\n @param [in] procedure_name procedure name.\n @param [in] code_type code type, currently supported PY, SO, CPP, ZIP.\n @param [in] procedure_description procedure description.\n @param [in] read_only procedure is read only or not.\n @param [in] version (Optional) the version of procedure.\n @param [in] graph (Optional) the graph to query.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since loading a stored procedure is a write request, the client in HA mode can only send a request to load a stored procedure to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"29-list-stored-procedures",children:"2.9. List stored procedures"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:" std::string str;\n bool ret = client.ListProcedures(str);\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool ListProcedures(std::string& result, const std::string& procedure_type,\n const std::string& version = "any",\n const std::string& graph = "default", const std::string& url = "");\n @param [out] result The result.\n @param [in] procedure_type (Optional) the procedure type, "" for all procedures,\n CPP and PY for special type.\n @param [in] version (Optional) the version of procedure.\n @param [in] graph (Optional) the graph to query.\n @param [in] url Node address of calling procedure.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, the request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"210-delete-stored-procedures",children:"2.10. Delete stored procedures"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string str;\n bool ret = client.DeleteProcedure(str, "CPP", "test_plugin1");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool DeleteProcedure(std::string& result, const std::string& procedure_type,\n const std::string& procedure_name, const std::string& graph = "default");\n @param [out] result The result.\n @param [in] procedure_type the procedure type, currently supported CPP and PY.\n @param [in] procedure_name procedure name.\n @param [in] graph (Optional) the graph to query.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since deleting a stored procedure is a write request, the client in HA mode can only send a delete request to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"211-import-schema-from-byte-stream",children:"2.11. Import schema from byte stream"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string str;\n bool ret = client.ImportSchemaFromContent(str, sImportContent["schema"]);\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool ImportSchemaFromContent(std::string& result, const std::string& schema,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0);\n @param [out] result The result.\n @param [in] schema the schema to be imported.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, otherwise, binary\n format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be interrupted.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing schema is a write request, the client in HA mode can only send an import schema request to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"212-import-edge-data-from-byte-stream",children:"2.12. Import edge data from byte stream"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string str;\n ret = client.ImportDataFromContent(str, sImportContent["person_desc"], sImportContent["person"],",");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool ImportDataFromContent(std::string& result, const std::string& desc,\n const std::string& data, const std::string& delimiter,\n bool continue_on_error = false, int thread_nums = 8,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0);\n @param [out] result The result.\n @param [in] desc data format description.\n @param [in] data the data to be imported.\n @param [in] delimiter data separator.\n @param [in] continue_on_error (Optional) whether to continue when importing data fails.\n @param [in] thread_nums (Optional) maximum number of threads.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, Otherwise,\n binary format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be\n interrupted.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing point and edge data is a write request, the client in HA mode can only send a request to import point and edge data to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"213-import-schema-from-file",children:"2.13. Import schema from file"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string conf_file("./yago.conf");\n std::string str;\n ret = client.ImportSchemaFromFile(str, conf_file);\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool ImportSchemaFromFile(std::string& result, const std::string& schema_file,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0);\n @param [out] result The result.\n @param [in] schema_file the schema_file contain schema.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, otherwise, binary\n format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be interrupted.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing schema is a write request, the client in HA mode can only send an import schema request to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"214-import-point-and-edge-data-from-file",children:"2.14. Import point and edge data from file"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string conf_file("./yago.conf");\n std::string str;\n ret = client.ImportDataFromFile(str, conf_file, ",");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool ImportDataFromFile(std::string& result, const std::string& conf_file,\n const std::string& delimiter, bool continue_on_error = false,\n int thread_nums = 8, int skip_packages = 0,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0);\n @param [out] result The result.\n @param [in] conf_file data file contains format description and data.\n @param [in] delimiter data separator.\n @param [in] continue_on_error (Optional) whether to continue when importing data fails.\n @param [in] thread_nums (Optional) maximum number of threads.\n @param [in] skip_packages (Optional) skip packages number.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, Otherwise,\n binary format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be\n interrupted.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing point and edge data is a write request, the client in HA mode can only send a request to import point and edge data to the leader."})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>o});var r=n(6540);const s={},a=r.createContext(s);function i(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6944],{7220:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>o,toc:()=>d});var r=n(4848),s=n(8453);const a={},i="TuGraph C++ SDK",o={id:"client-tools/cpp-client",title:"TuGraph C++ SDK",description:"This document is the usage instruction of TuGraph C++ SDK",source:"@site/../docs/en-US/source/7.client-tools/2.cpp-client.md",sourceDirName:"7.client-tools",slug:"/client-tools/cpp-client",permalink:"/tugraph-db/en/client-tools/cpp-client",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Python SDK",permalink:"/tugraph-db/en/client-tools/python-client"},next:{title:"TuGraph Java SDK",permalink:"/tugraph-db/en/client-tools/java-client"}},l={},d=[{value:"1.Instructions",id:"1instructions",level:2},{value:"2.Demo",id:"2demo",level:2},{value:"2.1.Instantiate the client object",id:"21instantiate-the-client-object",level:3},{value:"2.1.1. Instantiate a single node client object",id:"211-instantiate-a-single-node-client-object",level:4},{value:"2.1.2. Instantiate the HA cluster to directly connect to the client object",id:"212-instantiate-the-ha-cluster-to-directly-connect-to-the-client-object",level:4},{value:"2.1.3. Instantiate the HA cluster to indirectly connect to the client object",id:"213-instantiate-the-ha-cluster-to-indirectly-connect-to-the-client-object",level:4},{value:"2.2.Call cypher",id:"22call-cypher",level:3},{value:"2.3. Send cypher request to leader",id:"23-send-cypher-request-to-leader",level:3},{value:"2.4. Call GQL",id:"24-call-gql",level:3},{value:"2.5. Send GQL request to leader",id:"25-send-gql-request-to-leader",level:3},{value:"2.6. Calling stored procedures",id:"26-calling-stored-procedures",level:3},{value:"2.7. Call the stored procedure to the leader",id:"27-call-the-stored-procedure-to-the-leader",level:3},{value:"2.8. Load stored procedure",id:"28-load-stored-procedure",level:3},{value:"2.9. List stored procedures",id:"29-list-stored-procedures",level:3},{value:"2.10. Delete stored procedures",id:"210-delete-stored-procedures",level:3},{value:"2.11. Import schema from byte stream",id:"211-import-schema-from-byte-stream",level:3},{value:"2.12. Import edge data from byte stream",id:"212-import-edge-data-from-byte-stream",level:3},{value:"2.13. Import schema from file",id:"213-import-schema-from-file",level:3},{value:"2.14. Import point and edge data from file",id:"214-import-point-and-edge-data-from-file",level:3}];function c(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"tugraph-c-sdk",children:"TuGraph C++ SDK"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"This document is the usage instruction of TuGraph C++ SDK"}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"1instructions",children:"1.Instructions"}),"\n",(0,r.jsx)(t.p,{children:"C++ Client can use RPC to connect to lgraph_server to import data, execute stored procedures, call Cypher and other operations."}),"\n",(0,r.jsx)(t.h2,{id:"2demo",children:"2.Demo"}),"\n",(0,r.jsx)(t.h3,{id:"21instantiate-the-client-object",children:"2.1.Instantiate the client object"}),"\n",(0,r.jsx)(t.p,{children:"Introduce dependencies and instantiate"}),"\n",(0,r.jsx)(t.h4,{id:"211-instantiate-a-single-node-client-object",children:"2.1.1. Instantiate a single node client object"}),"\n",(0,r.jsx)(t.p,{children:"When starting the server in single-node mode, the client is instantiated in the following format"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:'RpcClient client("127.0.0.1:19099", "admin", "73@TuGraph");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"RpcClient(const std::string& url, const std::string& user, const std::string& password);\n@param url: tugraph host looks like ip:port\n@param user: login user name\n@param password: login password\n"})}),"\n",(0,r.jsx)(t.h4,{id:"212-instantiate-the-ha-cluster-to-directly-connect-to-the-client-object",children:"2.1.2. Instantiate the HA cluster to directly connect to the client object"}),"\n",(0,r.jsx)(t.p,{children:"When the HA cluster deployed on the server can be directly connected using the URL configured in ha_conf, the client is instantiated according to the following format"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:'RpcClient client("127.0.0.1:19099", "admin", "73@TuGraph");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"RpcClient(const std::string& url, const std::string& user, const std::string& password);\n@param url: tugraph host looks like ip:port\n@param user: login user name\n@param password: login password\n"})}),"\n",(0,r.jsx)(t.p,{children:"The user only needs to pass in the url of any node in the HA cluster, and the client will automatically maintain the connection pool based on the query information returned by the server, and there is no need to manually restart the client when the HA cluster expands horizontally."}),"\n",(0,r.jsx)(t.h4,{id:"213-instantiate-the-ha-cluster-to-indirectly-connect-to-the-client-object",children:"2.1.3. Instantiate the HA cluster to indirectly connect to the client object"}),"\n",(0,r.jsx)(t.p,{children:"When the HA cluster deployed on the server cannot use the URL configured in ha_conf to connect directly but must use an indirect URL (such as the Alibaba Cloud public network URL), the client is instantiated according to the following format."}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-java",children:'std::vector urls = {"189.33.97.23:9091", "189.33.97.24:9091", "189.33.97.25:9091"};\nTuGraphDbRpcClient client = new TuGraphDbRpcClient(urls, "admin", "73@TuGraph");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"RpcClient(std::vector& urls, std::string user, std::string password)\n@param urls: tugraph host list\n@param user: login user name\n@param password: login password\n"})}),"\n",(0,r.jsx)(t.p,{children:"Because the URL that the user connects to is different from the information configured when the server starts, the client connection pool cannot be automatically updated by sending a request to the cluster, so it is necessary to manually pass in the URLs of all nodes in the cluster when starting the client, and when the cluster node changes Manually restart the client."}),"\n",(0,r.jsx)(t.h3,{id:"22call-cypher",children:"2.2.Call cypher"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:" std::string str;\n bool ret = client.CallCypher(str,\n \"CALL db.createVertexLabel('actor', 'name', 'name', string, false, 'age', int8, true)\");\n\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool CallCypher(std::string& result, const std::string& cypher,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0, const std::string& url = "");\n @param [out] result The result.\n @param [in] cypher inquire statement.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format\uff0c true is json\uff0cOtherwise, binary\n format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be interrupted.\n @param [in] url (Optional) Node address of calling cypher.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"23-send-cypher-request-to-leader",children:"2.3. Send cypher request to leader"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:" std::string str;\n bool ret = client.CallCypherToLeader(str,\n \"CALL db.createVertexLabel('actor', 'name', 'name', string, false, 'age', int8, true)\");\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool CallCypherToLeader(std::string& result, const std::string& cypher,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0);\n @param [out] result The result.\n @param [in] cypher inquire statement.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, otherwise, binary\n format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be interrupted.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface only supports use in HA mode. In the client in HA mode, in order to prevent requests from being sent to followers with unsynchronized data,\nUsers can directly send requests to the leader, and the leader is elected by the cluster."}),"\n",(0,r.jsx)(t.h3,{id:"24-call-gql",children:"2.4. Call GQL"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:" std::string str;\n bool ret = client.CallGql(str,\n \"CALL db.createVertexLabel('actor', 'name', 'name', string, false, 'age', int8, true)\");\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool CallGql(std::string& result, const std::string& gql,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0, const std::string& url = "");\n @param [out] result The result.\n @param [in] gql inquire statement.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, otherwise, binary\n format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be interrupted.\n @param [in] url (Optional) Node address of calling gql.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"25-send-gql-request-to-leader",children:"2.5. Send GQL request to leader"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:" std::string str;\n bool ret = client.CallGqlToLeader(str,\n \"CALL db.createVertexLabel('actor', 'name', 'name', string, false, 'age', int8, true)\");\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool CallGqlToLeader(std::string& result, const std::string& gql,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0);\n @param [out] result The result.\n @param [in] gql inquire statement.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, otherwise, binary\n format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be interrupted.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface only supports use in HA mode. In the client in HA mode, in order to prevent requests from being sent to followers with unsynchronized data,\nUsers can directly send requests to the leader, and the leader is elected by the cluster."}),"\n",(0,r.jsx)(t.h3,{id:"26-calling-stored-procedures",children:"2.6. Calling stored procedures"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string str;\n bool ret = client.CallProcedure(str, "CPP", "test_plugin1", "bcefg");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool CallProcedure(std::string& result, const std::string& procedure_type,\n const std::string& procedure_name, const std::string& param,\n double procedure_time_out = 0.0, bool in_process = false,\n const std::string& graph = "default", bool json_format = true,\n const std::string& url = "");\n @param [out] result The result.\n @param [in] procedure_type the procedure type, currently supported CPP and PY.\n @param [in] procedure_name procedure name.\n @param [in] param the execution parameters.\n @param [in] procedure_time_out (Optional) Maximum execution time, overruns will be\n interrupted.\n @param [in] in_process (Optional) support in future.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, Otherwise,\n binary format.\n @param [in] url (Optional) Node address of calling procedure.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. By default, the execution result of the stored procedure is directly returned in json format. Specifying jsonFormat as false can return the execution result in string format.\nAmong them, in the client in HA mode, a read request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"27-call-the-stored-procedure-to-the-leader",children:"2.7. Call the stored procedure to the leader"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string str;\n bool ret = client.CallProcedureToLeader(str, "CPP", "test_plugin1", "bcefg");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool CallProcedureToLeader(std::string& result, const std::string& procedure_type,\n const std::string& procedure_name, const std::string& param,\n double procedure_time_out = 0.0, bool in_process = false,\n const std::string& graph = "default", bool json_format = true);\n @param [out] result The result.\n @param [in] procedure_type the procedure type, currently supported CPP and PY.\n @param [in] procedure_name procedure name.\n @param [in] param the execution parameters.\n @param [in] procedure_time_out (Optional) Maximum execution time, overruns will be\n interrupted.\n @param [in] in_process (Optional) support in future.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, Otherwise,\n binary format.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in HA mode. By default, the execution result of the stored procedure is directly returned in json format. Specifying jsonFormat as false can return the execution result in string format."}),"\n",(0,r.jsx)(t.h3,{id:"28-load-stored-procedure",children:"2.8. Load stored procedure"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string str;\n bool ret = client.LoadProcedure(str, code_sleep, "PY", "python_plugin1", "PY", "this is a test plugin", true)\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool LoadProcedure(std::string& result, const std::string& source_file,\n const std::string& procedure_type, const std::string& procedure_name,\n const std::string& code_type, const std::string& procedure_description,\n bool read_only, const std::string& version = "v1",\n const std::string& graph = "default");\n @param [out] result The result.\n @param [in] source_file the source_file contain procedure code.\n @param [in] procedure_type the procedure type, currently supported CPP and PY.\n @param [in] procedure_name procedure name.\n @param [in] code_type code type, currently supported PY, SO, CPP, ZIP.\n @param [in] procedure_description procedure description.\n @param [in] read_only procedure is read only or not.\n @param [in] version (Optional) the version of procedure.\n @param [in] graph (Optional) the graph to query.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since loading a stored procedure is a write request, the client in HA mode can only send a request to load a stored procedure to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"29-list-stored-procedures",children:"2.9. List stored procedures"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:" std::string str;\n bool ret = client.ListProcedures(str);\n"})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool ListProcedures(std::string& result, const std::string& procedure_type,\n const std::string& version = "any",\n const std::string& graph = "default", const std::string& url = "");\n @param [out] result The result.\n @param [in] procedure_type (Optional) the procedure type, "" for all procedures,\n CPP and PY for special type.\n @param [in] version (Optional) the version of procedure.\n @param [in] graph (Optional) the graph to query.\n @param [in] url Node address of calling procedure.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, in the client in HA mode, the request can be directed to a server by specifying the url parameter."}),"\n",(0,r.jsx)(t.h3,{id:"210-delete-stored-procedures",children:"2.10. Delete stored procedures"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string str;\n bool ret = client.DeleteProcedure(str, "CPP", "test_plugin1");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool DeleteProcedure(std::string& result, const std::string& procedure_type,\n const std::string& procedure_name, const std::string& graph = "default");\n @param [out] result The result.\n @param [in] procedure_type the procedure type, currently supported CPP and PY.\n @param [in] procedure_name procedure name.\n @param [in] graph (Optional) the graph to query.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since deleting a stored procedure is a write request, the client in HA mode can only send a delete request to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"211-import-schema-from-byte-stream",children:"2.11. Import schema from byte stream"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string str;\n bool ret = client.ImportSchemaFromContent(str, sImportContent["schema"]);\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool ImportSchemaFromContent(std::string& result, const std::string& schema,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0);\n @param [out] result The result.\n @param [in] schema the schema to be imported.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, otherwise, binary\n format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be interrupted.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing schema is a write request, the client in HA mode can only send an import schema request to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"212-import-edge-data-from-byte-stream",children:"2.12. Import edge data from byte stream"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string str;\n ret = client.ImportDataFromContent(str, sImportContent["person_desc"], sImportContent["person"],",");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool ImportDataFromContent(std::string& result, const std::string& desc,\n const std::string& data, const std::string& delimiter,\n bool continue_on_error = false, int thread_nums = 8,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0);\n @param [out] result The result.\n @param [in] desc data format description.\n @param [in] data the data to be imported.\n @param [in] delimiter data separator.\n @param [in] continue_on_error (Optional) whether to continue when importing data fails.\n @param [in] thread_nums (Optional) maximum number of threads.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, Otherwise,\n binary format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be\n interrupted.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing point and edge data is a write request, the client in HA mode can only send a request to import point and edge data to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"213-import-schema-from-file",children:"2.13. Import schema from file"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string conf_file("./yago.conf");\n std::string str;\n ret = client.ImportSchemaFromFile(str, conf_file);\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool ImportSchemaFromFile(std::string& result, const std::string& schema_file,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0);\n @param [out] result The result.\n @param [in] schema_file the schema_file contain schema.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, otherwise, binary\n format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be interrupted.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing schema is a write request, the client in HA mode can only send an import schema request to the leader."}),"\n",(0,r.jsx)(t.h3,{id:"214-import-point-and-edge-data-from-file",children:"2.14. Import point and edge data from file"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-C++",children:' std::string conf_file("./yago.conf");\n std::string str;\n ret = client.ImportDataFromFile(str, conf_file, ",");\n'})}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:' bool ImportDataFromFile(std::string& result, const std::string& conf_file,\n const std::string& delimiter, bool continue_on_error = false,\n int thread_nums = 8, int skip_packages = 0,\n const std::string& graph = "default", bool json_format = true,\n double timeout = 0);\n @param [out] result The result.\n @param [in] conf_file data file contains format description and data.\n @param [in] delimiter data separator.\n @param [in] continue_on_error (Optional) whether to continue when importing data fails.\n @param [in] thread_nums (Optional) maximum number of threads.\n @param [in] skip_packages (Optional) skip packages number.\n @param [in] graph (Optional) the graph to query.\n @param [in] json_format (Optional) Returns the format, true is json, Otherwise,\n binary format.\n @param [in] timeout (Optional) Maximum execution time, overruns will be\n interrupted.\n @returns True if it succeeds, false if it fails.\n'})}),"\n",(0,r.jsx)(t.p,{children:"This interface supports use in stand-alone mode and HA mode. Among them, since importing point and edge data is a write request, the client in HA mode can only send a request to import point and edge data to the leader."})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>o});var r=n(6540);const s={},a=r.createContext(s);function i(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/553e0098.67cf795e.js b/assets/js/553e0098.4a760954.js similarity index 98% rename from assets/js/553e0098.67cf795e.js rename to assets/js/553e0098.4a760954.js index a384775007..ffb722f998 100644 --- a/assets/js/553e0098.67cf795e.js +++ b/assets/js/553e0098.4a760954.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[9806],{3076:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>a,default:()=>c,frontMatter:()=>s,metadata:()=>d,toc:()=>h});var n=r(4848),i=r(8453);const s={},a="DEMO Earth",d={id:"quick-start/demo/wandering-earth",title:"DEMO:Wandering Earth",description:"This document mainly introduces the usage of the Wandering Earth demo.",source:"@site/../docs/en-US/source/3.quick-start/2.demo/2.wandering-earth.md",sourceDirName:"3.quick-start/2.demo",slug:"/quick-start/demo/wandering-earth",permalink:"/tugraph-db/en/quick-start/demo/wandering-earth",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"DEMO:Movie",permalink:"/tugraph-db/en/quick-start/demo/movie"},next:{title:"The Three Body",permalink:"/tugraph-db/en/quick-start/demo/the-three-body"}},o={},h=[{value:"1.Demo Scene Design",id:"1demo-scene-design",level:2},{value:"2.Instructions for Use",id:"2instructions-for-use",level:2},{value:"3.Data Import",id:"3data-import",level:2},{value:"4.Cypher Query",id:"4cypher-query",level:2},{value:"5.Usage Display",id:"5usage-display",level:2},{value:"5.1.Data Import Display",id:"51data-import-display",level:3},{value:"5.2.Query Display",id:"52query-display",level:3}];function l(e){const t={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"demo-earth",children:"DEMO:Wandering Earth"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"This document mainly introduces the usage of the Wandering Earth demo."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"1demo-scene-design",children:"1.Demo Scene Design"}),"\n",(0,n.jsx)(t.p,{children:"The demo is based on the story background of The Wandering Earth 1 and The Wandering Earth 2."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Based on the plot, a graph structure is designed, including three types of points: organization, character, celestial body, and facility, and two types of edges: event and relationship."}),"\n",(0,n.jsx)(t.li,{children:"Prepared data corresponding to the schema based on the plot."}),"\n",(0,n.jsx)(t.li,{children:"Prepared some queries to ask questions about the plot."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"2instructions-for-use",children:"2.Instructions for Use"}),"\n",(0,n.jsx)(t.p,{children:"Prerequisite: TuGraph is installed."}),"\n",(0,n.jsx)(t.h2,{id:"3data-import",children:"3.Data Import"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Data storage directory: ",(0,n.jsx)(t.a,{href:"https://github.com/TuGraph-family/tugraph-db-demo",children:"https://github.com/TuGraph-family/tugraph-db-demo"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Modify the DATA_PATH in import.json according to the corresponding data storage directory. For more details, please refer to ",(0,n.jsx)(t.a,{href:"/tugraph-db/en/utility-tools/data-import",children:"Data Importing"}),"."]}),"\n",(0,n.jsx)(t.li,{children:"After starting the TuGraph service, access ${HOST_IP}:7070 to open the web page and confirm whether the data is imported successfully."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"4cypher-query",children:"4.Cypher Query"}),"\n",(0,n.jsx)(t.p,{children:"Refer to the Cypher document and enter Cypher in the TuGraph web page frontend for queries."}),"\n",(0,n.jsx)(t.h2,{id:"5usage-display",children:"5.Usage Display"}),"\n",(0,n.jsx)(t.h3,{id:"51data-import-display",children:"5.1.Data Import Display"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"\u6570\u636e\u5bfc\u5165\u5c55\u793a",src:r(1526).A+"",width:"1527",height:"1120"})}),"\n",(0,n.jsx)(t.h3,{id:"52query-display",children:"5.2.Query Display"}),"\n",(0,n.jsx)(t.p,{children:"Query all event processes related to the crisis on Jupiter."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"\u6570\u636e\u5bfc\u5165\u5c55\u793a",src:r(3293).A+"",width:"1527",height:"1120"})}),"\n",(0,n.jsx)(t.p,{children:"Query all event processes related to all crises."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"\u6570\u636e\u5bfc\u5165\u5c55\u793a",src:r(52).A+"",width:"1527",height:"1120"})})]})}function c(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1526:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/wandering-earth-1-0d55cfd964d4531decde10ca519f0435.png"},3293:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/wandering-earth-2-d6bbcf44b71e4f7e8927ac46e99f8636.png"},52:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/wandering-earth-3-79833e91472e6b0c46d7d663b964728a.png"},8453:(e,t,r)=>{r.d(t,{R:()=>a,x:()=>d});var n=r(6540);const i={},s=n.createContext(i);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[9806],{3076:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>a,default:()=>c,frontMatter:()=>s,metadata:()=>d,toc:()=>h});var n=r(4848),i=r(8453);const s={},a="DEMO Earth",d={id:"quick-start/demo/wandering-earth",title:"DEMO:Wandering Earth",description:"This document mainly introduces the usage of the Wandering Earth demo.",source:"@site/../docs/en-US/source/3.quick-start/2.demo/2.wandering-earth.md",sourceDirName:"3.quick-start/2.demo",slug:"/quick-start/demo/wandering-earth",permalink:"/tugraph-db/en/quick-start/demo/wandering-earth",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"DEMO:Movie",permalink:"/tugraph-db/en/quick-start/demo/movie"},next:{title:"The Three Body",permalink:"/tugraph-db/en/quick-start/demo/the-three-body"}},o={},h=[{value:"1.Demo Scene Design",id:"1demo-scene-design",level:2},{value:"2.Instructions for Use",id:"2instructions-for-use",level:2},{value:"3.Data Import",id:"3data-import",level:2},{value:"4.Cypher Query",id:"4cypher-query",level:2},{value:"5.Usage Display",id:"5usage-display",level:2},{value:"5.1.Data Import Display",id:"51data-import-display",level:3},{value:"5.2.Query Display",id:"52query-display",level:3}];function l(e){const t={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"demo-earth",children:"DEMO:Wandering Earth"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"This document mainly introduces the usage of the Wandering Earth demo."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"1demo-scene-design",children:"1.Demo Scene Design"}),"\n",(0,n.jsx)(t.p,{children:"The demo is based on the story background of The Wandering Earth 1 and The Wandering Earth 2."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Based on the plot, a graph structure is designed, including three types of points: organization, character, celestial body, and facility, and two types of edges: event and relationship."}),"\n",(0,n.jsx)(t.li,{children:"Prepared data corresponding to the schema based on the plot."}),"\n",(0,n.jsx)(t.li,{children:"Prepared some queries to ask questions about the plot."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"2instructions-for-use",children:"2.Instructions for Use"}),"\n",(0,n.jsx)(t.p,{children:"Prerequisite: TuGraph is installed."}),"\n",(0,n.jsx)(t.h2,{id:"3data-import",children:"3.Data Import"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["Data storage directory: ",(0,n.jsx)(t.a,{href:"https://github.com/TuGraph-family/tugraph-db-demo",children:"https://github.com/TuGraph-family/tugraph-db-demo"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:["Modify the DATA_PATH in import.json according to the corresponding data storage directory. For more details, please refer to ",(0,n.jsx)(t.a,{href:"/tugraph-db/en/utility-tools/data-import",children:"Data Importing"}),"."]}),"\n",(0,n.jsx)(t.li,{children:"After starting the TuGraph service, access ${HOST_IP}:7070 to open the web page and confirm whether the data is imported successfully."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"4cypher-query",children:"4.Cypher Query"}),"\n",(0,n.jsx)(t.p,{children:"Refer to the Cypher document and enter Cypher in the TuGraph web page frontend for queries."}),"\n",(0,n.jsx)(t.h2,{id:"5usage-display",children:"5.Usage Display"}),"\n",(0,n.jsx)(t.h3,{id:"51data-import-display",children:"5.1.Data Import Display"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"\u6570\u636e\u5bfc\u5165\u5c55\u793a",src:r(1526).A+"",width:"1527",height:"1120"})}),"\n",(0,n.jsx)(t.h3,{id:"52query-display",children:"5.2.Query Display"}),"\n",(0,n.jsx)(t.p,{children:"Query all event processes related to the crisis on Jupiter."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"\u6570\u636e\u5bfc\u5165\u5c55\u793a",src:r(3293).A+"",width:"1527",height:"1120"})}),"\n",(0,n.jsx)(t.p,{children:"Query all event processes related to all crises."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"\u6570\u636e\u5bfc\u5165\u5c55\u793a",src:r(52).A+"",width:"1527",height:"1120"})})]})}function c(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1526:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/wandering-earth-1-0d55cfd964d4531decde10ca519f0435.png"},3293:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/wandering-earth-2-d6bbcf44b71e4f7e8927ac46e99f8636.png"},52:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/wandering-earth-3-79833e91472e6b0c46d7d663b964728a.png"},8453:(e,t,r)=>{r.d(t,{R:()=>a,x:()=>d});var n=r(6540);const i={},s=n.createContext(i);function a(e){const t=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5680df66.7884e317.js b/assets/js/5680df66.c948707d.js similarity index 99% rename from assets/js/5680df66.7884e317.js rename to assets/js/5680df66.c948707d.js index 8725aab3b4..598a57dd24 100644 --- a/assets/js/5680df66.7884e317.js +++ b/assets/js/5680df66.c948707d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4432],{419:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var i=t(4848),a=t(8453);const r={},o="OlapOnDisk API",s={id:"olap&procedure/olap/olap-on-disk-api",title:"OlapOnDisk API",description:"This document mainly introduces the usage instructions of OlapOnDisk API in detail",source:"@site/../docs/en-US/source/9.olap&procedure/2.olap/4.olap-on-disk-api.md",sourceDirName:"9.olap&procedure/2.olap",slug:"/olap&procedure/olap/olap-on-disk-api",permalink:"/tugraph-db/en/olap&procedure/olap/olap-on-disk-api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"OlapOnDB API",permalink:"/tugraph-db/en/olap&procedure/olap/olap-on-db-api"},next:{title:"Python Olap API",permalink:"/tugraph-db/en/olap&procedure/olap/python-api"}},l={},d=[{value:"Table of contents",id:"table-of-contents",level:2},{value:"1.Introduction",id:"1introduction",level:3},{value:"2.Algorithm example",id:"2algorithm-example",level:3},{value:"2.1.Head file",id:"21head-file",level:4},{value:"2.2.Configuration class MyConfig",id:"22configuration-class-myconfig",level:4},{value:"2.3.main function",id:"23main-function",level:4},{value:"2.4.bfs algorithm process",id:"24bfs-algorithm-process",level:4},{value:"3.Description of other commonly used functions",id:"3description-of-other-commonly-used-functions",level:3},{value:"3.1.Graph load",id:"31graph-load",level:4},{value:"3.2.Graph write",id:"32graph-write",level:4},{value:"3.3.graph parse function",id:"33graph-parse-function",level:4}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",edgedata:"edgedata",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"olapondisk-api",children:"OlapOnDisk API"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"This document mainly introduces the usage instructions of OlapOnDisk API in detail"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"table-of-contents",children:"Table of contents"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#1introduction",children:"1. Introduction"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#2algorithm-example",children:"2. Algorithm Example"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#21head-file",children:"2.1 header files"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#22configuration-class-myconfig",children:"2.2 Configuration class MyConfig"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#23main-function",children:"2.3 Main function"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#24bfs-algorithm-process",children:"2.4 bfs algorithm flow"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#3description-of-other-commonly-used-functions",children:"3. Function description of other commonly used functions"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#31graph-load",children:"3.1 Image Loading"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#32graph-write",children:"3.2 Image writing"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#33graph-parse-function",children:"3.3 Graph Analysis Function"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"1introduction",children:"1.Introduction"}),"\n",(0,i.jsx)(n.p,{children:"The Standalone mode of TuGraph can be used to load graph data files, where the sources of graph data files can include text files, BINARY_FILE binary files, and ODPS sources. In this mode, TuGraph can quickly load multiple data sources into a graph, and then run iterative algorithms such as BFS, WCC, SSSP, etc. on the graph, and output the final result to the terminal."}),"\n",(0,i.jsx)(n.p,{children:"In TuGraph, the export and calculation process can be accelerated through parallel processing in memory, so as to achieve near real-time processing and analysis. Compared with traditional methods, it avoids the overhead of data export and storage, and can use compact Graph data structures achieve desirable performance for computation."}),"\n",(0,i.jsx)(n.p,{children:"TuGraph has built-in a large number of common graph analysis algorithms and rich auxiliary interfaces, so users hardly need to implement the specific graph calculation process by themselves. They only need to include the header file (.h) of the corresponding algorithm library when implementing their own stored procedures. To your own program, and link your own dynamic library files in the compilation phase."}),"\n",(0,i.jsx)(n.p,{children:"This document mainly introduces the common interfaces of Standalone, and the auxiliary functions used are mainly contained in the OlapOnDB class. At the same time, in order to help users understand and facilitate, the BFS algorithm is illustrated with examples."}),"\n",(0,i.jsx)(n.h3,{id:"2algorithm-example",children:"2.Algorithm example"}),"\n",(0,i.jsxs)(n.p,{children:["Here, the BFS algorithm is explained in blocks, which are roughly divided into the main function ",(0,i.jsx)(n.code,{children:"main"}),", the BFS algorithm process ",(0,i.jsx)(n.code,{children:"BFSCore"})," function and the configuration class MyConfig."]}),"\n",(0,i.jsx)(n.h4,{id:"21head-file",children:"2.1.Head file"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-C++",children:'#include "olap/olap_on_disk.h" \n#include "tools/json.hpp" //Header files to include when using TuGraph\n#include "./algo.h" //A header file containing various algorithmic logic functions\n'})}),"\n",(0,i.jsx)(n.p,{children:"When using TuGraph to realize the calculation application of graph data files, generally, the StandaloneGraph class object graph is first created, the graph file data is loaded into the graph, and then the graph calculation process is realized by calling the graph logic function, and finally the result of the graph calculation is printed out."}),"\n",(0,i.jsx)(n.h4,{id:"22configuration-class-myconfig",children:"2.2.Configuration class MyConfig"}),"\n",(0,i.jsxs)(n.p,{children:["The MyConfig configuration class function is used to provide the configuration information required for the algorithm logic calculation, inherited from ConfigBase",(0,i.jsx)(n.edgedata,{children:", where EdgeDate can choose Empty (unweighted graph), int (the weight of the weighted graph is an integer) or double (the weight of the weighted graph is double) type."})]}),"\n",(0,i.jsx)(n.p,{children:"The MyConfig configuration class generally depends on the algorithm, and additional configuration information is required as follows:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Parameters required by the algorithm"}),"\n",(0,i.jsx)(n.li,{children:"Algorithm name"}),"\n",(0,i.jsx)(n.li,{children:"Configure the Print function in the class\nOther common members inherit from ConfigBase, please refer to src/olap/olap_config.h for reference."}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-C++",children:'class MyConfig : public ConfigBase {\n public:\n\n // The parameters required by the algorithm are initialized\n size_t root = 0;\n std::string name = std::string("bfs");\n void AddParameter(fma_common::Configuration & config) {\n ConfigBase::AddParameter(config);\n config.Add(root, "root", true)\n .Comment("the root of bfs");\n }\n void Print() {\n ConfigBase::Print();\n std::cout << " name: " << name << std::endl;\n if (root != size_t(-1)) {\n std::cout << " root: " << root << std::endl;\n } else {\n std::cout << " root: UNSET" << std::endl;\n }\n }\n // The configuration file accepts command line parameters. This use case will sequentially read the parameters when calling the algorithm from the command line. The value specified by the user is preferred. If the user does not specify it, the default parameter is selected.\n MyConfig(int &argc, char** &argv): ConfigBase(argc, argv) {\n fma_common::Configuration config;\n AddParameter(config);\n config.ExitAfterHelp(true);\n config.ParseAndFinalize(argc, argv);\n Print();\n }\n};\n'})}),"\n",(0,i.jsx)(n.h4,{id:"23main-function",children:"2.3.main function"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-C++",children:'int main(int argc, char** argv) {\n double start_time;\n // Statistical memory consumption class MemUsage instantiation\n MemUsage memUsage;\n memUsage.startMemRecord();\n\n // prepare\n start_time = get_time();\n // Configuration class MyConfig instantiation\n MyConfig config(argc, argv);\n size_t root_vid = config.root;\n // OlapOnDisk class instantiation\n OlapOnDisk graph;\n graph.Load(config, DUAL_DIRECTION);\n memUsage.print();\n memUsage.reset();\n // Statistical graph loading time consumption\n auto prepare_cost = get_time() - start_time;\n printf("prepare_cost = %.2lf(s)\\n", prepare_cost);\n\n // core\n start_time = get_time();\n // Create an array to count whether a node has been traversed\n auto parent = graph.AllocVertexArray();\n // Breadth-first search algorithm, returns the number of nodes connected to the root_vid root node in the graph\n size_t count = BFSCore(graph, root_vid, parent);\n memUsage.print();\n memUsage.reset();\n auto core_cost = get_time() - start_time;\n printf("core_cost = %.2lf(s)\\n", core_cost);\n\n // output\n start_time = get_time();\n // Print relevant information to the terminal\n printf("found_vertices = %ld\\n", count);\n auto output_cost = get_time() - start_time;\n printf("output_cost = %.2lf(s)\\n", output_cost);\n\n printf("total_cost = %.2lf(s)\\n", prepare_cost + core_cost + output_cost);\n printf("DONE.");\n\n return 0;\n}\n'})}),"\n",(0,i.jsx)(n.h4,{id:"24bfs-algorithm-process",children:"2.4.bfs algorithm process"}),"\n",(0,i.jsxs)(n.p,{children:["The main process of ",(0,i.jsx)(n.code,{children:"bfs"})," has two input parameters, the snapshot class (subgraph) and the number of iterations. The overall process can be divided into the following steps:"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Relevant definitions and initialization of data structures"}),"\n",(0,i.jsx)(n.li,{children:"Use the batch function to perform cyclic calculations on each node, find all nodes adjacent to the current node in each round, and exchange them when the round ends."}),"\n",(0,i.jsx)(n.li,{children:"Until all nodes are found, return the number of nodes discovered_vertices."}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-C++",children:'size_t BFSCore(Graph& graph, size_t root_vid, ParallelVector& parent){\n\n size_t root = root_vid;\n auto active_in = graph.AllocVertexSubset(); //Allocate an array, active_in is used to store the nodes found in the previous cycle stage\n active_in.Add(root); //Add the root node to the array\n auto active_out = graph.AllocVertexSubset(); //Allocate the array active_out to store the nodes found in the current cycle stage\n parent.Fill((size_t)-1); //Assign a value of -1 to the node in the parent array, -1 means not found\n parent[root] = root;\n size_t num_activations = 1; //Indicates the number of nodes found in the current loop phase\n size_t discovered_vertices = 0; //Indicates the total number of nodes found in the current cycle phase\n\n for (int ii = 0; num_activations != 0; ii++) { //num_activations indicates the number of nodes found in the current loop phase\n printf("activates(%d) <= %lu\\n", ii, num_activations);\n discovered_vertices += num_activations; //discovered_vertices indicates the total number of nodes found in the current cycle phase\n active_out.Clear();\n num_activations = graph.ProcessVertexActive(\n [&](size_t vi) {\n size_t num_activations = 0;\n for (auto& edge : graph.OutEdges(vi)) { //Each cycle starts from the root node, finds adjacent adjacent nodes, changes its parent value, and operates num_activations+1\n size_t dst = edge.neighbour;\n if (parent[dst] == (size_t)-1) {\n auto lock = graph.GuardVertexLock(dst);\n if (parent[dst] == (size_t)-1) {\n parent[dst] = vi;\n num_activations += 1;\n active_out.Add(dst); //Store the nodes found in the current loop phase\n }\n }\n }\n return num_activations;\n },\n active_in);\n active_in.Swap(active_out);\n }\n // return all nodes\n return discovered_vertices;\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"3description-of-other-commonly-used-functions",children:"3.Description of other commonly used functions"}),"\n",(0,i.jsx)(n.h4,{id:"31graph-load",children:"3.1.Graph load"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph-StandaloneThe loading sources of graph data files are mainly divided into three categories: text files, binary files, and ODPS. The binary file is a file in which the binary representation of the edge data is arranged in order, which can save a lot of storage space. Its loading function is divided into three types, namely:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"void Load(ConfigBase config,EdgeDirectionPolicy edge_direction_policy = DUAL_DIRECTION)"}),"\uff1aThe loading method of the graph data file contains two parameters, and their meanings represent respectively"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"config"}),"\uff1aConfiguration parameters to load. This parameter saves the general information of the graph (such as data source, algorithm name, data input and output paths, number of vertices, etc.) and different information parameters configured according to different data sources and different algorithms."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"edge_direction_policy"}),"\uff1aSpecifies whether the graph is directed or undirected, including three modes: DUAL_DIRECTION, MAKE_SYMMETRIC, and INPUT_SYMMETRIC. Among them, DUAL_DIRECTION is the default graph loading method.\nDUAL_DIRECTION : The input file is an asymmetric graph and the loaded graph is an asymmetric graph.\nMAKE_SYMMETRIC : The input file is an asymmetric graph and the loaded graph is a symmetric graph.\nINPUT_SYMMETRIC : The input file is a symmetric graph and the loaded graph is a symmetric graph.\nFor details, see ",(0,i.jsx)(n.code,{children:"enum EdgeDirectionPolicy"})," in the olap_config.h file under the lgraph folder."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"void LoadVertexArrayTxt(V * array, std::string path, std::function &)> parse_line)"}),"\uff1aLoad the vertices in the file into an array in the order of their ids. The meanings of each parameter are:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"array"}),"\uff1aarray of data to be read"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"path"}),"\uff1aThe path to read the file, each line in the file represents a pair of vertex"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"parse_line"}),"\uff1aA user-defined function that tells the system how to parse a line of text data into a vertex pair."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"32graph-write",children:"3.2.Graph write"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"void Write(ConfigBase & config, ParallelVector& array, size_t array_size, std::string name, std::function filter_output = filter_output_default)"}),"\uff1aWrite the data in the array back to the file, and the meanings of each parameter are:\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"config"}),"\uff1aConfiguration parameters to load. This parameter saves the general information of the graph (such as data source, algorithm name, data input and output paths, number of vertices, etc.) and different information parameters configured according to different data sources and different algorithms."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"array"}),"\uff1aarray of data to be written"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"array_size"}),"\uff1aThe length of the number of data to be written"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"name"}),"\uff1aalgorithm name"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"filter_output"}),"\uff1aWrite data rule function, the data to be written needs to meet the requirements of this function."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"33graph-parse-function",children:"3.3.graph parse function"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"std::tuple parse_line_unweighted(const char *p, const char *end, EdgeUnit &e)"}),"\uff1aParse the graph data file, and load the graph as an unweighted graph."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"std::tuple parse_line_weighted(const char* p, const char* end, EdgeUnit& e)"}),"\uff1aParse the graph data file, load the graph as a weighted graph, and specify the weight data type by modifying ",(0,i.jsx)(n.edgedata,{children:"."})]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"This function can be specified through the constructor parse_line when the MyConfig class is defined."})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>s});var i=t(6540);const a={},r=i.createContext(a);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4432],{419:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var i=t(4848),a=t(8453);const r={},o="OlapOnDisk API",s={id:"olap&procedure/olap/olap-on-disk-api",title:"OlapOnDisk API",description:"This document mainly introduces the usage instructions of OlapOnDisk API in detail",source:"@site/../docs/en-US/source/9.olap&procedure/2.olap/4.olap-on-disk-api.md",sourceDirName:"9.olap&procedure/2.olap",slug:"/olap&procedure/olap/olap-on-disk-api",permalink:"/tugraph-db/en/olap&procedure/olap/olap-on-disk-api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"OlapOnDB API",permalink:"/tugraph-db/en/olap&procedure/olap/olap-on-db-api"},next:{title:"Python Olap API",permalink:"/tugraph-db/en/olap&procedure/olap/python-api"}},l={},d=[{value:"Table of contents",id:"table-of-contents",level:2},{value:"1.Introduction",id:"1introduction",level:3},{value:"2.Algorithm example",id:"2algorithm-example",level:3},{value:"2.1.Head file",id:"21head-file",level:4},{value:"2.2.Configuration class MyConfig",id:"22configuration-class-myconfig",level:4},{value:"2.3.main function",id:"23main-function",level:4},{value:"2.4.bfs algorithm process",id:"24bfs-algorithm-process",level:4},{value:"3.Description of other commonly used functions",id:"3description-of-other-commonly-used-functions",level:3},{value:"3.1.Graph load",id:"31graph-load",level:4},{value:"3.2.Graph write",id:"32graph-write",level:4},{value:"3.3.graph parse function",id:"33graph-parse-function",level:4}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",edgedata:"edgedata",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"olapondisk-api",children:"OlapOnDisk API"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"This document mainly introduces the usage instructions of OlapOnDisk API in detail"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"table-of-contents",children:"Table of contents"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#1introduction",children:"1. Introduction"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#2algorithm-example",children:"2. Algorithm Example"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#21head-file",children:"2.1 header files"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#22configuration-class-myconfig",children:"2.2 Configuration class MyConfig"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#23main-function",children:"2.3 Main function"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#24bfs-algorithm-process",children:"2.4 bfs algorithm flow"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#3description-of-other-commonly-used-functions",children:"3. Function description of other commonly used functions"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#31graph-load",children:"3.1 Image Loading"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#32graph-write",children:"3.2 Image writing"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#33graph-parse-function",children:"3.3 Graph Analysis Function"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"1introduction",children:"1.Introduction"}),"\n",(0,i.jsx)(n.p,{children:"The Standalone mode of TuGraph can be used to load graph data files, where the sources of graph data files can include text files, BINARY_FILE binary files, and ODPS sources. In this mode, TuGraph can quickly load multiple data sources into a graph, and then run iterative algorithms such as BFS, WCC, SSSP, etc. on the graph, and output the final result to the terminal."}),"\n",(0,i.jsx)(n.p,{children:"In TuGraph, the export and calculation process can be accelerated through parallel processing in memory, so as to achieve near real-time processing and analysis. Compared with traditional methods, it avoids the overhead of data export and storage, and can use compact Graph data structures achieve desirable performance for computation."}),"\n",(0,i.jsx)(n.p,{children:"TuGraph has built-in a large number of common graph analysis algorithms and rich auxiliary interfaces, so users hardly need to implement the specific graph calculation process by themselves. They only need to include the header file (.h) of the corresponding algorithm library when implementing their own stored procedures. To your own program, and link your own dynamic library files in the compilation phase."}),"\n",(0,i.jsx)(n.p,{children:"This document mainly introduces the common interfaces of Standalone, and the auxiliary functions used are mainly contained in the OlapOnDB class. At the same time, in order to help users understand and facilitate, the BFS algorithm is illustrated with examples."}),"\n",(0,i.jsx)(n.h3,{id:"2algorithm-example",children:"2.Algorithm example"}),"\n",(0,i.jsxs)(n.p,{children:["Here, the BFS algorithm is explained in blocks, which are roughly divided into the main function ",(0,i.jsx)(n.code,{children:"main"}),", the BFS algorithm process ",(0,i.jsx)(n.code,{children:"BFSCore"})," function and the configuration class MyConfig."]}),"\n",(0,i.jsx)(n.h4,{id:"21head-file",children:"2.1.Head file"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-C++",children:'#include "olap/olap_on_disk.h" \n#include "tools/json.hpp" //Header files to include when using TuGraph\n#include "./algo.h" //A header file containing various algorithmic logic functions\n'})}),"\n",(0,i.jsx)(n.p,{children:"When using TuGraph to realize the calculation application of graph data files, generally, the StandaloneGraph class object graph is first created, the graph file data is loaded into the graph, and then the graph calculation process is realized by calling the graph logic function, and finally the result of the graph calculation is printed out."}),"\n",(0,i.jsx)(n.h4,{id:"22configuration-class-myconfig",children:"2.2.Configuration class MyConfig"}),"\n",(0,i.jsxs)(n.p,{children:["The MyConfig configuration class function is used to provide the configuration information required for the algorithm logic calculation, inherited from ConfigBase",(0,i.jsx)(n.edgedata,{children:", where EdgeDate can choose Empty (unweighted graph), int (the weight of the weighted graph is an integer) or double (the weight of the weighted graph is double) type."})]}),"\n",(0,i.jsx)(n.p,{children:"The MyConfig configuration class generally depends on the algorithm, and additional configuration information is required as follows:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Parameters required by the algorithm"}),"\n",(0,i.jsx)(n.li,{children:"Algorithm name"}),"\n",(0,i.jsx)(n.li,{children:"Configure the Print function in the class\nOther common members inherit from ConfigBase, please refer to src/olap/olap_config.h for reference."}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-C++",children:'class MyConfig : public ConfigBase {\n public:\n\n // The parameters required by the algorithm are initialized\n size_t root = 0;\n std::string name = std::string("bfs");\n void AddParameter(fma_common::Configuration & config) {\n ConfigBase::AddParameter(config);\n config.Add(root, "root", true)\n .Comment("the root of bfs");\n }\n void Print() {\n ConfigBase::Print();\n std::cout << " name: " << name << std::endl;\n if (root != size_t(-1)) {\n std::cout << " root: " << root << std::endl;\n } else {\n std::cout << " root: UNSET" << std::endl;\n }\n }\n // The configuration file accepts command line parameters. This use case will sequentially read the parameters when calling the algorithm from the command line. The value specified by the user is preferred. If the user does not specify it, the default parameter is selected.\n MyConfig(int &argc, char** &argv): ConfigBase(argc, argv) {\n fma_common::Configuration config;\n AddParameter(config);\n config.ExitAfterHelp(true);\n config.ParseAndFinalize(argc, argv);\n Print();\n }\n};\n'})}),"\n",(0,i.jsx)(n.h4,{id:"23main-function",children:"2.3.main function"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-C++",children:'int main(int argc, char** argv) {\n double start_time;\n // Statistical memory consumption class MemUsage instantiation\n MemUsage memUsage;\n memUsage.startMemRecord();\n\n // prepare\n start_time = get_time();\n // Configuration class MyConfig instantiation\n MyConfig config(argc, argv);\n size_t root_vid = config.root;\n // OlapOnDisk class instantiation\n OlapOnDisk graph;\n graph.Load(config, DUAL_DIRECTION);\n memUsage.print();\n memUsage.reset();\n // Statistical graph loading time consumption\n auto prepare_cost = get_time() - start_time;\n printf("prepare_cost = %.2lf(s)\\n", prepare_cost);\n\n // core\n start_time = get_time();\n // Create an array to count whether a node has been traversed\n auto parent = graph.AllocVertexArray();\n // Breadth-first search algorithm, returns the number of nodes connected to the root_vid root node in the graph\n size_t count = BFSCore(graph, root_vid, parent);\n memUsage.print();\n memUsage.reset();\n auto core_cost = get_time() - start_time;\n printf("core_cost = %.2lf(s)\\n", core_cost);\n\n // output\n start_time = get_time();\n // Print relevant information to the terminal\n printf("found_vertices = %ld\\n", count);\n auto output_cost = get_time() - start_time;\n printf("output_cost = %.2lf(s)\\n", output_cost);\n\n printf("total_cost = %.2lf(s)\\n", prepare_cost + core_cost + output_cost);\n printf("DONE.");\n\n return 0;\n}\n'})}),"\n",(0,i.jsx)(n.h4,{id:"24bfs-algorithm-process",children:"2.4.bfs algorithm process"}),"\n",(0,i.jsxs)(n.p,{children:["The main process of ",(0,i.jsx)(n.code,{children:"bfs"})," has two input parameters, the snapshot class (subgraph) and the number of iterations. The overall process can be divided into the following steps:"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Relevant definitions and initialization of data structures"}),"\n",(0,i.jsx)(n.li,{children:"Use the batch function to perform cyclic calculations on each node, find all nodes adjacent to the current node in each round, and exchange them when the round ends."}),"\n",(0,i.jsx)(n.li,{children:"Until all nodes are found, return the number of nodes discovered_vertices."}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-C++",children:'size_t BFSCore(Graph& graph, size_t root_vid, ParallelVector& parent){\n\n size_t root = root_vid;\n auto active_in = graph.AllocVertexSubset(); //Allocate an array, active_in is used to store the nodes found in the previous cycle stage\n active_in.Add(root); //Add the root node to the array\n auto active_out = graph.AllocVertexSubset(); //Allocate the array active_out to store the nodes found in the current cycle stage\n parent.Fill((size_t)-1); //Assign a value of -1 to the node in the parent array, -1 means not found\n parent[root] = root;\n size_t num_activations = 1; //Indicates the number of nodes found in the current loop phase\n size_t discovered_vertices = 0; //Indicates the total number of nodes found in the current cycle phase\n\n for (int ii = 0; num_activations != 0; ii++) { //num_activations indicates the number of nodes found in the current loop phase\n printf("activates(%d) <= %lu\\n", ii, num_activations);\n discovered_vertices += num_activations; //discovered_vertices indicates the total number of nodes found in the current cycle phase\n active_out.Clear();\n num_activations = graph.ProcessVertexActive(\n [&](size_t vi) {\n size_t num_activations = 0;\n for (auto& edge : graph.OutEdges(vi)) { //Each cycle starts from the root node, finds adjacent adjacent nodes, changes its parent value, and operates num_activations+1\n size_t dst = edge.neighbour;\n if (parent[dst] == (size_t)-1) {\n auto lock = graph.GuardVertexLock(dst);\n if (parent[dst] == (size_t)-1) {\n parent[dst] = vi;\n num_activations += 1;\n active_out.Add(dst); //Store the nodes found in the current loop phase\n }\n }\n }\n return num_activations;\n },\n active_in);\n active_in.Swap(active_out);\n }\n // return all nodes\n return discovered_vertices;\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"3description-of-other-commonly-used-functions",children:"3.Description of other commonly used functions"}),"\n",(0,i.jsx)(n.h4,{id:"31graph-load",children:"3.1.Graph load"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph-StandaloneThe loading sources of graph data files are mainly divided into three categories: text files, binary files, and ODPS. The binary file is a file in which the binary representation of the edge data is arranged in order, which can save a lot of storage space. Its loading function is divided into three types, namely:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"void Load(ConfigBase config,EdgeDirectionPolicy edge_direction_policy = DUAL_DIRECTION)"}),"\uff1aThe loading method of the graph data file contains two parameters, and their meanings represent respectively"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"config"}),"\uff1aConfiguration parameters to load. This parameter saves the general information of the graph (such as data source, algorithm name, data input and output paths, number of vertices, etc.) and different information parameters configured according to different data sources and different algorithms."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"edge_direction_policy"}),"\uff1aSpecifies whether the graph is directed or undirected, including three modes: DUAL_DIRECTION, MAKE_SYMMETRIC, and INPUT_SYMMETRIC. Among them, DUAL_DIRECTION is the default graph loading method.\nDUAL_DIRECTION : The input file is an asymmetric graph and the loaded graph is an asymmetric graph.\nMAKE_SYMMETRIC : The input file is an asymmetric graph and the loaded graph is a symmetric graph.\nINPUT_SYMMETRIC : The input file is a symmetric graph and the loaded graph is a symmetric graph.\nFor details, see ",(0,i.jsx)(n.code,{children:"enum EdgeDirectionPolicy"})," in the olap_config.h file under the lgraph folder."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"void LoadVertexArrayTxt(V * array, std::string path, std::function &)> parse_line)"}),"\uff1aLoad the vertices in the file into an array in the order of their ids. The meanings of each parameter are:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"array"}),"\uff1aarray of data to be read"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"path"}),"\uff1aThe path to read the file, each line in the file represents a pair of vertex"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"parse_line"}),"\uff1aA user-defined function that tells the system how to parse a line of text data into a vertex pair."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"32graph-write",children:"3.2.Graph write"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"void Write(ConfigBase & config, ParallelVector& array, size_t array_size, std::string name, std::function filter_output = filter_output_default)"}),"\uff1aWrite the data in the array back to the file, and the meanings of each parameter are:\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"config"}),"\uff1aConfiguration parameters to load. This parameter saves the general information of the graph (such as data source, algorithm name, data input and output paths, number of vertices, etc.) and different information parameters configured according to different data sources and different algorithms."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"array"}),"\uff1aarray of data to be written"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"array_size"}),"\uff1aThe length of the number of data to be written"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"name"}),"\uff1aalgorithm name"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"filter_output"}),"\uff1aWrite data rule function, the data to be written needs to meet the requirements of this function."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"33graph-parse-function",children:"3.3.graph parse function"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"std::tuple parse_line_unweighted(const char *p, const char *end, EdgeUnit &e)"}),"\uff1aParse the graph data file, and load the graph as an unweighted graph."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"std::tuple parse_line_weighted(const char* p, const char* end, EdgeUnit& e)"}),"\uff1aParse the graph data file, load the graph as a weighted graph, and specify the weight data type by modifying ",(0,i.jsx)(n.edgedata,{children:"."})]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"This function can be specified through the constructor parse_line when the MyConfig class is defined."})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>s});var i=t(6540);const a={},r=i.createContext(a);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/65f6f344.398d47b6.js b/assets/js/65f6f344.4fe3115b.js similarity index 99% rename from assets/js/65f6f344.398d47b6.js rename to assets/js/65f6f344.4fe3115b.js index 28a7e78501..36ea9a4286 100644 --- a/assets/js/65f6f344.398d47b6.js +++ b/assets/js/65f6f344.4fe3115b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[1929],{3253:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>a,toc:()=>d});var r=n(4848),i=n(8453);const l={},o="Privilege",a={id:"permission/privilege",title:"Privilege",description:"1.Introduce",source:"@site/../docs/en-US/source/10.permission/1.privilege.md",sourceDirName:"10.permission",slug:"/permission/privilege",permalink:"/tugraph-db/en/permission/privilege",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Heterogeneous Graph",permalink:"/tugraph-db/en/olap&procedure/learn/heterogeneous_graph"},next:{title:"Token Usage Guide",permalink:"/tugraph-db/en/permission/token"}},c={},d=[{value:"1.Introduce",id:"1introduce",level:2},{value:"2.Level of permissions",id:"2level-of-permissions",level:2},{value:"3.Permission keyword",id:"3permission-keyword",level:2},{value:"4.Common permission operations",id:"4common-permission-operations",level:2},{value:"4.1.User action",id:"41user-action",level:3},{value:"4.2.Role actions",id:"42role-actions",level:3},{value:"4.3.Assign roles to users",id:"43assign-roles-to-users",level:3},{value:"4.4.Role empowerment",id:"44role-empowerment",level:3}];function t(e){const s={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"privilege",children:"Privilege"})}),"\n",(0,r.jsx)(s.h2,{id:"1introduce",children:"1.Introduce"}),"\n",(0,r.jsxs)(s.blockquote,{children:["\n",(0,r.jsx)(s.p,{children:"The permissions of TuGraph are managed based on role-based access control. The permissions that define access control are assigned to roles, and the roles are then assigned to users."}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"2level-of-permissions",children:"2.Level of permissions"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Global layer: indicates global permissions, which have permissions for management and graph operations."}),"\n",(0,r.jsx)(s.li,{children:"Graph layer: control permissions on each graph;"}),"\n",(0,r.jsx)(s.li,{children:"Property level (Commercial version only) : control permissions on a property"}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"3permission-keyword",children:"3.Permission keyword"}),"\n",(0,r.jsx)(s.p,{children:"At present, the control of permissions is relatively simple"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"The Global layer currently has admin permission, and the admin user is preset."}),"\n"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"The Graph layer has four operation permissions: none, read, write, and full"}),"\n"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"none: No permission, no operation permission for the graph"}),"\n",(0,r.jsx)(s.li,{children:"read: Read-only permission, only has read permission for the graph"}),"\n",(0,r.jsx)(s.li,{children:"write: Read and write permission, not only has read permission for the graph, but also has write permission"}),"\n",(0,r.jsx)(s.li,{children:"full: All permissions, not only have read and write permissions for graphs, but also have permissions to delete graphs, modify graphs, and modify schemas"}),"\n"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"The Property layer (Commercial version only) has the following permissions: none, read, and write"}),"\n"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"none: No permission, no operation permission for the property"}),"\n",(0,r.jsx)(s.li,{children:"read: Read-only permission, only has read permission for the property"}),"\n",(0,r.jsx)(s.li,{children:"write: Read and write permission, not only has read permission for the property, but also has write permission"}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"4common-permission-operations",children:"4.Common permission operations"}),"\n",(0,r.jsx)(s.h3,{id:"41user-action",children:"4.1.User action"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Creating a user"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.createUser(user_name::STRING,password::STRING)\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Deleting a user"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.deleteUser(user_name::STRING)\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Change the password of the current user"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.changePassword(current_password::STRING,new_password::STRING)\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Changes the password of a specified user"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"\nCALL dbms.security.changeUserPassword(user_name::STRING,new_password::STRING)\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Disable or enable a user"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.disableUser(user::STRING,disable::BOOLEAN)\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"List all users"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.listUsers()\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Lists the current user information"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.showCurrentUser()\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Obtain user details"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.getUserInfo(user::STRING)\n"})}),"\n",(0,r.jsx)(s.h3,{id:"42role-actions",children:"4.2.Role actions"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Create a role"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.createRole(role_name::STRING,desc::STRING)\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Delete a role"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.deleteRole(role_name::STRING\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"List all characters"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.listRoles()\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Disable or enable the role"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.disableRole(role::STRING,disable::BOOLEAN)\n"})}),"\n",(0,r.jsx)(s.h3,{id:"43assign-roles-to-users",children:"4.3.Assign roles to users"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Adds the association between the user and the role"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.addUserRoles(user::STRING,roles::LIST)\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Deletes the association between the user and the role"}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"CALL dbms.security.deleteUserRoles(user::STRING,roles::LIST)"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Clears the relationship between user roles and rebuilds them"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.rebuildUserRoles(user::STRING,roles::LIST)\n"})}),"\n",(0,r.jsx)(s.h3,{id:"44role-empowerment",children:"4.4.Role empowerment"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Modifies the access permission of a role to a specified graph"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.modRoleAccessLevel(role::STRING,access_level::MAP)\n"})}),"\n",(0,r.jsx)(s.p,{children:"Example"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:'CALL dbms.security.modRoleAccessLevel("test_role", {test_graph1:"FULL", test_graph2:"NONE"})\n'})})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(t,{...e})}):t(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>o,x:()=>a});var r=n(6540);const i={},l=r.createContext(i);function o(e){const s=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(l.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[1929],{3253:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>a,toc:()=>d});var r=n(4848),i=n(8453);const l={},o="Privilege",a={id:"permission/privilege",title:"Privilege",description:"1.Introduce",source:"@site/../docs/en-US/source/10.permission/1.privilege.md",sourceDirName:"10.permission",slug:"/permission/privilege",permalink:"/tugraph-db/en/permission/privilege",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Heterogeneous Graph",permalink:"/tugraph-db/en/olap&procedure/learn/heterogeneous_graph"},next:{title:"Token Usage Guide",permalink:"/tugraph-db/en/permission/token"}},c={},d=[{value:"1.Introduce",id:"1introduce",level:2},{value:"2.Level of permissions",id:"2level-of-permissions",level:2},{value:"3.Permission keyword",id:"3permission-keyword",level:2},{value:"4.Common permission operations",id:"4common-permission-operations",level:2},{value:"4.1.User action",id:"41user-action",level:3},{value:"4.2.Role actions",id:"42role-actions",level:3},{value:"4.3.Assign roles to users",id:"43assign-roles-to-users",level:3},{value:"4.4.Role empowerment",id:"44role-empowerment",level:3}];function t(e){const s={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"privilege",children:"Privilege"})}),"\n",(0,r.jsx)(s.h2,{id:"1introduce",children:"1.Introduce"}),"\n",(0,r.jsxs)(s.blockquote,{children:["\n",(0,r.jsx)(s.p,{children:"The permissions of TuGraph are managed based on role-based access control. The permissions that define access control are assigned to roles, and the roles are then assigned to users."}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"2level-of-permissions",children:"2.Level of permissions"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Global layer: indicates global permissions, which have permissions for management and graph operations."}),"\n",(0,r.jsx)(s.li,{children:"Graph layer: control permissions on each graph;"}),"\n",(0,r.jsx)(s.li,{children:"Property level (Commercial version only) : control permissions on a property"}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"3permission-keyword",children:"3.Permission keyword"}),"\n",(0,r.jsx)(s.p,{children:"At present, the control of permissions is relatively simple"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"The Global layer currently has admin permission, and the admin user is preset."}),"\n"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"The Graph layer has four operation permissions: none, read, write, and full"}),"\n"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"none: No permission, no operation permission for the graph"}),"\n",(0,r.jsx)(s.li,{children:"read: Read-only permission, only has read permission for the graph"}),"\n",(0,r.jsx)(s.li,{children:"write: Read and write permission, not only has read permission for the graph, but also has write permission"}),"\n",(0,r.jsx)(s.li,{children:"full: All permissions, not only have read and write permissions for graphs, but also have permissions to delete graphs, modify graphs, and modify schemas"}),"\n"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"The Property layer (Commercial version only) has the following permissions: none, read, and write"}),"\n"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"none: No permission, no operation permission for the property"}),"\n",(0,r.jsx)(s.li,{children:"read: Read-only permission, only has read permission for the property"}),"\n",(0,r.jsx)(s.li,{children:"write: Read and write permission, not only has read permission for the property, but also has write permission"}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"4common-permission-operations",children:"4.Common permission operations"}),"\n",(0,r.jsx)(s.h3,{id:"41user-action",children:"4.1.User action"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Creating a user"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.createUser(user_name::STRING,password::STRING)\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Deleting a user"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.deleteUser(user_name::STRING)\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Change the password of the current user"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.changePassword(current_password::STRING,new_password::STRING)\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Changes the password of a specified user"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"\nCALL dbms.security.changeUserPassword(user_name::STRING,new_password::STRING)\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Disable or enable a user"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.disableUser(user::STRING,disable::BOOLEAN)\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"List all users"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.listUsers()\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Lists the current user information"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.showCurrentUser()\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Obtain user details"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.getUserInfo(user::STRING)\n"})}),"\n",(0,r.jsx)(s.h3,{id:"42role-actions",children:"4.2.Role actions"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Create a role"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.createRole(role_name::STRING,desc::STRING)\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Delete a role"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.deleteRole(role_name::STRING\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"List all characters"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.listRoles()\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Disable or enable the role"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.disableRole(role::STRING,disable::BOOLEAN)\n"})}),"\n",(0,r.jsx)(s.h3,{id:"43assign-roles-to-users",children:"4.3.Assign roles to users"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Adds the association between the user and the role"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.addUserRoles(user::STRING,roles::LIST)\n"})}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Deletes the association between the user and the role"}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"CALL dbms.security.deleteUserRoles(user::STRING,roles::LIST)"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Clears the relationship between user roles and rebuilds them"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.rebuildUserRoles(user::STRING,roles::LIST)\n"})}),"\n",(0,r.jsx)(s.h3,{id:"44role-empowerment",children:"4.4.Role empowerment"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Modifies the access permission of a role to a specified graph"}),"\n"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:"CALL dbms.security.modRoleAccessLevel(role::STRING,access_level::MAP)\n"})}),"\n",(0,r.jsx)(s.p,{children:"Example"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-cypher",children:'CALL dbms.security.modRoleAccessLevel("test_role", {test_graph1:"FULL", test_graph2:"NONE"})\n'})})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(t,{...e})}):t(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>o,x:()=>a});var r=n(6540);const i={},l=r.createContext(i);function o(e){const s=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(l.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6690cca3.8a89dfc4.js b/assets/js/6690cca3.696e367a.js similarity index 99% rename from assets/js/6690cca3.8a89dfc4.js rename to assets/js/6690cca3.696e367a.js index 2c9e0c5ad8..92b20c0c97 100644 --- a/assets/js/6690cca3.8a89dfc4.js +++ b/assets/js/6690cca3.696e367a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[730],{479:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>a,metadata:()=>o,toc:()=>h});var n=r(4848),s=r(8453);const a={},i="High Availability mode",o={id:"installation&running/high-availability-mode",title:"High Availability mode",description:"This document describes the principles, preparations, and server operations of the high availability mode",source:"@site/../docs/en-US/source/5.installation&running/8.high-availability-mode.md",sourceDirName:"5.installation&running",slug:"/installation&running/high-availability-mode",permalink:"/tugraph-db/en/installation&running/high-availability-mode",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:8,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Tugraph Running",permalink:"/tugraph-db/en/installation&running/tugraph-running"},next:{title:"Data Importing",permalink:"/tugraph-db/en/utility-tools/data-import"}},l={},h=[{value:"1.Theory",id:"1theory",level:2},{value:"2.Preparation",id:"2preparation",level:2},{value:"3.Start the initial backup group",id:"3start-the-initial-backup-group",level:2},{value:"3.1.The initial data is consistent",id:"31the-initial-data-is-consistent",level:3},{value:"3.2.Inconsistent initial data",id:"32inconsistent-initial-data",level:3},{value:"4.Start witness node",id:"4start-witness-node",level:2},{value:"4.1. Witness nodes are not allowed to become leader",id:"41-witness-nodes-are-not-allowed-to-become-leader",level:3},{value:"4.1. Allow witness nodes to become leaders",id:"41-allow-witness-nodes-to-become-leaders",level:3},{value:"5.Scale out other servers",id:"5scale-out-other-servers",level:2},{value:"6.Stopping the Server",id:"6stopping-the-server",level:2},{value:"7.Restarting the Server",id:"7restarting-the-server",level:2},{value:"8.docker deploys a highly available cluster",id:"8docker-deploys-a-highly-available-cluster",level:2},{value:"8.1.Install mirror",id:"81install-mirror",level:3},{value:"8.2.Create container",id:"82create-container",level:3},{value:"8.3.Start service",id:"83start-service",level:3},{value:"9.Server Status",id:"9server-status",level:2},{value:"10.Data synchronization in high availability mode",id:"10data-synchronization-in-high-availability-mode",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"high-availability-mode",children:"High Availability mode"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"This document describes the principles, preparations, and server operations of the high availability mode"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"1theory",children:"1.Theory"}),"\n",(0,n.jsx)(t.p,{children:"TuGraph provides high availability (HA) mode through multi-machine hot backup. In high availability mode, write operations to the database will be synchronized to all servers (non-witness), so that even if some servers are down, the availability of the service will not be affected."}),"\n",(0,n.jsxs)(t.p,{children:["When the high-availability mode is started, multiple TuGraph servers form a backup group, which is a high-availability cluster. Each backup group consists of three or more TuGraph servers, one of which serves as the ",(0,n.jsx)(t.code,{children:"leader"})," and the other replication group servers as ",(0,n.jsx)(t.code,{children:"followers"}),". Write requests are served by a ",(0,n.jsx)(t.code,{children:"leader"}),", which replicates and synchronizes each request to a ",(0,n.jsx)(t.code,{children:"follower"})," and can only respond to the client after the request has been synchronized to the server. This way, if any server fails, the other servers will still have all the data written so far. If the ",(0,n.jsx)(t.code,{children:"leader"})," server fails, other servers will automatically select a new ",(0,n.jsx)(t.code,{children:"leader"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["TuGraph's high-availability mode provides two types of nodes: ",(0,n.jsx)(t.code,{children:"replica"})," nodes and ",(0,n.jsx)(t.code,{children:"witness"})," nodes. Among them, the ",(0,n.jsx)(t.code,{children:"replica"})," node is an ordinary node, has logs and data, and can provide services to the outside world. The ",(0,n.jsx)(t.code,{children:"witness"})," node is a node that only receives heartbeats and logs but does not save data. According to deployment requirements, ",(0,n.jsx)(t.code,{children:"leader"})," nodes and ",(0,n.jsx)(t.code,{children:"follower"})," nodes can be flexibly deployed as ",(0,n.jsx)(t.code,{children:"replica"})," nodes or ",(0,n.jsx)(t.code,{children:"witness"})," nodes. Based on this, there are two deployment methods for TuGraph high-availability mode: one is the ordinary deployment mode, and the other is the simple deployment mode with witness."]}),"\n",(0,n.jsxs)(t.p,{children:["For normal deployment mode, ",(0,n.jsx)(t.code,{children:"leader"})," and all ",(0,n.jsx)(t.code,{children:"followers"})," are nodes of type ",(0,n.jsx)(t.code,{children:"replica"}),". Write requests are served by a ",(0,n.jsx)(t.code,{children:"leader"}),", which copies each request to a ",(0,n.jsx)(t.code,{children:"follower"})," and cannot respond to the client until the request has been synchronized to more than half of the servers. This way, if less than half of the servers fail, the other servers will still have all the data written so far. If the ",(0,n.jsx)(t.code,{children:"leader"})," server fails, other servers will automatically elect a new ",(0,n.jsx)(t.code,{children:"leader"})," to ensure data consistency and service availability."]}),"\n",(0,n.jsxs)(t.p,{children:["However, when the user server resources are insufficient or a network partition occurs, a normal HA cluster cannot be established. At this time, since the ",(0,n.jsx)(t.code,{children:"witness"})," node has no data and takes up little resources, the ",(0,n.jsx)(t.code,{children:"witness"})," node and the ",(0,n.jsx)(t.code,{children:"replica"})," node can be deployed on one machine. For example, when there are only 2 machines, you can deploy the ",(0,n.jsx)(t.code,{children:"replica"})," node on one machine, and the ",(0,n.jsx)(t.code,{children:"replica"})," node and ",(0,n.jsx)(t.code,{children:"witness"})," node on another machine, which not only saves resources, but also does not require log application To the state machine, there is no need to generate and install snapshots, so the response to requests is very fast, and it can help quickly elect a new leader when the cluster crashes or the network is partitioned. This is the simple deployment mode of the TuGraph HA cluster. Although ",(0,n.jsx)(t.code,{children:"witness"})," nodes have many benefits, since there is no data, the cluster actually adds a node that cannot become ",(0,n.jsx)(t.code,{children:"leader"}),", so the availability will be slightly reduced. To improve the availability of the cluster, you can allow the ",(0,n.jsx)(t.code,{children:"witness"})," node to be the leader temporarily by specifying the ",(0,n.jsx)(t.code,{children:"ha_enable_witness_to_leader"})," parameter as ",(0,n.jsx)(t.code,{children:"true"}),". After the ",(0,n.jsx)(t.code,{children:"witness"})," node synchronizes the new log to other nodes, it will actively switch the leader role to the node with the latest log."]}),"\n",(0,n.jsx)(t.p,{children:"This feature is supported in version 3.6 and above."}),"\n",(0,n.jsx)(t.h2,{id:"2preparation",children:"2.Preparation"}),"\n",(0,n.jsx)(t.p,{children:"To enable high availability mode, users need to:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Three or more instances of TuGraph servers."}),"\n",(0,n.jsx)(t.li,{children:"To enable high availability mode when starting lgraph_server, the 'enable_ha' option can be set to 'true' using a configuration file or the command line."}),"\n",(0,n.jsx)(t.li,{children:"Set the correct rpc_port through the configuration file or command line"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"3start-the-initial-backup-group",children:"3.Start the initial backup group"}),"\n",(0,n.jsxs)(t.p,{children:["After installing TuGraph, you can use the ",(0,n.jsx)(t.code,{children:"lgraph_server"})," command to start a high-availability cluster on different machines. This section mainly explains how to start a high-availability cluster. For cluster status management after startup, see ",(0,n.jsx)(t.a,{href:"/tugraph-db/en/utility-tools/ha-cluster-management",children:"lgraph_peer tool"})]}),"\n",(0,n.jsx)(t.h3,{id:"31the-initial-data-is-consistent",children:"3.1.The initial data is consistent"}),"\n",(0,n.jsxs)(t.p,{children:["When the data in all servers is the same or there is no data at startup, the user can\nspecify ",(0,n.jsx)(t.code,{children:"--ha_conf host1:port1,host2:port2"})," to start the server.\nIn this way, all prepared TuGraph instances can be added to the initial backup group at one time,\nAll servers in the backup group elect ",(0,n.jsx)(t.code,{children:"leader"})," according to the RAFT protocol, and other\nservers join the backup group with the role of ",(0,n.jsx)(t.code,{children:"follower"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"An example command to start an initial backup group is as follows:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090\n"})}),"\n",(0,n.jsx)(t.p,{children:"After the first server is started, it will elect itself as the 'leader' and organize a backup group with only itself."}),"\n",(0,n.jsx)(t.h3,{id:"32inconsistent-initial-data",children:"3.2.Inconsistent initial data"}),"\n",(0,n.jsxs)(t.p,{children:["If there is already data in the first server (imported by the ",(0,n.jsx)(t.code,{children:"lgraph_import"})," tool or transferred from a server in non-high availability mode),\nAnd it has not been used in high-availability mode before, the user should use the boostrap method to start. Start the server with data in bootstrap\nmode with the ",(0,n.jsx)(t.code,{children:"ha_bootstrap_role"})," parameter as 1, and specify the machine as the ",(0,n.jsx)(t.code,{children:"leader"})," through the ",(0,n.jsx)(t.code,{children:"ha_conf"}),"\nparameter. In bootstrap mode, the server will copy its own data to the new server before adding the newly\njoined server to the backup group, so that the data in each server is consistent."]}),"\n",(0,n.jsx)(t.p,{children:"An example command to start a data server is as follows:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090 --ha_bootstrap_role 1\n"})}),"\n",(0,n.jsxs)(t.p,{children:["Other servers without data need to specify the ",(0,n.jsx)(t.code,{children:"ha_bootstrap_role"})," parameter as 2, and specify the ",(0,n.jsx)(t.code,{children:"leader"})," through the ",(0,n.jsx)(t.code,{children:"ha_conf"})," parameter. The command example is as follows"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"**$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090 --ha_bootstrap_role 2\n"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"You need to pay attention to two points when using bootstrap to start an HA cluster:"})}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["You need to wait for the ",(0,n.jsx)(t.code,{children:"leader"})," node to generate a snapshot and start successfully before joining the ",(0,n.jsx)(t.code,{children:"follower"})," node, otherwise the ",(0,n.jsx)(t.code,{children:"follower"})," node may fail to join. When starting the ",(0,n.jsx)(t.code,{children:"follower"})," node, you can configure the ",(0,n.jsx)(t.code,{children:"ha_node_join_group_s"})," parameter to be slightly larger to allow multiple waits and timeout retries when joining the HA cluster."]}),"\n",(0,n.jsx)(t.li,{children:"The HA cluster can only use the bootstrap mode when it is started for the first time. It can only be started in the normal mode (see Section 3.1) when it is started later. In particular, multiple nodes of the same cluster cannot be started in the bootstrap mode, otherwise it may cause Data inconsistency"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"4start-witness-node",children:"4.Start witness node"}),"\n",(0,n.jsx)(t.h3,{id:"41-witness-nodes-are-not-allowed-to-become-leader",children:"4.1. Witness nodes are not allowed to become leader"}),"\n",(0,n.jsxs)(t.p,{children:["The startup method of ",(0,n.jsx)(t.code,{children:"witness"})," node is the same as that of ordinary nodes. You only need to set the ",(0,n.jsx)(t.code,{children:"ha_is_witness"})," parameter to ",(0,n.jsx)(t.code,{children:"true"}),". Note that the number of witness nodes should be less than half of the total number of cluster nodes."]}),"\n",(0,n.jsx)(t.p,{children:"An example command to start the witness node server is as follows:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090 --ha_is_witness 1\n"})}),"\n",(0,n.jsxs)(t.p,{children:["Note: By default, the ",(0,n.jsx)(t.code,{children:"witness"})," node is not allowed to become the ",(0,n.jsx)(t.code,{children:"leader"})," node, which can improve the performance of the cluster, but will reduce the availability of the cluster when the ",(0,n.jsx)(t.code,{children:"leader"})," node crashes."]}),"\n",(0,n.jsx)(t.h3,{id:"41-allow-witness-nodes-to-become-leaders",children:"4.1. Allow witness nodes to become leaders"}),"\n",(0,n.jsxs)(t.p,{children:["You can specify the ",(0,n.jsx)(t.code,{children:"ha_enable_witness_to_leader"})," parameter as ",(0,n.jsx)(t.code,{children:"true"}),", so that the ",(0,n.jsx)(t.code,{children:"witness"})," node can temporarily become the ",(0,n.jsx)(t.code,{children:"leader"})," node, and then actively switch to the master after the new log synchronization is completed."]}),"\n",(0,n.jsxs)(t.p,{children:["An example of the command to start the ",(0,n.jsx)(t.code,{children:"witness"})," node server that is allowed to become the ",(0,n.jsx)(t.code,{children:"leader"})," node is as follows:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090 --ha_is_witness 1 --ha_enable_witness_to_leader 1\n"})}),"\n",(0,n.jsxs)(t.p,{children:["Note: Although allowing ",(0,n.jsx)(t.code,{children:"witness"})," nodes to become ",(0,n.jsx)(t.code,{children:"leader"})," nodes can improve the availability of the cluster, it may affect data consistency in extreme cases. Therefore, it should generally be ensured that the number of ",(0,n.jsx)(t.code,{children:"witness"})," nodes + 1 is less than half of the total number of cluster nodes."]}),"\n",(0,n.jsx)(t.h2,{id:"5scale-out-other-servers",children:"5.Scale out other servers"}),"\n",(0,n.jsxs)(t.p,{children:["After starting the initial backup group, if you want to scale out the backup group, add new servers to the backup group,\nThe ",(0,n.jsx)(t.code,{children:"--ha_conf HOST:PORT"})," option should be used, where ",(0,n.jsx)(t.code,{children:"HOST"})," can be the IP address of any server already in this backup group,\nAnd ",(0,n.jsx)(t.code,{children:"PORT"})," is its RPC port. E.g:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This command will start a TuGraph server in high availability mode and try to add it to the backup group containing the server ",(0,n.jsx)(t.code,{children:"172.22.224.15:9090"}),".\nNote that joining a backup group requires a server to synchronize its data with the backup group's ",(0,n.jsx)(t.code,{children:"leader"})," server, and this process may take a considerable amount of time, depending on the size of the data."]}),"\n",(0,n.jsx)(t.h2,{id:"6stopping-the-server",children:"6.Stopping the Server"}),"\n",(0,n.jsx)(t.p,{children:"When a server goes offline via 'CTRL-C', it will notify the current 'leader' server to remove the server from the backup group. If the leader server goes offline, it will pass the leader identity permission to another server before going offline."}),"\n",(0,n.jsx)(t.p,{children:"If a server is terminated or disconnected from other servers in the backup group, the server is considered a failed node and the leader server will remove it from the backup group after a specified time limit."}),"\n",(0,n.jsx)(t.p,{children:"If any server leaves the backup group and wishes to rejoin, it must start with the '--ha_conf {HOST:PORT}' option, where 'HOST' is the IP address of a server in the current backup group."}),"\n",(0,n.jsx)(t.h2,{id:"7restarting-the-server",children:"7.Restarting the Server"}),"\n",(0,n.jsxs)(t.p,{children:["Restarting the entire backup group is not recommended as it disrupts service. All servers can be shut down if desired. But on reboot,\nIt must be ensured that at least N/2+1 servers in the backup group at shutdown can start normally, otherwise the startup will fail. and,\nRegardless of whether ",(0,n.jsx)(t.code,{children:"enable_bootstrap"})," is specified as true when initially starting the replication group, restarting the server only needs to pass\nSpecify the ",(0,n.jsx)(t.code,{children:"--ha_conf host1:port1,host2:port2"})," parameter to restart all servers at once. The command example is as follows:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090\n"})}),"\n",(0,n.jsx)(t.h2,{id:"8docker-deploys-a-highly-available-cluster",children:"8.docker deploys a highly available cluster"}),"\n",(0,n.jsx)(t.p,{children:"In real business scenarios, it is likely to encounter the need to deploy high-availability clusters on multiple operating systems or architectures.\nDifferentiated environments may cause some dependencies to be missing when compiling TuGraph. therefore,\nCompiling software in docker and deploying high-availability clusters is very valuable. Take the centos7 version of docker as an example,\nThe steps to deploy a highly available cluster are as follows."}),"\n",(0,n.jsx)(t.h3,{id:"81install-mirror",children:"8.1.Install mirror"}),"\n",(0,n.jsx)(t.p,{children:"Use the following command to download TuGraph's compiled docker image environment"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-shell",children:"docker pull tugraph/tugraph-compile-centos7\n"})}),"\n",(0,n.jsx)(t.p,{children:"Then pull the TuGraph source code and compile and install"}),"\n",(0,n.jsx)(t.h3,{id:"82create-container",children:"8.2.Create container"}),"\n",(0,n.jsxs)(t.p,{children:["Use the following command to create a container, use ",(0,n.jsx)(t.code,{children:"--net=host"})," to make the container run in host mode, in this mode\nDocker and the host machine share the network namespace, that is, they share the same IP."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-shell",children:"docker run --net=host -itd -p -v {src_dir}:{dst_dir} --name tugraph_ha tugraph/tugraph-compile-centos7 /bin/bash\n"})}),"\n",(0,n.jsx)(t.h3,{id:"83start-service",children:"8.3.Start service"}),"\n",(0,n.jsx)(t.p,{children:"Use the following command to start the service on each server, because docker and the host share IP, so you can directly specify to start the service on the host IP"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-shell",children:"$ lgraph_server -c lgraph.json --host 172.22.224.15 --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090\n"})}),"\n",(0,n.jsx)(t.h2,{id:"9server-status",children:"9.Server Status"}),"\n",(0,n.jsx)(t.p,{children:"The current status of the backup group can be obtained from the TuGraph visualization tool, REST API, and Cypher query."}),"\n",(0,n.jsx)(t.p,{children:"In the TuGraph visualization tool, you can find the list of servers and their roles in the backup group in the DBInfo section."}),"\n",(0,n.jsxs)(t.p,{children:["With the REST API, you can use ",(0,n.jsx)(t.code,{children:"GET /info/peers"})," to request information."]}),"\n",(0,n.jsxs)(t.p,{children:["In Cypher, the ",(0,n.jsx)(t.code,{children:"CALL dbms.listServers()"})," statement is used to query the status information of the current backup group."]}),"\n",(0,n.jsx)(t.h2,{id:"10data-synchronization-in-high-availability-mode",children:"10.Data synchronization in high availability mode"}),"\n",(0,n.jsx)(t.p,{children:"In high availability mode, different servers in the same backup group may not always be in the same state. For performance reasons, if a request has been synchronized to more than half of the servers, the leader server will consider the request to be in the committed state. Although the rest of the servers will eventually receive the new request, the inconsistent state of the servers will persist for some time. A client may also send a request to a server that has just restarted, thus having an older state and waiting to join a backup group."}),"\n",(0,n.jsx)(t.p,{children:"To ensure that the client sees consistently continuous data, and in particular to get rid of the 'reverse time travel' problem, where the client reads a state older than it has seen before, each TuGraph server keeps a monotonically increasing data version number. The mapping of the data version number to the database state in the backup group is globally consistent, meaning that if two servers have the same data version number, they must have the same data. When responding to a request, the server includes its data version number in the response. Thus, the client can tell which version it has seen. The client can choose to send this data version number along with the request. Upon receiving a request with a data version number, the server compares the data version number to its current version and rejects the request if its own version is lower than the requested version. This mechanism ensures that the client never reads a state that is older than before."})]})}function c(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>o});var n=r(6540);const s={},a=n.createContext(s);function i(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[730],{479:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>a,metadata:()=>o,toc:()=>h});var n=r(4848),s=r(8453);const a={},i="High Availability mode",o={id:"installation&running/high-availability-mode",title:"High Availability mode",description:"This document describes the principles, preparations, and server operations of the high availability mode",source:"@site/../docs/en-US/source/5.installation&running/8.high-availability-mode.md",sourceDirName:"5.installation&running",slug:"/installation&running/high-availability-mode",permalink:"/tugraph-db/en/installation&running/high-availability-mode",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:8,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Tugraph Running",permalink:"/tugraph-db/en/installation&running/tugraph-running"},next:{title:"Data Importing",permalink:"/tugraph-db/en/utility-tools/data-import"}},l={},h=[{value:"1.Theory",id:"1theory",level:2},{value:"2.Preparation",id:"2preparation",level:2},{value:"3.Start the initial backup group",id:"3start-the-initial-backup-group",level:2},{value:"3.1.The initial data is consistent",id:"31the-initial-data-is-consistent",level:3},{value:"3.2.Inconsistent initial data",id:"32inconsistent-initial-data",level:3},{value:"4.Start witness node",id:"4start-witness-node",level:2},{value:"4.1. Witness nodes are not allowed to become leader",id:"41-witness-nodes-are-not-allowed-to-become-leader",level:3},{value:"4.1. Allow witness nodes to become leaders",id:"41-allow-witness-nodes-to-become-leaders",level:3},{value:"5.Scale out other servers",id:"5scale-out-other-servers",level:2},{value:"6.Stopping the Server",id:"6stopping-the-server",level:2},{value:"7.Restarting the Server",id:"7restarting-the-server",level:2},{value:"8.docker deploys a highly available cluster",id:"8docker-deploys-a-highly-available-cluster",level:2},{value:"8.1.Install mirror",id:"81install-mirror",level:3},{value:"8.2.Create container",id:"82create-container",level:3},{value:"8.3.Start service",id:"83start-service",level:3},{value:"9.Server Status",id:"9server-status",level:2},{value:"10.Data synchronization in high availability mode",id:"10data-synchronization-in-high-availability-mode",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"high-availability-mode",children:"High Availability mode"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"This document describes the principles, preparations, and server operations of the high availability mode"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"1theory",children:"1.Theory"}),"\n",(0,n.jsx)(t.p,{children:"TuGraph provides high availability (HA) mode through multi-machine hot backup. In high availability mode, write operations to the database will be synchronized to all servers (non-witness), so that even if some servers are down, the availability of the service will not be affected."}),"\n",(0,n.jsxs)(t.p,{children:["When the high-availability mode is started, multiple TuGraph servers form a backup group, which is a high-availability cluster. Each backup group consists of three or more TuGraph servers, one of which serves as the ",(0,n.jsx)(t.code,{children:"leader"})," and the other replication group servers as ",(0,n.jsx)(t.code,{children:"followers"}),". Write requests are served by a ",(0,n.jsx)(t.code,{children:"leader"}),", which replicates and synchronizes each request to a ",(0,n.jsx)(t.code,{children:"follower"})," and can only respond to the client after the request has been synchronized to the server. This way, if any server fails, the other servers will still have all the data written so far. If the ",(0,n.jsx)(t.code,{children:"leader"})," server fails, other servers will automatically select a new ",(0,n.jsx)(t.code,{children:"leader"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["TuGraph's high-availability mode provides two types of nodes: ",(0,n.jsx)(t.code,{children:"replica"})," nodes and ",(0,n.jsx)(t.code,{children:"witness"})," nodes. Among them, the ",(0,n.jsx)(t.code,{children:"replica"})," node is an ordinary node, has logs and data, and can provide services to the outside world. The ",(0,n.jsx)(t.code,{children:"witness"})," node is a node that only receives heartbeats and logs but does not save data. According to deployment requirements, ",(0,n.jsx)(t.code,{children:"leader"})," nodes and ",(0,n.jsx)(t.code,{children:"follower"})," nodes can be flexibly deployed as ",(0,n.jsx)(t.code,{children:"replica"})," nodes or ",(0,n.jsx)(t.code,{children:"witness"})," nodes. Based on this, there are two deployment methods for TuGraph high-availability mode: one is the ordinary deployment mode, and the other is the simple deployment mode with witness."]}),"\n",(0,n.jsxs)(t.p,{children:["For normal deployment mode, ",(0,n.jsx)(t.code,{children:"leader"})," and all ",(0,n.jsx)(t.code,{children:"followers"})," are nodes of type ",(0,n.jsx)(t.code,{children:"replica"}),". Write requests are served by a ",(0,n.jsx)(t.code,{children:"leader"}),", which copies each request to a ",(0,n.jsx)(t.code,{children:"follower"})," and cannot respond to the client until the request has been synchronized to more than half of the servers. This way, if less than half of the servers fail, the other servers will still have all the data written so far. If the ",(0,n.jsx)(t.code,{children:"leader"})," server fails, other servers will automatically elect a new ",(0,n.jsx)(t.code,{children:"leader"})," to ensure data consistency and service availability."]}),"\n",(0,n.jsxs)(t.p,{children:["However, when the user server resources are insufficient or a network partition occurs, a normal HA cluster cannot be established. At this time, since the ",(0,n.jsx)(t.code,{children:"witness"})," node has no data and takes up little resources, the ",(0,n.jsx)(t.code,{children:"witness"})," node and the ",(0,n.jsx)(t.code,{children:"replica"})," node can be deployed on one machine. For example, when there are only 2 machines, you can deploy the ",(0,n.jsx)(t.code,{children:"replica"})," node on one machine, and the ",(0,n.jsx)(t.code,{children:"replica"})," node and ",(0,n.jsx)(t.code,{children:"witness"})," node on another machine, which not only saves resources, but also does not require log application To the state machine, there is no need to generate and install snapshots, so the response to requests is very fast, and it can help quickly elect a new leader when the cluster crashes or the network is partitioned. This is the simple deployment mode of the TuGraph HA cluster. Although ",(0,n.jsx)(t.code,{children:"witness"})," nodes have many benefits, since there is no data, the cluster actually adds a node that cannot become ",(0,n.jsx)(t.code,{children:"leader"}),", so the availability will be slightly reduced. To improve the availability of the cluster, you can allow the ",(0,n.jsx)(t.code,{children:"witness"})," node to be the leader temporarily by specifying the ",(0,n.jsx)(t.code,{children:"ha_enable_witness_to_leader"})," parameter as ",(0,n.jsx)(t.code,{children:"true"}),". After the ",(0,n.jsx)(t.code,{children:"witness"})," node synchronizes the new log to other nodes, it will actively switch the leader role to the node with the latest log."]}),"\n",(0,n.jsx)(t.p,{children:"This feature is supported in version 3.6 and above."}),"\n",(0,n.jsx)(t.h2,{id:"2preparation",children:"2.Preparation"}),"\n",(0,n.jsx)(t.p,{children:"To enable high availability mode, users need to:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Three or more instances of TuGraph servers."}),"\n",(0,n.jsx)(t.li,{children:"To enable high availability mode when starting lgraph_server, the 'enable_ha' option can be set to 'true' using a configuration file or the command line."}),"\n",(0,n.jsx)(t.li,{children:"Set the correct rpc_port through the configuration file or command line"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"3start-the-initial-backup-group",children:"3.Start the initial backup group"}),"\n",(0,n.jsxs)(t.p,{children:["After installing TuGraph, you can use the ",(0,n.jsx)(t.code,{children:"lgraph_server"})," command to start a high-availability cluster on different machines. This section mainly explains how to start a high-availability cluster. For cluster status management after startup, see ",(0,n.jsx)(t.a,{href:"/tugraph-db/en/utility-tools/ha-cluster-management",children:"lgraph_peer tool"})]}),"\n",(0,n.jsx)(t.h3,{id:"31the-initial-data-is-consistent",children:"3.1.The initial data is consistent"}),"\n",(0,n.jsxs)(t.p,{children:["When the data in all servers is the same or there is no data at startup, the user can\nspecify ",(0,n.jsx)(t.code,{children:"--ha_conf host1:port1,host2:port2"})," to start the server.\nIn this way, all prepared TuGraph instances can be added to the initial backup group at one time,\nAll servers in the backup group elect ",(0,n.jsx)(t.code,{children:"leader"})," according to the RAFT protocol, and other\nservers join the backup group with the role of ",(0,n.jsx)(t.code,{children:"follower"}),"."]}),"\n",(0,n.jsx)(t.p,{children:"An example command to start an initial backup group is as follows:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090\n"})}),"\n",(0,n.jsx)(t.p,{children:"After the first server is started, it will elect itself as the 'leader' and organize a backup group with only itself."}),"\n",(0,n.jsx)(t.h3,{id:"32inconsistent-initial-data",children:"3.2.Inconsistent initial data"}),"\n",(0,n.jsxs)(t.p,{children:["If there is already data in the first server (imported by the ",(0,n.jsx)(t.code,{children:"lgraph_import"})," tool or transferred from a server in non-high availability mode),\nAnd it has not been used in high-availability mode before, the user should use the boostrap method to start. Start the server with data in bootstrap\nmode with the ",(0,n.jsx)(t.code,{children:"ha_bootstrap_role"})," parameter as 1, and specify the machine as the ",(0,n.jsx)(t.code,{children:"leader"})," through the ",(0,n.jsx)(t.code,{children:"ha_conf"}),"\nparameter. In bootstrap mode, the server will copy its own data to the new server before adding the newly\njoined server to the backup group, so that the data in each server is consistent."]}),"\n",(0,n.jsx)(t.p,{children:"An example command to start a data server is as follows:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090 --ha_bootstrap_role 1\n"})}),"\n",(0,n.jsxs)(t.p,{children:["Other servers without data need to specify the ",(0,n.jsx)(t.code,{children:"ha_bootstrap_role"})," parameter as 2, and specify the ",(0,n.jsx)(t.code,{children:"leader"})," through the ",(0,n.jsx)(t.code,{children:"ha_conf"})," parameter. The command example is as follows"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"**$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090 --ha_bootstrap_role 2\n"})}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"You need to pay attention to two points when using bootstrap to start an HA cluster:"})}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["You need to wait for the ",(0,n.jsx)(t.code,{children:"leader"})," node to generate a snapshot and start successfully before joining the ",(0,n.jsx)(t.code,{children:"follower"})," node, otherwise the ",(0,n.jsx)(t.code,{children:"follower"})," node may fail to join. When starting the ",(0,n.jsx)(t.code,{children:"follower"})," node, you can configure the ",(0,n.jsx)(t.code,{children:"ha_node_join_group_s"})," parameter to be slightly larger to allow multiple waits and timeout retries when joining the HA cluster."]}),"\n",(0,n.jsx)(t.li,{children:"The HA cluster can only use the bootstrap mode when it is started for the first time. It can only be started in the normal mode (see Section 3.1) when it is started later. In particular, multiple nodes of the same cluster cannot be started in the bootstrap mode, otherwise it may cause Data inconsistency"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"4start-witness-node",children:"4.Start witness node"}),"\n",(0,n.jsx)(t.h3,{id:"41-witness-nodes-are-not-allowed-to-become-leader",children:"4.1. Witness nodes are not allowed to become leader"}),"\n",(0,n.jsxs)(t.p,{children:["The startup method of ",(0,n.jsx)(t.code,{children:"witness"})," node is the same as that of ordinary nodes. You only need to set the ",(0,n.jsx)(t.code,{children:"ha_is_witness"})," parameter to ",(0,n.jsx)(t.code,{children:"true"}),". Note that the number of witness nodes should be less than half of the total number of cluster nodes."]}),"\n",(0,n.jsx)(t.p,{children:"An example command to start the witness node server is as follows:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090 --ha_is_witness 1\n"})}),"\n",(0,n.jsxs)(t.p,{children:["Note: By default, the ",(0,n.jsx)(t.code,{children:"witness"})," node is not allowed to become the ",(0,n.jsx)(t.code,{children:"leader"})," node, which can improve the performance of the cluster, but will reduce the availability of the cluster when the ",(0,n.jsx)(t.code,{children:"leader"})," node crashes."]}),"\n",(0,n.jsx)(t.h3,{id:"41-allow-witness-nodes-to-become-leaders",children:"4.1. Allow witness nodes to become leaders"}),"\n",(0,n.jsxs)(t.p,{children:["You can specify the ",(0,n.jsx)(t.code,{children:"ha_enable_witness_to_leader"})," parameter as ",(0,n.jsx)(t.code,{children:"true"}),", so that the ",(0,n.jsx)(t.code,{children:"witness"})," node can temporarily become the ",(0,n.jsx)(t.code,{children:"leader"})," node, and then actively switch to the master after the new log synchronization is completed."]}),"\n",(0,n.jsxs)(t.p,{children:["An example of the command to start the ",(0,n.jsx)(t.code,{children:"witness"})," node server that is allowed to become the ",(0,n.jsx)(t.code,{children:"leader"})," node is as follows:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090 --ha_is_witness 1 --ha_enable_witness_to_leader 1\n"})}),"\n",(0,n.jsxs)(t.p,{children:["Note: Although allowing ",(0,n.jsx)(t.code,{children:"witness"})," nodes to become ",(0,n.jsx)(t.code,{children:"leader"})," nodes can improve the availability of the cluster, it may affect data consistency in extreme cases. Therefore, it should generally be ensured that the number of ",(0,n.jsx)(t.code,{children:"witness"})," nodes + 1 is less than half of the total number of cluster nodes."]}),"\n",(0,n.jsx)(t.h2,{id:"5scale-out-other-servers",children:"5.Scale out other servers"}),"\n",(0,n.jsxs)(t.p,{children:["After starting the initial backup group, if you want to scale out the backup group, add new servers to the backup group,\nThe ",(0,n.jsx)(t.code,{children:"--ha_conf HOST:PORT"})," option should be used, where ",(0,n.jsx)(t.code,{children:"HOST"})," can be the IP address of any server already in this backup group,\nAnd ",(0,n.jsx)(t.code,{children:"PORT"})," is its RPC port. E.g:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090\n"})}),"\n",(0,n.jsxs)(t.p,{children:["This command will start a TuGraph server in high availability mode and try to add it to the backup group containing the server ",(0,n.jsx)(t.code,{children:"172.22.224.15:9090"}),".\nNote that joining a backup group requires a server to synchronize its data with the backup group's ",(0,n.jsx)(t.code,{children:"leader"})," server, and this process may take a considerable amount of time, depending on the size of the data."]}),"\n",(0,n.jsx)(t.h2,{id:"6stopping-the-server",children:"6.Stopping the Server"}),"\n",(0,n.jsx)(t.p,{children:"When a server goes offline via 'CTRL-C', it will notify the current 'leader' server to remove the server from the backup group. If the leader server goes offline, it will pass the leader identity permission to another server before going offline."}),"\n",(0,n.jsx)(t.p,{children:"If a server is terminated or disconnected from other servers in the backup group, the server is considered a failed node and the leader server will remove it from the backup group after a specified time limit."}),"\n",(0,n.jsx)(t.p,{children:"If any server leaves the backup group and wishes to rejoin, it must start with the '--ha_conf {HOST:PORT}' option, where 'HOST' is the IP address of a server in the current backup group."}),"\n",(0,n.jsx)(t.h2,{id:"7restarting-the-server",children:"7.Restarting the Server"}),"\n",(0,n.jsxs)(t.p,{children:["Restarting the entire backup group is not recommended as it disrupts service. All servers can be shut down if desired. But on reboot,\nIt must be ensured that at least N/2+1 servers in the backup group at shutdown can start normally, otherwise the startup will fail. and,\nRegardless of whether ",(0,n.jsx)(t.code,{children:"enable_bootstrap"})," is specified as true when initially starting the replication group, restarting the server only needs to pass\nSpecify the ",(0,n.jsx)(t.code,{children:"--ha_conf host1:port1,host2:port2"})," parameter to restart all servers at once. The command example is as follows:"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090\n"})}),"\n",(0,n.jsx)(t.h2,{id:"8docker-deploys-a-highly-available-cluster",children:"8.docker deploys a highly available cluster"}),"\n",(0,n.jsx)(t.p,{children:"In real business scenarios, it is likely to encounter the need to deploy high-availability clusters on multiple operating systems or architectures.\nDifferentiated environments may cause some dependencies to be missing when compiling TuGraph. therefore,\nCompiling software in docker and deploying high-availability clusters is very valuable. Take the centos7 version of docker as an example,\nThe steps to deploy a highly available cluster are as follows."}),"\n",(0,n.jsx)(t.h3,{id:"81install-mirror",children:"8.1.Install mirror"}),"\n",(0,n.jsx)(t.p,{children:"Use the following command to download TuGraph's compiled docker image environment"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-shell",children:"docker pull tugraph/tugraph-compile-centos7\n"})}),"\n",(0,n.jsx)(t.p,{children:"Then pull the TuGraph source code and compile and install"}),"\n",(0,n.jsx)(t.h3,{id:"82create-container",children:"8.2.Create container"}),"\n",(0,n.jsxs)(t.p,{children:["Use the following command to create a container, use ",(0,n.jsx)(t.code,{children:"--net=host"})," to make the container run in host mode, in this mode\nDocker and the host machine share the network namespace, that is, they share the same IP."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-shell",children:"docker run --net=host -itd -p -v {src_dir}:{dst_dir} --name tugraph_ha tugraph/tugraph-compile-centos7 /bin/bash\n"})}),"\n",(0,n.jsx)(t.h3,{id:"83start-service",children:"8.3.Start service"}),"\n",(0,n.jsx)(t.p,{children:"Use the following command to start the service on each server, because docker and the host share IP, so you can directly specify to start the service on the host IP"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-shell",children:"$ lgraph_server -c lgraph.json --host 172.22.224.15 --rpc_port 9090 --enable_ha true --ha_conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090\n"})}),"\n",(0,n.jsx)(t.h2,{id:"9server-status",children:"9.Server Status"}),"\n",(0,n.jsx)(t.p,{children:"The current status of the backup group can be obtained from the TuGraph visualization tool, REST API, and Cypher query."}),"\n",(0,n.jsx)(t.p,{children:"In the TuGraph visualization tool, you can find the list of servers and their roles in the backup group in the DBInfo section."}),"\n",(0,n.jsxs)(t.p,{children:["With the REST API, you can use ",(0,n.jsx)(t.code,{children:"GET /info/peers"})," to request information."]}),"\n",(0,n.jsxs)(t.p,{children:["In Cypher, the ",(0,n.jsx)(t.code,{children:"CALL dbms.listServers()"})," statement is used to query the status information of the current backup group."]}),"\n",(0,n.jsx)(t.h2,{id:"10data-synchronization-in-high-availability-mode",children:"10.Data synchronization in high availability mode"}),"\n",(0,n.jsx)(t.p,{children:"In high availability mode, different servers in the same backup group may not always be in the same state. For performance reasons, if a request has been synchronized to more than half of the servers, the leader server will consider the request to be in the committed state. Although the rest of the servers will eventually receive the new request, the inconsistent state of the servers will persist for some time. A client may also send a request to a server that has just restarted, thus having an older state and waiting to join a backup group."}),"\n",(0,n.jsx)(t.p,{children:"To ensure that the client sees consistently continuous data, and in particular to get rid of the 'reverse time travel' problem, where the client reads a state older than it has seen before, each TuGraph server keeps a monotonically increasing data version number. The mapping of the data version number to the database state in the backup group is globally consistent, meaning that if two servers have the same data version number, they must have the same data. When responding to a request, the server includes its data version number in the response. Thus, the client can tell which version it has seen. The client can choose to send this data version number along with the request. Upon receiving a request with a data version number, the server compares the data version number to its current version and rejects the request if its own version is lower than the requested version. This mechanism ensures that the client never reads a state that is older than before."})]})}function c(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>o});var n=r(6540);const s={},a=n.createContext(s);function i(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/66d55dfc.c5aa7b96.js b/assets/js/66d55dfc.5620834d.js similarity index 97% rename from assets/js/66d55dfc.c5aa7b96.js rename to assets/js/66d55dfc.5620834d.js index 6932a83562..b4ae177934 100644 --- a/assets/js/66d55dfc.c5aa7b96.js +++ b/assets/js/66d55dfc.5620834d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3956],{7435:(t,e,s)=>{s.r(e),s.d(e,{assets:()=>i,contentTitle:()=>a,default:()=>d,frontMatter:()=>c,metadata:()=>r,toc:()=>u});var n=s(4848),o=s(8453);const c={},a="Contacts",r={id:"contacts",title:"Contacts",description:"If you have any feedback or suggestions for the product, You are welcome to join the discussion or make suggestions through the following contact methods.",source:"@site/../docs/en-US/source/15.contacts.md",sourceDirName:".",slug:"/contacts",permalink:"/tugraph-db/en/contacts",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:15,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"FAQ",permalink:"/tugraph-db/en/faq"}},i={},u=[];function h(t){const e={a:"a",h1:"h1",header:"header",img:"img",p:"p",...(0,o.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.header,{children:(0,n.jsx)(e.h1,{id:"contacts",children:"Contacts"})}),"\n",(0,n.jsx)(e.p,{children:"If you have any feedback or suggestions for the product, You are welcome to join the discussion or make suggestions through the following contact methods."}),"\n",(0,n.jsxs)(e.p,{children:["Official website: ",(0,n.jsx)(e.a,{href:"https://www.tugraph.org",children:"www.tugraph.org"})]}),"\n",(0,n.jsxs)(e.p,{children:["Github Issue:\n",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/issues",children:"Issue"})]}),"\n",(0,n.jsxs)(e.p,{children:["Github Discussions:\n",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions",children:"Discussions"})]}),"\n",(0,n.jsxs)(e.p,{children:["Slack:\n",(0,n.jsx)(e.a,{href:"https://join.slack.com/t/tugraph/shared_invite/zt-1hha8nuli-bqdkwn~w4zH1vlk0QvqIfg",children:"TuGraph.slack"})]}),"\n",(0,n.jsxs)(e.p,{children:["Contact us via dingtalk, wechat, email and telephone:\n",(0,n.jsx)(e.img,{alt:"contacts",src:s(5060).A+"",width:"1547",height:"516"})]})]})}function d(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(h,{...t})}):h(t)}},5060:(t,e,s)=>{s.d(e,{A:()=>n});const n=s.p+"assets/images/contact-en-22cbe0cf1926cc821cce8566ae1d4d3c.png"},8453:(t,e,s)=>{s.d(e,{R:()=>a,x:()=>r});var n=s(6540);const o={},c=n.createContext(o);function a(t){const e=n.useContext(c);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:a(t.components),n.createElement(c.Provider,{value:e},t.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3956],{7435:(t,e,s)=>{s.r(e),s.d(e,{assets:()=>i,contentTitle:()=>a,default:()=>d,frontMatter:()=>c,metadata:()=>r,toc:()=>u});var n=s(4848),o=s(8453);const c={},a="Contacts",r={id:"contacts",title:"Contacts",description:"If you have any feedback or suggestions for the product, You are welcome to join the discussion or make suggestions through the following contact methods.",source:"@site/../docs/en-US/source/15.contacts.md",sourceDirName:".",slug:"/contacts",permalink:"/tugraph-db/en/contacts",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:15,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"FAQ",permalink:"/tugraph-db/en/faq"}},i={},u=[];function h(t){const e={a:"a",h1:"h1",header:"header",img:"img",p:"p",...(0,o.R)(),...t.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.header,{children:(0,n.jsx)(e.h1,{id:"contacts",children:"Contacts"})}),"\n",(0,n.jsx)(e.p,{children:"If you have any feedback or suggestions for the product, You are welcome to join the discussion or make suggestions through the following contact methods."}),"\n",(0,n.jsxs)(e.p,{children:["Official website: ",(0,n.jsx)(e.a,{href:"https://www.tugraph.org",children:"www.tugraph.org"})]}),"\n",(0,n.jsxs)(e.p,{children:["Github Issue:\n",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/issues",children:"Issue"})]}),"\n",(0,n.jsxs)(e.p,{children:["Github Discussions:\n",(0,n.jsx)(e.a,{href:"https://github.com/TuGraph-db/tugraph-db/discussions",children:"Discussions"})]}),"\n",(0,n.jsxs)(e.p,{children:["Slack:\n",(0,n.jsx)(e.a,{href:"https://join.slack.com/t/tugraph/shared_invite/zt-1hha8nuli-bqdkwn~w4zH1vlk0QvqIfg",children:"TuGraph.slack"})]}),"\n",(0,n.jsxs)(e.p,{children:["Contact us via dingtalk, wechat, email and telephone:\n",(0,n.jsx)(e.img,{alt:"contacts",src:s(5060).A+"",width:"1547",height:"516"})]})]})}function d(t={}){const{wrapper:e}={...(0,o.R)(),...t.components};return e?(0,n.jsx)(e,{...t,children:(0,n.jsx)(h,{...t})}):h(t)}},5060:(t,e,s)=>{s.d(e,{A:()=>n});const n=s.p+"assets/images/contact-en-22cbe0cf1926cc821cce8566ae1d4d3c.png"},8453:(t,e,s)=>{s.d(e,{R:()=>a,x:()=>r});var n=s(6540);const o={},c=n.createContext(o);function a(t){const e=n.useContext(c);return n.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:a(t.components),n.createElement(c.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/6cc43114.ef4d9c30.js b/assets/js/6cc43114.5d07794d.js similarity index 98% rename from assets/js/6cc43114.ef4d9c30.js rename to assets/js/6cc43114.5d07794d.js index 2b37bfc26e..ef6743ead8 100644 --- a/assets/js/6cc43114.ef4d9c30.js +++ b/assets/js/6cc43114.5d07794d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8992],{1690:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var t=i(4848),r=i(8453);const o={},s="Environment Mode",l={id:"installation&running/environment-mode",title:"Environment Mode",description:"This document primarily introduces the three types of environments involved in TuGraph.",source:"@site/../docs/en-US/source/5.installation&running/2.environment-mode.md",sourceDirName:"5.installation&running",slug:"/installation&running/environment-mode",permalink:"/tugraph-db/en/installation&running/environment-mode",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Environment",permalink:"/tugraph-db/en/installation&running/environment"},next:{title:"Docker Deployment",permalink:"/tugraph-db/en/installation&running/docker-deployment"}},a={},d=[{value:"1.Classification",id:"1classification",level:2},{value:"2.System Library",id:"2system-library",level:2}];function c(e){const n={blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"environment-mode",children:"Environment Mode"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document primarily introduces the three types of environments involved in TuGraph."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1classification",children:"1.Classification"}),"\n",(0,t.jsx)(n.p,{children:"Based on the different functionalities supported by the environments, they can be categorized into the following:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"The compilation environment has all dependent libraries for TuGraph compilation, including all dependencies of the running environment, and can compile TuGraph source code, but does not include precompiled TuGraph executable files and library files for developers to compile source code."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Running environment, with GCC/Java/Python environment, can run all functions of TuGraph, and can host full-text indexing, java client, c++ source code uploaded as plugin, and complete functions of python plugin, built-in TuGraph precompiled executable file and library files for customers to install and use directly without compiling source code."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Simplified operating environment, which is approximately equivalent to a bare system plus precompiled TuGraph. It can only run the basic functions of TuGraph. There is no C++ plugin to compile and run, only so upload, no full-text index, and no python plugin. It is for quick setup and trial use.\nAfter compiling TuGraph, all the required dependencies are packaged together in the form of .a files, eliminating the need for unnecessary additional dependencies during runtime. However, since TuGraph supports stored procedures, which involve compiling C++ code on the server, the required compilers still need to be present in the environment."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"2system-library",children:"2.System Library"}),"\n",(0,t.jsx)(n.p,{children:"For the three types of environments, the required system libraries, excluding the TuGraph runtime package, are as follows:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Compilation Environment: It includes GCC, Python, Java compilers, as well as libraries such as ANTLR4 and Pybind11. Please refer to the tugraph-compile-*-Dockerfile for more details."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Runtime Environment: The main dependencies introduced by stored procedures include GCC, Boost, CMake, and others. Please refer to the tugraph-runtime-*-Dockerfile for more details."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Mini-Runtime Environment: There are no additional system library dependencies. Please refer to the tugraph-mini-runtime-*-Dockerfile for more details."}),"\n"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>l});var t=i(6540);const r={},o=t.createContext(r);function s(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8992],{1690:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var t=i(4848),r=i(8453);const o={},s="Environment Mode",l={id:"installation&running/environment-mode",title:"Environment Mode",description:"This document primarily introduces the three types of environments involved in TuGraph.",source:"@site/../docs/en-US/source/5.installation&running/2.environment-mode.md",sourceDirName:"5.installation&running",slug:"/installation&running/environment-mode",permalink:"/tugraph-db/en/installation&running/environment-mode",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Environment",permalink:"/tugraph-db/en/installation&running/environment"},next:{title:"Docker Deployment",permalink:"/tugraph-db/en/installation&running/docker-deployment"}},a={},d=[{value:"1.Classification",id:"1classification",level:2},{value:"2.System Library",id:"2system-library",level:2}];function c(e){const n={blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"environment-mode",children:"Environment Mode"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document primarily introduces the three types of environments involved in TuGraph."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1classification",children:"1.Classification"}),"\n",(0,t.jsx)(n.p,{children:"Based on the different functionalities supported by the environments, they can be categorized into the following:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"The compilation environment has all dependent libraries for TuGraph compilation, including all dependencies of the running environment, and can compile TuGraph source code, but does not include precompiled TuGraph executable files and library files for developers to compile source code."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Running environment, with GCC/Java/Python environment, can run all functions of TuGraph, and can host full-text indexing, java client, c++ source code uploaded as plugin, and complete functions of python plugin, built-in TuGraph precompiled executable file and library files for customers to install and use directly without compiling source code."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Simplified operating environment, which is approximately equivalent to a bare system plus precompiled TuGraph. It can only run the basic functions of TuGraph. There is no C++ plugin to compile and run, only so upload, no full-text index, and no python plugin. It is for quick setup and trial use.\nAfter compiling TuGraph, all the required dependencies are packaged together in the form of .a files, eliminating the need for unnecessary additional dependencies during runtime. However, since TuGraph supports stored procedures, which involve compiling C++ code on the server, the required compilers still need to be present in the environment."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"2system-library",children:"2.System Library"}),"\n",(0,t.jsx)(n.p,{children:"For the three types of environments, the required system libraries, excluding the TuGraph runtime package, are as follows:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Compilation Environment: It includes GCC, Python, Java compilers, as well as libraries such as ANTLR4 and Pybind11. Please refer to the tugraph-compile-*-Dockerfile for more details."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Runtime Environment: The main dependencies introduced by stored procedures include GCC, Boost, CMake, and others. Please refer to the tugraph-runtime-*-Dockerfile for more details."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Mini-Runtime Environment: There are no additional system library dependencies. Please refer to the tugraph-mini-runtime-*-Dockerfile for more details."}),"\n"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>l});var t=i(6540);const r={},o=t.createContext(r);function s(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6e5b21f1.5072a35c.js b/assets/js/6e5b21f1.dce507ec.js similarity index 99% rename from assets/js/6e5b21f1.5072a35c.js rename to assets/js/6e5b21f1.dce507ec.js index e605d4ceb1..25015559e6 100644 --- a/assets/js/6e5b21f1.5072a35c.js +++ b/assets/js/6e5b21f1.dce507ec.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4905],{9363:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>s,default:()=>l,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var n=a(4848),r=a(8453);const i={},s="HTAP",o={id:"introduction/characteristics/htap",title:"HTAP",description:"This document mainly introduces the design philosophy of TuGraph's HTAP.",source:"@site/../docs/en-US/source/2.introduction/5.characteristics/3.htap.md",sourceDirName:"2.introduction/5.characteristics",slug:"/introduction/characteristics/htap",permalink:"/tugraph-db/en/introduction/characteristics/htap",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Multi Level Interfaces",permalink:"/tugraph-db/en/introduction/characteristics/multi-level-Interfaces"},next:{title:"Architecture",permalink:"/tugraph-db/en/introduction/architecture"}},h={},c=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Design",id:"2design",level:2}];function d(e){const t={blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"htap",children:"HTAP"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"This document mainly introduces the design philosophy of TuGraph's HTAP."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"htap",src:a(7999).A+"",width:"952",height:"566"})}),"\n",(0,n.jsx)(t.p,{children:"There are different ways to implement HTAP in architecture: one is to use two different copies to handle OLTP and OLAP tasks separately, with the core being data consistency synchronization and additional resource overhead; the other is to use the same data storage at all times, but this implementation has memory bloat in its data structure and needs further work for industrialization. In TuGraph's design, simple OLAP and OLTP operations share the same data, while complex OLAP operations are exported and handled separately as snapshots."}),"\n",(0,n.jsx)(t.h2,{id:"2design",children:"2.Design"}),"\n",(0,n.jsx)(t.p,{children:"In TuGraph, OLTP is the graph transaction engine, corresponding to transaction operations in Figure; OLAP is the graph analysis engine, corresponding to simple graph analysis operations (such as SPSP) and complex graph analysis operations (such as PageRank), the former of which can be executed directly on the graph storage, while the latter requires exporting a snapshot for execution."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Transaction operations, measured by the graph transaction engine, are local graph add, delete, query and modify operations, typically used for K-hop access."}),"\n",(0,n.jsx)(t.li,{children:"Simple analysis operations are the simpler part of the graph analysis engine, usually local graph analysis operations, such as the shortest path algorithm SPSP and Jaccard algorithm."}),"\n",(0,n.jsx)(t.li,{children:"Complex analysis operations are the more complex part of the graph analysis engine, usually involving multi-round data iteration operations across the entire graph, such as the PageRank algorithm for webpage ranking and the Louvain algorithm for community discovery."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"As shown in Figure , external storage is added to the architecture diagram, making the data source for graph analysis not limited to the graph database and can be directly read from text files."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Graph storage, which is the storage in the graph database, has carefully designed data structures that can perform real-time add, delete, query and modify operations."}),"\n",(0,n.jsx)(t.li,{children:"External storage, which can be an RDBMS or text file, is stored in a simple way as an edge table, only for one-time batch reading and batch result writing. In the calculation layer, it corresponds to the interface in the overall architecture diagram."}),"\n",(0,n.jsx)(t.li,{children:"Cypher, the declarative graph query language, can be executed concurrently."}),"\n",(0,n.jsx)(t.li,{children:"Procedure API, the procedural graph query language, is flexible and can support both transaction operations and graph analysis operations, but its efficiency is not sufficient to complete complex graph analysis operations, and it can be executed concurrently."}),"\n",(0,n.jsx)(t.li,{children:"OLAP API, for multi-round iteration of complex graph analysis. Applications need to first export the graph data in storage into a snapshot in memory, which is only used for fast access and does not need to consider the write support of ACID, so it can be arranged more compactly, and the read efficiency of CSR arrangement is much higher than that of graph storage data arrangement. OLAP API can only be executed serially, and each operation uses full CPU resources."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"OLAP API snapshots can be created from external storage, where the edge table data is formatted as CSR, or from the graph storage. It should be noted that OLAP API requires that the IDs of the vertices be consecutive natural numbers, which may require additional ID mapping. This step can be mapped to a specified attribute when creating a snapshot or directly using the attribute value as the ID."}),"\n",(0,n.jsx)(t.p,{children:"Corresponding to the calculation interface and storage, there are four operating modes."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Transaction mode, each operation corresponds to a Cypher statement, which is a transaction by default."}),"\n",(0,n.jsx)(t.li,{children:"Plugin mode, call through plugins, after the calculation logic is loaded on the server, also known as stored procedures."}),"\n",(0,n.jsx)(t.li,{children:"Embed mode, which has the same interface as Plugin mode but the graph database service does not need to be started and can directly call the data in the database through the interface. This mode is usually used for debugging Procedure API and OLAP API code, and the debugging information and operation steps are more friendly than Plugin mode."}),"\n",(0,n.jsx)(t.li,{children:"Standalone mode, which maximally separates from the graph database, is more direct when only using the graph analysis engine for data analysis. Standalone mode will directly use the data of the external storage."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"The use of the graph neural network engine is similar to the 'complex graph analysis operation', which calls part of the OLAP API and GNN API at the same time, which is not elaborated here."})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},7999:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/htap-en-b02eec1489b053469011ccdc046b8780.png"},8453:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>o});var n=a(6540);const r={},i=n.createContext(r);function s(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4905],{9363:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>s,default:()=>l,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var n=a(4848),r=a(8453);const i={},s="HTAP",o={id:"introduction/characteristics/htap",title:"HTAP",description:"This document mainly introduces the design philosophy of TuGraph's HTAP.",source:"@site/../docs/en-US/source/2.introduction/5.characteristics/3.htap.md",sourceDirName:"2.introduction/5.characteristics",slug:"/introduction/characteristics/htap",permalink:"/tugraph-db/en/introduction/characteristics/htap",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Multi Level Interfaces",permalink:"/tugraph-db/en/introduction/characteristics/multi-level-Interfaces"},next:{title:"Architecture",permalink:"/tugraph-db/en/introduction/architecture"}},h={},c=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Design",id:"2design",level:2}];function d(e){const t={blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"htap",children:"HTAP"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"This document mainly introduces the design philosophy of TuGraph's HTAP."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"htap",src:a(7999).A+"",width:"952",height:"566"})}),"\n",(0,n.jsx)(t.p,{children:"There are different ways to implement HTAP in architecture: one is to use two different copies to handle OLTP and OLAP tasks separately, with the core being data consistency synchronization and additional resource overhead; the other is to use the same data storage at all times, but this implementation has memory bloat in its data structure and needs further work for industrialization. In TuGraph's design, simple OLAP and OLTP operations share the same data, while complex OLAP operations are exported and handled separately as snapshots."}),"\n",(0,n.jsx)(t.h2,{id:"2design",children:"2.Design"}),"\n",(0,n.jsx)(t.p,{children:"In TuGraph, OLTP is the graph transaction engine, corresponding to transaction operations in Figure; OLAP is the graph analysis engine, corresponding to simple graph analysis operations (such as SPSP) and complex graph analysis operations (such as PageRank), the former of which can be executed directly on the graph storage, while the latter requires exporting a snapshot for execution."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Transaction operations, measured by the graph transaction engine, are local graph add, delete, query and modify operations, typically used for K-hop access."}),"\n",(0,n.jsx)(t.li,{children:"Simple analysis operations are the simpler part of the graph analysis engine, usually local graph analysis operations, such as the shortest path algorithm SPSP and Jaccard algorithm."}),"\n",(0,n.jsx)(t.li,{children:"Complex analysis operations are the more complex part of the graph analysis engine, usually involving multi-round data iteration operations across the entire graph, such as the PageRank algorithm for webpage ranking and the Louvain algorithm for community discovery."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"As shown in Figure , external storage is added to the architecture diagram, making the data source for graph analysis not limited to the graph database and can be directly read from text files."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Graph storage, which is the storage in the graph database, has carefully designed data structures that can perform real-time add, delete, query and modify operations."}),"\n",(0,n.jsx)(t.li,{children:"External storage, which can be an RDBMS or text file, is stored in a simple way as an edge table, only for one-time batch reading and batch result writing. In the calculation layer, it corresponds to the interface in the overall architecture diagram."}),"\n",(0,n.jsx)(t.li,{children:"Cypher, the declarative graph query language, can be executed concurrently."}),"\n",(0,n.jsx)(t.li,{children:"Procedure API, the procedural graph query language, is flexible and can support both transaction operations and graph analysis operations, but its efficiency is not sufficient to complete complex graph analysis operations, and it can be executed concurrently."}),"\n",(0,n.jsx)(t.li,{children:"OLAP API, for multi-round iteration of complex graph analysis. Applications need to first export the graph data in storage into a snapshot in memory, which is only used for fast access and does not need to consider the write support of ACID, so it can be arranged more compactly, and the read efficiency of CSR arrangement is much higher than that of graph storage data arrangement. OLAP API can only be executed serially, and each operation uses full CPU resources."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"OLAP API snapshots can be created from external storage, where the edge table data is formatted as CSR, or from the graph storage. It should be noted that OLAP API requires that the IDs of the vertices be consecutive natural numbers, which may require additional ID mapping. This step can be mapped to a specified attribute when creating a snapshot or directly using the attribute value as the ID."}),"\n",(0,n.jsx)(t.p,{children:"Corresponding to the calculation interface and storage, there are four operating modes."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Transaction mode, each operation corresponds to a Cypher statement, which is a transaction by default."}),"\n",(0,n.jsx)(t.li,{children:"Plugin mode, call through plugins, after the calculation logic is loaded on the server, also known as stored procedures."}),"\n",(0,n.jsx)(t.li,{children:"Embed mode, which has the same interface as Plugin mode but the graph database service does not need to be started and can directly call the data in the database through the interface. This mode is usually used for debugging Procedure API and OLAP API code, and the debugging information and operation steps are more friendly than Plugin mode."}),"\n",(0,n.jsx)(t.li,{children:"Standalone mode, which maximally separates from the graph database, is more direct when only using the graph analysis engine for data analysis. Standalone mode will directly use the data of the external storage."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"The use of the graph neural network engine is similar to the 'complex graph analysis operation', which calls part of the OLAP API and GNN API at the same time, which is not elaborated here."})]})}function l(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},7999:(e,t,a)=>{a.d(t,{A:()=>n});const n=a.p+"assets/images/htap-en-b02eec1489b053469011ccdc046b8780.png"},8453:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>o});var n=a(6540);const r={},i=n.createContext(r);function s(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6fe137e4.9da9f63d.js b/assets/js/6fe137e4.cee0e85a.js similarity index 96% rename from assets/js/6fe137e4.9da9f63d.js rename to assets/js/6fe137e4.cee0e85a.js index 0932a82921..4d38aa2054 100644 --- a/assets/js/6fe137e4.9da9f63d.js +++ b/assets/js/6fe137e4.cee0e85a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5420],{525:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=a(4848),n=a(8453);const o={},s="Importing Data from Relational Databases to TuGraph",i={id:"best-practices/rdbms-to-tugraph",title:"Importing Data from Relational Databases to TuGraph",description:"Using DataX\uff0cto be completed.",source:"@site/../docs/en-US/source/13.best-practices/1.rdbms-to-tugraph.md",sourceDirName:"13.best-practices",slug:"/best-practices/rdbms-to-tugraph",permalink:"/tugraph-db/en/best-practices/rdbms-to-tugraph",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Roadmap",permalink:"/tugraph-db/en/contributor-manual/roadmap"},next:{title:"Using TuGraph Graph Learning Module for Node Classification",permalink:"/tugraph-db/en/best-practices/learn_practices"}},c={},u=[];function p(t){const e={a:"a",blockquote:"blockquote",h1:"h1",header:"header",p:"p",...(0,n.R)(),...t.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.header,{children:(0,r.jsx)(e.h1,{id:"importing-data-from-relational-databases-to-tugraph",children:"Importing Data from Relational Databases to TuGraph"})}),"\n",(0,r.jsxs)(e.blockquote,{children:["\n",(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/tugraph-db/en/utility-tools/tugraph-datax",children:"DataX"}),"\uff0cto be completed."]}),"\n"]})]})}function d(t={}){const{wrapper:e}={...(0,n.R)(),...t.components};return e?(0,r.jsx)(e,{...t,children:(0,r.jsx)(p,{...t})}):p(t)}},8453:(t,e,a)=>{a.d(e,{R:()=>s,x:()=>i});var r=a(6540);const n={},o=r.createContext(n);function s(t){const e=r.useContext(o);return r.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function i(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:s(t.components),r.createElement(o.Provider,{value:e},t.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5420],{525:(t,e,a)=>{a.r(e),a.d(e,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var r=a(4848),n=a(8453);const o={},s="Importing Data from Relational Databases to TuGraph",i={id:"best-practices/rdbms-to-tugraph",title:"Importing Data from Relational Databases to TuGraph",description:"Using DataX\uff0cto be completed.",source:"@site/../docs/en-US/source/13.best-practices/1.rdbms-to-tugraph.md",sourceDirName:"13.best-practices",slug:"/best-practices/rdbms-to-tugraph",permalink:"/tugraph-db/en/best-practices/rdbms-to-tugraph",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Roadmap",permalink:"/tugraph-db/en/contributor-manual/roadmap"},next:{title:"Using TuGraph Graph Learning Module for Node Classification",permalink:"/tugraph-db/en/best-practices/learn_practices"}},c={},u=[];function p(t){const e={a:"a",blockquote:"blockquote",h1:"h1",header:"header",p:"p",...(0,n.R)(),...t.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.header,{children:(0,r.jsx)(e.h1,{id:"importing-data-from-relational-databases-to-tugraph",children:"Importing Data from Relational Databases to TuGraph"})}),"\n",(0,r.jsxs)(e.blockquote,{children:["\n",(0,r.jsxs)(e.p,{children:["Using ",(0,r.jsx)(e.a,{href:"/tugraph-db/en/utility-tools/tugraph-datax",children:"DataX"}),"\uff0cto be completed."]}),"\n"]})]})}function d(t={}){const{wrapper:e}={...(0,n.R)(),...t.components};return e?(0,r.jsx)(e,{...t,children:(0,r.jsx)(p,{...t})}):p(t)}},8453:(t,e,a)=>{a.d(e,{R:()=>s,x:()=>i});var r=a(6540);const n={},o=r.createContext(n);function s(t){const e=r.useContext(o);return r.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function i(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(n):t.components||n:s(t.components),r.createElement(o.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/7387447f.9211323f.js b/assets/js/7387447f.5468010f.js similarity index 99% rename from assets/js/7387447f.9211323f.js rename to assets/js/7387447f.5468010f.js index 4e6dd164a8..0ef85b5cfb 100644 --- a/assets/js/7387447f.9211323f.js +++ b/assets/js/7387447f.5468010f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5645],{6691:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var t=r(4848),s=r(8453);const i={},o="RPC API",a={id:"client-tools/rpc-api",title:"RPC API",description:"This document mainly introduces the details of calling TuGraph's RPC API.",source:"@site/../docs/en-US/source/7.client-tools/8.rpc-api.md",sourceDirName:"7.client-tools",slug:"/client-tools/rpc-api",permalink:"/tugraph-db/en/client-tools/rpc-api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:8,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph RESTful API",permalink:"/tugraph-db/en/client-tools/restful-api"},next:{title:"TuGraph RESTful API Legacy",permalink:"/tugraph-db/en/client-tools/restful-api-legacy"}},l={},c=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Request",id:"2request",level:2},{value:"2.1.Establishing a Connection",id:"21establishing-a-connection",level:3},{value:"2.2.Request Types",id:"22request-types",level:3},{value:"3.Login",id:"3login",level:2},{value:"4.Query",id:"4query",level:2},{value:"5.Stored Procedures",id:"5stored-procedures",level:2},{value:"5.1.Load Stored Procedures",id:"51load-stored-procedures",level:3},{value:"5.2.Invoke Stored Procedures",id:"52invoke-stored-procedures",level:3},{value:"5.3.Delete Stored Procedures",id:"53delete-stored-procedures",level:3},{value:"5.4.List Stored Procedures",id:"54list-stored-procedures",level:3}];function d(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"rpc-api",children:"RPC API"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document mainly introduces the details of calling TuGraph's RPC API."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph provides rich RPC APIs for developers to remotely call the services provided by TuGraph through RPC requests."}),"\n",(0,t.jsx)(n.p,{children:"RPC (Remote Procedure Call) is a protocol for requesting services from remote computer programs through a network without the need to understand the underlying network technology.\nCompared with REST, RPC is method-oriented and mainly used for calling function methods. It is suitable for more complex communication scenarios and has higher performance.\nbrpc is an industrial-grade RPC framework written in C++. Based on brpc, TuGraph provides rich RPC APIs. This document describes how to use TuGraph's RPC API."}),"\n",(0,t.jsx)(n.h2,{id:"2request",children:"2.Request"}),"\n",(0,t.jsx)(n.h3,{id:"21establishing-a-connection",children:"2.1.Establishing a Connection"}),"\n",(0,t.jsx)(n.p,{children:"When developers send RPC requests to TuGraph services, they must first establish a connection. Taking C++ as an example, developers create a channel with the specified URL and create a specified service stub (LGraphRPCService_Stub) from the channel. Subsequently, they can send requests to the remote server through the stub like calling local methods."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-C++",children:' std::shared_ptr options = std::make_shared();\n options->protocol = "baidu_std";\n options->connection_type = "";\n options->timeout_ms = 60 * 60 * 1000 /*milliseconds*/;\n options->max_retry = 3;\n std::string load_balancer = "";\n std::shared_ptr channel = std::make_shared();\n if (channel->Init(url.c_str(), load_balancer, options.get()) != 0)\n throw RpcException("Fail to initialize channel");\n LGraphRPCService_Stub stub(channel.get());\n'})}),"\n",(0,t.jsx)(n.h3,{id:"22request-types",children:"2.2.Request Types"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph supports 10 types of RPC requests, and each request's functionality is shown in the following table:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Request"}),(0,t.jsx)(n.th,{children:"Functionality"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GraphApiRequest"}),(0,t.jsx)(n.td,{children:"Vertex-Edge Index"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"CypherRequest"}),(0,t.jsx)(n.td,{children:"cypher"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"PluginRequest"}),(0,t.jsx)(n.td,{children:"Stored Procedures"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"HARequest"}),(0,t.jsx)(n.td,{children:"High Availability"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ImportRequest"}),(0,t.jsx)(n.td,{children:"Data Import"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GraphRequest"}),(0,t.jsx)(n.td,{children:"Subgraph Operations"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"AclRequest"}),(0,t.jsx)(n.td,{children:"Access Control"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ConfigRequest"}),(0,t.jsx)(n.td,{children:"Configuration"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"RestoreRequest"}),(0,t.jsx)(n.td,{children:"Backup"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"SchemaRequest"}),(0,t.jsx)(n.td,{children:"Schema Management"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"When a user sends a request, the following parameters need to be passed in:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["client_version: an optional parameter, in HA mode, it can prevent outdated responses by comparing ",(0,t.jsx)(n.code,{children:"client_version"})," and ",(0,t.jsx)(n.code,{children:"server_version"})]}),"\n",(0,t.jsx)(n.li,{children:"token: a necessary parameter, the client obtains the token after logging in, and the token is passed in with each request to verify the user's identity"}),"\n",(0,t.jsx)(n.li,{children:"is_write_op: an optional parameter, indicating whether the request is a write request"}),"\n",(0,t.jsx)(n.li,{children:"user: an optional parameter, set user when synchronizing requests between master and slave in HA mode, and no token verification is required After the service processes the RPC request, it sends back a response."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"In addition to containing separate response information for each request, the response message also includes the following parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"error_code: a necessary parameter, indicating the processing status of the request"}),"\n",(0,t.jsx)(n.li,{children:"redirect: an optional parameter, when processing fails to send a write request to a follower in HA mode, set redirect as the request forwarding address, that is, the leader address"}),"\n",(0,t.jsx)(n.li,{children:"error: an optional parameter, indicating the error information of the request"}),"\n",(0,t.jsxs)(n.li,{children:["server_version: an optional parameter, set ",(0,t.jsx)(n.code,{children:"server_version"})," in the HA mode request response to avoid reverse time travel when client reads data"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["\u26a0\ufe0f ",(0,t.jsx)(n.strong,{children:"Except for CypherRequest, PluginRequest, HARequest and AclRequest, all other RPC interfaces will be gradually deprecated, and their functions will be unified into the CypherRequest interface."})]}),"\n",(0,t.jsx)(n.h2,{id:"3login",children:"3.Login"}),"\n",(0,t.jsx)(n.p,{children:"The login request message contains the following parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"user: a necessary parameter, the username"}),"\n",(0,t.jsx)(n.li,{children:"pass: a necessary parameter, the password"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Taking C++ as an example, the user sends a login request using the constructed service stub:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-C++",children:" auto* req = request.mutable_acl_request();\n auto* auth = req->mutable_auth_request()->mutable_login();\n auth->set_user(user);\n auth->set_password(pass);\n // send data\n cntl->Reset();\n cntl->request_attachment().append(FLAGS_attachment);\n req->set_client_version(server_version);\n req->set_token(token);\n LGraphRPCService_Stub stub(channel.get());\n LGraphResponse res;\n stub.HandleRequest(cntl.get(), req, &resp, nullptr);\n if (cntl->Failed()) throw RpcConnectionException(cntl->ErrorText());\n server_version = std::max(server_version, res.server_version());\n if (res.error_code() != LGraphResponse::SUCCESS) throw RpcStatusException(res.error());\n token = res.acl_response().auth_response().token();\n"})}),"\n",(0,t.jsx)(n.p,{children:"The login response message contains the following parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:'token: a necessary parameter. After successful login, a signed token, namely Json Web Token, will be received. The client stores the token and uses it for each subsequent request. If the login fails, an "Authentication failed" error will be received.'}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"4query",children:"4.Query"}),"\n",(0,t.jsx)(n.p,{children:"Users can interact with TuGraph through Cypher queries. The Cypher request message contains the following parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"query: a necessary parameter, the Cypher query statement"}),"\n",(0,t.jsx)(n.li,{children:"param_names: an optional parameter, the parameter name"}),"\n",(0,t.jsx)(n.li,{children:"param_values: an optional parameter, the parameter value"}),"\n",(0,t.jsx)(n.li,{children:"result_in_json_format: a necessary parameter, whether to return the query results in JSON format"}),"\n",(0,t.jsx)(n.li,{children:"graph: an optional parameter, the subgraph name for executing the Cypher statement"}),"\n",(0,t.jsx)(n.li,{children:"timeout: an optional parameter, the timeout for executing the Cypher statement"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Taking C++ as an example, the user sends a Cypher request as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-C++",children:" LGraphResponse res;\n cntl->Reset();\n cntl->request_attachment().append(FLAGS_attachment);\n LGraphRequest req;\n req.set_client_version(server_version);\n req.set_token(token);\n lgraph::CypherRequest* cypher_req = req.mutable_cypher_request();\n cypher_req->set_graph(graph);\n cypher_req->set_query(query);\n cypher_req->set_timeout(timeout);\n cypher_req->set_result_in_json_format(true);\n LGraphRPCService_Stub stub(channel.get());\n stub.HandleRequest(cntl.get(), &req, &res, nullptr);\n if (cntl->Failed()) throw RpcConnectionException(cntl->ErrorText());\n if (res.error_code() != LGraphResponse::SUCCESS) throw RpcStatusException(res.error());\n server_version = std::max(server_version, res.server_version());\n CypherResponse cypher_res = res.cypher_response();\n"})}),"\n",(0,t.jsx)(n.p,{children:"The Cypher request response contains one of the following two parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"json_result: the Cypher query result in JSON format"}),"\n",(0,t.jsx)(n.li,{children:"binary_result: the Cypher query result in the CypherResult format"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"5stored-procedures",children:"5.Stored Procedures"}),"\n",(0,t.jsx)(n.p,{children:"To meet users' more complex query/update logic, TuGraph supports stored procedures written in C and Python. Users can use RPC requests to perform CRUD operations on stored procedures."}),"\n",(0,t.jsx)(n.h3,{id:"51load-stored-procedures",children:"5.1.Load Stored Procedures"}),"\n",(0,t.jsx)(n.p,{children:"The request for loading stored procedures contains the following parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"name: a necessary parameter, the stored procedure name"}),"\n",(0,t.jsx)(n.li,{children:"read_only: a necessary parameter, whether it is read-only"}),"\n",(0,t.jsx)(n.li,{children:"code: a necessary parameter, the ByteString generated by reading the stored procedure file"}),"\n",(0,t.jsx)(n.li,{children:"desc: an optional parameter, the stored procedure description"}),"\n",(0,t.jsx)(n.li,{children:"code_type: an optional parameter, the stored procedure code type, which can be PY, SO, CPP, or ZIP"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Taking C++ as an example, the user loads the stored procedure as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-C++",children:' std::string content;\n if (!FieldSpecSerializer::FileReader(source_file, content)) {\n std::swap(content, result);\n return false;\n }\n LGraphRequest req;\n req.set_is_write_op(true);\n lgraph::PluginRequest* pluginRequest = req.mutable_plugin_request();\n pluginRequest->set_graph(graph);\n pluginRequest->set_type(procedure_type == "CPP" ? lgraph::PluginRequest::CPP\n : lgraph::PluginRequest::PYTHON);\n pluginRequest->set_version(version);\n lgraph::LoadPluginRequest* loadPluginRequest = pluginRequest->mutable_load_plugin_request();\n loadPluginRequest->set_code_type([](const std::string& type) {\n std::unordered_map um{\n {"SO", lgraph::LoadPluginRequest::SO},\n {"PY", lgraph::LoadPluginRequest::PY},\n {"ZIP", lgraph::LoadPluginRequest::ZIP},\n {"CPP", lgraph::LoadPluginRequest::CPP}};\n return um[type];\n }(code_type));\n loadPluginRequest->set_name(procedure_name);\n loadPluginRequest->set_desc(procedure_description);\n loadPluginRequest->set_read_only(read_only);\n loadPluginRequest->set_code(content);\n cntl->Reset();\n cntl->request_attachment().append(FLAGS_attachment);\n req.set_client_version(server_version);\n req.set_token(token);\n LGraphRPCService_Stub stub(channel.get());\n LGraphResponse res;\n stub.HandleRequest(cntl.get(), &req, &res, nullptr);\n if (cntl->Failed()) throw RpcConnectionException(cntl->ErrorText());\n server_version = std::max(server_version, res.server_version());\n if (res.error_code() != LGraphResponse::SUCCESS) throw RpcStatusException(res.error());\n'})}),"\n",(0,t.jsx)(n.p,{children:"The response for loading the stored procedure does not contain parameters, and if the loading fails, a BadInput exception will be thrown."}),"\n",(0,t.jsx)(n.h3,{id:"52invoke-stored-procedures",children:"5.2.Invoke Stored Procedures"}),"\n",(0,t.jsx)(n.p,{children:"The request for invoking stored procedures contains the following parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"name: a necessary parameter, the stored procedure name"}),"\n",(0,t.jsx)(n.li,{children:"param: a necessary parameter, the stored procedure parameters"}),"\n",(0,t.jsx)(n.li,{children:"result_in_json_format: an optional parameter, whether to return the invocation result in JSON format"}),"\n",(0,t.jsx)(n.li,{children:"in_process: an optional parameter, to be supported in the future"}),"\n",(0,t.jsx)(n.li,{children:"timeout: an optional parameter, the timeout for invoking the stored procedure"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Taking C++ as an example, the user invokes the stored procedure as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-C++",children:' LGraphRequest req;\n lgraph::PluginRequest* pluginRequest = req.mutable_plugin_request();\n pluginRequest->set_graph(graph);\n pluginRequest->set_type(procedure_type == "CPP" ? lgraph::PluginRequest::CPP\n : lgraph::PluginRequest::PYTHON);\n lgraph::CallPluginRequest *cpRequest = pluginRequest->mutable_call_plugin_request();\n cpRequest->set_name(procedure_name);\n cpRequest->set_in_process(in_process);\n cpRequest->set_param(param);\n cpRequest->set_timeout(procedure_time_out);\n cpRequest->set_result_in_json_format(json_format);\n LGraphResponse res;\n cntl->Reset();\n cntl->request_attachment().append(FLAGS_attachment);\n req.set_client_version(server_version);\n req.set_token(token);\n LGraphRPCService_Stub stub(channel.get());\n stub.HandleRequest(cntl.get(), &req, &res, nullptr);\n if (cntl->Failed()) throw RpcConnectionException(cntl->ErrorText());\n server_version = std::max(server_version, res.server_version());\n if (res.error_code() != LGraphResponse::SUCCESS) throw RpcStatusException(res.error());\n if (json_format) {\n result = res.mutable_plugin_response()->mutable_call_plugin_response()->json_result();\n } else {\n result = res.mutable_plugin_response()->mutable_call_plugin_response()->reply();\n }\n'})}),"\n",(0,t.jsx)(n.p,{children:"The response for invoking the stored procedure contains one of the following two parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"reply: the stored procedure invocation result in the ByteString format"}),"\n",(0,t.jsx)(n.li,{children:"json_result: the stored procedure invocation result in JSON format"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"53delete-stored-procedures",children:"5.3.Delete Stored Procedures"}),"\n",(0,t.jsx)(n.p,{children:"The request for deleting stored procedures contains the following parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"name: a necessary parameter, the stored procedure name"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Taking C++ as an example, the user deletes the stored procedure as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-C++",children:' LGraphRequest req;\n req.set_is_write_op(true);\n lgraph::PluginRequest* pluginRequest = req.mutable_plugin_request();\n pluginRequest->set_graph(graph);\n pluginRequest->set_type(procedure_type == "CPP" ? lgraph::PluginRequest::CPP\n : lgraph::PluginRequest::PYTHON);\n lgraph::DelPluginRequest* dpRequest = pluginRequest->mutable_del_plugin_request();\n dpRequest->set_name(procedure_name);\n cntl->Reset();\n cntl->request_attachment().append(FLAGS_attachment);\n req.set_client_version(server_version);\n req.set_token(token);\n LGraphRPCService_Stub stub(channel.get());\n LGraphResponse res;\n stub.HandleRequest(cntl.get(), &req, &res, nullptr);\n if (cntl->Failed()) throw RpcConnectionException(cntl->ErrorText());\n server_version = std::max(server_version, res.server_version());\n if (res.error_code() != LGraphResponse::SUCCESS) throw RpcStatusException(res.error());\n'})}),"\n",(0,t.jsx)(n.p,{children:"The response for deleting the stored procedure does not contain parameters, and if the deletion fails, a BadInput exception will be thrown."}),"\n",(0,t.jsx)(n.h3,{id:"54list-stored-procedures",children:"5.4.List Stored Procedures"}),"\n",(0,t.jsx)(n.p,{children:"The request for listing stored procedures does not require parameters. Taking C++ as an example, the user lists the stored procedures as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-C++",children:' LGraphRequest req;\n req.set_is_write_op(false);\n lgraph::PluginRequest* pluginRequest = req.mutable_plugin_request();\n pluginRequest->set_graph(graph);\n pluginRequest->set_type(procedure_type == "CPP" ? lgraph::PluginRequest::CPP\n : lgraph::PluginRequest::PYTHON);\n pluginRequest->mutable_list_plugin_request();\n cntl->Reset();\n cntl->request_attachment().append(FLAGS_attachment);\n req.set_client_version(server_version);\n req.set_token(token);\n LGraphRPCService_Stub stub(channel.get());\n LGraphResponse res;\n stub.HandleRequest(cntl.get(), &req, &res, nullptr);\n if (cntl->Failed()) throw RpcConnectionException(cntl->ErrorText());\n server_version = std::max(server_version, res.server_version());\n if (res.error_code() != LGraphResponse::SUCCESS) throw RpcStatusException(res.error());\n result = res.mutable_plugin_response()->mutable_list_plugin_response()->reply();\n'})}),"\n",(0,t.jsx)(n.p,{children:"The response for listing the stored procedures contains the following parameter:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"reply: the procedure list in JSON format"}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>a});var t=r(6540);const s={},i=t.createContext(s);function o(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5645],{6691:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var t=r(4848),s=r(8453);const i={},o="RPC API",a={id:"client-tools/rpc-api",title:"RPC API",description:"This document mainly introduces the details of calling TuGraph's RPC API.",source:"@site/../docs/en-US/source/7.client-tools/8.rpc-api.md",sourceDirName:"7.client-tools",slug:"/client-tools/rpc-api",permalink:"/tugraph-db/en/client-tools/rpc-api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:8,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph RESTful API",permalink:"/tugraph-db/en/client-tools/restful-api"},next:{title:"TuGraph RESTful API Legacy",permalink:"/tugraph-db/en/client-tools/restful-api-legacy"}},l={},c=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Request",id:"2request",level:2},{value:"2.1.Establishing a Connection",id:"21establishing-a-connection",level:3},{value:"2.2.Request Types",id:"22request-types",level:3},{value:"3.Login",id:"3login",level:2},{value:"4.Query",id:"4query",level:2},{value:"5.Stored Procedures",id:"5stored-procedures",level:2},{value:"5.1.Load Stored Procedures",id:"51load-stored-procedures",level:3},{value:"5.2.Invoke Stored Procedures",id:"52invoke-stored-procedures",level:3},{value:"5.3.Delete Stored Procedures",id:"53delete-stored-procedures",level:3},{value:"5.4.List Stored Procedures",id:"54list-stored-procedures",level:3}];function d(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"rpc-api",children:"RPC API"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document mainly introduces the details of calling TuGraph's RPC API."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph provides rich RPC APIs for developers to remotely call the services provided by TuGraph through RPC requests."}),"\n",(0,t.jsx)(n.p,{children:"RPC (Remote Procedure Call) is a protocol for requesting services from remote computer programs through a network without the need to understand the underlying network technology.\nCompared with REST, RPC is method-oriented and mainly used for calling function methods. It is suitable for more complex communication scenarios and has higher performance.\nbrpc is an industrial-grade RPC framework written in C++. Based on brpc, TuGraph provides rich RPC APIs. This document describes how to use TuGraph's RPC API."}),"\n",(0,t.jsx)(n.h2,{id:"2request",children:"2.Request"}),"\n",(0,t.jsx)(n.h3,{id:"21establishing-a-connection",children:"2.1.Establishing a Connection"}),"\n",(0,t.jsx)(n.p,{children:"When developers send RPC requests to TuGraph services, they must first establish a connection. Taking C++ as an example, developers create a channel with the specified URL and create a specified service stub (LGraphRPCService_Stub) from the channel. Subsequently, they can send requests to the remote server through the stub like calling local methods."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-C++",children:' std::shared_ptr options = std::make_shared();\n options->protocol = "baidu_std";\n options->connection_type = "";\n options->timeout_ms = 60 * 60 * 1000 /*milliseconds*/;\n options->max_retry = 3;\n std::string load_balancer = "";\n std::shared_ptr channel = std::make_shared();\n if (channel->Init(url.c_str(), load_balancer, options.get()) != 0)\n throw RpcException("Fail to initialize channel");\n LGraphRPCService_Stub stub(channel.get());\n'})}),"\n",(0,t.jsx)(n.h3,{id:"22request-types",children:"2.2.Request Types"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph supports 10 types of RPC requests, and each request's functionality is shown in the following table:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Request"}),(0,t.jsx)(n.th,{children:"Functionality"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GraphApiRequest"}),(0,t.jsx)(n.td,{children:"Vertex-Edge Index"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"CypherRequest"}),(0,t.jsx)(n.td,{children:"cypher"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"PluginRequest"}),(0,t.jsx)(n.td,{children:"Stored Procedures"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"HARequest"}),(0,t.jsx)(n.td,{children:"High Availability"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ImportRequest"}),(0,t.jsx)(n.td,{children:"Data Import"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"GraphRequest"}),(0,t.jsx)(n.td,{children:"Subgraph Operations"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"AclRequest"}),(0,t.jsx)(n.td,{children:"Access Control"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ConfigRequest"}),(0,t.jsx)(n.td,{children:"Configuration"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"RestoreRequest"}),(0,t.jsx)(n.td,{children:"Backup"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"SchemaRequest"}),(0,t.jsx)(n.td,{children:"Schema Management"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"When a user sends a request, the following parameters need to be passed in:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["client_version: an optional parameter, in HA mode, it can prevent outdated responses by comparing ",(0,t.jsx)(n.code,{children:"client_version"})," and ",(0,t.jsx)(n.code,{children:"server_version"})]}),"\n",(0,t.jsx)(n.li,{children:"token: a necessary parameter, the client obtains the token after logging in, and the token is passed in with each request to verify the user's identity"}),"\n",(0,t.jsx)(n.li,{children:"is_write_op: an optional parameter, indicating whether the request is a write request"}),"\n",(0,t.jsx)(n.li,{children:"user: an optional parameter, set user when synchronizing requests between master and slave in HA mode, and no token verification is required After the service processes the RPC request, it sends back a response."}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"In addition to containing separate response information for each request, the response message also includes the following parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"error_code: a necessary parameter, indicating the processing status of the request"}),"\n",(0,t.jsx)(n.li,{children:"redirect: an optional parameter, when processing fails to send a write request to a follower in HA mode, set redirect as the request forwarding address, that is, the leader address"}),"\n",(0,t.jsx)(n.li,{children:"error: an optional parameter, indicating the error information of the request"}),"\n",(0,t.jsxs)(n.li,{children:["server_version: an optional parameter, set ",(0,t.jsx)(n.code,{children:"server_version"})," in the HA mode request response to avoid reverse time travel when client reads data"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["\u26a0\ufe0f ",(0,t.jsx)(n.strong,{children:"Except for CypherRequest, PluginRequest, HARequest and AclRequest, all other RPC interfaces will be gradually deprecated, and their functions will be unified into the CypherRequest interface."})]}),"\n",(0,t.jsx)(n.h2,{id:"3login",children:"3.Login"}),"\n",(0,t.jsx)(n.p,{children:"The login request message contains the following parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"user: a necessary parameter, the username"}),"\n",(0,t.jsx)(n.li,{children:"pass: a necessary parameter, the password"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Taking C++ as an example, the user sends a login request using the constructed service stub:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-C++",children:" auto* req = request.mutable_acl_request();\n auto* auth = req->mutable_auth_request()->mutable_login();\n auth->set_user(user);\n auth->set_password(pass);\n // send data\n cntl->Reset();\n cntl->request_attachment().append(FLAGS_attachment);\n req->set_client_version(server_version);\n req->set_token(token);\n LGraphRPCService_Stub stub(channel.get());\n LGraphResponse res;\n stub.HandleRequest(cntl.get(), req, &resp, nullptr);\n if (cntl->Failed()) throw RpcConnectionException(cntl->ErrorText());\n server_version = std::max(server_version, res.server_version());\n if (res.error_code() != LGraphResponse::SUCCESS) throw RpcStatusException(res.error());\n token = res.acl_response().auth_response().token();\n"})}),"\n",(0,t.jsx)(n.p,{children:"The login response message contains the following parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:'token: a necessary parameter. After successful login, a signed token, namely Json Web Token, will be received. The client stores the token and uses it for each subsequent request. If the login fails, an "Authentication failed" error will be received.'}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"4query",children:"4.Query"}),"\n",(0,t.jsx)(n.p,{children:"Users can interact with TuGraph through Cypher queries. The Cypher request message contains the following parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"query: a necessary parameter, the Cypher query statement"}),"\n",(0,t.jsx)(n.li,{children:"param_names: an optional parameter, the parameter name"}),"\n",(0,t.jsx)(n.li,{children:"param_values: an optional parameter, the parameter value"}),"\n",(0,t.jsx)(n.li,{children:"result_in_json_format: a necessary parameter, whether to return the query results in JSON format"}),"\n",(0,t.jsx)(n.li,{children:"graph: an optional parameter, the subgraph name for executing the Cypher statement"}),"\n",(0,t.jsx)(n.li,{children:"timeout: an optional parameter, the timeout for executing the Cypher statement"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Taking C++ as an example, the user sends a Cypher request as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-C++",children:" LGraphResponse res;\n cntl->Reset();\n cntl->request_attachment().append(FLAGS_attachment);\n LGraphRequest req;\n req.set_client_version(server_version);\n req.set_token(token);\n lgraph::CypherRequest* cypher_req = req.mutable_cypher_request();\n cypher_req->set_graph(graph);\n cypher_req->set_query(query);\n cypher_req->set_timeout(timeout);\n cypher_req->set_result_in_json_format(true);\n LGraphRPCService_Stub stub(channel.get());\n stub.HandleRequest(cntl.get(), &req, &res, nullptr);\n if (cntl->Failed()) throw RpcConnectionException(cntl->ErrorText());\n if (res.error_code() != LGraphResponse::SUCCESS) throw RpcStatusException(res.error());\n server_version = std::max(server_version, res.server_version());\n CypherResponse cypher_res = res.cypher_response();\n"})}),"\n",(0,t.jsx)(n.p,{children:"The Cypher request response contains one of the following two parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"json_result: the Cypher query result in JSON format"}),"\n",(0,t.jsx)(n.li,{children:"binary_result: the Cypher query result in the CypherResult format"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"5stored-procedures",children:"5.Stored Procedures"}),"\n",(0,t.jsx)(n.p,{children:"To meet users' more complex query/update logic, TuGraph supports stored procedures written in C and Python. Users can use RPC requests to perform CRUD operations on stored procedures."}),"\n",(0,t.jsx)(n.h3,{id:"51load-stored-procedures",children:"5.1.Load Stored Procedures"}),"\n",(0,t.jsx)(n.p,{children:"The request for loading stored procedures contains the following parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"name: a necessary parameter, the stored procedure name"}),"\n",(0,t.jsx)(n.li,{children:"read_only: a necessary parameter, whether it is read-only"}),"\n",(0,t.jsx)(n.li,{children:"code: a necessary parameter, the ByteString generated by reading the stored procedure file"}),"\n",(0,t.jsx)(n.li,{children:"desc: an optional parameter, the stored procedure description"}),"\n",(0,t.jsx)(n.li,{children:"code_type: an optional parameter, the stored procedure code type, which can be PY, SO, CPP, or ZIP"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Taking C++ as an example, the user loads the stored procedure as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-C++",children:' std::string content;\n if (!FieldSpecSerializer::FileReader(source_file, content)) {\n std::swap(content, result);\n return false;\n }\n LGraphRequest req;\n req.set_is_write_op(true);\n lgraph::PluginRequest* pluginRequest = req.mutable_plugin_request();\n pluginRequest->set_graph(graph);\n pluginRequest->set_type(procedure_type == "CPP" ? lgraph::PluginRequest::CPP\n : lgraph::PluginRequest::PYTHON);\n pluginRequest->set_version(version);\n lgraph::LoadPluginRequest* loadPluginRequest = pluginRequest->mutable_load_plugin_request();\n loadPluginRequest->set_code_type([](const std::string& type) {\n std::unordered_map um{\n {"SO", lgraph::LoadPluginRequest::SO},\n {"PY", lgraph::LoadPluginRequest::PY},\n {"ZIP", lgraph::LoadPluginRequest::ZIP},\n {"CPP", lgraph::LoadPluginRequest::CPP}};\n return um[type];\n }(code_type));\n loadPluginRequest->set_name(procedure_name);\n loadPluginRequest->set_desc(procedure_description);\n loadPluginRequest->set_read_only(read_only);\n loadPluginRequest->set_code(content);\n cntl->Reset();\n cntl->request_attachment().append(FLAGS_attachment);\n req.set_client_version(server_version);\n req.set_token(token);\n LGraphRPCService_Stub stub(channel.get());\n LGraphResponse res;\n stub.HandleRequest(cntl.get(), &req, &res, nullptr);\n if (cntl->Failed()) throw RpcConnectionException(cntl->ErrorText());\n server_version = std::max(server_version, res.server_version());\n if (res.error_code() != LGraphResponse::SUCCESS) throw RpcStatusException(res.error());\n'})}),"\n",(0,t.jsx)(n.p,{children:"The response for loading the stored procedure does not contain parameters, and if the loading fails, a BadInput exception will be thrown."}),"\n",(0,t.jsx)(n.h3,{id:"52invoke-stored-procedures",children:"5.2.Invoke Stored Procedures"}),"\n",(0,t.jsx)(n.p,{children:"The request for invoking stored procedures contains the following parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"name: a necessary parameter, the stored procedure name"}),"\n",(0,t.jsx)(n.li,{children:"param: a necessary parameter, the stored procedure parameters"}),"\n",(0,t.jsx)(n.li,{children:"result_in_json_format: an optional parameter, whether to return the invocation result in JSON format"}),"\n",(0,t.jsx)(n.li,{children:"in_process: an optional parameter, to be supported in the future"}),"\n",(0,t.jsx)(n.li,{children:"timeout: an optional parameter, the timeout for invoking the stored procedure"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Taking C++ as an example, the user invokes the stored procedure as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-C++",children:' LGraphRequest req;\n lgraph::PluginRequest* pluginRequest = req.mutable_plugin_request();\n pluginRequest->set_graph(graph);\n pluginRequest->set_type(procedure_type == "CPP" ? lgraph::PluginRequest::CPP\n : lgraph::PluginRequest::PYTHON);\n lgraph::CallPluginRequest *cpRequest = pluginRequest->mutable_call_plugin_request();\n cpRequest->set_name(procedure_name);\n cpRequest->set_in_process(in_process);\n cpRequest->set_param(param);\n cpRequest->set_timeout(procedure_time_out);\n cpRequest->set_result_in_json_format(json_format);\n LGraphResponse res;\n cntl->Reset();\n cntl->request_attachment().append(FLAGS_attachment);\n req.set_client_version(server_version);\n req.set_token(token);\n LGraphRPCService_Stub stub(channel.get());\n stub.HandleRequest(cntl.get(), &req, &res, nullptr);\n if (cntl->Failed()) throw RpcConnectionException(cntl->ErrorText());\n server_version = std::max(server_version, res.server_version());\n if (res.error_code() != LGraphResponse::SUCCESS) throw RpcStatusException(res.error());\n if (json_format) {\n result = res.mutable_plugin_response()->mutable_call_plugin_response()->json_result();\n } else {\n result = res.mutable_plugin_response()->mutable_call_plugin_response()->reply();\n }\n'})}),"\n",(0,t.jsx)(n.p,{children:"The response for invoking the stored procedure contains one of the following two parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"reply: the stored procedure invocation result in the ByteString format"}),"\n",(0,t.jsx)(n.li,{children:"json_result: the stored procedure invocation result in JSON format"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"53delete-stored-procedures",children:"5.3.Delete Stored Procedures"}),"\n",(0,t.jsx)(n.p,{children:"The request for deleting stored procedures contains the following parameters:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"name: a necessary parameter, the stored procedure name"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Taking C++ as an example, the user deletes the stored procedure as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-C++",children:' LGraphRequest req;\n req.set_is_write_op(true);\n lgraph::PluginRequest* pluginRequest = req.mutable_plugin_request();\n pluginRequest->set_graph(graph);\n pluginRequest->set_type(procedure_type == "CPP" ? lgraph::PluginRequest::CPP\n : lgraph::PluginRequest::PYTHON);\n lgraph::DelPluginRequest* dpRequest = pluginRequest->mutable_del_plugin_request();\n dpRequest->set_name(procedure_name);\n cntl->Reset();\n cntl->request_attachment().append(FLAGS_attachment);\n req.set_client_version(server_version);\n req.set_token(token);\n LGraphRPCService_Stub stub(channel.get());\n LGraphResponse res;\n stub.HandleRequest(cntl.get(), &req, &res, nullptr);\n if (cntl->Failed()) throw RpcConnectionException(cntl->ErrorText());\n server_version = std::max(server_version, res.server_version());\n if (res.error_code() != LGraphResponse::SUCCESS) throw RpcStatusException(res.error());\n'})}),"\n",(0,t.jsx)(n.p,{children:"The response for deleting the stored procedure does not contain parameters, and if the deletion fails, a BadInput exception will be thrown."}),"\n",(0,t.jsx)(n.h3,{id:"54list-stored-procedures",children:"5.4.List Stored Procedures"}),"\n",(0,t.jsx)(n.p,{children:"The request for listing stored procedures does not require parameters. Taking C++ as an example, the user lists the stored procedures as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-C++",children:' LGraphRequest req;\n req.set_is_write_op(false);\n lgraph::PluginRequest* pluginRequest = req.mutable_plugin_request();\n pluginRequest->set_graph(graph);\n pluginRequest->set_type(procedure_type == "CPP" ? lgraph::PluginRequest::CPP\n : lgraph::PluginRequest::PYTHON);\n pluginRequest->mutable_list_plugin_request();\n cntl->Reset();\n cntl->request_attachment().append(FLAGS_attachment);\n req.set_client_version(server_version);\n req.set_token(token);\n LGraphRPCService_Stub stub(channel.get());\n LGraphResponse res;\n stub.HandleRequest(cntl.get(), &req, &res, nullptr);\n if (cntl->Failed()) throw RpcConnectionException(cntl->ErrorText());\n server_version = std::max(server_version, res.server_version());\n if (res.error_code() != LGraphResponse::SUCCESS) throw RpcStatusException(res.error());\n result = res.mutable_plugin_response()->mutable_list_plugin_response()->reply();\n'})}),"\n",(0,t.jsx)(n.p,{children:"The response for listing the stored procedures contains the following parameter:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"reply: the procedure list in JSON format"}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>a});var t=r(6540);const s={},i=t.createContext(s);function o(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/74344ff3.9cfc5742.js b/assets/js/74344ff3.a8e08772.js similarity index 99% rename from assets/js/74344ff3.9cfc5742.js rename to assets/js/74344ff3.a8e08772.js index 0696c3583e..059365205a 100644 --- a/assets/js/74344ff3.9cfc5742.js +++ b/assets/js/74344ff3.a8e08772.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[1076],{3917:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>d,default:()=>o,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var t=r(4848),s=r(8453);const i={},d="Tugraph CLI",l={id:"utility-tools/tugraph-cli",title:"Tugraph CLI",description:"This document mainly introduces the CLI tool lgraph_cypher of TuGraph.",source:"@site/../docs/en-US/source/6.utility-tools/6.tugraph-cli.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/tugraph-cli",permalink:"/tugraph-db/en/utility-tools/tugraph-cli",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:6,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Cluster management",permalink:"/tugraph-db/en/utility-tools/ha-cluster-management"},next:{title:"TuGraph DataX",permalink:"/tugraph-db/en/utility-tools/tugraph-datax"}},a={},c=[{value:"1.Instructions",id:"1instructions",level:2},{value:"Single command mode",id:"single-command-mode",level:2},{value:"Command line Parameters:",id:"command-line-parameters",level:3},{value:"Examples:",id:"examples",level:3},{value:"Interactive mode",id:"interactive-mode",level:2},{value:"Enter lgraph_cypher interaction mode:",id:"enter-lgraph_cypher-interaction-mode",level:3},{value:"Command Description",id:"command-description",level:3},{value:"cypher query command:",id:"cypher-query-command",level:3},{value:"Auxiliary Features:",id:"auxiliary-features",level:3}];function h(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"tugraph-cli",children:"Tugraph CLI"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document mainly introduces the CLI tool lgraph_cypher of TuGraph."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1instructions",children:"1.Instructions"}),"\n",(0,t.jsx)(n.p,{children:"The TuGraph release comes with a query client named 'lgraph_cypher' that can be used to submit OpenCypher requests to the TuGraph server. The 'lgraph_cypher' client has two execution modes: single command mode and interactive mode."}),"\n",(0,t.jsx)(n.h2,{id:"single-command-mode",children:"Single command mode"}),"\n",(0,t.jsx)(n.p,{children:"In single-command mode, 'lgraph_cypher' can be used to submit a single Cypher query and print the result directly to the terminal. The printed result can also be easily redirected to a specified file. This is handy when users need to get a lot of results from the server and save them in files."}),"\n",(0,t.jsx)(n.p,{children:"In this mode, the 'lgraph_cypher' tool has the following options:"}),"\n",(0,t.jsx)(n.h3,{id:"command-line-parameters",children:"Command line Parameters:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Parameter"}),(0,t.jsx)(n.th,{children:"Type"}),(0,t.jsx)(n.th,{children:"Instructions"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"--help"}),(0,t.jsx)(n.td,{children:"\\"}),(0,t.jsx)(n.td,{children:"List all parameters and descriptions."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-example"}),(0,t.jsx)(n.td,{children:"\\"}),(0,t.jsx)(n.td,{children:"List the command instances."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-c"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"A database configuration file used to obtain ip and port information."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-h"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Database server IP address. Omit this parameter if you have a configuration file. The default value is' 127.0.0.1 '"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-p"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Database server port. Omit this parameter if you have a configuration file. The default value is 7071"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-u"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"User name for logging in to the database."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-P"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Password for logging in to the database."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-f"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Contains the path to a single Cypher query single text file."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-s"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Single-line cypher query command. Start and end with ",(0,t.jsx)(n.code,{children:'"'}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-t"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Specifies the server timeout threshold for cypher queries. The default value is 150 seconds."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-format"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Query result display mode. Supports two formats: 'plain' and 'table'. The 'plain' format prints the query results in a single column. The 'table' format displays the query results in a tabular format. The default value is' table '"})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"examples",children:"Examples:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"cypher command file query:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-powershell",children:"\n$ ./lgraph_cypher.py -c /home/usr/lgraph_standalone.json -u user -P password -f /home/usr/cypher.json\n\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"cypher command single-sentence query:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-powershell",children:'\n$ ./lgraph_cypher.py -c /home/usr/lgraph_standalone.json -u user -P password -s "MATCH (n) RETURN n"\n\n'})}),"\n",(0,t.jsx)(n.h2,{id:"interactive-mode",children:"Interactive mode"}),"\n",(0,t.jsx)(n.p,{children:"'lgraph_cypher' can also be run in interactive mode. In interactive mode, the client stays connected to the server and interacts with the user in read-evaluate-print-loop."}),"\n",(0,t.jsx)(n.h3,{id:"enter-lgraph_cypher-interaction-mode",children:"Enter lgraph_cypher interaction mode:"}),"\n",(0,t.jsx)(n.p,{children:"If no '-f' or '-s' command line option added, 'lgraph_cypher' will enter interactive mode when running. how to use it:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"\n$ ./lgraph_cypher.py -c /home/usr/lgraph_standalone.json -u admin -P 73@TuGraph\n\n"})}),"\n",(0,t.jsx)(n.p,{children:"If the login is successful, the corresponding login success message will be displayed:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'**********************************************************************\n* TuGraph Graph Database X.Y.Z *\n* *\n* Copyright(C) 2018 Ant Group. All rights reserved. *\n* *\n**********************************************************************\nlogin success\n----------------------------------\nHost: 127.0.0.1\nPort: 7071\nUsername: admin\n----------------------------------\ntype ":help" to see all commands.\n>\n'})}),"\n",(0,t.jsx)(n.p,{children:"Now we also provide an interactive shell for users to enter Cypher queries or use the ':help' command to check for available commands."}),"\n",(0,t.jsx)(n.h3,{id:"command-description",children:"Command Description"}),"\n",(0,t.jsx)(n.p,{children:"In addition to the Cypher query, the shell of 'lgraph_cypher' accepts the following commands:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Command"}),(0,t.jsx)(n.th,{children:"Parameters"}),(0,t.jsx)(n.th,{children:"instructions"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":help"}),(0,t.jsx)(n.td,{children:"\\"}),(0,t.jsx)(n.td,{children:"Displays the server information and the corresponding description of all commands."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":db_info"}),(0,t.jsx)(n.td,{children:"\\"}),(0,t.jsx)(n.td,{children:"Query the current server status. /db/info for the corresponding REST API."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":clear"}),(0,t.jsx)(n.td,{children:"\\"}),(0,t.jsx)(n.td,{children:"Clear the screen."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":use"}),(0,t.jsx)(n.td,{children:"{Graph Name}"}),(0,t.jsxs)(n.td,{children:["The graph specified with this name defaults to ",(0,t.jsx)(n.code,{children:"default"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":source"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"-t {Query the timeout value} -f {The query file}"})}),(0,t.jsx)(n.td,{children:"cypher command file query in interactive mode. The default timeout threshold is 150 seconds. Query file format reference No interactive query parameters."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":exit"}),(0,t.jsx)(n.td,{children:"\\"}),(0,t.jsx)(n.td,{children:"Exit interactive mode and return to the original command line."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":format"}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"plain"})," or ",(0,t.jsx)(n.code,{children:"table"})]}),(0,t.jsx)(n.td,{children:"Change the display mode of cypher query results. Support 'plain' and 'table' modes."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":save all/command/result"}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"-f {The file path}"})," ",(0,t.jsx)(n.code,{children:"{Cypher}"})]}),(0,t.jsx)(n.td,{children:"The cypher command (command), query result (result) or both (all) are stored. The default location is' /saved_cypher.txt '"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Note:"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Each command should start with a colon ",(0,t.jsx)(n.code,{children:":"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:":save command example :"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:":save all -f /home/usr/saved.txt match (n) where return n, n.name limit 1000\n\n"})}),"\n",(0,t.jsx)(n.h3,{id:"cypher-query-command",children:"cypher query command:"}),"\n",(0,t.jsx)(n.p,{children:"In interactive mode, users can also directly input a single sentence cypher command for query, with \"'; ` \"end. Enter commands that are case insensitive. Here's an example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"login success\n>MATCH (n) RETURN n, n.name;\n+---+---+-------------+\n| | n |n.name |\n+---+---+-------------+\n| 0 | 0 |david |\n| 1 | 1 |Ann |\n| 2 | 2 |first movie |\n| 3 | 3 |Andres |\n+---+---+-------------+\ntime spent: 0.000520706176758\nsize of query: 4\n>\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"lgraph_cypher"})," supports multi-line input when typing commands. Users can use the ",(0,t.jsx)(n.code,{children:"ENTER"})," key to type long query statements into multiple lines. In the case of multi-line input, the beginning of the command line will change from ",(0,t.jsx)(n.code,{children:">"})," to ",(0,t.jsx)(n.code,{children:"=>"}),", and the user can continue to type the rest of the query."]}),"\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"login success\n>MATCH (n)\n=>WHERE n.uid='M11'\n=>RETURN n, n.name;\n"})}),"\n",(0,t.jsx)(n.h3,{id:"auxiliary-features",children:"Auxiliary Features:"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Input History:"})," Press the up and down arrow keys in interactive mode to display the input history."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Auto Completion:"})," lgraph_cypher will automatically complete based on the input history. In the event of a completion prompt, pressing the right arrow key will automatically complete the command."]})]})}function o(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>d,x:()=>l});var t=r(6540);const s={},i=t.createContext(s);function d(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[1076],{3917:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>d,default:()=>o,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var t=r(4848),s=r(8453);const i={},d="Tugraph CLI",l={id:"utility-tools/tugraph-cli",title:"Tugraph CLI",description:"This document mainly introduces the CLI tool lgraph_cypher of TuGraph.",source:"@site/../docs/en-US/source/6.utility-tools/6.tugraph-cli.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/tugraph-cli",permalink:"/tugraph-db/en/utility-tools/tugraph-cli",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:6,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Cluster management",permalink:"/tugraph-db/en/utility-tools/ha-cluster-management"},next:{title:"TuGraph DataX",permalink:"/tugraph-db/en/utility-tools/tugraph-datax"}},a={},c=[{value:"1.Instructions",id:"1instructions",level:2},{value:"Single command mode",id:"single-command-mode",level:2},{value:"Command line Parameters:",id:"command-line-parameters",level:3},{value:"Examples:",id:"examples",level:3},{value:"Interactive mode",id:"interactive-mode",level:2},{value:"Enter lgraph_cypher interaction mode:",id:"enter-lgraph_cypher-interaction-mode",level:3},{value:"Command Description",id:"command-description",level:3},{value:"cypher query command:",id:"cypher-query-command",level:3},{value:"Auxiliary Features:",id:"auxiliary-features",level:3}];function h(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"tugraph-cli",children:"Tugraph CLI"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document mainly introduces the CLI tool lgraph_cypher of TuGraph."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1instructions",children:"1.Instructions"}),"\n",(0,t.jsx)(n.p,{children:"The TuGraph release comes with a query client named 'lgraph_cypher' that can be used to submit OpenCypher requests to the TuGraph server. The 'lgraph_cypher' client has two execution modes: single command mode and interactive mode."}),"\n",(0,t.jsx)(n.h2,{id:"single-command-mode",children:"Single command mode"}),"\n",(0,t.jsx)(n.p,{children:"In single-command mode, 'lgraph_cypher' can be used to submit a single Cypher query and print the result directly to the terminal. The printed result can also be easily redirected to a specified file. This is handy when users need to get a lot of results from the server and save them in files."}),"\n",(0,t.jsx)(n.p,{children:"In this mode, the 'lgraph_cypher' tool has the following options:"}),"\n",(0,t.jsx)(n.h3,{id:"command-line-parameters",children:"Command line Parameters:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Parameter"}),(0,t.jsx)(n.th,{children:"Type"}),(0,t.jsx)(n.th,{children:"Instructions"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"--help"}),(0,t.jsx)(n.td,{children:"\\"}),(0,t.jsx)(n.td,{children:"List all parameters and descriptions."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-example"}),(0,t.jsx)(n.td,{children:"\\"}),(0,t.jsx)(n.td,{children:"List the command instances."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-c"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"A database configuration file used to obtain ip and port information."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-h"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Database server IP address. Omit this parameter if you have a configuration file. The default value is' 127.0.0.1 '"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-p"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Database server port. Omit this parameter if you have a configuration file. The default value is 7071"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-u"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"User name for logging in to the database."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-P"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Password for logging in to the database."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-f"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Contains the path to a single Cypher query single text file."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-s"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Single-line cypher query command. Start and end with ",(0,t.jsx)(n.code,{children:'"'}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-t"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Specifies the server timeout threshold for cypher queries. The default value is 150 seconds."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"-format"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Query result display mode. Supports two formats: 'plain' and 'table'. The 'plain' format prints the query results in a single column. The 'table' format displays the query results in a tabular format. The default value is' table '"})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"examples",children:"Examples:"}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"cypher command file query:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-powershell",children:"\n$ ./lgraph_cypher.py -c /home/usr/lgraph_standalone.json -u user -P password -f /home/usr/cypher.json\n\n"})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"cypher command single-sentence query:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-powershell",children:'\n$ ./lgraph_cypher.py -c /home/usr/lgraph_standalone.json -u user -P password -s "MATCH (n) RETURN n"\n\n'})}),"\n",(0,t.jsx)(n.h2,{id:"interactive-mode",children:"Interactive mode"}),"\n",(0,t.jsx)(n.p,{children:"'lgraph_cypher' can also be run in interactive mode. In interactive mode, the client stays connected to the server and interacts with the user in read-evaluate-print-loop."}),"\n",(0,t.jsx)(n.h3,{id:"enter-lgraph_cypher-interaction-mode",children:"Enter lgraph_cypher interaction mode:"}),"\n",(0,t.jsx)(n.p,{children:"If no '-f' or '-s' command line option added, 'lgraph_cypher' will enter interactive mode when running. how to use it:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"\n$ ./lgraph_cypher.py -c /home/usr/lgraph_standalone.json -u admin -P 73@TuGraph\n\n"})}),"\n",(0,t.jsx)(n.p,{children:"If the login is successful, the corresponding login success message will be displayed:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:'**********************************************************************\n* TuGraph Graph Database X.Y.Z *\n* *\n* Copyright(C) 2018 Ant Group. All rights reserved. *\n* *\n**********************************************************************\nlogin success\n----------------------------------\nHost: 127.0.0.1\nPort: 7071\nUsername: admin\n----------------------------------\ntype ":help" to see all commands.\n>\n'})}),"\n",(0,t.jsx)(n.p,{children:"Now we also provide an interactive shell for users to enter Cypher queries or use the ':help' command to check for available commands."}),"\n",(0,t.jsx)(n.h3,{id:"command-description",children:"Command Description"}),"\n",(0,t.jsx)(n.p,{children:"In addition to the Cypher query, the shell of 'lgraph_cypher' accepts the following commands:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Command"}),(0,t.jsx)(n.th,{children:"Parameters"}),(0,t.jsx)(n.th,{children:"instructions"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":help"}),(0,t.jsx)(n.td,{children:"\\"}),(0,t.jsx)(n.td,{children:"Displays the server information and the corresponding description of all commands."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":db_info"}),(0,t.jsx)(n.td,{children:"\\"}),(0,t.jsx)(n.td,{children:"Query the current server status. /db/info for the corresponding REST API."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":clear"}),(0,t.jsx)(n.td,{children:"\\"}),(0,t.jsx)(n.td,{children:"Clear the screen."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":use"}),(0,t.jsx)(n.td,{children:"{Graph Name}"}),(0,t.jsxs)(n.td,{children:["The graph specified with this name defaults to ",(0,t.jsx)(n.code,{children:"default"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":source"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"-t {Query the timeout value} -f {The query file}"})}),(0,t.jsx)(n.td,{children:"cypher command file query in interactive mode. The default timeout threshold is 150 seconds. Query file format reference No interactive query parameters."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":exit"}),(0,t.jsx)(n.td,{children:"\\"}),(0,t.jsx)(n.td,{children:"Exit interactive mode and return to the original command line."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":format"}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"plain"})," or ",(0,t.jsx)(n.code,{children:"table"})]}),(0,t.jsx)(n.td,{children:"Change the display mode of cypher query results. Support 'plain' and 'table' modes."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:":save all/command/result"}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"-f {The file path}"})," ",(0,t.jsx)(n.code,{children:"{Cypher}"})]}),(0,t.jsx)(n.td,{children:"The cypher command (command), query result (result) or both (all) are stored. The default location is' /saved_cypher.txt '"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Note:"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Each command should start with a colon ",(0,t.jsx)(n.code,{children:":"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:":save command example :"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:":save all -f /home/usr/saved.txt match (n) where return n, n.name limit 1000\n\n"})}),"\n",(0,t.jsx)(n.h3,{id:"cypher-query-command",children:"cypher query command:"}),"\n",(0,t.jsx)(n.p,{children:"In interactive mode, users can also directly input a single sentence cypher command for query, with \"'; ` \"end. Enter commands that are case insensitive. Here's an example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"login success\n>MATCH (n) RETURN n, n.name;\n+---+---+-------------+\n| | n |n.name |\n+---+---+-------------+\n| 0 | 0 |david |\n| 1 | 1 |Ann |\n| 2 | 2 |first movie |\n| 3 | 3 |Andres |\n+---+---+-------------+\ntime spent: 0.000520706176758\nsize of query: 4\n>\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"lgraph_cypher"})," supports multi-line input when typing commands. Users can use the ",(0,t.jsx)(n.code,{children:"ENTER"})," key to type long query statements into multiple lines. In the case of multi-line input, the beginning of the command line will change from ",(0,t.jsx)(n.code,{children:">"})," to ",(0,t.jsx)(n.code,{children:"=>"}),", and the user can continue to type the rest of the query."]}),"\n",(0,t.jsx)(n.p,{children:"Example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"login success\n>MATCH (n)\n=>WHERE n.uid='M11'\n=>RETURN n, n.name;\n"})}),"\n",(0,t.jsx)(n.h3,{id:"auxiliary-features",children:"Auxiliary Features:"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Input History:"})," Press the up and down arrow keys in interactive mode to display the input history."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Auto Completion:"})," lgraph_cypher will automatically complete based on the input history. In the event of a completion prompt, pressing the right arrow key will automatically complete the command."]})]})}function o(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>d,x:()=>l});var t=r(6540);const s={},i=t.createContext(s);function d(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/77278843.b99f48f2.js b/assets/js/77278843.be5db94e.js similarity index 99% rename from assets/js/77278843.b99f48f2.js rename to assets/js/77278843.be5db94e.js index 7c568d5b64..01d30e7d9b 100644 --- a/assets/js/77278843.b99f48f2.js +++ b/assets/js/77278843.be5db94e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4371],{6099:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>l});var i=t(4848),a=t(8453);const s={},o="Examples of geospatial data type usage",r={id:"best-practices/spatial",title:"Examples of geospatial data type usage",description:"1. Introduction",source:"@site/../docs/en-US/source/13.best-practices/5.spatial.md",sourceDirName:"13.best-practices",slug:"/best-practices/spatial",permalink:"/tugraph-db/en/best-practices/spatial",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Environment and version selection",permalink:"/tugraph-db/en/best-practices/selection"},next:{title:"FAQ",permalink:"/tugraph-db/en/faq"}},d={},l=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2. Background Knowledge",id:"2-background-knowledge",level:2},{value:"2.1 WGS84 Coordinate System (EPSG:4326)",id:"21-wgs84-coordinate-system-epsg4326",level:3},{value:"2.2 Cartesian Coordinate System (EPSG:7203)",id:"22-cartesian-coordinate-system-epsg7203",level:3},{value:"2.3 Data Storage Formats",id:"23-data-storage-formats",level:3},{value:"2.4 Common functions",id:"24-common-functions",level:3},{value:"3. Data Types",id:"3-data-types",level:2},{value:"4. Function Introduction",id:"4-function-introduction",level:2},{value:"5. Food Exploration",id:"5-food-exploration",level:2},{value:"5.1 Personalized Recommendations Based on Geographic Location",id:"51-personalized-recommendations-based-on-geographic-location",level:3},{value:"5.2 Data Model Design",id:"52-data-model-design",level:3},{value:"5.3 Building the Food Exploration Query",id:"53-building-the-food-exploration-query",level:3},{value:"6. Outlook",id:"6-outlook",level:2}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"examples-of-geospatial-data-type-usage",children:"Examples of geospatial data type usage"})}),"\n",(0,i.jsx)(n.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph, a graph database jointly developed by Ant Group and Tsinghua University, has built a comprehensive graph technology system that includes graph storage, graph calculation, graph learning, and a graph development platform, owning a leading-scale graph cluster in the industry. In recent years, geospatial capabilities have demonstrated significant application value in graph databases. They not only enhance the expressive power of data but also facilitate the fusion analysis of cross-domain data, especially displaying strong practical value in critical fields such as social networks, map exploration, and urban planning. TuGraph is also gradually supporting geospatial capabilities."}),"\n",(0,i.jsx)(n.h2,{id:"2-background-knowledge",children:"2. Background Knowledge"}),"\n",(0,i.jsxs)(n.p,{children:["EPSG(",(0,i.jsx)(n.a,{href:"https://epsg.io/",children:"EPSG.io: Coordinate Systems Worldwide"}),") is a standardized collection of geospatial reference system identifiers, used to identify different geospatial reference systems, including coordinate systems, geographic coordinate systems, projected coordinate systems, etc. We commonly use EPSG codes to represent the coordinate systems of data, and here we introduce two of the most common geospatial coordinate systems, which are also the types supported by most databases."]}),"\n",(0,i.jsx)(n.h3,{id:"21-wgs84-coordinate-system-epsg4326",children:"2.1 WGS84 Coordinate System (EPSG:4326)"}),"\n",(0,i.jsxs)(n.p,{children:["Global Positioning System: WGS84 is the foundation of the Global Positioning System (GPS), allowing GPS receivers around the world to determine precise positions. Almost all modern GPS devices provide location information based on the WGS84 coordinate system. Map Making and Geographic Information Systems (GIS): In the field of map making and GIS, WGS84 is widely used to define positions on Earth. This includes various types of map creation, spatial data analysis, and management, etc. ",(0,i.jsx)(n.img,{alt:"image.png",src:t(7720).A+"",width:"821",height:"390"})]}),"\n",(0,i.jsx)(n.h3,{id:"22-cartesian-coordinate-system-epsg7203",children:"2.2 Cartesian Coordinate System (EPSG:7203)"}),"\n",(0,i.jsxs)(n.p,{children:["The Cartesian coordinate system, also known as the rectilinear or orthogonal coordinate system, is the most basic and widely applied coordinate system. It defines a plane with two axes and a space with three axes that are perpendicular to each other, extensively applied in mathematics, physics, engineering, astronomy, and many other fields. ",(0,i.jsx)(n.img,{alt:"image.png",src:t(4535).A+"",width:"560",height:"560"})]}),"\n",(0,i.jsx)(n.h3,{id:"23-data-storage-formats",children:"2.3 Data Storage Formats"}),"\n",(0,i.jsx)(n.p,{children:"OGC (Open Geospatial Consortium) has defined standard representation formats for spatial data, namely WKT and WKB formats, for exchanging and storing spatial data between different systems and platforms, which have now been widely adopted. WKT (Well-Known Text) format is a text markup language that is easy to read and write for humans, while WKB (Well-Known Binary) format uses a series of bytes to encode spatial data, which is more suitable for storage in computers."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"WKT:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"POINT( )\nLINESTRING( , , ...)\n"})}),"\n",(0,i.jsx)(n.p,{children:"The WKT format data is as shown above, first specifying the spatial data type, then specifying the coordinates in parentheses, with a pair of coordinates representing a point, separated by commas between each coordinate pair. For Polygon type data, the first coordinate pair needs to be the same as the last coordinate pair to form a closed surface."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"WKB:"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(5019).A+"",width:"858",height:"264"})}),"\n",(0,i.jsx)(n.p,{children:"The encoding for the EWKB format is explained as follows:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Positions 0 - 1: Encoding method;"}),"\n",(0,i.jsxs)(n.li,{children:["Positions 2 - 5: Spatial data type;\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"0100: point"}),"\n",(0,i.jsx)(n.li,{children:"0200: linestring"}),"\n",(0,i.jsx)(n.li,{children:"0300: polygon"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Positions 6 - 9: Data dimension;\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"0020: two-dimensional"}),"\n",(0,i.jsx)(n.li,{children:"0030: three-dimensional"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:"Positions 10 - 17: EPSG code of the coordinate system;"}),"\n",(0,i.jsx)(n.li,{children:"Positions 18 - n: 16-bit hex representation of pairs of double-type coordinates."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"24-common-functions",children:"2.4 Common functions"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Name"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Signature"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"dbms.graph.createGraph"})}),(0,i.jsx)(n.td,{children:"create a subgraph"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"dbms.graph.createGraph(graph_name::STRING, description::STRING, max_size_GB::INTEGER) :: (::VOID)"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"db.createVertexLabel"})}),(0,i.jsx)(n.td,{children:"create a vertex label"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"db.createVertexLabel(label_name::STRING,field_specs::LIST) :: (::VOID)"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"db.getLabelSchema"})}),(0,i.jsx)(n.td,{children:"get the schema of label"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"db.getLabelSchema(label_type::STRING,label_name::STRING) :: (name::STRING,type::STRING,optional::BOOLEAN)"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"db.deleteLabel"})}),(0,i.jsx)(n.td,{children:"delete vertex label"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"db.deleteLabel(label_type::STRING,label_name::STRING) :: (::VOID)"})})]})]})]}),"\n",(0,i.jsxs)(n.p,{children:["\u66f4\u5b8c\u6574\u8be6\u7ec6\u7684\u51fd\u6570\u4f7f\u7528\u4ee5\u53ca\u63d2\u5165\u6570\u636e\u7684\u8bed\u53e5\uff0c\u53ef\u4ee5\u53c2\u8003 ",(0,i.jsx)(n.a,{href:"/tugraph-db/en/query/cypher",children:"Cypher API"})]}),"\n",(0,i.jsx)(n.h2,{id:"3-data-types",children:"3. Data Types"}),"\n",(0,i.jsx)(n.p,{children:"Currently, in TuGraph, we support three types of spatial data: Point, Linestring, and Polygon."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Point: POINT(2.0, 2.0, 7203)"}),"\n",(0,i.jsx)(n.li,{children:"Linestring: LINESTRING(0 2,1 1,2 0)"}),"\n",(0,i.jsx)(n.li,{children:"Polygon: POLYGON((0 0,0 7,4 2,2 0,0 0))"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Coordinates are of double type. Examples for creating graph models and inserting data as follows:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Create a vertex to mark food locations"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"CALL db.createVertexLabel('food', 'id', 'id', int64, false, 'name', string, true,'pointTest',point,true) \n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(6547).A+"",width:"932",height:"322"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Insert data to mark food points"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:" CREATE (n:food {id:10001, name: 'aco Bell',pointTest:point(3.0,4.0,7203)}) RETURN n\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(8635).A+"",width:"1112",height:"706"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Create a vertex with polyline attributes"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"CALL db.createVertexLabel('lineTest', 'id', 'id', int64, false, 'name', string, true,'linestringTest',linestring,true)\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(4962).A+"",width:"953",height:"432"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Insert data for vertex with linestring attributes"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"CREATE (n:lineTest {id:102, name: 'Tom',linestringTest:linestringwkt('LINESTRING(0 2,1 1,2 0)', 7203)}) RETURN n\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(289).A+"",width:"1777",height:"854"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Create a vertex with polygon attributes"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"CALL db.createVertexLabel('polygonTest', 'id', 'id', int64, false, 'name', string, true,'polygonTest',polygon,true)\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(2976).A+"",width:"922",height:"389"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Inser data for vertex with polygon attributes"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"CREATE (n:polygonTest {id:103, name: 'polygonTest',polygonTest:polygonwkt('POLYGON((0 0,0 7,4 2,2 0,0 0))', 7203)}) RETURN n\n"})}),"\n",(0,i.jsx)(n.h2,{id:"4-function-introduction",children:"4. Function Introduction"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Function Name"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Input Parameters"}),(0,i.jsx)(n.th,{children:"Return Type"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Distance()"}),(0,i.jsx)(n.td,{children:"Calculate the distance between two spatial data (requires the same coordinate system)"}),(0,i.jsx)(n.td,{children:"Spatial data1, Spatial data2"}),(0,i.jsx)(n.td,{children:"double"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Disjoint()"}),(0,i.jsx)(n.td,{children:"Determine whether two spatial data intersect (under development)"}),(0,i.jsx)(n.td,{children:"Spatial data1, Spatial data2"}),(0,i.jsx)(n.td,{children:"bool"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"WithinBBox()"}),(0,i.jsx)(n.td,{children:"Determine whether a spatial data is within a given rectangular area (under development)"}),(0,i.jsx)(n.td,{children:"Spatial data, Point1"}),(0,i.jsx)(n.td,{children:"bool"})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"5-food-exploration",children:"5. Food Exploration"}),"\n",(0,i.jsx)(n.h3,{id:"51-personalized-recommendations-based-on-geographic-location",children:"5.1 Personalized Recommendations Based on Geographic Location"}),"\n",(0,i.jsx)(n.p,{children:'In this section, we will explore how to use the TuGraph graph database\'s geospatial capabilities to create a vivid and interesting food exploration application that connects "people" and "food" through geographical locations to achieve personalized food recommendations. Imagine, no matter where you are, with just a gentle tap, the tempting food around you is at a glance \u2013 this is precisely the charm of the scene we\'re about to build.'}),"\n",(0,i.jsx)(n.h3,{id:"52-data-model-design",children:"5.2 Data Model Design"}),"\n",(0,i.jsx)(n.p,{children:"We first define two core types of vertex:\uff1a"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Food vertex: Each restaurant or snack shop can serve as a Food node, with attributes that include but are not limited to the name, address, rating, food category, etc. Notably, we will attach geographic coordinate information to every Food node to record its precise location accurately."}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:" CALL db.createVertexLabel('food', 'id', 'id', int64, false, 'name', string, true,'pointTest',point,true,'mark',double,true)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Prepare data:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"CREATE (n:food {id:10001, name: 'Starbucks',pointTest:point(1.0,1.0,7203),mark:4.8}) RETURN n\nCREATE (n:food {id:10002, name: 'KFC',pointTest:point(2.0,1.0,7203),mark:4.5}) RETURN n\nCREATE (n:food {id:10003, name: 'Pizza Hut',pointTest:point(2.0,5.0,7203),mark:4.5}) RETURN n\nCREATE (n:food {id:10004, name: 'Taco Bell',pointTest:point(3.0,4.0,7203),mark:4.7}) RETURN n\nCREATE (n:food {id:10005, name: 'Pizza Fusion',pointTest:point(5.0,3.0,7203),mark:4.9}) RETURN n\nCREATE (n:food {id:10006, name: 'HaiDiLao Hot Pot',pointTest:point(2.0,2.0,7203),mark:4.8}) RETURN n\nCREATE (n:food {id:10007, name: 'Lao Sze Chuan',pointTest:point(4.0,3.0,7203),mark:4.7}) RETURN n\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Person vertex: Represents the user of the application, with attributes including username, current location, etc. The user's current location is also represented by geographic coordinates, facilitating subsequent geospatial queries."}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:" CALL db.createVertexLabel('person', 'id', 'id', int64, false, 'name', string, true,'pointTest',point,true)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Prepare data:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:" CREATE (n:person {id:1, name: 'Tom',pointTest:point(3.0,3.0,7203)}) RETURN n\n"})}),"\n",(0,i.jsx)(n.h3,{id:"53-building-the-food-exploration-query",children:"5.3 Building the Food Exploration Query"}),"\n",(0,i.jsx)(n.p,{children:"The ability to find food within a distance of 2.5 based on the user's current location, and sort by distance in ascending order allows users to have a better experience by seeing the distance and rating."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Query Statement"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"match (n:person{id:1}),(m:food) with n.pointTest as p1,m.pointTest as p2,m.name as food,m.mark as mark\nCALL spatial.distance(p1,p2) YIELD distance \nWHERE distance<2.5\nRETURN food,distance,mark ORDER by distance\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(379).A+"",width:"1786",height:"821"})}),"\n",(0,i.jsx)(n.p,{children:'This query first matches a specific Person node (taking the user "Tom" as an example) and then finds all Food nodes. Using the custom distance function, the query calculates the straight-line distance between the current location of the Person node and each Food node, filtering out food within a distance of 2.5. Finally, the results are sorted by distance in ascending order, and the rating is provided as a reference to offer users the best possible recommendations.'}),"\n",(0,i.jsx)(n.h2,{id:"6-outlook",children:"6. Outlook"}),"\n",(0,i.jsx)(n.p,{children:"The aforementioned sections not only showcase TuGraph's capabilities in handling geospatial data but also depict an attractive food exploration scenario, proving the great potential of graph databases in providing personalized services that combine geographic location information. Whether it's finding a relaxing spot for the weekend or exploring unique cuisines during travel, such applications are set to greatly enrich people's life experiences.\nTuGraph will continue to implement Disjoint() and WithinBBox() functions, enriching more use cases. Of course, everyone is welcome to participate and collaborate in developing geospatial functionalities."})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},7720:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/EPSG_4326-ebcf508237a6a659deda1c1c05da731b.png"},4535:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/EPSG_7203-813d52c83637ec9bff32110935eb851d.png"},5019:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/WKB-fe5482c2e6681a0467a03cbf55761578.png"},8635:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/createFoodData-42a1476e438f5b07b017a493510a074f.png"},289:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/createLineTestData-d6b3f97eeae6bc43b1db36b3ac1536d4.png"},6547:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/createVertexLabel-6b5834819d1f4d20958b9ba6f13ebbde.png"},2976:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/createVertexLabel_PolygonTest-6c36f0248cb4843d13546b71df5b0eb1.png"},4962:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/createVertexLabel_lineTest-b37d40db2f4c254af64535f30a2842c5.png"},379:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/querryFood-bd53767c9a6b584a1ba73dae4f429efb.png"},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>r});var i=t(6540);const a={},s=i.createContext(a);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4371],{6099:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>l});var i=t(4848),a=t(8453);const s={},o="Examples of geospatial data type usage",r={id:"best-practices/spatial",title:"Examples of geospatial data type usage",description:"1. Introduction",source:"@site/../docs/en-US/source/13.best-practices/5.spatial.md",sourceDirName:"13.best-practices",slug:"/best-practices/spatial",permalink:"/tugraph-db/en/best-practices/spatial",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Environment and version selection",permalink:"/tugraph-db/en/best-practices/selection"},next:{title:"FAQ",permalink:"/tugraph-db/en/faq"}},d={},l=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2. Background Knowledge",id:"2-background-knowledge",level:2},{value:"2.1 WGS84 Coordinate System (EPSG:4326)",id:"21-wgs84-coordinate-system-epsg4326",level:3},{value:"2.2 Cartesian Coordinate System (EPSG:7203)",id:"22-cartesian-coordinate-system-epsg7203",level:3},{value:"2.3 Data Storage Formats",id:"23-data-storage-formats",level:3},{value:"2.4 Common functions",id:"24-common-functions",level:3},{value:"3. Data Types",id:"3-data-types",level:2},{value:"4. Function Introduction",id:"4-function-introduction",level:2},{value:"5. Food Exploration",id:"5-food-exploration",level:2},{value:"5.1 Personalized Recommendations Based on Geographic Location",id:"51-personalized-recommendations-based-on-geographic-location",level:3},{value:"5.2 Data Model Design",id:"52-data-model-design",level:3},{value:"5.3 Building the Food Exploration Query",id:"53-building-the-food-exploration-query",level:3},{value:"6. Outlook",id:"6-outlook",level:2}];function c(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"examples-of-geospatial-data-type-usage",children:"Examples of geospatial data type usage"})}),"\n",(0,i.jsx)(n.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph, a graph database jointly developed by Ant Group and Tsinghua University, has built a comprehensive graph technology system that includes graph storage, graph calculation, graph learning, and a graph development platform, owning a leading-scale graph cluster in the industry. In recent years, geospatial capabilities have demonstrated significant application value in graph databases. They not only enhance the expressive power of data but also facilitate the fusion analysis of cross-domain data, especially displaying strong practical value in critical fields such as social networks, map exploration, and urban planning. TuGraph is also gradually supporting geospatial capabilities."}),"\n",(0,i.jsx)(n.h2,{id:"2-background-knowledge",children:"2. Background Knowledge"}),"\n",(0,i.jsxs)(n.p,{children:["EPSG(",(0,i.jsx)(n.a,{href:"https://epsg.io/",children:"EPSG.io: Coordinate Systems Worldwide"}),") is a standardized collection of geospatial reference system identifiers, used to identify different geospatial reference systems, including coordinate systems, geographic coordinate systems, projected coordinate systems, etc. We commonly use EPSG codes to represent the coordinate systems of data, and here we introduce two of the most common geospatial coordinate systems, which are also the types supported by most databases."]}),"\n",(0,i.jsx)(n.h3,{id:"21-wgs84-coordinate-system-epsg4326",children:"2.1 WGS84 Coordinate System (EPSG:4326)"}),"\n",(0,i.jsxs)(n.p,{children:["Global Positioning System: WGS84 is the foundation of the Global Positioning System (GPS), allowing GPS receivers around the world to determine precise positions. Almost all modern GPS devices provide location information based on the WGS84 coordinate system. Map Making and Geographic Information Systems (GIS): In the field of map making and GIS, WGS84 is widely used to define positions on Earth. This includes various types of map creation, spatial data analysis, and management, etc. ",(0,i.jsx)(n.img,{alt:"image.png",src:t(7720).A+"",width:"821",height:"390"})]}),"\n",(0,i.jsx)(n.h3,{id:"22-cartesian-coordinate-system-epsg7203",children:"2.2 Cartesian Coordinate System (EPSG:7203)"}),"\n",(0,i.jsxs)(n.p,{children:["The Cartesian coordinate system, also known as the rectilinear or orthogonal coordinate system, is the most basic and widely applied coordinate system. It defines a plane with two axes and a space with three axes that are perpendicular to each other, extensively applied in mathematics, physics, engineering, astronomy, and many other fields. ",(0,i.jsx)(n.img,{alt:"image.png",src:t(4535).A+"",width:"560",height:"560"})]}),"\n",(0,i.jsx)(n.h3,{id:"23-data-storage-formats",children:"2.3 Data Storage Formats"}),"\n",(0,i.jsx)(n.p,{children:"OGC (Open Geospatial Consortium) has defined standard representation formats for spatial data, namely WKT and WKB formats, for exchanging and storing spatial data between different systems and platforms, which have now been widely adopted. WKT (Well-Known Text) format is a text markup language that is easy to read and write for humans, while WKB (Well-Known Binary) format uses a series of bytes to encode spatial data, which is more suitable for storage in computers."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"WKT:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"POINT( )\nLINESTRING( , , ...)\n"})}),"\n",(0,i.jsx)(n.p,{children:"The WKT format data is as shown above, first specifying the spatial data type, then specifying the coordinates in parentheses, with a pair of coordinates representing a point, separated by commas between each coordinate pair. For Polygon type data, the first coordinate pair needs to be the same as the last coordinate pair to form a closed surface."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"WKB:"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(5019).A+"",width:"858",height:"264"})}),"\n",(0,i.jsx)(n.p,{children:"The encoding for the EWKB format is explained as follows:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Positions 0 - 1: Encoding method;"}),"\n",(0,i.jsxs)(n.li,{children:["Positions 2 - 5: Spatial data type;\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"0100: point"}),"\n",(0,i.jsx)(n.li,{children:"0200: linestring"}),"\n",(0,i.jsx)(n.li,{children:"0300: polygon"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Positions 6 - 9: Data dimension;\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"0020: two-dimensional"}),"\n",(0,i.jsx)(n.li,{children:"0030: three-dimensional"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:"Positions 10 - 17: EPSG code of the coordinate system;"}),"\n",(0,i.jsx)(n.li,{children:"Positions 18 - n: 16-bit hex representation of pairs of double-type coordinates."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"24-common-functions",children:"2.4 Common functions"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Name"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Signature"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"dbms.graph.createGraph"})}),(0,i.jsx)(n.td,{children:"create a subgraph"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"dbms.graph.createGraph(graph_name::STRING, description::STRING, max_size_GB::INTEGER) :: (::VOID)"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"db.createVertexLabel"})}),(0,i.jsx)(n.td,{children:"create a vertex label"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"db.createVertexLabel(label_name::STRING,field_specs::LIST) :: (::VOID)"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"db.getLabelSchema"})}),(0,i.jsx)(n.td,{children:"get the schema of label"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"db.getLabelSchema(label_type::STRING,label_name::STRING) :: (name::STRING,type::STRING,optional::BOOLEAN)"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"db.deleteLabel"})}),(0,i.jsx)(n.td,{children:"delete vertex label"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"db.deleteLabel(label_type::STRING,label_name::STRING) :: (::VOID)"})})]})]})]}),"\n",(0,i.jsxs)(n.p,{children:["\u66f4\u5b8c\u6574\u8be6\u7ec6\u7684\u51fd\u6570\u4f7f\u7528\u4ee5\u53ca\u63d2\u5165\u6570\u636e\u7684\u8bed\u53e5\uff0c\u53ef\u4ee5\u53c2\u8003 ",(0,i.jsx)(n.a,{href:"/tugraph-db/en/query/cypher",children:"Cypher API"})]}),"\n",(0,i.jsx)(n.h2,{id:"3-data-types",children:"3. Data Types"}),"\n",(0,i.jsx)(n.p,{children:"Currently, in TuGraph, we support three types of spatial data: Point, Linestring, and Polygon."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Point: POINT(2.0, 2.0, 7203)"}),"\n",(0,i.jsx)(n.li,{children:"Linestring: LINESTRING(0 2,1 1,2 0)"}),"\n",(0,i.jsx)(n.li,{children:"Polygon: POLYGON((0 0,0 7,4 2,2 0,0 0))"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Coordinates are of double type. Examples for creating graph models and inserting data as follows:"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Create a vertex to mark food locations"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"CALL db.createVertexLabel('food', 'id', 'id', int64, false, 'name', string, true,'pointTest',point,true) \n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(6547).A+"",width:"932",height:"322"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Insert data to mark food points"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:" CREATE (n:food {id:10001, name: 'aco Bell',pointTest:point(3.0,4.0,7203)}) RETURN n\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(8635).A+"",width:"1112",height:"706"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Create a vertex with polyline attributes"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"CALL db.createVertexLabel('lineTest', 'id', 'id', int64, false, 'name', string, true,'linestringTest',linestring,true)\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(4962).A+"",width:"953",height:"432"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Insert data for vertex with linestring attributes"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"CREATE (n:lineTest {id:102, name: 'Tom',linestringTest:linestringwkt('LINESTRING(0 2,1 1,2 0)', 7203)}) RETURN n\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(289).A+"",width:"1777",height:"854"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Create a vertex with polygon attributes"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"CALL db.createVertexLabel('polygonTest', 'id', 'id', int64, false, 'name', string, true,'polygonTest',polygon,true)\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(2976).A+"",width:"922",height:"389"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Inser data for vertex with polygon attributes"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"CREATE (n:polygonTest {id:103, name: 'polygonTest',polygonTest:polygonwkt('POLYGON((0 0,0 7,4 2,2 0,0 0))', 7203)}) RETURN n\n"})}),"\n",(0,i.jsx)(n.h2,{id:"4-function-introduction",children:"4. Function Introduction"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Function Name"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Input Parameters"}),(0,i.jsx)(n.th,{children:"Return Type"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Distance()"}),(0,i.jsx)(n.td,{children:"Calculate the distance between two spatial data (requires the same coordinate system)"}),(0,i.jsx)(n.td,{children:"Spatial data1, Spatial data2"}),(0,i.jsx)(n.td,{children:"double"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Disjoint()"}),(0,i.jsx)(n.td,{children:"Determine whether two spatial data intersect (under development)"}),(0,i.jsx)(n.td,{children:"Spatial data1, Spatial data2"}),(0,i.jsx)(n.td,{children:"bool"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"WithinBBox()"}),(0,i.jsx)(n.td,{children:"Determine whether a spatial data is within a given rectangular area (under development)"}),(0,i.jsx)(n.td,{children:"Spatial data, Point1"}),(0,i.jsx)(n.td,{children:"bool"})]})]})]}),"\n",(0,i.jsx)(n.h2,{id:"5-food-exploration",children:"5. Food Exploration"}),"\n",(0,i.jsx)(n.h3,{id:"51-personalized-recommendations-based-on-geographic-location",children:"5.1 Personalized Recommendations Based on Geographic Location"}),"\n",(0,i.jsx)(n.p,{children:'In this section, we will explore how to use the TuGraph graph database\'s geospatial capabilities to create a vivid and interesting food exploration application that connects "people" and "food" through geographical locations to achieve personalized food recommendations. Imagine, no matter where you are, with just a gentle tap, the tempting food around you is at a glance \u2013 this is precisely the charm of the scene we\'re about to build.'}),"\n",(0,i.jsx)(n.h3,{id:"52-data-model-design",children:"5.2 Data Model Design"}),"\n",(0,i.jsx)(n.p,{children:"We first define two core types of vertex:\uff1a"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Food vertex: Each restaurant or snack shop can serve as a Food node, with attributes that include but are not limited to the name, address, rating, food category, etc. Notably, we will attach geographic coordinate information to every Food node to record its precise location accurately."}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:" CALL db.createVertexLabel('food', 'id', 'id', int64, false, 'name', string, true,'pointTest',point,true,'mark',double,true)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Prepare data:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"CREATE (n:food {id:10001, name: 'Starbucks',pointTest:point(1.0,1.0,7203),mark:4.8}) RETURN n\nCREATE (n:food {id:10002, name: 'KFC',pointTest:point(2.0,1.0,7203),mark:4.5}) RETURN n\nCREATE (n:food {id:10003, name: 'Pizza Hut',pointTest:point(2.0,5.0,7203),mark:4.5}) RETURN n\nCREATE (n:food {id:10004, name: 'Taco Bell',pointTest:point(3.0,4.0,7203),mark:4.7}) RETURN n\nCREATE (n:food {id:10005, name: 'Pizza Fusion',pointTest:point(5.0,3.0,7203),mark:4.9}) RETURN n\nCREATE (n:food {id:10006, name: 'HaiDiLao Hot Pot',pointTest:point(2.0,2.0,7203),mark:4.8}) RETURN n\nCREATE (n:food {id:10007, name: 'Lao Sze Chuan',pointTest:point(4.0,3.0,7203),mark:4.7}) RETURN n\n"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Person vertex: Represents the user of the application, with attributes including username, current location, etc. The user's current location is also represented by geographic coordinates, facilitating subsequent geospatial queries."}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:" CALL db.createVertexLabel('person', 'id', 'id', int64, false, 'name', string, true,'pointTest',point,true)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Prepare data:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:" CREATE (n:person {id:1, name: 'Tom',pointTest:point(3.0,3.0,7203)}) RETURN n\n"})}),"\n",(0,i.jsx)(n.h3,{id:"53-building-the-food-exploration-query",children:"5.3 Building the Food Exploration Query"}),"\n",(0,i.jsx)(n.p,{children:"The ability to find food within a distance of 2.5 based on the user's current location, and sort by distance in ascending order allows users to have a better experience by seeing the distance and rating."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Query Statement"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"match (n:person{id:1}),(m:food) with n.pointTest as p1,m.pointTest as p2,m.name as food,m.mark as mark\nCALL spatial.distance(p1,p2) YIELD distance \nWHERE distance<2.5\nRETURN food,distance,mark ORDER by distance\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"image.png",src:t(379).A+"",width:"1786",height:"821"})}),"\n",(0,i.jsx)(n.p,{children:'This query first matches a specific Person node (taking the user "Tom" as an example) and then finds all Food nodes. Using the custom distance function, the query calculates the straight-line distance between the current location of the Person node and each Food node, filtering out food within a distance of 2.5. Finally, the results are sorted by distance in ascending order, and the rating is provided as a reference to offer users the best possible recommendations.'}),"\n",(0,i.jsx)(n.h2,{id:"6-outlook",children:"6. Outlook"}),"\n",(0,i.jsx)(n.p,{children:"The aforementioned sections not only showcase TuGraph's capabilities in handling geospatial data but also depict an attractive food exploration scenario, proving the great potential of graph databases in providing personalized services that combine geographic location information. Whether it's finding a relaxing spot for the weekend or exploring unique cuisines during travel, such applications are set to greatly enrich people's life experiences.\nTuGraph will continue to implement Disjoint() and WithinBBox() functions, enriching more use cases. Of course, everyone is welcome to participate and collaborate in developing geospatial functionalities."})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},7720:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/EPSG_4326-ebcf508237a6a659deda1c1c05da731b.png"},4535:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/EPSG_7203-813d52c83637ec9bff32110935eb851d.png"},5019:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/WKB-fe5482c2e6681a0467a03cbf55761578.png"},8635:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/createFoodData-42a1476e438f5b07b017a493510a074f.png"},289:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/createLineTestData-d6b3f97eeae6bc43b1db36b3ac1536d4.png"},6547:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/createVertexLabel-6b5834819d1f4d20958b9ba6f13ebbde.png"},2976:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/createVertexLabel_PolygonTest-6c36f0248cb4843d13546b71df5b0eb1.png"},4962:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/createVertexLabel_lineTest-b37d40db2f4c254af64535f30a2842c5.png"},379:(e,n,t)=>{t.d(n,{A:()=>i});const i=t.p+"assets/images/querryFood-bd53767c9a6b584a1ba73dae4f429efb.png"},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>r});var i=t(6540);const a={},s=i.createContext(a);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7c05b63b.c8c4f137.js b/assets/js/7c05b63b.483d50ee.js similarity index 98% rename from assets/js/7c05b63b.c8c4f137.js rename to assets/js/7c05b63b.483d50ee.js index 306f8f7684..272af28e83 100644 --- a/assets/js/7c05b63b.c8c4f137.js +++ b/assets/js/7c05b63b.483d50ee.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3291],{5828:(a,e,t)=>{t.r(e),t.d(e,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>s,metadata:()=>o,toc:()=>h});var n=t(4848),i=t(8453);const s={},r="What is a graph database",o={id:"introduction/what-is-gdbms",title:"What is a graph database",description:"This document mainly introduce what is a graph database, the advantages of graph database compared with relational database, and the comparison between graph database and relational database",source:"@site/../docs/en-US/source/2.introduction/2.what-is-gdbms.md",sourceDirName:"2.introduction",slug:"/introduction/what-is-gdbms",permalink:"/tugraph-db/en/introduction/what-is-gdbms",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"What is Graph",permalink:"/tugraph-db/en/introduction/what-is-graph"},next:{title:"What is TuGraph",permalink:"/tugraph-db/en/introduction/what-is-tugraph"}},d={},h=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2. Advantages of graph databases over relational databases",id:"2-advantages-of-graph-databases-over-relational-databases",level:2},{value:"2.1 Performance",id:"21-performance",level:3},{value:"2.2 Compatibility",id:"22-compatibility",level:3},{value:"2.3 Intuitive",id:"23-intuitive",level:3},{value:"3. Comparison between graph database and relational database",id:"3-comparison-between-graph-database-and-relational-database",level:2}];function l(a){const e={blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...a.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.header,{children:(0,n.jsx)(e.h1,{id:"what-is-a-graph-database",children:"What is a graph database"})}),"\n",(0,n.jsxs)(e.blockquote,{children:["\n",(0,n.jsx)(e.p,{children:"This document mainly introduce what is a graph database, the advantages of graph database compared with relational database, and the comparison between graph database and relational database"}),"\n"]}),"\n",(0,n.jsx)(e.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,n.jsx)(e.p,{children:"Graph database is a database based on graph model. The main function of graph database is to manage graph data, so it needs to support efficient vertex/edge query and update; To facilitate user use, it is usually necessary to add transaction support to ensure the normal operation of concurrent operations."}),"\n",(0,n.jsx)(e.h2,{id:"2-advantages-of-graph-databases-over-relational-databases",children:"2. Advantages of graph databases over relational databases"}),"\n",(0,n.jsx)(e.p,{children:"The function of graph database is an extension of traditional relational database. Compared with relational database, the graph structure supported by graph data is more flexible. Graph database is different from other databases in terms of data addition, deletion, query and modification based on graph. On the operation abstraction of graph data, a vertex-based perspective is adopted, for example, a vertex accesses its neighboring vertices through all its outgoing edges. This kind of operation is also the core of the design of graph database system."}),"\n",(0,n.jsx)(e.p,{children:"The uniqueness of graph database can be reflected in the following three aspects:"}),"\n",(0,n.jsx)(e.h3,{id:"21-performance",children:"2.1 Performance"}),"\n",(0,n.jsx)(e.p,{children:"Handling the relationship between data, it is inevitable to use table JOIN operation in relational database, which has a great impact on performance. Graph database is a direct access, similar to pointer access, which is more efficient operation of associated data, compared with relational database performance improvement of 2 to 4 orders of magnitude."}),"\n",(0,n.jsx)(e.h3,{id:"22-compatibility",children:"2.2 Compatibility"}),"\n",(0,n.jsx)(e.p,{children:"In reality, the process of a project is often evolutionary. The content and even the format of the data are constantly changing. In a relational database, this means that a change in the table structure, or the creation of multiple new tables, significantly changes the source data. In the graph database, you simply add new vertices, edges, and attributes, and set them to the corresponding types. In essence, a table represents a type of data, and a vertex represents a specific data, meaning that relational databases pay more attention to the type of data, while graph databases pay more attention to the individuals of data and identify their association relationships."}),"\n",(0,n.jsx)(e.h3,{id:"23-intuitive",children:"2.3 Intuitive"}),"\n",(0,n.jsx)(e.p,{children:"Using graphs (or nets) to express real-world relationships is more straightforward and natural, especially in the Internet of Things era. If relational data used, a high degree of abstract thinking required to build a table of characters first, then a table of relations, and finally a map of data. When analyzing and querying the graph data, you can also intuitively find the desired data interactively through the point-edge connection topology, without any professional knowledge."}),"\n",(0,n.jsx)(e.h2,{id:"3-comparison-between-graph-database-and-relational-database",children:"3. Comparison between graph database and relational database"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,n.jsxs)(e.table,{children:[(0,n.jsx)(e.thead,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.th,{children:"classification"}),(0,n.jsx)(e.th,{children:"model"}),(0,n.jsx)(e.th,{children:"advantage"}),(0,n.jsx)(e.th,{children:"disadvantage"}),(0,n.jsx)(e.th,{children:"example"})]})}),(0,n.jsxs)(e.tbody,{children:[(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"Relational database"}),(0,n.jsx)(e.td,{children:"Table structure"}),(0,n.jsx)(e.td,{children:"Data is highly structured, consistent, and software maturity is high"}),(0,n.jsx)(e.td,{children:"The multi-hop association query is inefficient or not supported"}),(0,n.jsx)(e.td,{children:"MySQL\u3001Oracle"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"Graph database"}),(0,n.jsx)(e.td,{children:"graph structure"}),(0,n.jsx)(e.td,{children:"Modeling and manipulating associations is very efficient"}),(0,n.jsx)(e.td,{children:"Highly structured data processing is not as powerful as relational databases"}),(0,n.jsx)(e.td,{children:"Neo4j\u3001TuGraph"})]})]})]}),"\n",(0,n.jsx)(e.p,{children:"In a word, in the face of massive data storage and processing problems, the traditional relational database has been unable to meet most of the daily data storage needs. Graph database technology can store relational information as entities and expand data model flexibly. Because it provides the most direct expression of related data, and the graph model is naturally tolerant to heterogeneous data. In the future, graph database technology will become one of the most popular technologies, which will provide powerful support for enterprises to store and analyze large-scale graph data."})]})}function c(a={}){const{wrapper:e}={...(0,i.R)(),...a.components};return e?(0,n.jsx)(e,{...a,children:(0,n.jsx)(l,{...a})}):l(a)}},8453:(a,e,t)=>{t.d(e,{R:()=>r,x:()=>o});var n=t(6540);const i={},s=n.createContext(i);function r(a){const e=n.useContext(s);return n.useMemo((function(){return"function"==typeof a?a(e):{...e,...a}}),[e,a])}function o(a){let e;return e=a.disableParentContext?"function"==typeof a.components?a.components(i):a.components||i:r(a.components),n.createElement(s.Provider,{value:e},a.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3291],{5828:(a,e,t)=>{t.r(e),t.d(e,{assets:()=>d,contentTitle:()=>r,default:()=>c,frontMatter:()=>s,metadata:()=>o,toc:()=>h});var n=t(4848),i=t(8453);const s={},r="What is a graph database",o={id:"introduction/what-is-gdbms",title:"What is a graph database",description:"This document mainly introduce what is a graph database, the advantages of graph database compared with relational database, and the comparison between graph database and relational database",source:"@site/../docs/en-US/source/2.introduction/2.what-is-gdbms.md",sourceDirName:"2.introduction",slug:"/introduction/what-is-gdbms",permalink:"/tugraph-db/en/introduction/what-is-gdbms",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"What is Graph",permalink:"/tugraph-db/en/introduction/what-is-graph"},next:{title:"What is TuGraph",permalink:"/tugraph-db/en/introduction/what-is-tugraph"}},d={},h=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2. Advantages of graph databases over relational databases",id:"2-advantages-of-graph-databases-over-relational-databases",level:2},{value:"2.1 Performance",id:"21-performance",level:3},{value:"2.2 Compatibility",id:"22-compatibility",level:3},{value:"2.3 Intuitive",id:"23-intuitive",level:3},{value:"3. Comparison between graph database and relational database",id:"3-comparison-between-graph-database-and-relational-database",level:2}];function l(a){const e={blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...a.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(e.header,{children:(0,n.jsx)(e.h1,{id:"what-is-a-graph-database",children:"What is a graph database"})}),"\n",(0,n.jsxs)(e.blockquote,{children:["\n",(0,n.jsx)(e.p,{children:"This document mainly introduce what is a graph database, the advantages of graph database compared with relational database, and the comparison between graph database and relational database"}),"\n"]}),"\n",(0,n.jsx)(e.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,n.jsx)(e.p,{children:"Graph database is a database based on graph model. The main function of graph database is to manage graph data, so it needs to support efficient vertex/edge query and update; To facilitate user use, it is usually necessary to add transaction support to ensure the normal operation of concurrent operations."}),"\n",(0,n.jsx)(e.h2,{id:"2-advantages-of-graph-databases-over-relational-databases",children:"2. Advantages of graph databases over relational databases"}),"\n",(0,n.jsx)(e.p,{children:"The function of graph database is an extension of traditional relational database. Compared with relational database, the graph structure supported by graph data is more flexible. Graph database is different from other databases in terms of data addition, deletion, query and modification based on graph. On the operation abstraction of graph data, a vertex-based perspective is adopted, for example, a vertex accesses its neighboring vertices through all its outgoing edges. This kind of operation is also the core of the design of graph database system."}),"\n",(0,n.jsx)(e.p,{children:"The uniqueness of graph database can be reflected in the following three aspects:"}),"\n",(0,n.jsx)(e.h3,{id:"21-performance",children:"2.1 Performance"}),"\n",(0,n.jsx)(e.p,{children:"Handling the relationship between data, it is inevitable to use table JOIN operation in relational database, which has a great impact on performance. Graph database is a direct access, similar to pointer access, which is more efficient operation of associated data, compared with relational database performance improvement of 2 to 4 orders of magnitude."}),"\n",(0,n.jsx)(e.h3,{id:"22-compatibility",children:"2.2 Compatibility"}),"\n",(0,n.jsx)(e.p,{children:"In reality, the process of a project is often evolutionary. The content and even the format of the data are constantly changing. In a relational database, this means that a change in the table structure, or the creation of multiple new tables, significantly changes the source data. In the graph database, you simply add new vertices, edges, and attributes, and set them to the corresponding types. In essence, a table represents a type of data, and a vertex represents a specific data, meaning that relational databases pay more attention to the type of data, while graph databases pay more attention to the individuals of data and identify their association relationships."}),"\n",(0,n.jsx)(e.h3,{id:"23-intuitive",children:"2.3 Intuitive"}),"\n",(0,n.jsx)(e.p,{children:"Using graphs (or nets) to express real-world relationships is more straightforward and natural, especially in the Internet of Things era. If relational data used, a high degree of abstract thinking required to build a table of characters first, then a table of relations, and finally a map of data. When analyzing and querying the graph data, you can also intuitively find the desired data interactively through the point-edge connection topology, without any professional knowledge."}),"\n",(0,n.jsx)(e.h2,{id:"3-comparison-between-graph-database-and-relational-database",children:"3. Comparison between graph database and relational database"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,n.jsxs)(e.table,{children:[(0,n.jsx)(e.thead,{children:(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.th,{children:"classification"}),(0,n.jsx)(e.th,{children:"model"}),(0,n.jsx)(e.th,{children:"advantage"}),(0,n.jsx)(e.th,{children:"disadvantage"}),(0,n.jsx)(e.th,{children:"example"})]})}),(0,n.jsxs)(e.tbody,{children:[(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"Relational database"}),(0,n.jsx)(e.td,{children:"Table structure"}),(0,n.jsx)(e.td,{children:"Data is highly structured, consistent, and software maturity is high"}),(0,n.jsx)(e.td,{children:"The multi-hop association query is inefficient or not supported"}),(0,n.jsx)(e.td,{children:"MySQL\u3001Oracle"})]}),(0,n.jsxs)(e.tr,{children:[(0,n.jsx)(e.td,{children:"Graph database"}),(0,n.jsx)(e.td,{children:"graph structure"}),(0,n.jsx)(e.td,{children:"Modeling and manipulating associations is very efficient"}),(0,n.jsx)(e.td,{children:"Highly structured data processing is not as powerful as relational databases"}),(0,n.jsx)(e.td,{children:"Neo4j\u3001TuGraph"})]})]})]}),"\n",(0,n.jsx)(e.p,{children:"In a word, in the face of massive data storage and processing problems, the traditional relational database has been unable to meet most of the daily data storage needs. Graph database technology can store relational information as entities and expand data model flexibly. Because it provides the most direct expression of related data, and the graph model is naturally tolerant to heterogeneous data. In the future, graph database technology will become one of the most popular technologies, which will provide powerful support for enterprises to store and analyze large-scale graph data."})]})}function c(a={}){const{wrapper:e}={...(0,i.R)(),...a.components};return e?(0,n.jsx)(e,{...a,children:(0,n.jsx)(l,{...a})}):l(a)}},8453:(a,e,t)=>{t.d(e,{R:()=>r,x:()=>o});var n=t(6540);const i={},s=n.createContext(i);function r(a){const e=n.useContext(s);return n.useMemo((function(){return"function"==typeof a?a(e):{...e,...a}}),[e,a])}function o(a){let e;return e=a.disableParentContext?"function"==typeof a.components?a.components(i):a.components||i:r(a.components),n.createElement(s.Provider,{value:e},a.children)}}}]); \ No newline at end of file diff --git a/assets/js/7c75d82b.472a4844.js b/assets/js/7c75d82b.48c6b775.js similarity index 99% rename from assets/js/7c75d82b.472a4844.js rename to assets/js/7c75d82b.48c6b775.js index 1c3c98ee53..0b3fa5ebc0 100644 --- a/assets/js/7c75d82b.472a4844.js +++ b/assets/js/7c75d82b.48c6b775.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8153],{7042:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>_,toc:()=>l});var o=t(4848),i=t(8453);const r={},s="Corporate Contributor License Agreement",_={id:"contributor-manual/corporate-cla",title:"Corporate Contributor License Agreement",description:"AntGroupOpenSourceCorporateCLAEnglishChinese2021",source:"@site/../docs/en-US/source/12.contributor-manual/4.corporate-cla.md",sourceDirName:"12.contributor-manual",slug:"/contributor-manual/corporate-cla",permalink:"/tugraph-db/en/contributor-manual/corporate-cla",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Individual Contributor License Agreement",permalink:"/tugraph-db/en/contributor-manual/individual-cla"},next:{title:"TuGraph Roadmap",permalink:"/tugraph-db/en/contributor-manual/roadmap"}},a={},l=[];function c(e){const n={h1:"h1",header:"header",li:"li",ol:"ol",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"corporate-contributor-license-agreement",children:"Corporate Contributor License Agreement"})}),"\n",(0,o.jsx)(n.p,{children:"Ant_Group_Open_Source_Corporate_CLA_English_Chinese_2021"}),"\n",(0,o.jsx)(n.p,{children:"Ant Group"}),"\n",(0,o.jsx)(n.p,{children:"Corporate Contributor License Agreement"}),"\n",(0,o.jsx)(n.p,{children:"\u8682\u8681\u96c6\u56e2"}),"\n",(0,o.jsx)(n.p,{children:"\u516c\u53f8\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae"}),"\n",(0,o.jsx)(n.p,{children:'Thank you for your interest in contributing documentation and related software code to a project hosted or managed by Ant Group, or any of its affiliates. In order to clarify the intellectual property license granted with Contributions from any person or entity, Ant Group must have a Contributor License Agreement ("CLA") on file that has been signed by each Contributor, indicating agreement to the license terms below. This version of the Contributor License Agreement allows a legal entity (the "Corporation") to submit Contributions to the applicable project. If you are an individual making a submission on your own behalf, then you should sign the separation Individual Contributor License Agreement.'}),"\n",(0,o.jsx)(n.p,{children:"\u611f\u8c22\u60a8\u5bf9\u5411\u8682\u8681\u96c6\u56e2\u6216\u5176\u4efb\u4f55\u5173\u8054\u65b9\u4e3b\u529e\u6216\u7ba1\u7406\u7684\u9879\u76ee\u8d21\u732e\u6587\u6863\u548c\u76f8\u5173\u8f6f\u4ef6\u4ee3\u7801\u7684\u5174\u8da3\u3002\u4e3a\u5398\u6e05\u5c31\u4e2a\u4eba\u6216\u5b9e\u4f53\u8d21\u732e\u5185\u5bb9\u800c\u6388\u4e88\u7684\u77e5\u8bc6\u4ea7\u6743\u8bb8\u53ef\uff0c\u8682\u8681\u96c6\u56e2\u5fc5\u987b\u5bf9\u6bcf\u4f4d\u8d21\u732e\u8005\u7b7e\u7f72\u7684\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae\uff08\u201cCLA\u201d\uff09\u8fdb\u884c\u5f52\u6863\uff0c\u4ee5\u8bc1\u660e\u5c31\u4ee5\u4e0b\u8bb8\u53ef\u6761\u4ef6\u8fbe\u6210\u7684\u4e00\u81f4\u3002\u6b64\u7248\u672c\u7684\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae\u5141\u8bb8\u6cd5\u4eba\u5b9e\u4f53\uff08\u201c\u516c\u53f8\u201d\uff09\u5411\u76f8\u5e94\u9879\u76ee\u63d0\u4ea4\u8d21\u732e\u5185\u5bb9\u3002\u5982\u679c\u60a8\u662f\u4ee5\u81ea\u8eab\u540d\u4e49\u8fdb\u884c\u63d0\u4ea4\u7684\u4e2a\u4eba\uff0c\u60a8\u5e94\u5f53\u53e6\u884c\u7b7e\u7f72\u4e00\u4efd\u4e2a\u4eba\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae\u3002"}),"\n",(0,o.jsx)(n.p,{children:"You accept and agree to the following terms and conditions for Your present and future Contributions submitted to Ant Group. Except for the license granted herein to Ant Group and recipients of documentation and software distributed by Ant Group, You reserve all right, title, and interest in and to Your Contributions."}),"\n",(0,o.jsx)(n.p,{children:"\u5c31\u60a8\u76ee\u524d\u548c\u5c06\u6765\u5411\u8682\u8681\u96c6\u56e2\u63d0\u4ea4\u7684\u8d21\u732e\u5185\u5bb9\uff0c\u60a8\u63a5\u53d7\u5e76\u540c\u610f\u4ee5\u4e0b\u6761\u6b3e\u548c\u6761\u4ef6\u3002\u9664\u4e86\u6839\u636e\u672c\u534f\u8bae\u5411\u8682\u8681\u96c6\u56e2\u548c\u8682\u8681\u96c6\u56e2\u53d1\u5e03\u6587\u6863\u548c\u8f6f\u4ef6\u7684\u63a5\u6536\u65b9\u6388\u4e88\u7684\u8bb8\u53ef\uff0c\u60a8\u5bf9\u4e8e\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u4fdd\u7559\u6240\u6709\u6743\u5229\u3001\u6240\u6709\u6743\u548c\u5229\u76ca\u3002"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Definitions."}),"\n",(0,o.jsx)(n.li,{children:"\u5b9a\u4e49\u3002"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:'"You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with Ant Group. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.'}),"\n",(0,o.jsx)(n.p,{children:"\u201c\u60a8\u201d\uff08\u6216\u201c\u60a8\u7684\u201d\uff09\u7cfb\u6307\u4e0e\u8682\u8681\u96c6\u56e2\u7b7e\u7f72\u672c\u534f\u8bae\u7684\u8457\u4f5c\u6743\u4eba\u6216\u7ecf\u8457\u4f5c\u6743\u4eba\u6388\u6743\u7684\u6cd5\u5f8b\u5b9e\u4f53\u3002\u5bf9\u4e8e\u6cd5\u5f8b\u5b9e\u4f53\u800c\u8a00\uff0c\u63d0\u4ea4\u8d21\u732e\u5185\u5bb9\u7684\u5b9e\u4f53\u4ee5\u53ca\u5176\u4ed6\u4efb\u4f55\u63a7\u5236\u8be5\u5b9e\u4f53\u3001\u53d7\u5176\u63a7\u5236\u6216\u4e0e\u5176\u53d7\u5230\u540c\u4e00\u4e3b\u4f53\u63a7\u5236\u7684\u5b9e\u4f53\u88ab\u89c6\u4e3a\u5355\u4e2a\u8d21\u732e\u8005\u3002\u4e3a\u672c\u5b9a\u4e49\u4e4b\u76ee\u7684\uff0c\u201c\u63a7\u5236\u201d \u7cfb\u6307\uff08i\uff09\u901a\u8fc7\u5408\u540c\u6216\u5176\u4ed6\u65b9\u5f0f\uff0c\u76f4\u63a5\u6216\u95f4\u63a5\u5bf9\u8be5\u5b9e\u4f53\u8fdb\u884c\u6307\u5bfc\u548c\u7ba1\u7406\u7684\u6743\u529b\uff0c\uff08ii\uff09\u6301\u6709\u8be5\u5b9e\u4f53\u767e\u5206\u4e4b\u4e94\u5341\uff0850%\uff09\u6216\u66f4\u591a\u7684\u5df2\u53d1\u884c\u80a1\u4efd\uff0c\u6216\uff08iii\uff09\u95f4\u63a5\u6301\u6709\u8be5\u5b9e\u4f53\u6743\u76ca\u3002"}),"\n",(0,o.jsx)(n.p,{children:'"Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to Ant Group for inclusion in, or documentation of, any of the products or projects owned or managed by Ant Group (the "Work"), including without limitation any Work described in Schedule B. For the purposes of this definition, "submitted" means any form of electronic or written communication sent to Ant Group or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, Ant Group for the purpose of discussing and improving the Work.'}),"\n",(0,o.jsx)(n.p,{children:"\u201c\u8d21\u732e\u5185\u5bb9\u201d\u7cfb\u6307\u7531\u60a8\u6709\u610f\u5730\u5411\u8682\u8681\u96c6\u56e2\u63d0\u4ea4\uff0c\u4ee5\u4fbf\u88ab\u5305\u542b\u6216\u8bb0\u8f7d\u5728\u4efb\u4f55\u8682\u8681\u96c6\u56e2\u62e5\u6709\u6216\u7ba1\u7406\u7684\u4ea7\u54c1\u6216\u9879\u76ee\uff08\u201c\u4f5c\u54c1\u201d\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u4efb\u4f55\u5728\u9644\u5f55B\u4e2d\u5217\u4e3e\u7684\u4f5c\u54c1\uff09\u4e2d\u7684\u4efb\u4f55\u539f\u521b\u4f5c\u54c1\uff0c\u5305\u62ec\u5bf9\u65e2\u5b58\u4f5c\u54c1\u7684\u4efb\u4f55\u4fee\u6539\u548c\u589e\u52a0\u3002\u4e3a\u672c\u5b9a\u4e49\u4e4b\u76ee\u7684\uff0c\u201c\u63d0\u4ea4\u201d\u7cfb\u6307\u5411\u8682\u8681\u96c6\u56e2\u6216\u5176\u4ee3\u8868\u8fdb\u884c\u7684\u4efb\u4f55\u5f62\u5f0f\u7684\u7535\u5b50\u6216\u4e66\u9762\u4ea4\u6d41\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u4e3a\u8ba8\u8bba\u548c\u6539\u5584\u4f5c\u54c1\u4e3a\u76ee\u7684\uff0c\u901a\u8fc7\u8682\u8681\u96c6\u56e2\u7ba1\u7406\u7684\uff08\u6216\u4ee5\u8682\u8681\u96c6\u56e2\u540d\u4e49\u7ba1\u7406\u7684\uff09\u7535\u5b50\u90ae\u4ef6\u5217\u8868\u3001\u6e90\u4ee3\u7801\u63a7\u5236\u7cfb\u7edf\u548c\u95ee\u9898\u8ddf\u8e2a\u7cfb\u7edf\u8fdb\u884c\u7684\u4ea4\u6d41\u3002"}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to Ant Group and to recipients of documentation and software distributed by Ant Group a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u8457\u4f5c\u6743\u8bb8\u53ef\u7684\u6388\u4e88\u3002\u53d7\u9650\u4e8e\u672c\u534f\u8bae\u7684\u6761\u6b3e\u548c\u6761\u4ef6\uff0c\u60a8\u5728\u6b64\u6388\u4e88\u8682\u8681\u96c6\u56e2\u4ee5\u53ca\u8682\u8681\u96c6\u56e2\u53d1\u5e03\u6587\u6863\u548c\u8f6f\u4ef6\u7684\u63a5\u6536\u65b9\u6c38\u4e45\u6027\u7684\u3001\u5168\u7403\u8303\u56f4\u5185\u7684\u3001\u975e\u6392\u4ed6\u7684\u3001\u5b8c\u5168\u65e0\u987b\u8bb8\u53ef\u8d39\u7684\u3001\u5b8c\u5168\u65e0\u987b\u7248\u6743\u8d39\u7684\u548c\u4e0d\u53ef\u64a4\u9500\u7684\u8457\u4f5c\u6743\u8bb8\u53ef\uff0c\u4ee5\u590d\u5236\u3001\u884d\u751f\u3001\u516c\u5f00\u5c55\u793a\u3001\u516c\u5f00\u6267\u884c\u3001\u8f6c\u6388\u6743\u548c\u53d1\u5e03\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u548c\u8be5\u7b49\u884d\u751f\u4f5c\u54c1\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to Ant Group and to recipients of documentation and software distributed by Ant Group a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u4e13\u5229\u8bb8\u53ef\u7684\u6388\u4e88\u3002 \u53d7\u9650\u4e8e\u672c\u534f\u8bae\u7684\u6761\u6b3e\u548c\u6761\u4ef6\uff0c\u60a8\u5728\u6b64\u6388\u4e88\u8682\u8681\u96c6\u56e2\u4ee5\u53ca\u8682\u8681\u96c6\u56e2\u53d1\u5e03\u6587\u6863\u548c\u8f6f\u4ef6\u7684\u63a5\u6536\u65b9\u6c38\u4e45\u6027\u7684\u3001\u5168\u7403\u8303\u56f4\u5185\u7684\u3001\u975e\u6392\u4ed6\u7684\u3001\u5b8c\u5168\u65e0\u987b\u8bb8\u53ef\u8d39\u7684\u3001\u5b8c\u5168\u65e0\u987b\u7248\u6743\u8d39\u7684\u548c\u4e0d\u53ef\u64a4\u9500\uff08\u672c\u8282\u89c4\u5b9a\u7684\u60c5\u5f62\u9664\u5916\uff09\u7684\u4e13\u5229\u8bb8\u53ef\uff0c\u4ee5\u5f00\u53d1\u3001\u5229\u7528\u3001\u8981\u7ea6\u51fa\u552e\u3001\u51fa\u552e\u3001\u5bfc\u5165\u6216\u4ee5\u5176\u4ed6\u65b9\u5f0f\u8f6c\u8ba9\u4f5c\u54c1\uff0c\u4f46\u8be5\u8bb8\u53ef\u4ec5\u9002\u7528\u4e8e\u60a8\u6709\u6743\u8bb8\u53ef\u7684\uff0c\u4e14\u5fc5\u7136\u4f1a\u88ab\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u4fb5\u6743\uff08\u8d21\u732e\u5185\u5bb9\u5355\u72ec\u6784\u6210\u4fb5\u6743\u3001\u6216\u4e0e\u8d21\u732e\u5185\u5bb9\u7684\u76f8\u5173\u4f5c\u54c1\u4e00\u540c\u6784\u6210\u4fb5\u6743\uff09\u7684\u4e13\u5229\u7533\u8bf7\u8303\u56f4\u3002\u5982\u679c\u4efb\u4f55\u5b9e\u4f53\u9488\u5bf9\u60a8\u6216\u5176\u4ed6\u5b9e\u4f53\u63d0\u8d77\u4e13\u5229\u8bc9\u8bbc\uff08\u5305\u62ec\u8bc9\u8bbc\u4e2d\u7684\u4ea4\u53c9\u8bf7\u6c42\u6216\u53cd\u8bc9\uff09\uff0c\u4e3b\u5f20\u60a8\u7684\u8d21\u732e\u5185\u5bb9\uff08\u6216\u60a8\u53c2\u4e0e\u8d21\u732e\u7684\u4f5c\u54c1\uff09\u9020\u6210\u4e86\u76f4\u63a5\u6027\u6216\u8f85\u52a9\u6027\u7684\u4e13\u5229\u4fb5\u6743\uff0c\u5219\u4efb\u4f55\u6839\u636e\u672c\u534f\u8bae\u9488\u5bf9\u8be5\u8d21\u732e\u5185\u5bb9\u6216\u4f5c\u54c1\u6388\u4e88\u8be5\u5b9e\u4f53\u7684\u4e13\u5229\u8bb8\u53ef\u5e94\u5f53\u5728\u8d77\u8bc9\u4e4b\u65e5\u7ec8\u6b62\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"You represent that you are legally entitled to grant the above license. You represent further that each employee of the Corporation designated on Schedule A below (or in a subsequent written modification to that Schedule) is authorized to submit Contributions on behalf of the Corporation."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u60a8\u4fdd\u8bc1\u60a8\u4f9d\u6cd5\u6709\u6743\u6388\u4e88\u4e0a\u8ff0\u8bb8\u53ef\u3002\u60a8\u8fdb\u4e00\u6b65\u4fdd\u8bc1\u4e0b\u6587\u9644\u8868A\uff08\u8be5\u9644\u8868\u53ef\u901a\u8fc7\u4e66\u9762\u65b9\u5f0f\u8fdb\u884c\u540e\u7eed\u66f4\u6539\uff09\u6240\u6307\u5b9a\u7684\u4efb\u610f\u516c\u53f8\u5458\u5de5\u5747\u6709\u6743\u4ee5\u516c\u53f8\u540d\u4e49\u63d0\u4ea4\u8d21\u732e\u5185\u5bb9\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u60a8\u4fdd\u8bc1\u60a8\u6240\u6709\u7684\u8d21\u732e\u5185\u5bb9\u5747\u4e3a\u60a8\u7684\u539f\u521b\u4f5c\u54c1\uff08\u5173\u4e8e\u4e3a\u4ed6\u4eba\u63d0\u4ea4\u4f5c\u54c1\u7684\u89c4\u5b9a\uff0c\u53ef\u53c2\u89c1\u7b2c7\u8282\uff09\u3002\u60a8\u4fdd\u8bc1\u60a8\u63d0\u4ea4\u7684\u8d21\u732e\u5185\u5bb9\u5305\u62ec\u4efb\u4f55\u7b2c\u4e09\u65b9\u8bb8\u53ef\u6216\u5176\u4ed6\u9650\u5236\uff08\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u76f8\u5173\u4e13\u5229\u6216\u5546\u6807\uff09\u7684\u5168\u90e8\u7ec6\u8282\uff0c\u53ea\u8981\u8be5\u7b49\u8bb8\u53ef\u6216\u5176\u4ed6\u9650\u5236\u4e3a\u60a8\u4e2a\u4eba\u6240\u77e5\u6089\u4e14\u4e0e\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u7684\u4efb\u4f55\u90e8\u5206\u76f8\u5173\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:'You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.'}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u5728\u60a8\u81ea\u613f\u63d0\u4f9b\u652f\u6301\u7684\u8303\u56f4\u4e4b\u5916\uff0c\u60a8\u65e0\u9700\u5bf9\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u63d0\u4f9b\u652f\u6301\u3002\u60a8\u53ef\u4ee5\u63d0\u4f9b\u514d\u8d39\u652f\u6301\u6216\u6536\u8d39\u652f\u6301\uff0c\u4e5f\u53ef\u4ee5\u5b8c\u5168\u4e0d\u63d0\u4f9b\u652f\u6301\u3002\u9664\u975e\u9002\u7528\u6cd5\u5f8b\u53e6\u6709\u89c4\u5b9a\u6216\u53e6\u6709\u4e66\u9762\u7ea6\u5b9a\uff0c\u60a8\u201c\u6309\u7167\u73b0\u72b6\u201d\u63d0\u4f9b\u60a8\u7684\u8d21\u732e\u5185\u5bb9\uff0c\u800c\u4e0d\u5bf9\u5176\u63d0\u4f9b\u4efb\u4f55\u7c7b\u578b\u7684\u4fdd\u8bc1\u6216\u6761\u4ef6\uff0c\u65e0\u8bba\u660e\u793a\u8fd8\u662f\u9ed8\u793a\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u4e3a\u4efb\u4f55\u7279\u5b9a\u76ee\u7684\u5bf9\u6240\u6709\u6743\u3001\u65e0\u4fb5\u6743\u3001\u9002\u9500\u6027\u6216\u9002\u5f53\u6027\u7684\u4fdd\u8bc1\u6216\u6761\u4ef6\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:'Should You wish to submit work that is not Your original creation, You may submit it to Ant Group separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]".'}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u5982\u679c\u60a8\u5e0c\u671b\u63d0\u4ea4\u5e76\u975e\u60a8\u539f\u521b\u7684\u4f5c\u54c1\uff0c\u60a8\u53ef\u4ee5\u5728\u4efb\u4f55\u8d21\u732e\u5185\u5bb9\u4e4b\u5916\u5355\u72ec\u5411\u8682\u8681\u96c6\u56e2\u63d0\u4ea4\uff0c\u6807\u6ce8\u5173\u4e8e\u5176\u6765\u6e90\u548c\u60a8\u4e2a\u4eba\u6240\u77e5\u6089\u7684\u4efb\u4f55\u8bb8\u53ef\u6216\u5176\u4ed6\u9650\u5236\uff08\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u76f8\u5173\u4e13\u5229\u3001\u5546\u6807\u548c\u8bb8\u53ef\u534f\u8bae\uff09\u7684\u5b8c\u6574\u4fe1\u606f\uff0c\u5e76\u4ee5\u663e\u8457\u65b9\u5f0f\u6807\u660e\u8be5\u4f5c\u54c1\u5c5e\u4e8e\u201c\u4ee5\u7b2c\u4e09\u65b9\u540d\u4e49\u63d0\u4ea4\uff1a\u3010\u586b\u5199\u59d3\u540d\u3011\u201d\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"You agree to notify Ant Group of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u60a8\u540c\u610f\u5728\u60a8\u83b7\u6089\u4efb\u4f55\u53ef\u80fd\u5bfc\u81f4\u4e0a\u8ff0\u4fdd\u8bc1\u5728\u4efb\u4f55\u65b9\u9762\u4e0d\u51c6\u786e\u7684\u4e8b\u5b9e\u6216\u60c5\u51b5\u4e4b\u65f6\u901a\u77e5\u8682\u8681\u96c6\u56e2\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"This Agreement will be governed by and construed in accordance with the laws of the People's Republic of China excluding that body of laws known as conflict of laws. The parties expressly agree that the United Nations Convention on Contracts for the International Sale of Goods will not apply. Any legal action or proceeding arising under this Agreement will be brought exclusively in the courts located in Hangzhou, China, and the parties hereby irrevocably consent to the personal jurisdiction and venue therein."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u672c\u534f\u8bae\u53d7\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd\u6cd5\u5f8b\u7ba1\u8f96\uff0c\u5e76\u4f9d\u636e\u5176\u8fdb\u884c\u89e3\u91ca\uff0c\u4f46\u51b2\u7a81\u6cd5\u89c4\u5219\u9664\u5916\u3002\u534f\u8bae\u5404\u65b9\u660e\u786e\u540c\u610f\u6392\u9664\u300a\u8054\u5408\u56fd\u56fd\u9645\u8d27\u7269\u9500\u552e\u5408\u540c\u516c\u7ea6\u300b\u7684\u9002\u7528\u3002\u4efb\u4f55\u7531\u672c\u534f\u8bae\u4ea7\u751f\u7684\u6cd5\u5f8b\u8bc9\u8bbc\u6216\u7a0b\u5e8f\u5747\u5e94\u6392\u4ed6\u6027\u5730\u63d0\u4ea4\u81f3\u4e2d\u56fd\u676d\u5dde\u7684\u6cd5\u9662\u8fdb\u884c\u5ba1\u7406\uff0c\u4e14\u5404\u65b9\u5728\u6b64\u4e0d\u53ef\u64a4\u9500\u5730\u540c\u610f\u8be5\u7b49\u5173\u4e8e\u5c5e\u4eba\u7ba1\u8f96\u548c\u6cd5\u9662\u5730\u7684\u5b89\u6392\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"For your reading convenience, this Agreement is written in parallel English and Chinese sections. To the extent there is a conflict between the English and Chinese sections, the English sections shall govern."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u4e3a\u4e86\u60a8\u7684\u9605\u8bfb\u65b9\u4fbf\uff0c\u672c\u534f\u8bae\u540c\u65f6\u63d0\u4f9b\u4e86\u82f1\u6587\u548c\u4e2d\u6587\u6bb5\u843d\u3002\u5982\u679c\u82f1\u6587\u548c\u4e2d\u6587\u6bb5\u843d\u6709\u77db\u76fe\uff0c\u5219\u4ee5\u82f1\u6587\u6bb5\u843d\u4e3a\u51c6\u3002"}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Please sign\u8bf7\u7b7e\u7f72: __________________________________ Date\u65e5\u671f: ____________"}),"\n",(0,o.jsx)(n.p,{children:"Company Name\u516c\u53f8\u540d\u79f0: ________________________________________________"}),"\n",(0,o.jsx)(n.p,{children:"Full name\u5168\u540d: _____________________________________________________"}),"\n",(0,o.jsx)(n.p,{children:"Title\u804c\u52a1: _____________________________________________________"}),"\n",(0,o.jsx)(n.p,{children:"Mailing Address\u4fe1\u4ef6\u5730\u5740: ________________________________________________"}),"\n",(0,o.jsx)(n.p,{children:"Country\u56fd\u5bb6: _____________________________________________________"}),"\n",(0,o.jsx)(n.p,{children:"Telephone\u7535\u8bdd: _____________________________________________________"}),"\n",(0,o.jsx)(n.p,{children:"E-Mail\u7535\u5b50\u90ae\u7bb1: ______________________________________________________"}),"\n",(0,o.jsx)(n.p,{children:"Schedule A\u9644\u5f55A:"}),"\n",(0,o.jsx)(n.p,{children:"Please provide an initial list of designated employees authorized to submit Contributions on behalf of the Corporation:"}),"\n",(0,o.jsx)(n.p,{children:"\u8bf7\u63d0\u4f9b\u4e00\u4efd\u6709\u6743\u4ee5\u516c\u53f8\u540d\u4e49\u63d0\u4ea4\u8d21\u732e\u5185\u5bb9\u7684\u6307\u5b9a\u5458\u5de5\u7684\u521d\u59cb\u540d\u5355\uff1a"}),"\n",(0,o.jsx)(n.p,{children:"Schedule B \u9644\u5f55B:"}),"\n",(0,o.jsx)(n.p,{children:"Description of Initial Contribution:"}),"\n",(0,o.jsx)(n.p,{children:"\u63cf\u8ff0\u521d\u59cb\u8d21\u732e\u5185\u5bb9\uff1a"})]})}function d(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>_});var o=t(6540);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function _(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8153],{7042:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>_,toc:()=>l});var o=t(4848),i=t(8453);const r={},s="Corporate Contributor License Agreement",_={id:"contributor-manual/corporate-cla",title:"Corporate Contributor License Agreement",description:"AntGroupOpenSourceCorporateCLAEnglishChinese2021",source:"@site/../docs/en-US/source/12.contributor-manual/4.corporate-cla.md",sourceDirName:"12.contributor-manual",slug:"/contributor-manual/corporate-cla",permalink:"/tugraph-db/en/contributor-manual/corporate-cla",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Individual Contributor License Agreement",permalink:"/tugraph-db/en/contributor-manual/individual-cla"},next:{title:"TuGraph Roadmap",permalink:"/tugraph-db/en/contributor-manual/roadmap"}},a={},l=[];function c(e){const n={h1:"h1",header:"header",li:"li",ol:"ol",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"corporate-contributor-license-agreement",children:"Corporate Contributor License Agreement"})}),"\n",(0,o.jsx)(n.p,{children:"Ant_Group_Open_Source_Corporate_CLA_English_Chinese_2021"}),"\n",(0,o.jsx)(n.p,{children:"Ant Group"}),"\n",(0,o.jsx)(n.p,{children:"Corporate Contributor License Agreement"}),"\n",(0,o.jsx)(n.p,{children:"\u8682\u8681\u96c6\u56e2"}),"\n",(0,o.jsx)(n.p,{children:"\u516c\u53f8\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae"}),"\n",(0,o.jsx)(n.p,{children:'Thank you for your interest in contributing documentation and related software code to a project hosted or managed by Ant Group, or any of its affiliates. In order to clarify the intellectual property license granted with Contributions from any person or entity, Ant Group must have a Contributor License Agreement ("CLA") on file that has been signed by each Contributor, indicating agreement to the license terms below. This version of the Contributor License Agreement allows a legal entity (the "Corporation") to submit Contributions to the applicable project. If you are an individual making a submission on your own behalf, then you should sign the separation Individual Contributor License Agreement.'}),"\n",(0,o.jsx)(n.p,{children:"\u611f\u8c22\u60a8\u5bf9\u5411\u8682\u8681\u96c6\u56e2\u6216\u5176\u4efb\u4f55\u5173\u8054\u65b9\u4e3b\u529e\u6216\u7ba1\u7406\u7684\u9879\u76ee\u8d21\u732e\u6587\u6863\u548c\u76f8\u5173\u8f6f\u4ef6\u4ee3\u7801\u7684\u5174\u8da3\u3002\u4e3a\u5398\u6e05\u5c31\u4e2a\u4eba\u6216\u5b9e\u4f53\u8d21\u732e\u5185\u5bb9\u800c\u6388\u4e88\u7684\u77e5\u8bc6\u4ea7\u6743\u8bb8\u53ef\uff0c\u8682\u8681\u96c6\u56e2\u5fc5\u987b\u5bf9\u6bcf\u4f4d\u8d21\u732e\u8005\u7b7e\u7f72\u7684\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae\uff08\u201cCLA\u201d\uff09\u8fdb\u884c\u5f52\u6863\uff0c\u4ee5\u8bc1\u660e\u5c31\u4ee5\u4e0b\u8bb8\u53ef\u6761\u4ef6\u8fbe\u6210\u7684\u4e00\u81f4\u3002\u6b64\u7248\u672c\u7684\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae\u5141\u8bb8\u6cd5\u4eba\u5b9e\u4f53\uff08\u201c\u516c\u53f8\u201d\uff09\u5411\u76f8\u5e94\u9879\u76ee\u63d0\u4ea4\u8d21\u732e\u5185\u5bb9\u3002\u5982\u679c\u60a8\u662f\u4ee5\u81ea\u8eab\u540d\u4e49\u8fdb\u884c\u63d0\u4ea4\u7684\u4e2a\u4eba\uff0c\u60a8\u5e94\u5f53\u53e6\u884c\u7b7e\u7f72\u4e00\u4efd\u4e2a\u4eba\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae\u3002"}),"\n",(0,o.jsx)(n.p,{children:"You accept and agree to the following terms and conditions for Your present and future Contributions submitted to Ant Group. Except for the license granted herein to Ant Group and recipients of documentation and software distributed by Ant Group, You reserve all right, title, and interest in and to Your Contributions."}),"\n",(0,o.jsx)(n.p,{children:"\u5c31\u60a8\u76ee\u524d\u548c\u5c06\u6765\u5411\u8682\u8681\u96c6\u56e2\u63d0\u4ea4\u7684\u8d21\u732e\u5185\u5bb9\uff0c\u60a8\u63a5\u53d7\u5e76\u540c\u610f\u4ee5\u4e0b\u6761\u6b3e\u548c\u6761\u4ef6\u3002\u9664\u4e86\u6839\u636e\u672c\u534f\u8bae\u5411\u8682\u8681\u96c6\u56e2\u548c\u8682\u8681\u96c6\u56e2\u53d1\u5e03\u6587\u6863\u548c\u8f6f\u4ef6\u7684\u63a5\u6536\u65b9\u6388\u4e88\u7684\u8bb8\u53ef\uff0c\u60a8\u5bf9\u4e8e\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u4fdd\u7559\u6240\u6709\u6743\u5229\u3001\u6240\u6709\u6743\u548c\u5229\u76ca\u3002"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Definitions."}),"\n",(0,o.jsx)(n.li,{children:"\u5b9a\u4e49\u3002"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:'"You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with Ant Group. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.'}),"\n",(0,o.jsx)(n.p,{children:"\u201c\u60a8\u201d\uff08\u6216\u201c\u60a8\u7684\u201d\uff09\u7cfb\u6307\u4e0e\u8682\u8681\u96c6\u56e2\u7b7e\u7f72\u672c\u534f\u8bae\u7684\u8457\u4f5c\u6743\u4eba\u6216\u7ecf\u8457\u4f5c\u6743\u4eba\u6388\u6743\u7684\u6cd5\u5f8b\u5b9e\u4f53\u3002\u5bf9\u4e8e\u6cd5\u5f8b\u5b9e\u4f53\u800c\u8a00\uff0c\u63d0\u4ea4\u8d21\u732e\u5185\u5bb9\u7684\u5b9e\u4f53\u4ee5\u53ca\u5176\u4ed6\u4efb\u4f55\u63a7\u5236\u8be5\u5b9e\u4f53\u3001\u53d7\u5176\u63a7\u5236\u6216\u4e0e\u5176\u53d7\u5230\u540c\u4e00\u4e3b\u4f53\u63a7\u5236\u7684\u5b9e\u4f53\u88ab\u89c6\u4e3a\u5355\u4e2a\u8d21\u732e\u8005\u3002\u4e3a\u672c\u5b9a\u4e49\u4e4b\u76ee\u7684\uff0c\u201c\u63a7\u5236\u201d \u7cfb\u6307\uff08i\uff09\u901a\u8fc7\u5408\u540c\u6216\u5176\u4ed6\u65b9\u5f0f\uff0c\u76f4\u63a5\u6216\u95f4\u63a5\u5bf9\u8be5\u5b9e\u4f53\u8fdb\u884c\u6307\u5bfc\u548c\u7ba1\u7406\u7684\u6743\u529b\uff0c\uff08ii\uff09\u6301\u6709\u8be5\u5b9e\u4f53\u767e\u5206\u4e4b\u4e94\u5341\uff0850%\uff09\u6216\u66f4\u591a\u7684\u5df2\u53d1\u884c\u80a1\u4efd\uff0c\u6216\uff08iii\uff09\u95f4\u63a5\u6301\u6709\u8be5\u5b9e\u4f53\u6743\u76ca\u3002"}),"\n",(0,o.jsx)(n.p,{children:'"Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to Ant Group for inclusion in, or documentation of, any of the products or projects owned or managed by Ant Group (the "Work"), including without limitation any Work described in Schedule B. For the purposes of this definition, "submitted" means any form of electronic or written communication sent to Ant Group or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, Ant Group for the purpose of discussing and improving the Work.'}),"\n",(0,o.jsx)(n.p,{children:"\u201c\u8d21\u732e\u5185\u5bb9\u201d\u7cfb\u6307\u7531\u60a8\u6709\u610f\u5730\u5411\u8682\u8681\u96c6\u56e2\u63d0\u4ea4\uff0c\u4ee5\u4fbf\u88ab\u5305\u542b\u6216\u8bb0\u8f7d\u5728\u4efb\u4f55\u8682\u8681\u96c6\u56e2\u62e5\u6709\u6216\u7ba1\u7406\u7684\u4ea7\u54c1\u6216\u9879\u76ee\uff08\u201c\u4f5c\u54c1\u201d\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u4efb\u4f55\u5728\u9644\u5f55B\u4e2d\u5217\u4e3e\u7684\u4f5c\u54c1\uff09\u4e2d\u7684\u4efb\u4f55\u539f\u521b\u4f5c\u54c1\uff0c\u5305\u62ec\u5bf9\u65e2\u5b58\u4f5c\u54c1\u7684\u4efb\u4f55\u4fee\u6539\u548c\u589e\u52a0\u3002\u4e3a\u672c\u5b9a\u4e49\u4e4b\u76ee\u7684\uff0c\u201c\u63d0\u4ea4\u201d\u7cfb\u6307\u5411\u8682\u8681\u96c6\u56e2\u6216\u5176\u4ee3\u8868\u8fdb\u884c\u7684\u4efb\u4f55\u5f62\u5f0f\u7684\u7535\u5b50\u6216\u4e66\u9762\u4ea4\u6d41\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u4e3a\u8ba8\u8bba\u548c\u6539\u5584\u4f5c\u54c1\u4e3a\u76ee\u7684\uff0c\u901a\u8fc7\u8682\u8681\u96c6\u56e2\u7ba1\u7406\u7684\uff08\u6216\u4ee5\u8682\u8681\u96c6\u56e2\u540d\u4e49\u7ba1\u7406\u7684\uff09\u7535\u5b50\u90ae\u4ef6\u5217\u8868\u3001\u6e90\u4ee3\u7801\u63a7\u5236\u7cfb\u7edf\u548c\u95ee\u9898\u8ddf\u8e2a\u7cfb\u7edf\u8fdb\u884c\u7684\u4ea4\u6d41\u3002"}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to Ant Group and to recipients of documentation and software distributed by Ant Group a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u8457\u4f5c\u6743\u8bb8\u53ef\u7684\u6388\u4e88\u3002\u53d7\u9650\u4e8e\u672c\u534f\u8bae\u7684\u6761\u6b3e\u548c\u6761\u4ef6\uff0c\u60a8\u5728\u6b64\u6388\u4e88\u8682\u8681\u96c6\u56e2\u4ee5\u53ca\u8682\u8681\u96c6\u56e2\u53d1\u5e03\u6587\u6863\u548c\u8f6f\u4ef6\u7684\u63a5\u6536\u65b9\u6c38\u4e45\u6027\u7684\u3001\u5168\u7403\u8303\u56f4\u5185\u7684\u3001\u975e\u6392\u4ed6\u7684\u3001\u5b8c\u5168\u65e0\u987b\u8bb8\u53ef\u8d39\u7684\u3001\u5b8c\u5168\u65e0\u987b\u7248\u6743\u8d39\u7684\u548c\u4e0d\u53ef\u64a4\u9500\u7684\u8457\u4f5c\u6743\u8bb8\u53ef\uff0c\u4ee5\u590d\u5236\u3001\u884d\u751f\u3001\u516c\u5f00\u5c55\u793a\u3001\u516c\u5f00\u6267\u884c\u3001\u8f6c\u6388\u6743\u548c\u53d1\u5e03\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u548c\u8be5\u7b49\u884d\u751f\u4f5c\u54c1\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to Ant Group and to recipients of documentation and software distributed by Ant Group a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u4e13\u5229\u8bb8\u53ef\u7684\u6388\u4e88\u3002 \u53d7\u9650\u4e8e\u672c\u534f\u8bae\u7684\u6761\u6b3e\u548c\u6761\u4ef6\uff0c\u60a8\u5728\u6b64\u6388\u4e88\u8682\u8681\u96c6\u56e2\u4ee5\u53ca\u8682\u8681\u96c6\u56e2\u53d1\u5e03\u6587\u6863\u548c\u8f6f\u4ef6\u7684\u63a5\u6536\u65b9\u6c38\u4e45\u6027\u7684\u3001\u5168\u7403\u8303\u56f4\u5185\u7684\u3001\u975e\u6392\u4ed6\u7684\u3001\u5b8c\u5168\u65e0\u987b\u8bb8\u53ef\u8d39\u7684\u3001\u5b8c\u5168\u65e0\u987b\u7248\u6743\u8d39\u7684\u548c\u4e0d\u53ef\u64a4\u9500\uff08\u672c\u8282\u89c4\u5b9a\u7684\u60c5\u5f62\u9664\u5916\uff09\u7684\u4e13\u5229\u8bb8\u53ef\uff0c\u4ee5\u5f00\u53d1\u3001\u5229\u7528\u3001\u8981\u7ea6\u51fa\u552e\u3001\u51fa\u552e\u3001\u5bfc\u5165\u6216\u4ee5\u5176\u4ed6\u65b9\u5f0f\u8f6c\u8ba9\u4f5c\u54c1\uff0c\u4f46\u8be5\u8bb8\u53ef\u4ec5\u9002\u7528\u4e8e\u60a8\u6709\u6743\u8bb8\u53ef\u7684\uff0c\u4e14\u5fc5\u7136\u4f1a\u88ab\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u4fb5\u6743\uff08\u8d21\u732e\u5185\u5bb9\u5355\u72ec\u6784\u6210\u4fb5\u6743\u3001\u6216\u4e0e\u8d21\u732e\u5185\u5bb9\u7684\u76f8\u5173\u4f5c\u54c1\u4e00\u540c\u6784\u6210\u4fb5\u6743\uff09\u7684\u4e13\u5229\u7533\u8bf7\u8303\u56f4\u3002\u5982\u679c\u4efb\u4f55\u5b9e\u4f53\u9488\u5bf9\u60a8\u6216\u5176\u4ed6\u5b9e\u4f53\u63d0\u8d77\u4e13\u5229\u8bc9\u8bbc\uff08\u5305\u62ec\u8bc9\u8bbc\u4e2d\u7684\u4ea4\u53c9\u8bf7\u6c42\u6216\u53cd\u8bc9\uff09\uff0c\u4e3b\u5f20\u60a8\u7684\u8d21\u732e\u5185\u5bb9\uff08\u6216\u60a8\u53c2\u4e0e\u8d21\u732e\u7684\u4f5c\u54c1\uff09\u9020\u6210\u4e86\u76f4\u63a5\u6027\u6216\u8f85\u52a9\u6027\u7684\u4e13\u5229\u4fb5\u6743\uff0c\u5219\u4efb\u4f55\u6839\u636e\u672c\u534f\u8bae\u9488\u5bf9\u8be5\u8d21\u732e\u5185\u5bb9\u6216\u4f5c\u54c1\u6388\u4e88\u8be5\u5b9e\u4f53\u7684\u4e13\u5229\u8bb8\u53ef\u5e94\u5f53\u5728\u8d77\u8bc9\u4e4b\u65e5\u7ec8\u6b62\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"You represent that you are legally entitled to grant the above license. You represent further that each employee of the Corporation designated on Schedule A below (or in a subsequent written modification to that Schedule) is authorized to submit Contributions on behalf of the Corporation."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u60a8\u4fdd\u8bc1\u60a8\u4f9d\u6cd5\u6709\u6743\u6388\u4e88\u4e0a\u8ff0\u8bb8\u53ef\u3002\u60a8\u8fdb\u4e00\u6b65\u4fdd\u8bc1\u4e0b\u6587\u9644\u8868A\uff08\u8be5\u9644\u8868\u53ef\u901a\u8fc7\u4e66\u9762\u65b9\u5f0f\u8fdb\u884c\u540e\u7eed\u66f4\u6539\uff09\u6240\u6307\u5b9a\u7684\u4efb\u610f\u516c\u53f8\u5458\u5de5\u5747\u6709\u6743\u4ee5\u516c\u53f8\u540d\u4e49\u63d0\u4ea4\u8d21\u732e\u5185\u5bb9\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u60a8\u4fdd\u8bc1\u60a8\u6240\u6709\u7684\u8d21\u732e\u5185\u5bb9\u5747\u4e3a\u60a8\u7684\u539f\u521b\u4f5c\u54c1\uff08\u5173\u4e8e\u4e3a\u4ed6\u4eba\u63d0\u4ea4\u4f5c\u54c1\u7684\u89c4\u5b9a\uff0c\u53ef\u53c2\u89c1\u7b2c7\u8282\uff09\u3002\u60a8\u4fdd\u8bc1\u60a8\u63d0\u4ea4\u7684\u8d21\u732e\u5185\u5bb9\u5305\u62ec\u4efb\u4f55\u7b2c\u4e09\u65b9\u8bb8\u53ef\u6216\u5176\u4ed6\u9650\u5236\uff08\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u76f8\u5173\u4e13\u5229\u6216\u5546\u6807\uff09\u7684\u5168\u90e8\u7ec6\u8282\uff0c\u53ea\u8981\u8be5\u7b49\u8bb8\u53ef\u6216\u5176\u4ed6\u9650\u5236\u4e3a\u60a8\u4e2a\u4eba\u6240\u77e5\u6089\u4e14\u4e0e\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u7684\u4efb\u4f55\u90e8\u5206\u76f8\u5173\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:'You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.'}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u5728\u60a8\u81ea\u613f\u63d0\u4f9b\u652f\u6301\u7684\u8303\u56f4\u4e4b\u5916\uff0c\u60a8\u65e0\u9700\u5bf9\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u63d0\u4f9b\u652f\u6301\u3002\u60a8\u53ef\u4ee5\u63d0\u4f9b\u514d\u8d39\u652f\u6301\u6216\u6536\u8d39\u652f\u6301\uff0c\u4e5f\u53ef\u4ee5\u5b8c\u5168\u4e0d\u63d0\u4f9b\u652f\u6301\u3002\u9664\u975e\u9002\u7528\u6cd5\u5f8b\u53e6\u6709\u89c4\u5b9a\u6216\u53e6\u6709\u4e66\u9762\u7ea6\u5b9a\uff0c\u60a8\u201c\u6309\u7167\u73b0\u72b6\u201d\u63d0\u4f9b\u60a8\u7684\u8d21\u732e\u5185\u5bb9\uff0c\u800c\u4e0d\u5bf9\u5176\u63d0\u4f9b\u4efb\u4f55\u7c7b\u578b\u7684\u4fdd\u8bc1\u6216\u6761\u4ef6\uff0c\u65e0\u8bba\u660e\u793a\u8fd8\u662f\u9ed8\u793a\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u4e3a\u4efb\u4f55\u7279\u5b9a\u76ee\u7684\u5bf9\u6240\u6709\u6743\u3001\u65e0\u4fb5\u6743\u3001\u9002\u9500\u6027\u6216\u9002\u5f53\u6027\u7684\u4fdd\u8bc1\u6216\u6761\u4ef6\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:'Should You wish to submit work that is not Your original creation, You may submit it to Ant Group separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]".'}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u5982\u679c\u60a8\u5e0c\u671b\u63d0\u4ea4\u5e76\u975e\u60a8\u539f\u521b\u7684\u4f5c\u54c1\uff0c\u60a8\u53ef\u4ee5\u5728\u4efb\u4f55\u8d21\u732e\u5185\u5bb9\u4e4b\u5916\u5355\u72ec\u5411\u8682\u8681\u96c6\u56e2\u63d0\u4ea4\uff0c\u6807\u6ce8\u5173\u4e8e\u5176\u6765\u6e90\u548c\u60a8\u4e2a\u4eba\u6240\u77e5\u6089\u7684\u4efb\u4f55\u8bb8\u53ef\u6216\u5176\u4ed6\u9650\u5236\uff08\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u76f8\u5173\u4e13\u5229\u3001\u5546\u6807\u548c\u8bb8\u53ef\u534f\u8bae\uff09\u7684\u5b8c\u6574\u4fe1\u606f\uff0c\u5e76\u4ee5\u663e\u8457\u65b9\u5f0f\u6807\u660e\u8be5\u4f5c\u54c1\u5c5e\u4e8e\u201c\u4ee5\u7b2c\u4e09\u65b9\u540d\u4e49\u63d0\u4ea4\uff1a\u3010\u586b\u5199\u59d3\u540d\u3011\u201d\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"You agree to notify Ant Group of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u60a8\u540c\u610f\u5728\u60a8\u83b7\u6089\u4efb\u4f55\u53ef\u80fd\u5bfc\u81f4\u4e0a\u8ff0\u4fdd\u8bc1\u5728\u4efb\u4f55\u65b9\u9762\u4e0d\u51c6\u786e\u7684\u4e8b\u5b9e\u6216\u60c5\u51b5\u4e4b\u65f6\u901a\u77e5\u8682\u8681\u96c6\u56e2\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"This Agreement will be governed by and construed in accordance with the laws of the People's Republic of China excluding that body of laws known as conflict of laws. The parties expressly agree that the United Nations Convention on Contracts for the International Sale of Goods will not apply. Any legal action or proceeding arising under this Agreement will be brought exclusively in the courts located in Hangzhou, China, and the parties hereby irrevocably consent to the personal jurisdiction and venue therein."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u672c\u534f\u8bae\u53d7\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd\u6cd5\u5f8b\u7ba1\u8f96\uff0c\u5e76\u4f9d\u636e\u5176\u8fdb\u884c\u89e3\u91ca\uff0c\u4f46\u51b2\u7a81\u6cd5\u89c4\u5219\u9664\u5916\u3002\u534f\u8bae\u5404\u65b9\u660e\u786e\u540c\u610f\u6392\u9664\u300a\u8054\u5408\u56fd\u56fd\u9645\u8d27\u7269\u9500\u552e\u5408\u540c\u516c\u7ea6\u300b\u7684\u9002\u7528\u3002\u4efb\u4f55\u7531\u672c\u534f\u8bae\u4ea7\u751f\u7684\u6cd5\u5f8b\u8bc9\u8bbc\u6216\u7a0b\u5e8f\u5747\u5e94\u6392\u4ed6\u6027\u5730\u63d0\u4ea4\u81f3\u4e2d\u56fd\u676d\u5dde\u7684\u6cd5\u9662\u8fdb\u884c\u5ba1\u7406\uff0c\u4e14\u5404\u65b9\u5728\u6b64\u4e0d\u53ef\u64a4\u9500\u5730\u540c\u610f\u8be5\u7b49\u5173\u4e8e\u5c5e\u4eba\u7ba1\u8f96\u548c\u6cd5\u9662\u5730\u7684\u5b89\u6392\u3002"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"For your reading convenience, this Agreement is written in parallel English and Chinese sections. To the extent there is a conflict between the English and Chinese sections, the English sections shall govern."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"\u4e3a\u4e86\u60a8\u7684\u9605\u8bfb\u65b9\u4fbf\uff0c\u672c\u534f\u8bae\u540c\u65f6\u63d0\u4f9b\u4e86\u82f1\u6587\u548c\u4e2d\u6587\u6bb5\u843d\u3002\u5982\u679c\u82f1\u6587\u548c\u4e2d\u6587\u6bb5\u843d\u6709\u77db\u76fe\uff0c\u5219\u4ee5\u82f1\u6587\u6bb5\u843d\u4e3a\u51c6\u3002"}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Please sign\u8bf7\u7b7e\u7f72: __________________________________ Date\u65e5\u671f: ____________"}),"\n",(0,o.jsx)(n.p,{children:"Company Name\u516c\u53f8\u540d\u79f0: ________________________________________________"}),"\n",(0,o.jsx)(n.p,{children:"Full name\u5168\u540d: _____________________________________________________"}),"\n",(0,o.jsx)(n.p,{children:"Title\u804c\u52a1: _____________________________________________________"}),"\n",(0,o.jsx)(n.p,{children:"Mailing Address\u4fe1\u4ef6\u5730\u5740: ________________________________________________"}),"\n",(0,o.jsx)(n.p,{children:"Country\u56fd\u5bb6: _____________________________________________________"}),"\n",(0,o.jsx)(n.p,{children:"Telephone\u7535\u8bdd: _____________________________________________________"}),"\n",(0,o.jsx)(n.p,{children:"E-Mail\u7535\u5b50\u90ae\u7bb1: ______________________________________________________"}),"\n",(0,o.jsx)(n.p,{children:"Schedule A\u9644\u5f55A:"}),"\n",(0,o.jsx)(n.p,{children:"Please provide an initial list of designated employees authorized to submit Contributions on behalf of the Corporation:"}),"\n",(0,o.jsx)(n.p,{children:"\u8bf7\u63d0\u4f9b\u4e00\u4efd\u6709\u6743\u4ee5\u516c\u53f8\u540d\u4e49\u63d0\u4ea4\u8d21\u732e\u5185\u5bb9\u7684\u6307\u5b9a\u5458\u5de5\u7684\u521d\u59cb\u540d\u5355\uff1a"}),"\n",(0,o.jsx)(n.p,{children:"Schedule B \u9644\u5f55B:"}),"\n",(0,o.jsx)(n.p,{children:"Description of Initial Contribution:"}),"\n",(0,o.jsx)(n.p,{children:"\u63cf\u8ff0\u521d\u59cb\u8d21\u732e\u5185\u5bb9\uff1a"})]})}function d(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>_});var o=t(6540);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function _(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7ca1a5df.3683e3f1.js b/assets/js/7ca1a5df.9d98152c.js similarity index 99% rename from assets/js/7ca1a5df.3683e3f1.js rename to assets/js/7ca1a5df.9d98152c.js index 3ad8f7e1cf..1e8c65dca0 100644 --- a/assets/js/7ca1a5df.3683e3f1.js +++ b/assets/js/7ca1a5df.9d98152c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[9583],{4268:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var n=r(4848),a=r(8453);const o={},s="Traversal API",i={id:"olap&procedure/procedure/traversal",title:"Traversal API",description:"This document mainly explains the Traversal API in the stored procedure of TuGraph.",source:"@site/../docs/en-US/source/9.olap&procedure/1.procedure/2.traversal.md",sourceDirName:"9.olap&procedure/1.procedure",slug:"/olap&procedure/procedure/traversal",permalink:"/tugraph-db/en/olap&procedure/procedure/traversal",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Stored Procedure Guide",permalink:"/tugraph-db/en/olap&procedure/procedure/"},next:{title:"Rust Stored Procedures",permalink:"/tugraph-db/en/olap&procedure/procedure/Rust-procedure"}},l={},d=[{value:"2. Interface",id:"2-interface",level:2},{value:"2.1. Snapshot",id:"21-snapshot",level:3},{value:"2.2. Traversal",id:"22-traversal",level:3}];function c(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"traversal-api",children:"Traversal API"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"This document mainly explains the Traversal API in the stored procedure of TuGraph."}),"\n"]}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Introduction\nThe powerful online analytical processing (OLAP) capability of TuGraph is an important feature that sets it apart from other graph databases. With the help of the C++ OLAP API (olap_on_db.h), users can quickly export a subgraph that needs to be analyzed, and then run iterative graph computing processes such as PageRank, connected components, and community detection on it, and then make corresponding decisions based on the results. The export and computation processes can be accelerated through parallel processing, achieving almost real-time analysis and processing, and avoiding the lengthy steps of traditional solutions that require exporting, transforming, and reimporting (ETL) data into dedicated analytical systems for offline processing."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"TuGraph has built-in many commonly used graph analysis algorithms and rich auxiliary interfaces, so users hardly need to implement specific graph computing processes themselves. They just need to include the header files (.h files) of the corresponding algorithm library in their own programs when implementing their own storage procedures, and link the corresponding dynamic library files (.so) during compilation. In general, the only process that users need to implement themselves is the extraction of the subgraph to be analyzed."}),"\n",(0,n.jsx)(t.p,{children:"Currently, the Traversal API only supports C++."}),"\n",(0,n.jsx)(t.h2,{id:"2-interface",children:"2. Interface"}),"\n",(0,n.jsx)(t.h3,{id:"21-snapshot",children:"2.1. Snapshot"}),"\n",(0,n.jsx)(t.p,{children:"The Snapshot template class in C++ OLAP API is used to represent extracted static subgraphs. The EdgeData is used to represent the data type of the weight used for each edge in the subgraph. If the edges do not require weights, Empty is used as the EdgeData."}),"\n",(0,n.jsx)(t.p,{children:"The extracted subgraph can be described using the constructor of the Snapshot class."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-c",children:"Snapshot::Snapshot(\n GraphDB & db,\n Transaction & txn,\n size_t flags = 0,\n std::function vertex_filter = nullptr,\n std::function out_edge_filter = nullptr\n);\n"})}),"\n",(0,n.jsx)(t.p,{children:'In the above text, "db" represents the database handle, "txn" represents the transaction handle, and "flags" represents the options used during generation, with the optional values including the following combinations: SNAPSHOT_PARALLEL indicates that multiple threads are used for parallel extraction during export; SNAPSHOT_UNDIRECTED indicates that the exported graph needs to be transformed into an undirected graph.'}),"\n",(0,n.jsx)(t.p,{children:'"vertex_filter" is a user-defined filtering function for vertices, where a return value of true indicates that the vertex needs to be included in the extracted subgraph, and vice versa.'}),"\n",(0,n.jsx)(t.p,{children:'"out_edge_filter" is a user-defined filtering function for edges, where a return value of true indicates that the edge needs to be included in the extracted subgraph, and vice versa.'}),"\n",(0,n.jsx)(t.p,{children:"When the filtering functions are set to default values, it means that all vertices/edges should be included."}),"\n",(0,n.jsx)(t.p,{children:"For other methods provided by the Snapshot class, please refer to the detailed C++ API documentation (olap_on_db.h)."}),"\n",(0,n.jsx)(t.h3,{id:"22-traversal",children:"2.2. Traversal"}),"\n",(0,n.jsx)(t.p,{children:"A common type of analysis in graph databases is to start from one or more vertices and iteratively expand and access their neighbors. Although this type of analysis can be done using Cypher, its performance is limited by the serial interpretation and execution when the depth of traversal is large. Writing stored procedures using the C++ Core API eliminates the overhead of interpretation but is still limited by the processing power of a single thread."}),"\n",(0,n.jsx)(t.p,{children:"In order to enable users to accelerate these types of analysis tasks through parallel processing, we have wrapped a Traversal framework based on the C++ OLAP API. Users can directly use the FrontierTraversal and PathTraversal classes in this framework to perform iterative traversal analysis tasks. For specific usage instructions, please refer to the corresponding C++ API documentation (lgraph_traversal.h)."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-c",children:"ParallelVector FindVertices(\n GraphDB & db,\n Transaction & txn,\n std::function filter,\n bool parallel = false\n);\n"})}),"\n",(0,n.jsx)(t.p,{children:'This method can be used to find all vertices that satisfy a certain condition (when the filter returns true). When the "parallel" parameter is set to true, the search process will be executed in parallel.'}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-c",children:"template \nParallelVector ExtractVertexData(\n GraphDB & db,\n Transaction & txn,\n ParallelVector & frontier,\n std::function extract,\n bool parallel = false\n);\n"})}),"\n",(0,n.jsx)(t.p,{children:'This method can be used to extract (VertexData type) properties from a specified set of vertices (frontier) using the extract method. When the "parallel" parameter is set to true, the extraction process will be executed in parallel.'}),"\n",(0,n.jsx)(t.p,{children:"FrontierTraversal is suitable for cases where only the traversed set of vertices is of interest. When a user needs to access information along the path (vertices/edges along the path) in the traversal process or result, PathTraversal needs to be used. Both types of traversal have four parameters in their constructor, namely the database handle db, transaction handle txn, options flags and capacity. The available options include the following combinations: TRAVERSAL_PARALLEL indicates that multiple threads are used for parallel traversal; TRAVERSAL_ALLOW_REVISITS indicates that vertices can be visited repeatedly during traversal (PathTraversal implicitly includes this option).\ncapacity indicates the capacity of the path collection during initialization."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-c",children:"void SetFrontier(size_t root_vid);\nvoid SetFrontier(ParallelVector & root_vids);\nvoid SetFrontier(std::function root_vertex_filter);\n"})}),"\n",(0,n.jsx)(t.p,{children:"Both types of traversal have three ways to set the starting vertex/vertex set for traversal. The first two methods directly specify the vertex ID, while the last method is similar to FindVertices."}),"\n",(0,n.jsx)(t.p,{children:"Both types of traversal start from the set of vertices in the current layer. They use the extension function to access each outgoing edge/incoming edge/outgoing and incoming edges, and use a user-defined filter function to determine if the extension is successful. If successful, the neighboring vertex/appended path with the edge is added to the set of vertices/paths in the next layer."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-c",children:"void ExpandOutEdges(\n std::function out_edge_filter = nullptr,\n std::function out_neighbour_filter = nullptr\n);\nvoid ExpandInEdges(\n std::function in_edge_filter = nullptr,\n std::function in_neighbour_filter = nullptr\n);\nvoid ExpandEdges(\n std::function out_edge_filter = nullptr,\n std::function in_edge_filter = nullptr,\n std::function out_neighbour_filter = nullptr,\n std::function in_neighbour_filter = nullptr\n);\n"})}),"\n",(0,n.jsx)(t.p,{children:"The above describes the three traversal methods of FrontierTraversal. It starts from the current set of vertices and, for each vertex in the set, iterates through each outgoing edge/incoming edge/outgoing and incoming edges. If the edge or neighbor vertex satisfies the user-defined filter conditions (where edge_filter is the filter function for edges and neighbour_filter is the filter function for neighbor vertices), the neighbor vertex is added to the new set of vertices."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-c",children:"ParallelVector & GetFrontier();\n"})}),"\n",(0,n.jsx)(t.p,{children:"After the expansion of the current set of vertices is finished, the new set of vertices can be obtained using the above method."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-c",children:"void ExpandOutEdges(\n std::function out_edge_filter = nullptr,\n std::function out_neighbour_filter = nullptr\n);\nvoid ExpandInEdges(\n std::function in_edge_filter = nullptr,\n std::function in_neighbour_filter = nullptr\n);\nvoid ExpandEdges(\n std::function out_edge_filter = nullptr,\n std::function in_edge_filter = nullptr,\n std::function out_neighbour_filter = nullptr,\n std::function in_neighbour_filter = nullptr\n);\n"})}),"\n",(0,n.jsx)(t.p,{children:"The three traversal methods of PathTraversal are similar to FrontierTraversal, except that the user-defined filter function adds two additional parameters: Path, which contains the path before the new edge is expanded, and IteratorHelper, which can be used to convert the vertices/edges in the path to corresponding iterators in the database. The relevant documentation can be found in the corresponding C++ API documentation."})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>s,x:()=>i});var n=r(6540);const a={},o=n.createContext(a);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[9583],{4268:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var n=r(4848),a=r(8453);const o={},s="Traversal API",i={id:"olap&procedure/procedure/traversal",title:"Traversal API",description:"This document mainly explains the Traversal API in the stored procedure of TuGraph.",source:"@site/../docs/en-US/source/9.olap&procedure/1.procedure/2.traversal.md",sourceDirName:"9.olap&procedure/1.procedure",slug:"/olap&procedure/procedure/traversal",permalink:"/tugraph-db/en/olap&procedure/procedure/traversal",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Stored Procedure Guide",permalink:"/tugraph-db/en/olap&procedure/procedure/"},next:{title:"Rust Stored Procedures",permalink:"/tugraph-db/en/olap&procedure/procedure/Rust-procedure"}},l={},d=[{value:"2. Interface",id:"2-interface",level:2},{value:"2.1. Snapshot",id:"21-snapshot",level:3},{value:"2.2. Traversal",id:"22-traversal",level:3}];function c(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"traversal-api",children:"Traversal API"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"This document mainly explains the Traversal API in the stored procedure of TuGraph."}),"\n"]}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Introduction\nThe powerful online analytical processing (OLAP) capability of TuGraph is an important feature that sets it apart from other graph databases. With the help of the C++ OLAP API (olap_on_db.h), users can quickly export a subgraph that needs to be analyzed, and then run iterative graph computing processes such as PageRank, connected components, and community detection on it, and then make corresponding decisions based on the results. The export and computation processes can be accelerated through parallel processing, achieving almost real-time analysis and processing, and avoiding the lengthy steps of traditional solutions that require exporting, transforming, and reimporting (ETL) data into dedicated analytical systems for offline processing."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"TuGraph has built-in many commonly used graph analysis algorithms and rich auxiliary interfaces, so users hardly need to implement specific graph computing processes themselves. They just need to include the header files (.h files) of the corresponding algorithm library in their own programs when implementing their own storage procedures, and link the corresponding dynamic library files (.so) during compilation. In general, the only process that users need to implement themselves is the extraction of the subgraph to be analyzed."}),"\n",(0,n.jsx)(t.p,{children:"Currently, the Traversal API only supports C++."}),"\n",(0,n.jsx)(t.h2,{id:"2-interface",children:"2. Interface"}),"\n",(0,n.jsx)(t.h3,{id:"21-snapshot",children:"2.1. Snapshot"}),"\n",(0,n.jsx)(t.p,{children:"The Snapshot template class in C++ OLAP API is used to represent extracted static subgraphs. The EdgeData is used to represent the data type of the weight used for each edge in the subgraph. If the edges do not require weights, Empty is used as the EdgeData."}),"\n",(0,n.jsx)(t.p,{children:"The extracted subgraph can be described using the constructor of the Snapshot class."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-c",children:"Snapshot::Snapshot(\n GraphDB & db,\n Transaction & txn,\n size_t flags = 0,\n std::function vertex_filter = nullptr,\n std::function out_edge_filter = nullptr\n);\n"})}),"\n",(0,n.jsx)(t.p,{children:'In the above text, "db" represents the database handle, "txn" represents the transaction handle, and "flags" represents the options used during generation, with the optional values including the following combinations: SNAPSHOT_PARALLEL indicates that multiple threads are used for parallel extraction during export; SNAPSHOT_UNDIRECTED indicates that the exported graph needs to be transformed into an undirected graph.'}),"\n",(0,n.jsx)(t.p,{children:'"vertex_filter" is a user-defined filtering function for vertices, where a return value of true indicates that the vertex needs to be included in the extracted subgraph, and vice versa.'}),"\n",(0,n.jsx)(t.p,{children:'"out_edge_filter" is a user-defined filtering function for edges, where a return value of true indicates that the edge needs to be included in the extracted subgraph, and vice versa.'}),"\n",(0,n.jsx)(t.p,{children:"When the filtering functions are set to default values, it means that all vertices/edges should be included."}),"\n",(0,n.jsx)(t.p,{children:"For other methods provided by the Snapshot class, please refer to the detailed C++ API documentation (olap_on_db.h)."}),"\n",(0,n.jsx)(t.h3,{id:"22-traversal",children:"2.2. Traversal"}),"\n",(0,n.jsx)(t.p,{children:"A common type of analysis in graph databases is to start from one or more vertices and iteratively expand and access their neighbors. Although this type of analysis can be done using Cypher, its performance is limited by the serial interpretation and execution when the depth of traversal is large. Writing stored procedures using the C++ Core API eliminates the overhead of interpretation but is still limited by the processing power of a single thread."}),"\n",(0,n.jsx)(t.p,{children:"In order to enable users to accelerate these types of analysis tasks through parallel processing, we have wrapped a Traversal framework based on the C++ OLAP API. Users can directly use the FrontierTraversal and PathTraversal classes in this framework to perform iterative traversal analysis tasks. For specific usage instructions, please refer to the corresponding C++ API documentation (lgraph_traversal.h)."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-c",children:"ParallelVector FindVertices(\n GraphDB & db,\n Transaction & txn,\n std::function filter,\n bool parallel = false\n);\n"})}),"\n",(0,n.jsx)(t.p,{children:'This method can be used to find all vertices that satisfy a certain condition (when the filter returns true). When the "parallel" parameter is set to true, the search process will be executed in parallel.'}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-c",children:"template \nParallelVector ExtractVertexData(\n GraphDB & db,\n Transaction & txn,\n ParallelVector & frontier,\n std::function extract,\n bool parallel = false\n);\n"})}),"\n",(0,n.jsx)(t.p,{children:'This method can be used to extract (VertexData type) properties from a specified set of vertices (frontier) using the extract method. When the "parallel" parameter is set to true, the extraction process will be executed in parallel.'}),"\n",(0,n.jsx)(t.p,{children:"FrontierTraversal is suitable for cases where only the traversed set of vertices is of interest. When a user needs to access information along the path (vertices/edges along the path) in the traversal process or result, PathTraversal needs to be used. Both types of traversal have four parameters in their constructor, namely the database handle db, transaction handle txn, options flags and capacity. The available options include the following combinations: TRAVERSAL_PARALLEL indicates that multiple threads are used for parallel traversal; TRAVERSAL_ALLOW_REVISITS indicates that vertices can be visited repeatedly during traversal (PathTraversal implicitly includes this option).\ncapacity indicates the capacity of the path collection during initialization."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-c",children:"void SetFrontier(size_t root_vid);\nvoid SetFrontier(ParallelVector & root_vids);\nvoid SetFrontier(std::function root_vertex_filter);\n"})}),"\n",(0,n.jsx)(t.p,{children:"Both types of traversal have three ways to set the starting vertex/vertex set for traversal. The first two methods directly specify the vertex ID, while the last method is similar to FindVertices."}),"\n",(0,n.jsx)(t.p,{children:"Both types of traversal start from the set of vertices in the current layer. They use the extension function to access each outgoing edge/incoming edge/outgoing and incoming edges, and use a user-defined filter function to determine if the extension is successful. If successful, the neighboring vertex/appended path with the edge is added to the set of vertices/paths in the next layer."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-c",children:"void ExpandOutEdges(\n std::function out_edge_filter = nullptr,\n std::function out_neighbour_filter = nullptr\n);\nvoid ExpandInEdges(\n std::function in_edge_filter = nullptr,\n std::function in_neighbour_filter = nullptr\n);\nvoid ExpandEdges(\n std::function out_edge_filter = nullptr,\n std::function in_edge_filter = nullptr,\n std::function out_neighbour_filter = nullptr,\n std::function in_neighbour_filter = nullptr\n);\n"})}),"\n",(0,n.jsx)(t.p,{children:"The above describes the three traversal methods of FrontierTraversal. It starts from the current set of vertices and, for each vertex in the set, iterates through each outgoing edge/incoming edge/outgoing and incoming edges. If the edge or neighbor vertex satisfies the user-defined filter conditions (where edge_filter is the filter function for edges and neighbour_filter is the filter function for neighbor vertices), the neighbor vertex is added to the new set of vertices."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-c",children:"ParallelVector & GetFrontier();\n"})}),"\n",(0,n.jsx)(t.p,{children:"After the expansion of the current set of vertices is finished, the new set of vertices can be obtained using the above method."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-c",children:"void ExpandOutEdges(\n std::function out_edge_filter = nullptr,\n std::function out_neighbour_filter = nullptr\n);\nvoid ExpandInEdges(\n std::function in_edge_filter = nullptr,\n std::function in_neighbour_filter = nullptr\n);\nvoid ExpandEdges(\n std::function out_edge_filter = nullptr,\n std::function in_edge_filter = nullptr,\n std::function out_neighbour_filter = nullptr,\n std::function in_neighbour_filter = nullptr\n);\n"})}),"\n",(0,n.jsx)(t.p,{children:"The three traversal methods of PathTraversal are similar to FrontierTraversal, except that the user-defined filter function adds two additional parameters: Path, which contains the path before the new edge is expanded, and IteratorHelper, which can be used to convert the vertices/edges in the path to corresponding iterators in the database. The relevant documentation can be found in the corresponding C++ API documentation."})]})}function h(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>s,x:()=>i});var n=r(6540);const a={},o=n.createContext(a);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7d21d01b.e18fdcc4.js b/assets/js/7d21d01b.02de3e80.js similarity index 99% rename from assets/js/7d21d01b.e18fdcc4.js rename to assets/js/7d21d01b.02de3e80.js index 5c4457bccf..f1706acd95 100644 --- a/assets/js/7d21d01b.e18fdcc4.js +++ b/assets/js/7d21d01b.02de3e80.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[9660],{6070:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var i=t(4848),r=t(8453);const s={},a="Python Olap API",o={id:"olap&procedure/olap/python-api",title:"Python Olap API",description:"This document mainly introduces the API usage of OlapBase OlapOnDB and OlapOnDisk in Python",source:"@site/../docs/en-US/source/9.olap&procedure/2.olap/5.python-api.md",sourceDirName:"9.olap&procedure/2.olap",slug:"/olap&procedure/olap/python-api",permalink:"/tugraph-db/en/olap&procedure/olap/python-api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"OlapOnDisk API",permalink:"/tugraph-db/en/olap&procedure/olap/olap-on-disk-api"},next:{title:"TuGraph Built-in Algorithm Description",permalink:"/tugraph-db/en/olap&procedure/olap/algorithms"}},l={},c=[{value:"Table of contents",id:"table-of-contents",level:2},{value:"1 Overview",id:"1-overview",level:2},{value:"2. Configuration requirements",id:"2-configuration-requirements",level:2},{value:"3. Cython",id:"3-cython",level:2},{value:"4. Olap API",id:"4-olap-api",level:2},{value:"Atomic operations",id:"atomic-operations",level:3},{value:"Vertex collection class ParallelBitset",id:"vertex-collection-class-parallelbitset",level:3},{value:"Vertex array class ParallelVector",id:"vertex-array-class-parallelvector",level:3},{value:"Custom Data Structure",id:"custom-data-structure",level:3},{value:"Graph class OlapBase",id:"graph-class-olapbase",level:3},{value:"Graph class OlapOnDB:",id:"graph-class-olapondb",level:3},{value:"Graph class OlapOnDisk",id:"graph-class-olapondisk",level:3},{value:"ConfigBase:",id:"configbase",level:4},{value:"5. lgraph_db API",id:"5-lgraph_db-api",level:2},{value:"VertexIndexIterator",id:"vertexindexiterator",level:3},{value:"Galaxy",id:"galaxy",level:3},{value:"GraphDB:",id:"graphdb",level:3},{value:"Transaction:",id:"transaction",level:3},{value:"PyGalaxy:",id:"pygalaxy",level:3},{value:"PyGraphDB:",id:"pygraphdb",level:3},{value:"6. Algorithm plug-in example",id:"6-algorithm-plug-in-example",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"python-olap-api",children:"Python Olap API"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"This document mainly introduces the API usage of OlapBase OlapOnDB and OlapOnDisk in Python"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"table-of-contents",children:"Table of contents"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#1-overview",children:"1.Overview"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#2-configuration-requirements",children:"2.Configuration Requirements"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#3-cython",children:"3.Cython"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#4-olap-api",children:"4.Olap API"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#atomic-operations",children:"4.1. Atomic operations"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#vertex-collection-class-parallelbitset",children:"4.2. Vertex collection class ParallelBitset"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#vertex-array-class-parallelvector",children:"4.3. Vertex array class ParallelVector"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#custom-data-structure",children:"4.4. Custom data structure"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#graph-class-olapbase",children:"4.5.Graph class OlapBase"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#graph-class-olapondb",children:"4.6. Graph Class OlapOnDB"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#graph-class-olapondisk",children:"4.7.Graph class OlapOnDisk"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#5-lgraph_db-api",children:"5.lgraph DB API"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#6-algorithm-plug-in-example",children:"6.Algorithm plugin example"})}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"1-overview",children:"1 Overview"}),"\n",(0,i.jsx)(n.p,{children:"This manual will introduce the simple configuration required to use the Python interface of the TuGraph graph computing system, and explain the TuGraph Python API in conjunction with the code. For details about the functions of class ParallelBitset, OlapBase, etc., see olap-base-api.md, olap-on-db-api.md and olap-on-disk-api.md."}),"\n",(0,i.jsx)(n.h2,{id:"2-configuration-requirements",children:"2. Configuration requirements"}),"\n",(0,i.jsx)(n.p,{children:"If you want to use TuGraph to write and compile your own applications, the required configuration requirements are:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Linux operating system, currently running successfully on Ubuntu16.04.2 and Centos7 systems."}),"\n",(0,i.jsx)(n.li,{children:"A compiler that supports C++17 requires GCC version 5.4.1 or later."}),"\n",(0,i.jsx)(n.li,{children:"Cython, version 3.0a1 or above is required, and the tested version is 3.0.0a11"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"3-cython",children:"3. Cython"}),"\n",(0,i.jsx)(n.p,{children:"Cython is an efficient programming language that is a superset of Python. Cython can translate .py files into C/C++ codes and compile them into Python extension modules, which can be called through import in Python. In TuGraph, all Python procedures are compiled into Python extension modules by Cython and then used."}),"\n",(0,i.jsx)(n.p,{children:"The main advantage of using Cython is that it combines the simplicity and ease of use of Python with the performance of C/C++. The TuGraph Python interface is implemented using Cython."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"https://cython.readthedocs.io/en/latest/index.html",children:"Cython Documentation"})}),"\n",(0,i.jsx)(n.h2,{id:"4-olap-api",children:"4. Olap API"}),"\n",(0,i.jsxs)(n.p,{children:["The Olap API is used for graph computing and is implemented in C++. The usage and functions are basically the same as the C++ interface. To use the API in a Python file, the interfaces declared in procedures/algo_cython/olap_base.pxd must be imported using ",(0,i.jsx)(n.code,{children:"cython.cimports.olap_base import *"}),". The Python file can only be run after being compiled by Cython."]}),"\n",(0,i.jsx)(n.h3,{id:"atomic-operations",children:"Atomic operations"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"cas[T](ptr: cython.pointer(T), oldv: T, newv: T)-> cython.bint"}),": If the value pointed to by ptr is equal to oldv, assign the value pointed to by ptr to newv and return True, otherwise return False."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"write_min[T](a: cython.pointer(T), b: T)->cython.bint"}),": If b is smaller than the value pointed to by a, then assign the value pointed to by a to b and return true, otherwise return false."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"write_max[T](a: cython.pointer(T), b: T)->cython.bint"}),": If b is greater than the value pointed to by a, then assign the value pointed to by a to b and return true, otherwise return false."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"write_add[T](a: cython.pointer(T), b: T)->cython.bint"}),": Add the value of b to the value pointed to by a."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"write_sub[T](a: cython.pointer(T), b: T)->cython.bint"}),": Subtract the value pointed to by a from the value of b."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"vertex-collection-class-parallelbitset",children:"Vertex collection class ParallelBitset"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Size() -> size_t"}),": Indicates the number of vertices in the Bitmap."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ParallelBitset(size: size_t)"}),": Initializes size and data, where the length of data is (size >> 6) + 1."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Clear() -> cython.void"}),": Empties the collection."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Fill() -> cython.void"}),": Adds all vertices to the set."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Has(i: size_t) -> cython.bint"}),": Checks if vertex i is in the set."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Add(i: size_t) -> cython.bint"}),": Adds vertex i to the set."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Swap(other: ParallelBitset) -> cython.void"}),": Exchanges elements with another ParallelBitset set."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"vertex-array-class-parallelvector",children:"Vertex array class ParallelVector"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ParallelVector[T](size_t capacity)"}),": Constructs a ParallelVector, where capacity is the initial capacity of the vertex array."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"operator[](i: size_t) -> T"}),": Returns the data at index i."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"begin() -> cython.pointer(T)"}),": Returns the start pointer of ParallelVector."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"end() -> cython.pointer(T)"}),": Returns the end pointer of ParallelVector. The usage of begin() and end() is similar to the begin and end pointers of the vector container, and these two pointers can be used to sequentially access the array."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Back() -> T"}),": Returns the last data of ParallelVector."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Data() -> cython.pointer(T)"}),": Indicates the data of the array itself."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Destroy() -> cython.void"}),": Clears the data in the ParallelVector array and deletes the array."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Size() -> size_t"}),": Indicates the number of data in ParallelVector."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Resize(size: size_t) -> cython.void"}),": Changes ParallelVector to size, which should be greater than or equal to the size before the change and less than capacity."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Clear() -> cython.void"}),": Clears the data in ParallelVector."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ReAlloc(capacity: size_t) -> cython.void"}),": Allocates a new capacity size to ParallelVector. If the array has data, it migrates the data to the new memory."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Fill(elem: T) -> cython.void"}),": Assigns elem to all data of ParallelVector."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Append(elem: T, atomic: cython.bint = true) -> cython.void"}),": Adds a data to the end of ParallelVector."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Swap(other: ParallelVector[T]) -> cython.void"}),": Exchanges data with another ParallelVector."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Copy() -> ParallelVector[T]"}),": Copies the current ParallelVector data and stores it in the copy array."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"custom-data-structure",children:"Custom Data Structure"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Empty"}),": A special data type whose content is empty."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"EdgeUnit[EdgeData]"}),": Indicates the edge whose weight type is EdgeData, used to parse the input file, including three member variables:\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"src: size_t"}),": starting vertex of the edge"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"dst: size_t"}),": end of the edge"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"edge_data: EdgeData"}),": edge weight"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"AdjUnit[EdgeData]"}),": indicates the edge whose weight type is EdgeData, which is used in the batch calculation process and contains two member variables:\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"neighbor: size_t"}),": neighbor vertex of the edge"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"edge_data: EdgeData"}),": edge weight"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"AdjList[EdgeData]"}),": The adjacency list of vertices whose weight type is EdgeData, often used to represent the set of incoming and outgoing edges of vertices, including three member functions:\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"begin()->cython.pointer(AdjUnit[T])"}),": the starting pointer of the list"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"end()->cython.pointer(AdjUnit[T])"}),": the end pointer of the list"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"operator[](i: size_t)-> AdjUnit[EdgeData]"}),": the data whose subscript is i"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"graph-class-olapbase",children:"Graph class OlapBase"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"NumVertices()->size_t"}),": get the number of vertices"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"NumEdges()-> size_t"}),": get the number of edges"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"OutDegree(vid: size_t)-> size_t"}),": out-degree of vertex vid"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"InDegree(vid: size_t)->size_t"}),": in-degree of the vertex vid"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"AllocVertexArray[VertexData]() ->ParallelVector[VertexData]"}),": Allocates an array of type VertexData with size as the number of vertices"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"AllocVertexSubset()-> ParallelBitset"}),": Assigns a subset of ParallelBitsets to denote whether the state of all vertices is activated"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"OutEdges(vid: size_t)-> AdjList[EdgeData]"}),": Get the list of all outgoing edges of vertex v"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"InEdges(vid: size_t)-> AdjList[EdgeData]"}),": Get the list of all incoming edges of vertex v"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"Transpose()->cython.void"}),": transpose of a directed graph"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"LoadFromArray(edge_array: cython.p_char, input_vertices: size_t, input_edges: size_t, edge_direction_policy: EdgeDirectionPolicy)"}),": Loads the graph data from the array, contains four parameters, the meaning of which are respectively:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"edge_array"})," : reads the data from the array into the graph. Normally, the array contains multiple edges."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"input_vertices"}),": specifies the number of vertices read into the graph by the array."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"input_edges"})," : specifies the number of edges that the array reads into the image."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"edge_direction_policy"})," : indicates that the graph is directed or undirected. The graph can be divided into three modes: DUAL_DIRECTION, MAKE_SYMMETRIC, and INPUT_SYMMETRIC. For details, see 'enum EdgeDirectionPolicy' in the config.h file in the core folder."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"AcquireVertexLock(vid: size_t)-> cython.void"}),": locks a vertex vid and prohibits other threads from accessing the vertex data corresponding to this lock"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"void ReleaseVertexLock(vid: size_t)-> cython.void"}),": unlocks the vertex vid and all threads can access the vertex data corresponding to the lock"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"TuGraph provides two batch operations to perform point-centric batch processing in parallel, which is slightly different from C++ in Python."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'# Function name: ProcessVertexInRange[ReducedSum, Algorithm](\n# work: (algo: Algorithm, vi: size_t)-> ReducedSum,\n# lower: size_t, upper: size_t,\n# algo: Algorithm,\n# zero: ReducedSum = 0,\n# reduce: (a: ReducedSum, b: ReducedSum)-> ReducedSum = reduce_plus[ReducedSum])\n#\n# Function purpose: Executes the work function on nodes whose node numbers are between lower and upper in the Graph. The fourth parameter indicates the base of accumulation, which is 0 by default.\n# The fifth parameter indicates that the iterative reduce function operation is performed on the node return value after each work process, and the default is the accumulation operation.\n# For specific implementation, please refer to the specific code in include/lgraph/olap_base.h\n#\n# Example usage: Count the number of vertices with edges in the parent array.\n\nimport cython\nfrom cython.cimports.olap_base import *\n\n\n@cython.cclass\nclass CountCore:\n graph: cython.pointer(OlapBase[Empty])\n parent: ParallelVector[size_t]\n\n @cython.cfunc\n @cython.nogil\n def Work(self, vi: size_t) -> size_t:\n if self.graph.OutDegree(self.parent[vi]) > 0:\n return 1\n return 0\n\n def run(self, pointer_g: cython.pointer(OlapBase[Empty])):\n self.graph = pointer_g\n self.parent = self.graph.AllocVertexArray[size_t]()\n vertex_num: size_t\n vertex_num = self.graph.ProcessVertexInRange[size_t, CountCore](self.Work, 0, self.parent.Size(), self)\n print("the number is", vertex_num)\n\nif __name__ == "__main__":\n count_core = CountCore()\n count_core.run(cython.address(g))\n'})}),"\n",(0,i.jsx)(n.p,{children:"g is the instantiated object of graph class OlapBase"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'# Function name: ProcessVertexActive[ReducedSum, Algorithm](\n# work: (algo: Algorithm, vi: size_t)-> ReducedSum,\n# active: ParallelBitset,\n# algo: Algorithm,\n# zero: ReducedSum = 0,\n# reduce: (a: ReducedSum, b: ReducedSum)-> ReducedSum = reduce_plus[ReducedSum])\n#\n# Function purpose: Execute the work function on the nodes corresponding to 1 in the active_vertices bitset. The third parameter indicates the base of accumulation, which is 0 by default;\n# The fourth parameter indicates that the iterative reduce function operation is performed on the node return value after each work process, and the default is the accumulation operation.\n# For specific implementation, please refer to the specific code in /include/lgraph/olap_base.h\n#\n# Usage example: Output all out-degree neighbors of nodes 1, 2, and 3 in the Graph, and count the total out-degree of these three nodes.\n\nimport cython\nfrom cython.cimports.olap_base import *\nfrom cython.cimports.libc.stdio import printf\n\n\n@cython.cclass\nclass NeighborCore:\n graph: cython.pointer(OlapBase[Empty])\n active_in: ParallelBitset\n\n @cython.cfunc\n @cython.nogil\n def Work(self, vi: size_t) -> size_t:\n degree = self. graph. OutDegree(vi)\n dst: size_t\n edges = self. graph. OutEdges(vi)\n local_out_degree: size_t\n for i in range(degree):\n dst = edges[i].neighbor\n printf("node %lu has neighbor %lu\\n", vi, dst)\n local_out_degree += 1\n return local_out_degree\n\n def run(self, pointer_g: cython.pointer(OlapBase[Empty])):\n self.graph = pointer_g\n self.active_in = self.graph.AllocVertexSubset()\n self. active_in. Add(1)\n self. active_in. Add(2)\n self. active_in. Add(3)\n total_outdegree = cython.declare(\n size_t,\n self.graph.ProcessVertexActive[size_t, CountCore](self.Work, self.active_in, self))\n printf("total outdegree of node1,2,3 is %lu\\n",total_outdegree)\n\nif __name__ == "__main__":\n neighbor_core = NeighborCore()\n neighbor_core.run(cython.address(g))\n'})}),"\n",(0,i.jsx)(n.p,{children:"As shown in the above two examples, ProcessVertexActive and ProcessVertexInRange in Python require an additional algorithm class pointer parameter compared to their C++ counterparts. The Work function is generally used as a member function of the algorithm class to access member variables, such as in the graph and ParallelVector parent examples shown above. When calling the batch function, the Work function and the self pointer of the algorithm class are passed to the batch function."}),"\n",(0,i.jsxs)(n.p,{children:["The Work function will be called in multiple threads, so the @cython.nogil decorator is added to release the Python global interpretation lock. In code executed by multiple threads, such as the Work function in the batch function, variables are better declared as C/C++ types using ",(0,i.jsx)(n.code,{children:"dst: type"})," or ",(0,i.jsx)(n.code,{children:"dst = cython.declare(type)"}),". This is because Python objects cannot be used in multi-threaded code."]}),"\n",(0,i.jsx)(n.h3,{id:"graph-class-olapondb",children:"Graph class OlapOnDB:"}),"\n",(0,i.jsx)(n.p,{children:"Parallelize to create a directed graph:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"olapondb = OlapOnDB[Empty](db, txn, SNAPSHOT_PARALLEL)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Parallelize to create an undirected graph"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"olapondb = OlapOnDB[Empty](db, txn, SNAPSHOT_PARALLEL | SNAPSHOT_UNDIRECTED)\n"})}),"\n",(0,i.jsx)(n.p,{children:"ID_MAPPING creates a directed graph"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"olapondb = OlapOnDB[Empty](db, txn, SNAPSHOT_PARALLEL | SNAPSHOT_IDMAPPING)\n"})}),"\n",(0,i.jsx)(n.h3,{id:"graph-class-olapondisk",children:"Graph class OlapOnDisk"}),"\n",(0,i.jsx)(n.h4,{id:"configbase",children:"ConfigBase:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"ConfigBase()"}),": Constructor"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"std::string input_dir"}),": graph edge table data path"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"std::string output_dir"}),": output path"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"Load(config: ConfigBase[EdgeData], edge_direction_policy: EdgeDirectionPolicy)-> void"}),": read in graph data"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"5-lgraph_db-api",children:"5. lgraph_db API"}),"\n",(0,i.jsx)(n.p,{children:"Please refer to the files procedures/algo_cython/lgraph_db.pxd and lgraph_db_python.py for the lgraph_db API."}),"\n",(0,i.jsxs)(n.p,{children:["The usage and functions of the interface in lgraph_db.pxd are basically the same as the C++ interface. The interface declared in lgraph_db.pxd is implemented in C++. In the py file, it must be imported by ",(0,i.jsx)(n.code,{children:"cython.cimports.olap_db import *"})," and compiled by the Cython file to run."]}),"\n",(0,i.jsx)(n.h3,{id:"vertexindexiterator",children:"VertexIndexIterator"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"GetVid()-> int64_t"}),": Get the vid of the vertex"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"galaxy",children:"Galaxy"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Galaxy(dir_path: std::string)"}),": constructor, dir_path is the db path"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"SetCurrentUser(user: std::string, password: std::string)-> cython.void"}),": set user"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"SetUser(user: std::string)-> cython.void"}),": set user"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"OpenGraph(graph: std::string, read_only: bint)-> GraphDB"}),": create GraphDB"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"graphdb",children:"GraphDB:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CreateReadTxn()-> Transaction"}),": create a read-only transaction"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CreateWriteTxn()-> Transaction"}),": create a write transaction"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ForkTxn(txn: Transaction)-> Transaction"}),": Copy transactions, only read transactions can be copied"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"transaction",children:"Transaction:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"GetVertexIndexIterator(\n label: std::string,\n field: std::string,\n key_start: std::string,\n key_end: std::string) -> VertexIndexIterator\n"})}),"\n",(0,i.jsx)(n.p,{children:"Gets index iterator. The iterator has field value [key_start, key_end]. So key_start=key_end=v returns an iterator pointing to all vertexes that has field value v"}),"\n",(0,i.jsxs)(n.p,{children:["lgraph_db_python.py packages the C++ classes Galaxy and GraphDB from lgraph_db.pxd as Python classes. After compiling lgraph_db_python.py into a Python extension, you can directly access it in a Python file or from the Python command line by importing it with ",(0,i.jsx)(n.code,{children:"import lgraph_db_python"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"pygalaxy",children:"PyGalaxy:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"PyGalaxy(self, dir_path: str)"}),": constructor, dir_path is the db path"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"SetCurrentUser(self, user: str password: str)-> void"}),": set user"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"SetUser(self, user: std::string)-> void"}),": set user"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"OpenGraph(self, graph: str, read_only: bool)-> PyGraphDB"}),": create PyGraphDB"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"pygraphdb",children:"PyGraphDB:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"get_pointer(self)->cython.Py_ssize_t"}),": address of C++ class GraphDB"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"6-algorithm-plug-in-example",children:"6. Algorithm plug-in example"}),"\n",(0,i.jsx)(n.p,{children:"The following is a code example of the BFS algorithm implemented in Python:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'# cython: language_level=3, cpp_locals=True, boundscheck=False, wraparound=False, initializedcheck=False\n# distutils: language = c++\n\n# Comments work as follows:\n# language_level=3: use Python3\n# cpp_locals=True: C++17 is required, and std::optional is used to manage C++ objects in Python code, which can avoid copy construction of C++ objects\n# boundscheck=False: Turn off bounds checking for indexes\n# wraparound=False: Turn off the processing of negative subscripts (similar to Python List)\n# initializedcheck=False: Turn off checking whether the memory is initialized, and the running performance will be faster after turning off the check\n# language = c++: translate this .py file to C++ instead of C file. TuGraph uses a lot of template functions, so C++ should be used\n\nimport json\n\nimport cython\nfrom cython.cimports.olap_base import *\nfrom cython.cimports.lgraph_db import *\n# From procedures/algo_cython/ cimportolap_base.pxd and lgraph_db.pxd, similar to #include "xxx.h" in C++\n\nfrom cython.cimports.libc.stdio import printf\n# Similar to #include in C++\n# Other common ones include cython.cimports.libcpp.unordered_map, etc.\n\nimport time\n\n@cython.cclass\n# cython.cclass indicates that BFSCore is a C-type Class\nclass BFSCore:\n graph: cython.pointer(OlapBase[Empty])\n # cython.pointer(OlapBase[Empty]) indicates the pointer of OlapBase[Empty], similar to OlapBase[Empty]* in C++\n # Cython provides common types of pointers, such as cython.p_int, cython.p_char, etc.\n parent: ParallelVector[size_t]\n active_in: ParallelBitset\n active_out: ParallelBitset\n root: size_t\n # root: size_t declares root as a C++ size_t type variable, equivalent to root = cython.declare(size_t)\n # Variables that do not declare a type are Python object types\n # Declaring variable types will greatly improve performance, and in the multi-threaded part, only C/C++ type variables can be accessed\n\n @cython.cfunc\n # cython.cfunc indicates that Work is a C-type function, and the parameters and return values should be declared\n # cfunc has good performance and can accept C/C++ objects as parameters and return values, but it cannot be called in other python files\n # Similar to cython.ccall, such as Standalone function, which can be called in other python files\n @cython.nogil\n # cython.nogil means to release the Python global interpretation lock. In the part modified by nogil, Python objects cannot be accessed\n # In the multi-threaded part, there should be nogil decorator\n @cython.exceptval(check=False)\n # cython.exceptval(check=False) means that exception propagation is disabled, and Python exceptions raised inside the function will be ignored\n def Work(self, vi: size_t) -> size_t:\n degree = cython.declare(size_t, self.graph.OutDegree(vi))\n out_edges = cython.declare(AdjList[Empty], self.graph.OutEdges(vi))\n i = cython.declare(size_t, 0)\n local_num_activations = cython.declare(size_t, 0)\n dst: size_t\n for i in range(degree):\n dst = out_edges[i].neighbor\n if self.parent[dst] == cython.cast(size_t, -1):\n # parent[dst] == -1 means that dst has not been visited by bfs\n if self.active_out.Add(dst):\n # Set dst as an active node; ParallelBitmap.Add is an atomic operation to prevent double calculation\n self.parent[dst] = vi\n local_num_activations += 1\n return local_num_activations\n\n @cython.cfunc\n @cython.nogil\n @cython.exceptval(check=False)\n def run(self, g: cython.pointer(OlapBase[Empty]), r: size_t) -> cython. size_t:\n self. graph = g\n self.root = r\n self.active_in = g.AllocVertexSubset()\n self.active_out = g.AllocVertexSubset()\n self.parent = g.AllocVertexArray[size_t]()\n self. parent. Fill(-1)\n num_vertices = cython.declare(size_t, self.graph.NumVertices())\n printf("num_vertices = %lu\\n", num_vertices)\n self.parent[self.root] = self.root\n num_activations = cython.declare(size_t, 1)\n discovered_vertices = cython.declare(size_t, num_activations)\n self. active_in. Add(self. root)\n while num_activations > 0:\n self. active_out. Clear()\n num_activations = g.ProcessVertexActive[size_t, BFSCore](self.Work, self.active_in, self)\n discovered_vertices += num_activations\n self. active_out. Swap(self. active_in)\n printf("num_activations = %lu\\n", num_activations)\n return discovered_vertices\n\n\n@cython.cfunc\ndef procedure_process(db: cython.pointer(GraphDB), request: dict, response: dict) -> cython.bint:\n cost = time. time()\n root_id = "0"\n label = "node"\n field = "id"\n if "root" in request:\n root_id = request["root"]\n if "label" in request:\n label = request["label"]\n if "field" in request:\n field = request["field"]\n\n txn = db.CreateReadTxn()\n olapondb = OlapOnDB[Empty](db[0], txn, SNAPSHOT_PARALLEL)\n # Create OlapOnDB in parallel\n # Cython does not support dereference operations such as *db, use db[0] to dereference\n root_vid = txn.GetVertexIndexIterator(\n label.encode(\'utf-8\'), field.encode(\'utf-8\'),\n root_id.encode(\'utf-8\'), root_id.encode(\'utf-8\')\n ).GetVid()\n # Get the iterator of the root node through GetVertexIndexIterator based on the root node label name, field name and field value (root_id),\n # and get the vid through the iterator. When there is no ID_MAPPING, the vid is the same as the id in OlapOnDB\n cost = time. time() - cost\n printf("prepare_cost = %lf s\\n", cython.cast(cython.double, cost))\n a = BFSCore()\n cost = time. time()\n count = a. run(cython. address(olapondb), root_vid)\n cost = time. time() - cost\n printf("core_cost = %lf s\\n", cython.cast(cython.double, cost))\n response["found_vertices"] = count\n response["num_vertices"] = olapondb. NumVertices()\n response["num_edges"] = olapondb. NumEdges()\n return True\n\n\n@cython.ccall\ndef Process(db: lgraph_db_python.PyGraphDB, inp: bytes):\n # Process is the plug-in entry in embed mode and procedure mode, modified with cython.ccall\n # The Process function must be named Process, and the parameters are lgraph_db_python.PyGraphDB and bytes\n # The return value must be (bool, str)\n _inp = inp.decode("utf-8")\n request = json.loads(_inp)\n response = {}\n addr = cython.declare(cython.Py_ssize_t, db.get_pointer())\n # Get the address of the GraphDB object in the PyGraphDB, convert it to a pointer and pass it\n procedure_process(cython.cast(cython.pointer(GraphDB), addr),\n request, response)\n return (True, json.dumps(response))\n\n'})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var i=t(6540);const r={},s=i.createContext(r);function a(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[9660],{6070:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>c});var i=t(4848),r=t(8453);const s={},a="Python Olap API",o={id:"olap&procedure/olap/python-api",title:"Python Olap API",description:"This document mainly introduces the API usage of OlapBase OlapOnDB and OlapOnDisk in Python",source:"@site/../docs/en-US/source/9.olap&procedure/2.olap/5.python-api.md",sourceDirName:"9.olap&procedure/2.olap",slug:"/olap&procedure/olap/python-api",permalink:"/tugraph-db/en/olap&procedure/olap/python-api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"OlapOnDisk API",permalink:"/tugraph-db/en/olap&procedure/olap/olap-on-disk-api"},next:{title:"TuGraph Built-in Algorithm Description",permalink:"/tugraph-db/en/olap&procedure/olap/algorithms"}},l={},c=[{value:"Table of contents",id:"table-of-contents",level:2},{value:"1 Overview",id:"1-overview",level:2},{value:"2. Configuration requirements",id:"2-configuration-requirements",level:2},{value:"3. Cython",id:"3-cython",level:2},{value:"4. Olap API",id:"4-olap-api",level:2},{value:"Atomic operations",id:"atomic-operations",level:3},{value:"Vertex collection class ParallelBitset",id:"vertex-collection-class-parallelbitset",level:3},{value:"Vertex array class ParallelVector",id:"vertex-array-class-parallelvector",level:3},{value:"Custom Data Structure",id:"custom-data-structure",level:3},{value:"Graph class OlapBase",id:"graph-class-olapbase",level:3},{value:"Graph class OlapOnDB:",id:"graph-class-olapondb",level:3},{value:"Graph class OlapOnDisk",id:"graph-class-olapondisk",level:3},{value:"ConfigBase:",id:"configbase",level:4},{value:"5. lgraph_db API",id:"5-lgraph_db-api",level:2},{value:"VertexIndexIterator",id:"vertexindexiterator",level:3},{value:"Galaxy",id:"galaxy",level:3},{value:"GraphDB:",id:"graphdb",level:3},{value:"Transaction:",id:"transaction",level:3},{value:"PyGalaxy:",id:"pygalaxy",level:3},{value:"PyGraphDB:",id:"pygraphdb",level:3},{value:"6. Algorithm plug-in example",id:"6-algorithm-plug-in-example",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"python-olap-api",children:"Python Olap API"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"This document mainly introduces the API usage of OlapBase OlapOnDB and OlapOnDisk in Python"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"table-of-contents",children:"Table of contents"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#1-overview",children:"1.Overview"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#2-configuration-requirements",children:"2.Configuration Requirements"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#3-cython",children:"3.Cython"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#4-olap-api",children:"4.Olap API"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#atomic-operations",children:"4.1. Atomic operations"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#vertex-collection-class-parallelbitset",children:"4.2. Vertex collection class ParallelBitset"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#vertex-array-class-parallelvector",children:"4.3. Vertex array class ParallelVector"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#custom-data-structure",children:"4.4. Custom data structure"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#graph-class-olapbase",children:"4.5.Graph class OlapBase"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#graph-class-olapondb",children:"4.6. Graph Class OlapOnDB"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#graph-class-olapondisk",children:"4.7.Graph class OlapOnDisk"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#5-lgraph_db-api",children:"5.lgraph DB API"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#6-algorithm-plug-in-example",children:"6.Algorithm plugin example"})}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"1-overview",children:"1 Overview"}),"\n",(0,i.jsx)(n.p,{children:"This manual will introduce the simple configuration required to use the Python interface of the TuGraph graph computing system, and explain the TuGraph Python API in conjunction with the code. For details about the functions of class ParallelBitset, OlapBase, etc., see olap-base-api.md, olap-on-db-api.md and olap-on-disk-api.md."}),"\n",(0,i.jsx)(n.h2,{id:"2-configuration-requirements",children:"2. Configuration requirements"}),"\n",(0,i.jsx)(n.p,{children:"If you want to use TuGraph to write and compile your own applications, the required configuration requirements are:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Linux operating system, currently running successfully on Ubuntu16.04.2 and Centos7 systems."}),"\n",(0,i.jsx)(n.li,{children:"A compiler that supports C++17 requires GCC version 5.4.1 or later."}),"\n",(0,i.jsx)(n.li,{children:"Cython, version 3.0a1 or above is required, and the tested version is 3.0.0a11"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"3-cython",children:"3. Cython"}),"\n",(0,i.jsx)(n.p,{children:"Cython is an efficient programming language that is a superset of Python. Cython can translate .py files into C/C++ codes and compile them into Python extension modules, which can be called through import in Python. In TuGraph, all Python procedures are compiled into Python extension modules by Cython and then used."}),"\n",(0,i.jsx)(n.p,{children:"The main advantage of using Cython is that it combines the simplicity and ease of use of Python with the performance of C/C++. The TuGraph Python interface is implemented using Cython."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.a,{href:"https://cython.readthedocs.io/en/latest/index.html",children:"Cython Documentation"})}),"\n",(0,i.jsx)(n.h2,{id:"4-olap-api",children:"4. Olap API"}),"\n",(0,i.jsxs)(n.p,{children:["The Olap API is used for graph computing and is implemented in C++. The usage and functions are basically the same as the C++ interface. To use the API in a Python file, the interfaces declared in procedures/algo_cython/olap_base.pxd must be imported using ",(0,i.jsx)(n.code,{children:"cython.cimports.olap_base import *"}),". The Python file can only be run after being compiled by Cython."]}),"\n",(0,i.jsx)(n.h3,{id:"atomic-operations",children:"Atomic operations"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"cas[T](ptr: cython.pointer(T), oldv: T, newv: T)-> cython.bint"}),": If the value pointed to by ptr is equal to oldv, assign the value pointed to by ptr to newv and return True, otherwise return False."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"write_min[T](a: cython.pointer(T), b: T)->cython.bint"}),": If b is smaller than the value pointed to by a, then assign the value pointed to by a to b and return true, otherwise return false."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"write_max[T](a: cython.pointer(T), b: T)->cython.bint"}),": If b is greater than the value pointed to by a, then assign the value pointed to by a to b and return true, otherwise return false."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"write_add[T](a: cython.pointer(T), b: T)->cython.bint"}),": Add the value of b to the value pointed to by a."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"write_sub[T](a: cython.pointer(T), b: T)->cython.bint"}),": Subtract the value pointed to by a from the value of b."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"vertex-collection-class-parallelbitset",children:"Vertex collection class ParallelBitset"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Size() -> size_t"}),": Indicates the number of vertices in the Bitmap."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ParallelBitset(size: size_t)"}),": Initializes size and data, where the length of data is (size >> 6) + 1."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Clear() -> cython.void"}),": Empties the collection."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Fill() -> cython.void"}),": Adds all vertices to the set."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Has(i: size_t) -> cython.bint"}),": Checks if vertex i is in the set."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Add(i: size_t) -> cython.bint"}),": Adds vertex i to the set."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Swap(other: ParallelBitset) -> cython.void"}),": Exchanges elements with another ParallelBitset set."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"vertex-array-class-parallelvector",children:"Vertex array class ParallelVector"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ParallelVector[T](size_t capacity)"}),": Constructs a ParallelVector, where capacity is the initial capacity of the vertex array."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"operator[](i: size_t) -> T"}),": Returns the data at index i."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"begin() -> cython.pointer(T)"}),": Returns the start pointer of ParallelVector."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"end() -> cython.pointer(T)"}),": Returns the end pointer of ParallelVector. The usage of begin() and end() is similar to the begin and end pointers of the vector container, and these two pointers can be used to sequentially access the array."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Back() -> T"}),": Returns the last data of ParallelVector."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Data() -> cython.pointer(T)"}),": Indicates the data of the array itself."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Destroy() -> cython.void"}),": Clears the data in the ParallelVector array and deletes the array."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Size() -> size_t"}),": Indicates the number of data in ParallelVector."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Resize(size: size_t) -> cython.void"}),": Changes ParallelVector to size, which should be greater than or equal to the size before the change and less than capacity."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Clear() -> cython.void"}),": Clears the data in ParallelVector."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ReAlloc(capacity: size_t) -> cython.void"}),": Allocates a new capacity size to ParallelVector. If the array has data, it migrates the data to the new memory."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Fill(elem: T) -> cython.void"}),": Assigns elem to all data of ParallelVector."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Append(elem: T, atomic: cython.bint = true) -> cython.void"}),": Adds a data to the end of ParallelVector."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Swap(other: ParallelVector[T]) -> cython.void"}),": Exchanges data with another ParallelVector."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Copy() -> ParallelVector[T]"}),": Copies the current ParallelVector data and stores it in the copy array."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"custom-data-structure",children:"Custom Data Structure"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Empty"}),": A special data type whose content is empty."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"EdgeUnit[EdgeData]"}),": Indicates the edge whose weight type is EdgeData, used to parse the input file, including three member variables:\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"src: size_t"}),": starting vertex of the edge"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"dst: size_t"}),": end of the edge"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"edge_data: EdgeData"}),": edge weight"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"AdjUnit[EdgeData]"}),": indicates the edge whose weight type is EdgeData, which is used in the batch calculation process and contains two member variables:\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"neighbor: size_t"}),": neighbor vertex of the edge"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"edge_data: EdgeData"}),": edge weight"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"AdjList[EdgeData]"}),": The adjacency list of vertices whose weight type is EdgeData, often used to represent the set of incoming and outgoing edges of vertices, including three member functions:\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"begin()->cython.pointer(AdjUnit[T])"}),": the starting pointer of the list"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"end()->cython.pointer(AdjUnit[T])"}),": the end pointer of the list"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"operator[](i: size_t)-> AdjUnit[EdgeData]"}),": the data whose subscript is i"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"graph-class-olapbase",children:"Graph class OlapBase"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"NumVertices()->size_t"}),": get the number of vertices"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"NumEdges()-> size_t"}),": get the number of edges"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"OutDegree(vid: size_t)-> size_t"}),": out-degree of vertex vid"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"InDegree(vid: size_t)->size_t"}),": in-degree of the vertex vid"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"AllocVertexArray[VertexData]() ->ParallelVector[VertexData]"}),": Allocates an array of type VertexData with size as the number of vertices"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"AllocVertexSubset()-> ParallelBitset"}),": Assigns a subset of ParallelBitsets to denote whether the state of all vertices is activated"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"OutEdges(vid: size_t)-> AdjList[EdgeData]"}),": Get the list of all outgoing edges of vertex v"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"InEdges(vid: size_t)-> AdjList[EdgeData]"}),": Get the list of all incoming edges of vertex v"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"Transpose()->cython.void"}),": transpose of a directed graph"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"LoadFromArray(edge_array: cython.p_char, input_vertices: size_t, input_edges: size_t, edge_direction_policy: EdgeDirectionPolicy)"}),": Loads the graph data from the array, contains four parameters, the meaning of which are respectively:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"edge_array"})," : reads the data from the array into the graph. Normally, the array contains multiple edges."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"input_vertices"}),": specifies the number of vertices read into the graph by the array."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"input_edges"})," : specifies the number of edges that the array reads into the image."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"edge_direction_policy"})," : indicates that the graph is directed or undirected. The graph can be divided into three modes: DUAL_DIRECTION, MAKE_SYMMETRIC, and INPUT_SYMMETRIC. For details, see 'enum EdgeDirectionPolicy' in the config.h file in the core folder."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"AcquireVertexLock(vid: size_t)-> cython.void"}),": locks a vertex vid and prohibits other threads from accessing the vertex data corresponding to this lock"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"void ReleaseVertexLock(vid: size_t)-> cython.void"}),": unlocks the vertex vid and all threads can access the vertex data corresponding to the lock"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"TuGraph provides two batch operations to perform point-centric batch processing in parallel, which is slightly different from C++ in Python."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'# Function name: ProcessVertexInRange[ReducedSum, Algorithm](\n# work: (algo: Algorithm, vi: size_t)-> ReducedSum,\n# lower: size_t, upper: size_t,\n# algo: Algorithm,\n# zero: ReducedSum = 0,\n# reduce: (a: ReducedSum, b: ReducedSum)-> ReducedSum = reduce_plus[ReducedSum])\n#\n# Function purpose: Executes the work function on nodes whose node numbers are between lower and upper in the Graph. The fourth parameter indicates the base of accumulation, which is 0 by default.\n# The fifth parameter indicates that the iterative reduce function operation is performed on the node return value after each work process, and the default is the accumulation operation.\n# For specific implementation, please refer to the specific code in include/lgraph/olap_base.h\n#\n# Example usage: Count the number of vertices with edges in the parent array.\n\nimport cython\nfrom cython.cimports.olap_base import *\n\n\n@cython.cclass\nclass CountCore:\n graph: cython.pointer(OlapBase[Empty])\n parent: ParallelVector[size_t]\n\n @cython.cfunc\n @cython.nogil\n def Work(self, vi: size_t) -> size_t:\n if self.graph.OutDegree(self.parent[vi]) > 0:\n return 1\n return 0\n\n def run(self, pointer_g: cython.pointer(OlapBase[Empty])):\n self.graph = pointer_g\n self.parent = self.graph.AllocVertexArray[size_t]()\n vertex_num: size_t\n vertex_num = self.graph.ProcessVertexInRange[size_t, CountCore](self.Work, 0, self.parent.Size(), self)\n print("the number is", vertex_num)\n\nif __name__ == "__main__":\n count_core = CountCore()\n count_core.run(cython.address(g))\n'})}),"\n",(0,i.jsx)(n.p,{children:"g is the instantiated object of graph class OlapBase"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'# Function name: ProcessVertexActive[ReducedSum, Algorithm](\n# work: (algo: Algorithm, vi: size_t)-> ReducedSum,\n# active: ParallelBitset,\n# algo: Algorithm,\n# zero: ReducedSum = 0,\n# reduce: (a: ReducedSum, b: ReducedSum)-> ReducedSum = reduce_plus[ReducedSum])\n#\n# Function purpose: Execute the work function on the nodes corresponding to 1 in the active_vertices bitset. The third parameter indicates the base of accumulation, which is 0 by default;\n# The fourth parameter indicates that the iterative reduce function operation is performed on the node return value after each work process, and the default is the accumulation operation.\n# For specific implementation, please refer to the specific code in /include/lgraph/olap_base.h\n#\n# Usage example: Output all out-degree neighbors of nodes 1, 2, and 3 in the Graph, and count the total out-degree of these three nodes.\n\nimport cython\nfrom cython.cimports.olap_base import *\nfrom cython.cimports.libc.stdio import printf\n\n\n@cython.cclass\nclass NeighborCore:\n graph: cython.pointer(OlapBase[Empty])\n active_in: ParallelBitset\n\n @cython.cfunc\n @cython.nogil\n def Work(self, vi: size_t) -> size_t:\n degree = self. graph. OutDegree(vi)\n dst: size_t\n edges = self. graph. OutEdges(vi)\n local_out_degree: size_t\n for i in range(degree):\n dst = edges[i].neighbor\n printf("node %lu has neighbor %lu\\n", vi, dst)\n local_out_degree += 1\n return local_out_degree\n\n def run(self, pointer_g: cython.pointer(OlapBase[Empty])):\n self.graph = pointer_g\n self.active_in = self.graph.AllocVertexSubset()\n self. active_in. Add(1)\n self. active_in. Add(2)\n self. active_in. Add(3)\n total_outdegree = cython.declare(\n size_t,\n self.graph.ProcessVertexActive[size_t, CountCore](self.Work, self.active_in, self))\n printf("total outdegree of node1,2,3 is %lu\\n",total_outdegree)\n\nif __name__ == "__main__":\n neighbor_core = NeighborCore()\n neighbor_core.run(cython.address(g))\n'})}),"\n",(0,i.jsx)(n.p,{children:"As shown in the above two examples, ProcessVertexActive and ProcessVertexInRange in Python require an additional algorithm class pointer parameter compared to their C++ counterparts. The Work function is generally used as a member function of the algorithm class to access member variables, such as in the graph and ParallelVector parent examples shown above. When calling the batch function, the Work function and the self pointer of the algorithm class are passed to the batch function."}),"\n",(0,i.jsxs)(n.p,{children:["The Work function will be called in multiple threads, so the @cython.nogil decorator is added to release the Python global interpretation lock. In code executed by multiple threads, such as the Work function in the batch function, variables are better declared as C/C++ types using ",(0,i.jsx)(n.code,{children:"dst: type"})," or ",(0,i.jsx)(n.code,{children:"dst = cython.declare(type)"}),". This is because Python objects cannot be used in multi-threaded code."]}),"\n",(0,i.jsx)(n.h3,{id:"graph-class-olapondb",children:"Graph class OlapOnDB:"}),"\n",(0,i.jsx)(n.p,{children:"Parallelize to create a directed graph:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"olapondb = OlapOnDB[Empty](db, txn, SNAPSHOT_PARALLEL)\n"})}),"\n",(0,i.jsx)(n.p,{children:"Parallelize to create an undirected graph"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"olapondb = OlapOnDB[Empty](db, txn, SNAPSHOT_PARALLEL | SNAPSHOT_UNDIRECTED)\n"})}),"\n",(0,i.jsx)(n.p,{children:"ID_MAPPING creates a directed graph"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:"olapondb = OlapOnDB[Empty](db, txn, SNAPSHOT_PARALLEL | SNAPSHOT_IDMAPPING)\n"})}),"\n",(0,i.jsx)(n.h3,{id:"graph-class-olapondisk",children:"Graph class OlapOnDisk"}),"\n",(0,i.jsx)(n.h4,{id:"configbase",children:"ConfigBase:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"ConfigBase()"}),": Constructor"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"std::string input_dir"}),": graph edge table data path"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"std::string output_dir"}),": output path"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"Load(config: ConfigBase[EdgeData], edge_direction_policy: EdgeDirectionPolicy)-> void"}),": read in graph data"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"5-lgraph_db-api",children:"5. lgraph_db API"}),"\n",(0,i.jsx)(n.p,{children:"Please refer to the files procedures/algo_cython/lgraph_db.pxd and lgraph_db_python.py for the lgraph_db API."}),"\n",(0,i.jsxs)(n.p,{children:["The usage and functions of the interface in lgraph_db.pxd are basically the same as the C++ interface. The interface declared in lgraph_db.pxd is implemented in C++. In the py file, it must be imported by ",(0,i.jsx)(n.code,{children:"cython.cimports.olap_db import *"})," and compiled by the Cython file to run."]}),"\n",(0,i.jsx)(n.h3,{id:"vertexindexiterator",children:"VertexIndexIterator"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"GetVid()-> int64_t"}),": Get the vid of the vertex"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"galaxy",children:"Galaxy"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"Galaxy(dir_path: std::string)"}),": constructor, dir_path is the db path"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"SetCurrentUser(user: std::string, password: std::string)-> cython.void"}),": set user"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"SetUser(user: std::string)-> cython.void"}),": set user"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"OpenGraph(graph: std::string, read_only: bint)-> GraphDB"}),": create GraphDB"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"graphdb",children:"GraphDB:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CreateReadTxn()-> Transaction"}),": create a read-only transaction"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"CreateWriteTxn()-> Transaction"}),": create a write transaction"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"ForkTxn(txn: Transaction)-> Transaction"}),": Copy transactions, only read transactions can be copied"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"transaction",children:"Transaction:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"GetVertexIndexIterator(\n label: std::string,\n field: std::string,\n key_start: std::string,\n key_end: std::string) -> VertexIndexIterator\n"})}),"\n",(0,i.jsx)(n.p,{children:"Gets index iterator. The iterator has field value [key_start, key_end]. So key_start=key_end=v returns an iterator pointing to all vertexes that has field value v"}),"\n",(0,i.jsxs)(n.p,{children:["lgraph_db_python.py packages the C++ classes Galaxy and GraphDB from lgraph_db.pxd as Python classes. After compiling lgraph_db_python.py into a Python extension, you can directly access it in a Python file or from the Python command line by importing it with ",(0,i.jsx)(n.code,{children:"import lgraph_db_python"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"pygalaxy",children:"PyGalaxy:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"PyGalaxy(self, dir_path: str)"}),": constructor, dir_path is the db path"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"SetCurrentUser(self, user: str password: str)-> void"}),": set user"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"SetUser(self, user: std::string)-> void"}),": set user"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"OpenGraph(self, graph: str, read_only: bool)-> PyGraphDB"}),": create PyGraphDB"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"pygraphdb",children:"PyGraphDB:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"get_pointer(self)->cython.Py_ssize_t"}),": address of C++ class GraphDB"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"6-algorithm-plug-in-example",children:"6. Algorithm plug-in example"}),"\n",(0,i.jsx)(n.p,{children:"The following is a code example of the BFS algorithm implemented in Python:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-python",children:'# cython: language_level=3, cpp_locals=True, boundscheck=False, wraparound=False, initializedcheck=False\n# distutils: language = c++\n\n# Comments work as follows:\n# language_level=3: use Python3\n# cpp_locals=True: C++17 is required, and std::optional is used to manage C++ objects in Python code, which can avoid copy construction of C++ objects\n# boundscheck=False: Turn off bounds checking for indexes\n# wraparound=False: Turn off the processing of negative subscripts (similar to Python List)\n# initializedcheck=False: Turn off checking whether the memory is initialized, and the running performance will be faster after turning off the check\n# language = c++: translate this .py file to C++ instead of C file. TuGraph uses a lot of template functions, so C++ should be used\n\nimport json\n\nimport cython\nfrom cython.cimports.olap_base import *\nfrom cython.cimports.lgraph_db import *\n# From procedures/algo_cython/ cimportolap_base.pxd and lgraph_db.pxd, similar to #include "xxx.h" in C++\n\nfrom cython.cimports.libc.stdio import printf\n# Similar to #include in C++\n# Other common ones include cython.cimports.libcpp.unordered_map, etc.\n\nimport time\n\n@cython.cclass\n# cython.cclass indicates that BFSCore is a C-type Class\nclass BFSCore:\n graph: cython.pointer(OlapBase[Empty])\n # cython.pointer(OlapBase[Empty]) indicates the pointer of OlapBase[Empty], similar to OlapBase[Empty]* in C++\n # Cython provides common types of pointers, such as cython.p_int, cython.p_char, etc.\n parent: ParallelVector[size_t]\n active_in: ParallelBitset\n active_out: ParallelBitset\n root: size_t\n # root: size_t declares root as a C++ size_t type variable, equivalent to root = cython.declare(size_t)\n # Variables that do not declare a type are Python object types\n # Declaring variable types will greatly improve performance, and in the multi-threaded part, only C/C++ type variables can be accessed\n\n @cython.cfunc\n # cython.cfunc indicates that Work is a C-type function, and the parameters and return values should be declared\n # cfunc has good performance and can accept C/C++ objects as parameters and return values, but it cannot be called in other python files\n # Similar to cython.ccall, such as Standalone function, which can be called in other python files\n @cython.nogil\n # cython.nogil means to release the Python global interpretation lock. In the part modified by nogil, Python objects cannot be accessed\n # In the multi-threaded part, there should be nogil decorator\n @cython.exceptval(check=False)\n # cython.exceptval(check=False) means that exception propagation is disabled, and Python exceptions raised inside the function will be ignored\n def Work(self, vi: size_t) -> size_t:\n degree = cython.declare(size_t, self.graph.OutDegree(vi))\n out_edges = cython.declare(AdjList[Empty], self.graph.OutEdges(vi))\n i = cython.declare(size_t, 0)\n local_num_activations = cython.declare(size_t, 0)\n dst: size_t\n for i in range(degree):\n dst = out_edges[i].neighbor\n if self.parent[dst] == cython.cast(size_t, -1):\n # parent[dst] == -1 means that dst has not been visited by bfs\n if self.active_out.Add(dst):\n # Set dst as an active node; ParallelBitmap.Add is an atomic operation to prevent double calculation\n self.parent[dst] = vi\n local_num_activations += 1\n return local_num_activations\n\n @cython.cfunc\n @cython.nogil\n @cython.exceptval(check=False)\n def run(self, g: cython.pointer(OlapBase[Empty]), r: size_t) -> cython. size_t:\n self. graph = g\n self.root = r\n self.active_in = g.AllocVertexSubset()\n self.active_out = g.AllocVertexSubset()\n self.parent = g.AllocVertexArray[size_t]()\n self. parent. Fill(-1)\n num_vertices = cython.declare(size_t, self.graph.NumVertices())\n printf("num_vertices = %lu\\n", num_vertices)\n self.parent[self.root] = self.root\n num_activations = cython.declare(size_t, 1)\n discovered_vertices = cython.declare(size_t, num_activations)\n self. active_in. Add(self. root)\n while num_activations > 0:\n self. active_out. Clear()\n num_activations = g.ProcessVertexActive[size_t, BFSCore](self.Work, self.active_in, self)\n discovered_vertices += num_activations\n self. active_out. Swap(self. active_in)\n printf("num_activations = %lu\\n", num_activations)\n return discovered_vertices\n\n\n@cython.cfunc\ndef procedure_process(db: cython.pointer(GraphDB), request: dict, response: dict) -> cython.bint:\n cost = time. time()\n root_id = "0"\n label = "node"\n field = "id"\n if "root" in request:\n root_id = request["root"]\n if "label" in request:\n label = request["label"]\n if "field" in request:\n field = request["field"]\n\n txn = db.CreateReadTxn()\n olapondb = OlapOnDB[Empty](db[0], txn, SNAPSHOT_PARALLEL)\n # Create OlapOnDB in parallel\n # Cython does not support dereference operations such as *db, use db[0] to dereference\n root_vid = txn.GetVertexIndexIterator(\n label.encode(\'utf-8\'), field.encode(\'utf-8\'),\n root_id.encode(\'utf-8\'), root_id.encode(\'utf-8\')\n ).GetVid()\n # Get the iterator of the root node through GetVertexIndexIterator based on the root node label name, field name and field value (root_id),\n # and get the vid through the iterator. When there is no ID_MAPPING, the vid is the same as the id in OlapOnDB\n cost = time. time() - cost\n printf("prepare_cost = %lf s\\n", cython.cast(cython.double, cost))\n a = BFSCore()\n cost = time. time()\n count = a. run(cython. address(olapondb), root_vid)\n cost = time. time() - cost\n printf("core_cost = %lf s\\n", cython.cast(cython.double, cost))\n response["found_vertices"] = count\n response["num_vertices"] = olapondb. NumVertices()\n response["num_edges"] = olapondb. NumEdges()\n return True\n\n\n@cython.ccall\ndef Process(db: lgraph_db_python.PyGraphDB, inp: bytes):\n # Process is the plug-in entry in embed mode and procedure mode, modified with cython.ccall\n # The Process function must be named Process, and the parameters are lgraph_db_python.PyGraphDB and bytes\n # The return value must be (bool, str)\n _inp = inp.decode("utf-8")\n request = json.loads(_inp)\n response = {}\n addr = cython.declare(cython.Py_ssize_t, db.get_pointer())\n # Get the address of the GraphDB object in the PyGraphDB, convert it to a pointer and pass it\n procedure_process(cython.cast(cython.pointer(GraphDB), addr),\n request, response)\n return (True, json.dumps(response))\n\n'})})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var i=t(6540);const r={},s=i.createContext(r);function a(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7f99a0c3.7878e52e.js b/assets/js/7f99a0c3.d8c1a2b0.js similarity index 99% rename from assets/js/7f99a0c3.7878e52e.js rename to assets/js/7f99a0c3.d8c1a2b0.js index 29d721b8e9..92cf058c4b 100644 --- a/assets/js/7f99a0c3.7878e52e.js +++ b/assets/js/7f99a0c3.d8c1a2b0.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[9503],{9904:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>l,default:()=>u,frontMatter:()=>t,metadata:()=>s,toc:()=>a});var i=n(4848),r=n(8453);const t={},l="Log",s={id:"permission/log",title:"Log",description:"This document mainly introduces the logging function of TuGraph.",source:"@site/../docs/en-US/source/10.permission/5.log.md",sourceDirName:"10.permission",slug:"/permission/log",permalink:"/tugraph-db/en/permission/log",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Monitoring",permalink:"/tugraph-db/en/permission/monitoring"},next:{title:"Unit Testing",permalink:"/tugraph-db/en/quality/unit-testing"}},d={},a=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Server log",id:"2server-log",level:2},{value:"2.1.Server Log Configuration Items",id:"21server-log-configuration-items",level:3},{value:"2.2.Example of Server Log Output Macro Usage",id:"22example-of-server-log-output-macro-usage",level:3},{value:"2.3.Procedure log",id:"23procedure-log",level:3},{value:"2.3.1.Cpp procedure",id:"231cpp-procedure",level:4},{value:"2.3.1.python procedure",id:"231python-procedure",level:4},{value:"3.Audit log",id:"3audit-log",level:2}];function c(e){const o={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"log",children:"Log"})}),"\n",(0,i.jsxs)(o.blockquote,{children:["\n",(0,i.jsx)(o.p,{children:"This document mainly introduces the logging function of TuGraph."}),"\n"]}),"\n",(0,i.jsx)(o.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,i.jsx)(o.p,{children:"TuGraph keeps two types of logs: server logs and audit logs. Server logs record human-readable server status information, while audit logs maintain encrypted information for every operation performed on the server."}),"\n",(0,i.jsx)(o.h2,{id:"2server-log",children:"2.Server log"}),"\n",(0,i.jsx)(o.h3,{id:"21server-log-configuration-items",children:"2.1.Server Log Configuration Items"}),"\n",(0,i.jsxs)(o.p,{children:["The output directory of server logs can be specified through the ",(0,i.jsx)(o.code,{children:"log_dir"})," configuration item. The level of log can be specified through the ",(0,i.jsx)(o.code,{children:"verbose"})," configuration item."]}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"log_dir"})," configuration item is empty by default. If ",(0,i.jsx)(o.code,{children:"log_dir"})," configuration item is empty, then all logs will be write to the console(nothing will be written to the console if the ",(0,i.jsx)(o.code,{children:"log_dir"})," configuration item is empty under daemon mode); if ",(0,i.jsx)(o.code,{children:"log_dir"})," configuration item is configured specifically, log files will bew generated under that path. The maximum size of a single log file is 256MB."]}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"verbose"})," configuration item controls the level of log, and is divided into three levels of ",(0,i.jsx)(o.code,{children:"0, 1, 2"}),". Ther verbosity of log record grows as the number grows. The default level is ",(0,i.jsx)(o.code,{children:"1"}),". When the level is set to ",(0,i.jsx)(o.code,{children:"2"}),", the server will print logs in ",(0,i.jsx)(o.code,{children:"DEBUG"})," level and above. When the level is set to ",(0,i.jsx)(o.code,{children:"1"}),", the server will print logs in ",(0,i.jsx)(o.code,{children:"INFO"})," level and above. When the level is set to ",(0,i.jsx)(o.code,{children:"0"}),", the server will print log in ",(0,i.jsx)(o.code,{children:"ERROR"})," level and above."]}),"\n",(0,i.jsx)(o.h3,{id:"22example-of-server-log-output-macro-usage",children:"2.2.Example of Server Log Output Macro Usage"}),"\n",(0,i.jsx)(o.p,{children:"If the developer wants to add logs to the code during development, they can refer to the following example:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:'#include "tools/lgraph_log.h" // add log dependency.\n\nvoid LogExample() {\n // The log module has been initialized during the database startup, and developers can directly call the macro.\n // The log level is divided into five levels: DEBUG, INFO, WARNING, ERROR, and FATAL.\n\n LOG_DEBUG() << "This is a debug level log message.";\n LOG_INFO() << "This is a info level log message.";\n LOG_WARN() << "This is a warning level log message.";\n LOG_ERROR() << "This is a error level log message.";\n LOG_FATAL() << "This is a fatal level log message.";\n}\n'})}),"\n",(0,i.jsx)(o.p,{children:"You can also refer to the log macro usage in test/test_lgraph_log.cpp."}),"\n",(0,i.jsx)(o.h3,{id:"23procedure-log",children:"2.3.Procedure log"}),"\n",(0,i.jsxs)(o.p,{children:["Developers can use the log function to output debug information that they need to the log for looking up and assisting development during the development of procedures. Debug information will be output to the same log file as the server log (if ",(0,i.jsx)(o.code,{children:"log_dir"})," configuration item is not specified, it will also be output to the console)"]}),"\n",(0,i.jsx)(o.h4,{id:"231cpp-procedure",children:"2.3.1.Cpp procedure"}),"\n",(0,i.jsxs)(o.p,{children:["Please use the log macro provided in 2.2 to output debug information, and avoid using output methods such as cout or printf. For specific usage, please refer to the following sample code (see ",(0,i.jsx)(o.code,{children:"procedures/demo/log_demo.cpp"})," for details)"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:'#include \n#include "lgraph/lgraph.h"\n#include "tools/lgraph_log.h" // add log dependency\nusing namespace lgraph_api;\n\nvoid LogExample() {\n LOG_DEBUG() << "This is a debug level log message.";\n LOG_INFO() << "This is a info level log message.";\n LOG_WARN() << "This is a warning level log message.";\n LOG_ERROR() << "This is a error level log message.";\n}\n\nextern "C" bool Process(GraphDB& db, const std::string& request, std::string& response) {\n response = "TuGraph log demo";\n LogExample();\n return true;\n}\n'})}),"\n",(0,i.jsx)(o.p,{children:"After inserting the above sample code into the database as a procedure and running it, you can see the corresponding log entries in the log file."}),"\n",(0,i.jsx)(o.h4,{id:"231python-procedure",children:"2.3.1.python procedure"}),"\n",(0,i.jsx)(o.p,{children:"Please use Python's built-in print to output debug information. The debug information will be merged into a WARN-level log entry and output to the log file after the procedure is executed."}),"\n",(0,i.jsx)(o.h2,{id:"3audit-log",children:"3.Audit log"}),"\n",(0,i.jsx)(o.p,{children:"Audit logs record each request and response, as well as the user who sent the request and when the request received. Audit logging can only be turned on or off. The results can be queried using the TuGraph visualization tool and the REST API."}),"\n",(0,i.jsxs)(o.p,{children:["To enable the Audit Log, you need to set the ",(0,i.jsx)(o.code,{children:"enable_audit_log"})," parameter to ",(0,i.jsx)(o.code,{children:"true"})," in the configuration file. For the configuration file and parameter descriptions, see:",(0,i.jsx)(o.a,{href:"../../5.installation&running/7.tugraph-running.md",children:"Tugraph Running/Service configuration"})]})]})}function u(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,o,n)=>{n.d(o,{R:()=>l,x:()=>s});var i=n(6540);const r={},t=i.createContext(r);function l(e){const o=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function s(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),i.createElement(t.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[9503],{9904:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>l,default:()=>u,frontMatter:()=>t,metadata:()=>s,toc:()=>a});var i=n(4848),r=n(8453);const t={},l="Log",s={id:"permission/log",title:"Log",description:"This document mainly introduces the logging function of TuGraph.",source:"@site/../docs/en-US/source/10.permission/5.log.md",sourceDirName:"10.permission",slug:"/permission/log",permalink:"/tugraph-db/en/permission/log",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Monitoring",permalink:"/tugraph-db/en/permission/monitoring"},next:{title:"Unit Testing",permalink:"/tugraph-db/en/quality/unit-testing"}},d={},a=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Server log",id:"2server-log",level:2},{value:"2.1.Server Log Configuration Items",id:"21server-log-configuration-items",level:3},{value:"2.2.Example of Server Log Output Macro Usage",id:"22example-of-server-log-output-macro-usage",level:3},{value:"2.3.Procedure log",id:"23procedure-log",level:3},{value:"2.3.1.Cpp procedure",id:"231cpp-procedure",level:4},{value:"2.3.1.python procedure",id:"231python-procedure",level:4},{value:"3.Audit log",id:"3audit-log",level:2}];function c(e){const o={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o.header,{children:(0,i.jsx)(o.h1,{id:"log",children:"Log"})}),"\n",(0,i.jsxs)(o.blockquote,{children:["\n",(0,i.jsx)(o.p,{children:"This document mainly introduces the logging function of TuGraph."}),"\n"]}),"\n",(0,i.jsx)(o.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,i.jsx)(o.p,{children:"TuGraph keeps two types of logs: server logs and audit logs. Server logs record human-readable server status information, while audit logs maintain encrypted information for every operation performed on the server."}),"\n",(0,i.jsx)(o.h2,{id:"2server-log",children:"2.Server log"}),"\n",(0,i.jsx)(o.h3,{id:"21server-log-configuration-items",children:"2.1.Server Log Configuration Items"}),"\n",(0,i.jsxs)(o.p,{children:["The output directory of server logs can be specified through the ",(0,i.jsx)(o.code,{children:"log_dir"})," configuration item. The level of log can be specified through the ",(0,i.jsx)(o.code,{children:"verbose"})," configuration item."]}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"log_dir"})," configuration item is empty by default. If ",(0,i.jsx)(o.code,{children:"log_dir"})," configuration item is empty, then all logs will be write to the console(nothing will be written to the console if the ",(0,i.jsx)(o.code,{children:"log_dir"})," configuration item is empty under daemon mode); if ",(0,i.jsx)(o.code,{children:"log_dir"})," configuration item is configured specifically, log files will bew generated under that path. The maximum size of a single log file is 256MB."]}),"\n",(0,i.jsxs)(o.p,{children:["The ",(0,i.jsx)(o.code,{children:"verbose"})," configuration item controls the level of log, and is divided into three levels of ",(0,i.jsx)(o.code,{children:"0, 1, 2"}),". Ther verbosity of log record grows as the number grows. The default level is ",(0,i.jsx)(o.code,{children:"1"}),". When the level is set to ",(0,i.jsx)(o.code,{children:"2"}),", the server will print logs in ",(0,i.jsx)(o.code,{children:"DEBUG"})," level and above. When the level is set to ",(0,i.jsx)(o.code,{children:"1"}),", the server will print logs in ",(0,i.jsx)(o.code,{children:"INFO"})," level and above. When the level is set to ",(0,i.jsx)(o.code,{children:"0"}),", the server will print log in ",(0,i.jsx)(o.code,{children:"ERROR"})," level and above."]}),"\n",(0,i.jsx)(o.h3,{id:"22example-of-server-log-output-macro-usage",children:"2.2.Example of Server Log Output Macro Usage"}),"\n",(0,i.jsx)(o.p,{children:"If the developer wants to add logs to the code during development, they can refer to the following example:"}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:'#include "tools/lgraph_log.h" // add log dependency.\n\nvoid LogExample() {\n // The log module has been initialized during the database startup, and developers can directly call the macro.\n // The log level is divided into five levels: DEBUG, INFO, WARNING, ERROR, and FATAL.\n\n LOG_DEBUG() << "This is a debug level log message.";\n LOG_INFO() << "This is a info level log message.";\n LOG_WARN() << "This is a warning level log message.";\n LOG_ERROR() << "This is a error level log message.";\n LOG_FATAL() << "This is a fatal level log message.";\n}\n'})}),"\n",(0,i.jsx)(o.p,{children:"You can also refer to the log macro usage in test/test_lgraph_log.cpp."}),"\n",(0,i.jsx)(o.h3,{id:"23procedure-log",children:"2.3.Procedure log"}),"\n",(0,i.jsxs)(o.p,{children:["Developers can use the log function to output debug information that they need to the log for looking up and assisting development during the development of procedures. Debug information will be output to the same log file as the server log (if ",(0,i.jsx)(o.code,{children:"log_dir"})," configuration item is not specified, it will also be output to the console)"]}),"\n",(0,i.jsx)(o.h4,{id:"231cpp-procedure",children:"2.3.1.Cpp procedure"}),"\n",(0,i.jsxs)(o.p,{children:["Please use the log macro provided in 2.2 to output debug information, and avoid using output methods such as cout or printf. For specific usage, please refer to the following sample code (see ",(0,i.jsx)(o.code,{children:"procedures/demo/log_demo.cpp"})," for details)"]}),"\n",(0,i.jsx)(o.pre,{children:(0,i.jsx)(o.code,{children:'#include \n#include "lgraph/lgraph.h"\n#include "tools/lgraph_log.h" // add log dependency\nusing namespace lgraph_api;\n\nvoid LogExample() {\n LOG_DEBUG() << "This is a debug level log message.";\n LOG_INFO() << "This is a info level log message.";\n LOG_WARN() << "This is a warning level log message.";\n LOG_ERROR() << "This is a error level log message.";\n}\n\nextern "C" bool Process(GraphDB& db, const std::string& request, std::string& response) {\n response = "TuGraph log demo";\n LogExample();\n return true;\n}\n'})}),"\n",(0,i.jsx)(o.p,{children:"After inserting the above sample code into the database as a procedure and running it, you can see the corresponding log entries in the log file."}),"\n",(0,i.jsx)(o.h4,{id:"231python-procedure",children:"2.3.1.python procedure"}),"\n",(0,i.jsx)(o.p,{children:"Please use Python's built-in print to output debug information. The debug information will be merged into a WARN-level log entry and output to the log file after the procedure is executed."}),"\n",(0,i.jsx)(o.h2,{id:"3audit-log",children:"3.Audit log"}),"\n",(0,i.jsx)(o.p,{children:"Audit logs record each request and response, as well as the user who sent the request and when the request received. Audit logging can only be turned on or off. The results can be queried using the TuGraph visualization tool and the REST API."}),"\n",(0,i.jsxs)(o.p,{children:["To enable the Audit Log, you need to set the ",(0,i.jsx)(o.code,{children:"enable_audit_log"})," parameter to ",(0,i.jsx)(o.code,{children:"true"})," in the configuration file. For the configuration file and parameter descriptions, see:",(0,i.jsx)(o.a,{href:"../../5.installation&running/7.tugraph-running.md",children:"Tugraph Running/Service configuration"})]})]})}function u(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,i.jsx)(o,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,o,n)=>{n.d(o,{R:()=>l,x:()=>s});var i=n(6540);const r={},t=i.createContext(r);function l(e){const o=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function s(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),i.createElement(t.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8110278a.af0bfd97.js b/assets/js/8110278a.1ca5c965.js similarity index 99% rename from assets/js/8110278a.af0bfd97.js rename to assets/js/8110278a.1ca5c965.js index a2340afa33..0a3fb49ed8 100644 --- a/assets/js/8110278a.af0bfd97.js +++ b/assets/js/8110278a.1ca5c965.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[7213],{1645:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>o});var s=t(4848),i=t(8453);const r={},a="Cloud Deployment",c={id:"installation&running/cloud-deployment",title:"Cloud Deployment",description:"This document mainly introduces the cloud deployment of TuGraph, and you can also refer to theAlibaba Cloud ComputeNest deployment document.\u3002",source:"@site/../docs/en-US/source/5.installation&running/5.cloud-deployment.md",sourceDirName:"5.installation&running",slug:"/installation&running/cloud-deployment",permalink:"/tugraph-db/en/installation&running/cloud-deployment",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Local Package Deployment",permalink:"/tugraph-db/en/installation&running/local-package-deployment"},next:{title:"Compile",permalink:"/tugraph-db/en/installation&running/compile"}},l={},o=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Instance Description",id:"2instance-description",level:2},{value:"3.Deployment Process",id:"3deployment-process",level:2},{value:"3.1.Preparation",id:"31preparation",level:3},{value:"3.2.Deployment Entrance",id:"32deployment-entrance",level:3},{value:"3.3.Apply for Trial Use",id:"33apply-for-trial-use",level:3},{value:"3.4.Create TuGraph Service",id:"34create-tugraph-service",level:3},{value:"3.4.1.Parameter List",id:"341parameter-list",level:4},{value:"3.4.2.Specific Steps",id:"342specific-steps",level:4},{value:"3.5.Start TuGraph Service",id:"35start-tugraph-service",level:3},{value:"4.Common FAQs",id:"4common-faqs",level:2},{value:"No available resources in the selected deployment area",id:"no-available-resources-in-the-selected-deployment-area",level:3},{value:"Unaccessible to the web port",id:"unaccessible-to-the-web-port",level:3},{value:"Username or password is not correct",id:"username-or-password-is-not-correct",level:3}];function d(e){const n={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"cloud-deployment",children:"Cloud Deployment"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["This document mainly introduces the cloud deployment of TuGraph, and you can also refer to the",(0,s.jsx)(n.a,{href:"https://aliyun-computenest.github.io/quickstart-tugraph/",children:"Alibaba Cloud ComputeNest deployment document."}),"\u3002"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,s.jsx)(n.p,{children:"TuGraph (tugraph.antgroup.com) is a high-performance graph database of Alibaba Group. TuGraph provides community version services on ComputeNest, so you can quickly deploy TuGraph services on ComputeNest and achieve operation and maintenance monitoring, thereby building your own graph application. This document introduces how to open TuGraph community version services on ComputeNest, as well as deployment process and usage instructions."}),"\n",(0,s.jsx)(n.h2,{id:"2instance-description",children:"2.Instance Description"}),"\n",(0,s.jsx)(n.p,{children:"TuGraph is deployed as a community open source version, and the source code can be found in the Github Repo. Currently, the available instance specifications are as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Instance Family"}),(0,s.jsx)(n.th,{children:"vCPU and Memory"}),(0,s.jsx)(n.th,{children:"System Disk"}),(0,s.jsx)(n.th,{children:"Public Bandwidth"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ecs.r7a.xlarge"}),(0,s.jsx)(n.td,{children:"AMD Memory r7a, 4vCPU 32GiB"}),(0,s.jsx)(n.td,{children:"ESSD Cloud Disk 200GiB PL0"}),(0,s.jsx)(n.td,{children:"Fixed bandwidth of 1Mbps"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ecs.r6.xlarge"}),(0,s.jsx)(n.td,{children:"Memory r6, 4vCPU 32GiB"}),(0,s.jsx)(n.td,{children:"ESSD Cloud Disk 200GiB PL0"}),(0,s.jsx)(n.td,{children:"Fixed bandwidth of 1Mbps"})]})]})]}),"\n",(0,s.jsxs)(n.p,{children:["Estimated costs can be seen in real time when creating instances (currently free). If you need more specifications or other services (such as cluster high availability requirements, enterprise-level support services, etc.), please contact us at ",(0,s.jsx)(n.a,{href:"mailto:tugraph@service.alipay.com",children:"tugraph@service.alipay.com"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"3deployment-process",children:"3.Deployment Process"}),"\n",(0,s.jsx)(n.h3,{id:"31preparation",children:"3.1.Preparation"}),"\n",(0,s.jsx)(n.p,{children:"Before starting to use, you need an Alibaba Cloud account to access and create resources such as ECS and VPC."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"If you use a personal account, you can directly create a service instance."}),"\n",(0,s.jsxs)(n.li,{children:["If you create a service instance using a RAM user and use Alibaba Cloud ComputeNest for the first time:\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Before creating a service instance, you need to add permissions for the corresponding resources to the account of the RAM user. For detailed operations on adding RAM permissions, please see Grant RAM user permissions. The required permissions are shown in the following table."}),"\n",(0,s.jsx)(n.li,{children:"Authorization to create associated roles is also required. Refer to the following figure and select Agree to authorize and create associated roles."}),"\n"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Permission Policy Name"}),(0,s.jsx)(n.th,{children:"Remark"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"AliyunECSFullAccess"}),(0,s.jsx)(n.td,{children:"Permissions for managing cloud server services (ECS)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"AliyunVPCFullAccess"}),(0,s.jsx)(n.td,{children:"Permissions for managing Virtual Private Cloud (VPC)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"AliyunROSFullAccess"}),(0,s.jsx)(n.td,{children:"Permissions for managing Resource Orchestration Service (ROS)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"AliyunComputeNestUserFullAccess"}),(0,s.jsx)(n.td,{children:"Permissions for managing ComputeNest services (ComputeNest) on the user side"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"AliyunCloudMonitorFullAccess"}),(0,s.jsx)(n.td,{children:"Permissions for managing Alibaba Cloud Monitor (CloudMonitor)"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Cloud Deployment",src:t(2931).A+"",width:"2390",height:"612"})}),"\n",(0,s.jsx)(n.h3,{id:"32deployment-entrance",children:"3.2.Deployment Entrance"}),"\n",(0,s.jsx)(n.p,{children:"You can search in Alibaba Cloud ComputeNest, or quickly access it through the following deployment link."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://computenest.console.aliyun.com/user/cn-hangzhou/serviceInstanceCreate?ServiceId=service-7b50ea3d20e643da95bf&&isTrial=true",children:"Deployment Link"})}),"\n",(0,s.jsx)(n.h3,{id:"33apply-for-trial-use",children:"3.3.Apply for Trial Use"}),"\n",(0,s.jsx)(n.p,{children:"Before formal trial use, you need to apply for trial use, fill in the information as prompted, and create the TuGraph service after passing the review."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Apply for Trial Use",src:t(7656).A+"",width:"2071",height:"949"})}),"\n",(0,s.jsx)(n.h3,{id:"34create-tugraph-service",children:"3.4.Create TuGraph Service"}),"\n",(0,s.jsx)(n.h4,{id:"341parameter-list",children:"3.4.1.Parameter List"}),"\n",(0,s.jsx)(n.p,{children:"During the process of creating a service instance, you need to configure the parameter list of the service instance information. The specific parameters are as follows."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Parameter Group"}),(0,s.jsx)(n.th,{children:"Parameter Item"}),(0,s.jsx)(n.th,{children:"Example"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Service Instance Name"}),(0,s.jsx)(n.td,{children:"N/A"}),(0,s.jsx)(n.td,{children:"test"}),(0,s.jsx)(n.td,{children:"The name of the instance."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Region"}),(0,s.jsx)(n.td,{children:"N/A"}),(0,s.jsx)(n.td,{children:"China East 1 (Hangzhou)"}),(0,s.jsx)(n.td,{children:"Select the region of the service instance. It is recommended to select nearby regions to obtain better network latency."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Payment Type Configuration"}),(0,s.jsx)(n.td,{children:"Payment Type"}),(0,s.jsx)(n.td,{children:"Pay-As-You-Go"}),(0,s.jsx)(n.td,{children:"For free use, please select Pay-As-You-Go."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Availability Zone Configuration"}),(0,s.jsx)(n.td,{children:"Deployment Area"}),(0,s.jsx)(n.td,{children:"Availability ZoneI"}),(0,s.jsx)(n.td,{children:"Different available zones under the region, ensure that the instance is not empty."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Select Existing Basic Resource Configuration"}),(0,s.jsx)(n.td,{children:"VPC ID"}),(0,s.jsx)(n.td,{children:"vpc-xxx"}),(0,s.jsx)(n.td,{children:"Select the ID of the Virtual Private Cloud according to the actual situation."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Select Existing Basic Resource Configuration"}),(0,s.jsx)(n.td,{children:"Switch ID"}),(0,s.jsx)(n.td,{children:"vsw-xxx"}),(0,s.jsx)(n.td,{children:"Select the Switch ID according to the actual situation. If the Switch ID cannot be found, try switching the region and available zone."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ECS Instance Configuration"}),(0,s.jsx)(n.td,{children:"Instance Type"}),(0,s.jsx)(n.td,{children:"ecs.r6.xlarge"}),(0,s.jsx)(n.td,{children:"Currently supports ecs.r6.xlarge and ecs.r7a.xlarge specifications."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ECS Instance Configuration"}),(0,s.jsx)(n.td,{children:"Instance Password"}),(0,s.jsx)(n.td,{children:"**"}),(0,s.jsx)(n.td,{children:"Set the instance password. Length of 8-30 characters, must include three items (uppercase letters, lowercase letters, numbers, special characters in ()`~!@#$%^&*_-+={}[]:;'<>,.?/)."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"342specific-steps",children:"3.4.2.Specific Steps"}),"\n",(0,s.jsx)(n.p,{children:"The creation of the service is carried out according to the following steps, refer to the figure below:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:'Create an instance name, such as "test" in the figure below'}),"\n",(0,s.jsx)(n.li,{children:'Select the region, such as "China East 1 (Hangzhou)" in the figure below'}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Create Instance",src:t(1873).A+"",width:"2874",height:"1066"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Select the instance type, currently supports ecs.r6.xlarge and ecs.r7a.xlarge specifications. If there is no model available in the list, try selecting other deployment areas."}),"\n",(0,s.jsx)(n.li,{children:"Select the model"}),"\n",(0,s.jsx)(n.li,{children:"Configure the password for the instance"}),"\n",(0,s.jsx)(n.li,{children:'Select the deployment area, such as "Availability Zone I" in the figure below'}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Select Region",src:t(862).A+"",width:"4102",height:"1242"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Click next to enter the order confirmation page"}),"\n",(0,s.jsx)(n.li,{children:'Check the checkboxes for "Permission Confirmation" and "Service Terms"'}),"\n",(0,s.jsx)(n.li,{children:'Click the green "Start Free Trial" button in the lower left corner to create a service instance'}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Confirmation",src:t(9175).A+"",width:"3414",height:"2180"})}),"\n",(0,s.jsx)(n.h3,{id:"35start-tugraph-service",children:"3.5.Start TuGraph Service"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"View the service instance: After the service instance is created successfully, it takes about 2 minutes for deployment. After the deployment is complete, you can see the corresponding service instance on the page, as shown in the figure below."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"View Instance",src:t(2764).A+"",width:"4616",height:"1264"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Click the service instance to access TuGraph. After entering the corresponding service instance, you can get 3 ways to\nuse it on the page: web, rpc, ssh. You can also see the password of user admin on the page."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Access Method",src:t(8213).A+"",width:"1216",height:"612"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Click the link of web to jump to the deployed TuGraph Web. It is recommended that novice users first use the demo to quickly get started with TuGraph.\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"First, on the TuGraph Web login page, enter the default username (admin) and the password on the page to log in, as shown in the figure below."}),"\n",(0,s.jsx)(n.li,{children:'After the login is completed, click "New Instance" -> "Create Instance" in sequence, wait for the creation to be completed, and the steps in 3 will change to green in turn, and it will automatically switch to the subgraph MovieDemo1, as shown in the figure below.'}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Login",src:t(9058).A+"",width:"1527",height:"1120"}),"\n",(0,s.jsx)(n.img,{alt:"Create Demo",src:t(6923).A+"",width:"1709",height:"592"})]}),"\n",(0,s.jsx)(n.h2,{id:"4common-faqs",children:"4.Common FAQs"}),"\n",(0,s.jsx)(n.h3,{id:"no-available-resources-in-the-selected-deployment-area",children:"No available resources in the selected deployment area"}),"\n",(0,s.jsx)(n.p,{children:"Sometimes, the selected deployment area (such as Availability Zone G) does not have available resources for the selected package, and an error will be reported as shown in the figure below."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Deployment Error",src:t(2859).A+"",width:"596",height:"544"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Solution"}),":Try selecting other regions, such as Availability Zone I"]}),"\n",(0,s.jsx)(n.h3,{id:"unaccessible-to-the-web-port",children:"Unaccessible to the web port"}),"\n",(0,s.jsx)(n.p,{children:"It takes some time for the server to get ready. Just wait for a few seconds."}),"\n",(0,s.jsx)(n.h3,{id:"username-or-password-is-not-correct",children:"Username or password is not correct"}),"\n",(0,s.jsx)(n.p,{children:"Please make sure that you are using the password on the page instead of the default one."})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},2931:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-1-6de73b2cfb5fe70e92e5e3435ad8574f.png"},2859:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-10-55820cf0e6bb8fac4c2e7d548b97a1fc.png"},7656:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-2-2424fad73dbcd8267de47772bd60d29f.png"},1873:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-3-72b2b61772400506bd9a80eb4d343017.png"},862:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-4-0372e82170ac8bffe6d2d02b03b0a9e2.png"},9175:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-5-f4512e5e080e0b9f6138224cc49d424e.png"},2764:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-6-66d573e42075d2367c35e77b3330e2ac.png"},8213:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-7-a23a6b3eff495502a4c3dcb7e92e19ca.png"},9058:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-8-3141da1eed5c4e147ecdef322cf1c58d.png"},6923:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-9-8778b1296f1ca19397384c068bab67ea.png"},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>c});var s=t(6540);const i={},r=s.createContext(i);function a(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[7213],{1645:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>o});var s=t(4848),i=t(8453);const r={},a="Cloud Deployment",c={id:"installation&running/cloud-deployment",title:"Cloud Deployment",description:"This document mainly introduces the cloud deployment of TuGraph, and you can also refer to theAlibaba Cloud ComputeNest deployment document.\u3002",source:"@site/../docs/en-US/source/5.installation&running/5.cloud-deployment.md",sourceDirName:"5.installation&running",slug:"/installation&running/cloud-deployment",permalink:"/tugraph-db/en/installation&running/cloud-deployment",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Local Package Deployment",permalink:"/tugraph-db/en/installation&running/local-package-deployment"},next:{title:"Compile",permalink:"/tugraph-db/en/installation&running/compile"}},l={},o=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Instance Description",id:"2instance-description",level:2},{value:"3.Deployment Process",id:"3deployment-process",level:2},{value:"3.1.Preparation",id:"31preparation",level:3},{value:"3.2.Deployment Entrance",id:"32deployment-entrance",level:3},{value:"3.3.Apply for Trial Use",id:"33apply-for-trial-use",level:3},{value:"3.4.Create TuGraph Service",id:"34create-tugraph-service",level:3},{value:"3.4.1.Parameter List",id:"341parameter-list",level:4},{value:"3.4.2.Specific Steps",id:"342specific-steps",level:4},{value:"3.5.Start TuGraph Service",id:"35start-tugraph-service",level:3},{value:"4.Common FAQs",id:"4common-faqs",level:2},{value:"No available resources in the selected deployment area",id:"no-available-resources-in-the-selected-deployment-area",level:3},{value:"Unaccessible to the web port",id:"unaccessible-to-the-web-port",level:3},{value:"Username or password is not correct",id:"username-or-password-is-not-correct",level:3}];function d(e){const n={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"cloud-deployment",children:"Cloud Deployment"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["This document mainly introduces the cloud deployment of TuGraph, and you can also refer to the",(0,s.jsx)(n.a,{href:"https://aliyun-computenest.github.io/quickstart-tugraph/",children:"Alibaba Cloud ComputeNest deployment document."}),"\u3002"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,s.jsx)(n.p,{children:"TuGraph (tugraph.antgroup.com) is a high-performance graph database of Alibaba Group. TuGraph provides community version services on ComputeNest, so you can quickly deploy TuGraph services on ComputeNest and achieve operation and maintenance monitoring, thereby building your own graph application. This document introduces how to open TuGraph community version services on ComputeNest, as well as deployment process and usage instructions."}),"\n",(0,s.jsx)(n.h2,{id:"2instance-description",children:"2.Instance Description"}),"\n",(0,s.jsx)(n.p,{children:"TuGraph is deployed as a community open source version, and the source code can be found in the Github Repo. Currently, the available instance specifications are as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Instance Family"}),(0,s.jsx)(n.th,{children:"vCPU and Memory"}),(0,s.jsx)(n.th,{children:"System Disk"}),(0,s.jsx)(n.th,{children:"Public Bandwidth"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ecs.r7a.xlarge"}),(0,s.jsx)(n.td,{children:"AMD Memory r7a, 4vCPU 32GiB"}),(0,s.jsx)(n.td,{children:"ESSD Cloud Disk 200GiB PL0"}),(0,s.jsx)(n.td,{children:"Fixed bandwidth of 1Mbps"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ecs.r6.xlarge"}),(0,s.jsx)(n.td,{children:"Memory r6, 4vCPU 32GiB"}),(0,s.jsx)(n.td,{children:"ESSD Cloud Disk 200GiB PL0"}),(0,s.jsx)(n.td,{children:"Fixed bandwidth of 1Mbps"})]})]})]}),"\n",(0,s.jsxs)(n.p,{children:["Estimated costs can be seen in real time when creating instances (currently free). If you need more specifications or other services (such as cluster high availability requirements, enterprise-level support services, etc.), please contact us at ",(0,s.jsx)(n.a,{href:"mailto:tugraph@service.alipay.com",children:"tugraph@service.alipay.com"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"3deployment-process",children:"3.Deployment Process"}),"\n",(0,s.jsx)(n.h3,{id:"31preparation",children:"3.1.Preparation"}),"\n",(0,s.jsx)(n.p,{children:"Before starting to use, you need an Alibaba Cloud account to access and create resources such as ECS and VPC."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"If you use a personal account, you can directly create a service instance."}),"\n",(0,s.jsxs)(n.li,{children:["If you create a service instance using a RAM user and use Alibaba Cloud ComputeNest for the first time:\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Before creating a service instance, you need to add permissions for the corresponding resources to the account of the RAM user. For detailed operations on adding RAM permissions, please see Grant RAM user permissions. The required permissions are shown in the following table."}),"\n",(0,s.jsx)(n.li,{children:"Authorization to create associated roles is also required. Refer to the following figure and select Agree to authorize and create associated roles."}),"\n"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Permission Policy Name"}),(0,s.jsx)(n.th,{children:"Remark"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"AliyunECSFullAccess"}),(0,s.jsx)(n.td,{children:"Permissions for managing cloud server services (ECS)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"AliyunVPCFullAccess"}),(0,s.jsx)(n.td,{children:"Permissions for managing Virtual Private Cloud (VPC)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"AliyunROSFullAccess"}),(0,s.jsx)(n.td,{children:"Permissions for managing Resource Orchestration Service (ROS)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"AliyunComputeNestUserFullAccess"}),(0,s.jsx)(n.td,{children:"Permissions for managing ComputeNest services (ComputeNest) on the user side"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"AliyunCloudMonitorFullAccess"}),(0,s.jsx)(n.td,{children:"Permissions for managing Alibaba Cloud Monitor (CloudMonitor)"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Cloud Deployment",src:t(2931).A+"",width:"2390",height:"612"})}),"\n",(0,s.jsx)(n.h3,{id:"32deployment-entrance",children:"3.2.Deployment Entrance"}),"\n",(0,s.jsx)(n.p,{children:"You can search in Alibaba Cloud ComputeNest, or quickly access it through the following deployment link."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.a,{href:"https://computenest.console.aliyun.com/user/cn-hangzhou/serviceInstanceCreate?ServiceId=service-7b50ea3d20e643da95bf&&isTrial=true",children:"Deployment Link"})}),"\n",(0,s.jsx)(n.h3,{id:"33apply-for-trial-use",children:"3.3.Apply for Trial Use"}),"\n",(0,s.jsx)(n.p,{children:"Before formal trial use, you need to apply for trial use, fill in the information as prompted, and create the TuGraph service after passing the review."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Apply for Trial Use",src:t(7656).A+"",width:"2071",height:"949"})}),"\n",(0,s.jsx)(n.h3,{id:"34create-tugraph-service",children:"3.4.Create TuGraph Service"}),"\n",(0,s.jsx)(n.h4,{id:"341parameter-list",children:"3.4.1.Parameter List"}),"\n",(0,s.jsx)(n.p,{children:"During the process of creating a service instance, you need to configure the parameter list of the service instance information. The specific parameters are as follows."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Parameter Group"}),(0,s.jsx)(n.th,{children:"Parameter Item"}),(0,s.jsx)(n.th,{children:"Example"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Service Instance Name"}),(0,s.jsx)(n.td,{children:"N/A"}),(0,s.jsx)(n.td,{children:"test"}),(0,s.jsx)(n.td,{children:"The name of the instance."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Region"}),(0,s.jsx)(n.td,{children:"N/A"}),(0,s.jsx)(n.td,{children:"China East 1 (Hangzhou)"}),(0,s.jsx)(n.td,{children:"Select the region of the service instance. It is recommended to select nearby regions to obtain better network latency."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Payment Type Configuration"}),(0,s.jsx)(n.td,{children:"Payment Type"}),(0,s.jsx)(n.td,{children:"Pay-As-You-Go"}),(0,s.jsx)(n.td,{children:"For free use, please select Pay-As-You-Go."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Availability Zone Configuration"}),(0,s.jsx)(n.td,{children:"Deployment Area"}),(0,s.jsx)(n.td,{children:"Availability ZoneI"}),(0,s.jsx)(n.td,{children:"Different available zones under the region, ensure that the instance is not empty."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Select Existing Basic Resource Configuration"}),(0,s.jsx)(n.td,{children:"VPC ID"}),(0,s.jsx)(n.td,{children:"vpc-xxx"}),(0,s.jsx)(n.td,{children:"Select the ID of the Virtual Private Cloud according to the actual situation."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Select Existing Basic Resource Configuration"}),(0,s.jsx)(n.td,{children:"Switch ID"}),(0,s.jsx)(n.td,{children:"vsw-xxx"}),(0,s.jsx)(n.td,{children:"Select the Switch ID according to the actual situation. If the Switch ID cannot be found, try switching the region and available zone."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ECS Instance Configuration"}),(0,s.jsx)(n.td,{children:"Instance Type"}),(0,s.jsx)(n.td,{children:"ecs.r6.xlarge"}),(0,s.jsx)(n.td,{children:"Currently supports ecs.r6.xlarge and ecs.r7a.xlarge specifications."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ECS Instance Configuration"}),(0,s.jsx)(n.td,{children:"Instance Password"}),(0,s.jsx)(n.td,{children:"**"}),(0,s.jsx)(n.td,{children:"Set the instance password. Length of 8-30 characters, must include three items (uppercase letters, lowercase letters, numbers, special characters in ()`~!@#$%^&*_-+={}[]:;'<>,.?/)."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{})]})]})]}),"\n",(0,s.jsx)(n.h4,{id:"342specific-steps",children:"3.4.2.Specific Steps"}),"\n",(0,s.jsx)(n.p,{children:"The creation of the service is carried out according to the following steps, refer to the figure below:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:'Create an instance name, such as "test" in the figure below'}),"\n",(0,s.jsx)(n.li,{children:'Select the region, such as "China East 1 (Hangzhou)" in the figure below'}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Create Instance",src:t(1873).A+"",width:"2874",height:"1066"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Select the instance type, currently supports ecs.r6.xlarge and ecs.r7a.xlarge specifications. If there is no model available in the list, try selecting other deployment areas."}),"\n",(0,s.jsx)(n.li,{children:"Select the model"}),"\n",(0,s.jsx)(n.li,{children:"Configure the password for the instance"}),"\n",(0,s.jsx)(n.li,{children:'Select the deployment area, such as "Availability Zone I" in the figure below'}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Select Region",src:t(862).A+"",width:"4102",height:"1242"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Click next to enter the order confirmation page"}),"\n",(0,s.jsx)(n.li,{children:'Check the checkboxes for "Permission Confirmation" and "Service Terms"'}),"\n",(0,s.jsx)(n.li,{children:'Click the green "Start Free Trial" button in the lower left corner to create a service instance'}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Confirmation",src:t(9175).A+"",width:"3414",height:"2180"})}),"\n",(0,s.jsx)(n.h3,{id:"35start-tugraph-service",children:"3.5.Start TuGraph Service"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"View the service instance: After the service instance is created successfully, it takes about 2 minutes for deployment. After the deployment is complete, you can see the corresponding service instance on the page, as shown in the figure below."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"View Instance",src:t(2764).A+"",width:"4616",height:"1264"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Click the service instance to access TuGraph. After entering the corresponding service instance, you can get 3 ways to\nuse it on the page: web, rpc, ssh. You can also see the password of user admin on the page."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Access Method",src:t(8213).A+"",width:"1216",height:"612"})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Click the link of web to jump to the deployed TuGraph Web. It is recommended that novice users first use the demo to quickly get started with TuGraph.\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"First, on the TuGraph Web login page, enter the default username (admin) and the password on the page to log in, as shown in the figure below."}),"\n",(0,s.jsx)(n.li,{children:'After the login is completed, click "New Instance" -> "Create Instance" in sequence, wait for the creation to be completed, and the steps in 3 will change to green in turn, and it will automatically switch to the subgraph MovieDemo1, as shown in the figure below.'}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.img,{alt:"Login",src:t(9058).A+"",width:"1527",height:"1120"}),"\n",(0,s.jsx)(n.img,{alt:"Create Demo",src:t(6923).A+"",width:"1709",height:"592"})]}),"\n",(0,s.jsx)(n.h2,{id:"4common-faqs",children:"4.Common FAQs"}),"\n",(0,s.jsx)(n.h3,{id:"no-available-resources-in-the-selected-deployment-area",children:"No available resources in the selected deployment area"}),"\n",(0,s.jsx)(n.p,{children:"Sometimes, the selected deployment area (such as Availability Zone G) does not have available resources for the selected package, and an error will be reported as shown in the figure below."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Deployment Error",src:t(2859).A+"",width:"596",height:"544"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Solution"}),":Try selecting other regions, such as Availability Zone I"]}),"\n",(0,s.jsx)(n.h3,{id:"unaccessible-to-the-web-port",children:"Unaccessible to the web port"}),"\n",(0,s.jsx)(n.p,{children:"It takes some time for the server to get ready. Just wait for a few seconds."}),"\n",(0,s.jsx)(n.h3,{id:"username-or-password-is-not-correct",children:"Username or password is not correct"}),"\n",(0,s.jsx)(n.p,{children:"Please make sure that you are using the password on the page instead of the default one."})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},2931:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-1-6de73b2cfb5fe70e92e5e3435ad8574f.png"},2859:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-10-55820cf0e6bb8fac4c2e7d548b97a1fc.png"},7656:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-2-2424fad73dbcd8267de47772bd60d29f.png"},1873:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-3-72b2b61772400506bd9a80eb4d343017.png"},862:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-4-0372e82170ac8bffe6d2d02b03b0a9e2.png"},9175:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-5-f4512e5e080e0b9f6138224cc49d424e.png"},2764:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-6-66d573e42075d2367c35e77b3330e2ac.png"},8213:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-7-a23a6b3eff495502a4c3dcb7e92e19ca.png"},9058:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-8-3141da1eed5c4e147ecdef322cf1c58d.png"},6923:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/cloud-deployment-9-8778b1296f1ca19397384c068bab67ea.png"},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>c});var s=t(6540);const i={},r=s.createContext(i);function a(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/811fe2fb.a4ef1e3e.js b/assets/js/811fe2fb.ef47da70.js similarity index 99% rename from assets/js/811fe2fb.a4ef1e3e.js rename to assets/js/811fe2fb.ef47da70.js index 7a3d552e8a..3176ffa75a 100644 --- a/assets/js/811fe2fb.a4ef1e3e.js +++ b/assets/js/811fe2fb.ef47da70.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[7738],{3720:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>g,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var r=a(4848),t=a(8453);const i={},o="Training",s={id:"olap&procedure/learn/training",title:"Training",description:"This document details how to use TuGraph for training Graph Neural Networks (GNNs).",source:"@site/../docs/en-US/source/9.olap&procedure/3.learn/3.training.md",sourceDirName:"9.olap&procedure/3.learn",slug:"/olap&procedure/learn/training",permalink:"/tugraph-db/en/olap&procedure/learn/training",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Sampling API",permalink:"/tugraph-db/en/olap&procedure/learn/sampling_api"},next:{title:"Heterogeneous Graph",permalink:"/tugraph-db/en/olap&procedure/learn/heterogeneous_graph"}},l={},d=[{value:"1. Training",id:"1-training",level:2},{value:"2. Mini-Batch Training",id:"2-mini-batch-training",level:2},{value:"3. Full-Batch training",id:"3-full-batch-training",level:2}];function h(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"training",children:"Training"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"This document details how to use TuGraph for training Graph Neural Networks (GNNs)."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"1-training",children:"1. Training"}),"\n",(0,r.jsx)(n.p,{children:"When using TuGraph's graph learning module for training, it can be divided into two categories: full graph training and mini-batch training."}),"\n",(0,r.jsx)(n.p,{children:"Full graph training involves loading the entire graph from the TuGraph db into memory and training the GNN. Mini-batch training uses the sampling operator of the TuGraph graph learning module to sample the entire graph data and then input it into the training framework for training."}),"\n",(0,r.jsx)(n.h2,{id:"2-mini-batch-training",children:"2. Mini-Batch Training"}),"\n",(0,r.jsx)(n.p,{children:"Mini-batch training requires the use of TuGraph's graph learning module's sampling operators, which currently support Neighbor Sampling, Edge Sampling, Random Walk Sampling, and Negative Sampling. The sampling result of the TuGraph graph learning module's sampling operator is returned in the form of a List."}),"\n",(0,r.jsx)(n.p,{children:"The following takes Neighbor Sampling as an example to introduce how to convert the sampled results into the training framework for format conversion.\nThe user needs to provide a Sample class:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"class TuGraphSample(object):\n def __init__(self, args=None):\n super(TuGraphSample, self).__init__()\n self.args = args\n def sample(self, g, seed_nodes):\n args = self.args\n # 1. Load graph data\n galaxy = PyGalaxy(args.db_path)\n galaxy.SetCurrentUser(args.username, args.password)\n db = galaxy.OpenGraph(args.graph_name, False)\n sample_node = seed_nodes.tolist()\n length = args.randomwalk_length\n NodeInfo = []\n EdgeInfo = []\n # 2. Sampling method, the result is stored in NodeInfo and EdgeInfo\n if args.sample_method == 'randomwalk':\n randomwalk.Process(db, 100, sample_node, length, NodeInfo, EdgeInfo)\n elif args.sample_method == 'negative':\n negativesample.Process(db, 100)\n else:\n neighborsample(db, 100, sample_node, args.nbor_sample_num, NodeInfo, EdgeInfo)\n del db\n del galaxy\n # 3. Format conversion of the result to fit the training format\n remap(EdgeInfo[0], EdgeInfo[1], NodeInfo[0])\n g = dgl.graph((EdgeInfo[0], EdgeInfo[1]))\n g.ndata['feat'] = torch.tensor(NodeInfo[1])\n g.ndata['label'] = torch.tensor(NodeInfo[2])\n return g\n"})}),"\n",(0,r.jsx)(n.p,{children:"As shown in the code, the graph data is first loaded into memory. Then use the sampling operator to sample the graph data, and the results are stored in NodeInfo and EdgeInfo. NodeInfo and EdgeInfo are python list results, and the stored information results are as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Graph Data"}),(0,r.jsx)(n.th,{children:"Storage Position"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Edge source"}),(0,r.jsx)(n.td,{children:"EdgeInfo[0]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Edge destination"}),(0,r.jsx)(n.td,{children:"EdgeInfo[1]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Vertex ID"}),(0,r.jsx)(n.td,{children:"NodeInfo[0]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Vertex features"}),(0,r.jsx)(n.td,{children:"NodeInfo[1]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Vertex label"}),(0,r.jsx)(n.td,{children:"NodeInfo[2]"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Finally, we format the result to fit the training format. Here we use the DGL training framework, so we construct a DGL Graph using the result data, and then return the DGL Graph."}),"\n",(0,r.jsx)(n.p,{children:"Once we provide the TuGraphSample class, we can use it for Mini-Batch training. Let the data loading part of DGL use the sampler instance of TuGraphSample as follows:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:" sampler = TugraphSample(args)\n fake_g = construct_graph() # just make dgl happy\n dataloader = dgl.dataloading.DataLoader(fake_g,\n torch.arange(train_nids),\n sampler,\n batch_size=batch_size,\n device=device,\n use_ddp=True,\n num_workers=0,\n drop_last=False,\n )\n"})}),"\n",(0,r.jsx)(n.p,{children:"Use DGL for model training:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"def train(dataloader, model):\n optimizer = torch.optim.Adam(model.parameters(), lr=1e-2, weight_decay=5e-4)\n model.train()\n s = time.time()\n for graph in dataloader:\n load_time = time.time()\n graph = dgl.add_self_loop(graph)\n logits = model(graph, graph.ndata['feat'])\n loss = loss_fcn(logits, graph.ndata['label'])\n optimizer.zero_grad()\n loss.backward()\n optimizer.step()\n train_time = time.time()\n print('load time', load_time - s, 'train_time', train_time - load_time)\n s = time.time()\n return float(loss)\n"})}),"\n",(0,r.jsx)(n.h2,{id:"3-full-batch-training",children:"3. Full-Batch training"}),"\n",(0,r.jsx)(n.p,{children:"Full-Batch training of GNNs (Graph Neural Networks) is a type of training that involves processing the entire training dataset at once. It is one of the simplest and most straightforward training methods for GNNs, where the entire graph is treated as a single instance. In full-batch training, the entire dataset is loaded into memory and the model is trained on the entire graph. This type of training is especially useful for small to medium-sized graphs, and is mainly used for static graphs that do not change over time."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"getdb. Process(db, olapondb, feature_len, NodeInfo, EdgeInfo)\n"})}),"\n",(0,r.jsx)(n.p,{children:"The full graph are then fed into the training framework for training.\nFull code: learn/examples/train_full_cora.py\u3002"})]})}function g(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,n,a)=>{a.d(n,{R:()=>o,x:()=>s});var r=a(6540);const t={},i=r.createContext(t);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[7738],{3720:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>g,frontMatter:()=>i,metadata:()=>s,toc:()=>d});var r=a(4848),t=a(8453);const i={},o="Training",s={id:"olap&procedure/learn/training",title:"Training",description:"This document details how to use TuGraph for training Graph Neural Networks (GNNs).",source:"@site/../docs/en-US/source/9.olap&procedure/3.learn/3.training.md",sourceDirName:"9.olap&procedure/3.learn",slug:"/olap&procedure/learn/training",permalink:"/tugraph-db/en/olap&procedure/learn/training",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Sampling API",permalink:"/tugraph-db/en/olap&procedure/learn/sampling_api"},next:{title:"Heterogeneous Graph",permalink:"/tugraph-db/en/olap&procedure/learn/heterogeneous_graph"}},l={},d=[{value:"1. Training",id:"1-training",level:2},{value:"2. Mini-Batch Training",id:"2-mini-batch-training",level:2},{value:"3. Full-Batch training",id:"3-full-batch-training",level:2}];function h(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"training",children:"Training"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"This document details how to use TuGraph for training Graph Neural Networks (GNNs)."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"1-training",children:"1. Training"}),"\n",(0,r.jsx)(n.p,{children:"When using TuGraph's graph learning module for training, it can be divided into two categories: full graph training and mini-batch training."}),"\n",(0,r.jsx)(n.p,{children:"Full graph training involves loading the entire graph from the TuGraph db into memory and training the GNN. Mini-batch training uses the sampling operator of the TuGraph graph learning module to sample the entire graph data and then input it into the training framework for training."}),"\n",(0,r.jsx)(n.h2,{id:"2-mini-batch-training",children:"2. Mini-Batch Training"}),"\n",(0,r.jsx)(n.p,{children:"Mini-batch training requires the use of TuGraph's graph learning module's sampling operators, which currently support Neighbor Sampling, Edge Sampling, Random Walk Sampling, and Negative Sampling. The sampling result of the TuGraph graph learning module's sampling operator is returned in the form of a List."}),"\n",(0,r.jsx)(n.p,{children:"The following takes Neighbor Sampling as an example to introduce how to convert the sampled results into the training framework for format conversion.\nThe user needs to provide a Sample class:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"class TuGraphSample(object):\n def __init__(self, args=None):\n super(TuGraphSample, self).__init__()\n self.args = args\n def sample(self, g, seed_nodes):\n args = self.args\n # 1. Load graph data\n galaxy = PyGalaxy(args.db_path)\n galaxy.SetCurrentUser(args.username, args.password)\n db = galaxy.OpenGraph(args.graph_name, False)\n sample_node = seed_nodes.tolist()\n length = args.randomwalk_length\n NodeInfo = []\n EdgeInfo = []\n # 2. Sampling method, the result is stored in NodeInfo and EdgeInfo\n if args.sample_method == 'randomwalk':\n randomwalk.Process(db, 100, sample_node, length, NodeInfo, EdgeInfo)\n elif args.sample_method == 'negative':\n negativesample.Process(db, 100)\n else:\n neighborsample(db, 100, sample_node, args.nbor_sample_num, NodeInfo, EdgeInfo)\n del db\n del galaxy\n # 3. Format conversion of the result to fit the training format\n remap(EdgeInfo[0], EdgeInfo[1], NodeInfo[0])\n g = dgl.graph((EdgeInfo[0], EdgeInfo[1]))\n g.ndata['feat'] = torch.tensor(NodeInfo[1])\n g.ndata['label'] = torch.tensor(NodeInfo[2])\n return g\n"})}),"\n",(0,r.jsx)(n.p,{children:"As shown in the code, the graph data is first loaded into memory. Then use the sampling operator to sample the graph data, and the results are stored in NodeInfo and EdgeInfo. NodeInfo and EdgeInfo are python list results, and the stored information results are as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Graph Data"}),(0,r.jsx)(n.th,{children:"Storage Position"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Edge source"}),(0,r.jsx)(n.td,{children:"EdgeInfo[0]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Edge destination"}),(0,r.jsx)(n.td,{children:"EdgeInfo[1]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Vertex ID"}),(0,r.jsx)(n.td,{children:"NodeInfo[0]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Vertex features"}),(0,r.jsx)(n.td,{children:"NodeInfo[1]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Vertex label"}),(0,r.jsx)(n.td,{children:"NodeInfo[2]"})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Finally, we format the result to fit the training format. Here we use the DGL training framework, so we construct a DGL Graph using the result data, and then return the DGL Graph."}),"\n",(0,r.jsx)(n.p,{children:"Once we provide the TuGraphSample class, we can use it for Mini-Batch training. Let the data loading part of DGL use the sampler instance of TuGraphSample as follows:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:" sampler = TugraphSample(args)\n fake_g = construct_graph() # just make dgl happy\n dataloader = dgl.dataloading.DataLoader(fake_g,\n torch.arange(train_nids),\n sampler,\n batch_size=batch_size,\n device=device,\n use_ddp=True,\n num_workers=0,\n drop_last=False,\n )\n"})}),"\n",(0,r.jsx)(n.p,{children:"Use DGL for model training:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"def train(dataloader, model):\n optimizer = torch.optim.Adam(model.parameters(), lr=1e-2, weight_decay=5e-4)\n model.train()\n s = time.time()\n for graph in dataloader:\n load_time = time.time()\n graph = dgl.add_self_loop(graph)\n logits = model(graph, graph.ndata['feat'])\n loss = loss_fcn(logits, graph.ndata['label'])\n optimizer.zero_grad()\n loss.backward()\n optimizer.step()\n train_time = time.time()\n print('load time', load_time - s, 'train_time', train_time - load_time)\n s = time.time()\n return float(loss)\n"})}),"\n",(0,r.jsx)(n.h2,{id:"3-full-batch-training",children:"3. Full-Batch training"}),"\n",(0,r.jsx)(n.p,{children:"Full-Batch training of GNNs (Graph Neural Networks) is a type of training that involves processing the entire training dataset at once. It is one of the simplest and most straightforward training methods for GNNs, where the entire graph is treated as a single instance. In full-batch training, the entire dataset is loaded into memory and the model is trained on the entire graph. This type of training is especially useful for small to medium-sized graphs, and is mainly used for static graphs that do not change over time."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"getdb. Process(db, olapondb, feature_len, NodeInfo, EdgeInfo)\n"})}),"\n",(0,r.jsx)(n.p,{children:"The full graph are then fed into the training framework for training.\nFull code: learn/examples/train_full_cora.py\u3002"})]})}function g(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,n,a)=>{a.d(n,{R:()=>o,x:()=>s});var r=a(6540);const t={},i=r.createContext(t);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/84f7962c.d1670fe1.js b/assets/js/84f7962c.dbac439d.js similarity index 99% rename from assets/js/84f7962c.d1670fe1.js rename to assets/js/84f7962c.dbac439d.js index aebf17daa0..aedd3d96c7 100644 --- a/assets/js/84f7962c.d1670fe1.js +++ b/assets/js/84f7962c.dbac439d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3282],{7160:(n,e,s)=>{s.r(e),s.d(e,{assets:()=>c,contentTitle:()=>l,default:()=>o,frontMatter:()=>d,metadata:()=>t,toc:()=>h});var r=s(4848),i=s(8453);const d={},l="TuGraph RESTful API Legacy",t={id:"client-tools/restful-api-legacy",title:"TuGraph RESTful API Legacy",description:"This document describes how to call the Rest API of TuGrpah.",source:"@site/../docs/en-US/source/7.client-tools/9.restful-api-legacy.md",sourceDirName:"7.client-tools",slug:"/client-tools/restful-api-legacy",permalink:"/tugraph-db/en/client-tools/restful-api-legacy",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:9,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"RPC API",permalink:"/tugraph-db/en/client-tools/rpc-api"},next:{title:"Cypher API",permalink:"/tugraph-db/en/query/cypher"}},c={},h=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Protocols And Data Format",id:"2protocols-and-data-format",level:2},{value:"2.1.Protocols",id:"21protocols",level:3},{value:"2.2.Request",id:"22request",level:3},{value:"2.3.Response",id:"23response",level:3},{value:"2.4.Data Format",id:"24data-format",level:3},{value:"2.5.URI Format",id:"25uri-format",level:3},{value:"3.Login",id:"3login",level:2},{value:"3.1.User Login",id:"31user-login",level:3},{value:"3.2.Token Refresh",id:"32token-refresh",level:3},{value:"3.3.Modify Token Validity Period",id:"33modify-token-validity-period",level:3},{value:"3.4.Query Token validity period",id:"34query-token-validity-period",level:3},{value:"3.5.Logout",id:"35logout",level:3},{value:"4.Query",id:"4query",level:2},{value:"4.1.Call Cypher",id:"41call-cypher",level:3},{value:"4.2.Call Cypher with Parameters",id:"42call-cypher-with-parameters",level:3},{value:"5.Stored Procedures",id:"5stored-procedures",level:2},{value:"5.1.Create Stored Procedure",id:"51create-stored-procedure",level:3},{value:"5.2.List Stored Procedures",id:"52list-stored-procedures",level:3},{value:"5.3.Retrieve Stored Procedure Detail",id:"53retrieve-stored-procedure-detail",level:3},{value:"5.4.Call Stored Procedure",id:"54call-stored-procedure",level:3},{value:"5.5.Delete Stored Procedure",id:"55delete-stored-procedure",level:3},{value:"6.Deprecated",id:"6deprecated",level:2},{value:"6.1.User Management",id:"61user-management",level:3},{value:"6.1.1.Add User",id:"611add-user",level:4},{value:"6.1.2.Change Password",id:"612change-password",level:4},{value:"6.1.3.List All Users",id:"613list-all-users",level:4},{value:"6.1.4.Delete User",id:"614delete-user",level:4},{value:"6.2.Access Control",id:"62access-control",level:3},{value:"6.2.1.Query User's Access Level",id:"621query-users-access-level",level:4},{value:"6.2.2.Change User's Access Level",id:"622change-users-access-level",level:4},{value:"6.2.3.Remove User's Access Right",id:"623remove-users-access-right",level:4},{value:"6.3.Server Status",id:"63server-status",level:3},{value:"6.3.1.Modify Server Configuration",id:"631modify-server-configuration",level:4},{value:"6.3.2.Current Server Status",id:"632current-server-status",level:4},{value:"6.3.3.CPU Status",id:"633cpu-status",level:4},{value:"6.3.4.Disk Status",id:"634disk-status",level:4},{value:"6.3.5.Memory Status",id:"635memory-status",level:4},{value:"6.3.6.Database Size",id:"636database-size",level:4},{value:"6.3.7.DB Configuration",id:"637db-configuration",level:4},{value:"6.3.7.High Availability Server List",id:"637high-availability-server-list",level:4},{value:"6.3.8.Current Leader Information",id:"638current-leader-information",level:4},{value:"6.3.9.Server Statistics",id:"639server-statistics",level:4},{value:"6.3.10.Get Audit Logs",id:"6310get-audit-logs",level:4},{value:"6.4.Task Management",id:"64task-management",level:3},{value:"6.4.1.List Running Tasks",id:"641list-running-tasks",level:4},{value:"6.4.2.Abort Task",id:"642abort-task",level:4},{value:"6.5.Subgraph Management",id:"65subgraph-management",level:3},{value:"6.5.1.Create New Subgraph",id:"651create-new-subgraph",level:4},{value:"6.5.2.Delete Subgraph",id:"652delete-subgraph",level:4},{value:"6.5.3.List All Subgraphs",id:"653list-all-subgraphs",level:4},{value:"6.6.Label",id:"66label",level:3},{value:"6.6.1.Create Label",id:"661create-label",level:4},{value:"6.6.2.List All Labels",id:"662list-all-labels",level:4},{value:"6.6.3.Get Label Data Format",id:"663get-label-data-format",level:4},{value:"6.6.4.Schema Import",id:"664schema-import",level:4},{value:"6.7.Vertex Operation",id:"67vertex-operation",level:3},{value:"6.7.1.List Vertex and Label Number",id:"671list-vertex-and-label-number",level:4},{value:"6.7.2.Create New Vertex",id:"672create-new-vertex",level:4},{value:"6.7.3.Batch Create Vertexes",id:"673batch-create-vertexes",level:4},{value:"6.7.4.Get Vertex",id:"674get-vertex",level:4},{value:"6.7.5.Delete Vertex",id:"675delete-vertex",level:4},{value:"6.7.6.Get Vertex Property",id:"676get-vertex-property",level:4},{value:"6.7.7.Get Vertex Field",id:"677get-vertex-field",level:4},{value:"6.7.8.Update Vertex Property",id:"678update-vertex-property",level:4},{value:"6.8.Edge Operation",id:"68edge-operation",level:3},{value:"6.8.1.Create Edge",id:"681create-edge",level:4},{value:"6.8.2.Batch Create Edges",id:"682batch-create-edges",level:4},{value:"6.8.3.List Out-going Edges",id:"683list-out-going-edges",level:4},{value:"6.8.4.List Incoming Edges",id:"684list-incoming-edges",level:4},{value:"6.8.5.List All Edges",id:"685list-all-edges",level:4},{value:"6.8.6.Get Edge Information",id:"686get-edge-information",level:4},{value:"6.8.7.Delete Edge",id:"687delete-edge",level:4},{value:"6.8.8.Get Edge Properties",id:"688get-edge-properties",level:4},{value:"6.8.9.Get Edge Field",id:"689get-edge-field",level:4},{value:"6.8.10.Update Edge Property",id:"6810update-edge-property",level:4},{value:"6.9.Index",id:"69index",level:3},{value:"6.9.1.Create Index",id:"691create-index",level:4},{value:"6.9.2.List All Indexes",id:"692list-all-indexes",level:4},{value:"6.9.3.List Indexes Related with Specified Label",id:"693list-indexes-related-with-specified-label",level:4},{value:"6.9.4.Delete Index",id:"694delete-index",level:4},{value:"6.9.5.Get Vertex by Index",id:"695get-vertex-by-index",level:4},{value:"6.10.Data Import",id:"610data-import",level:3},{value:"6.11.Miscellany",id:"611miscellany",level:3},{value:"6.11.1.Extract Subgraph",id:"6111extract-subgraph",level:4}];function x(n){const e={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...n.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.header,{children:(0,r.jsx)(e.h1,{id:"tugraph-restful-api-legacy",children:"TuGraph RESTful API Legacy"})}),"\n",(0,r.jsxs)(e.blockquote,{children:["\n",(0,r.jsx)(e.p,{children:"This document describes how to call the Rest API of TuGrpah."}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph provides HTTP RESTful APIs, which allow users to access TuGraph servers through HTTP requests remotely."}),"\n",(0,r.jsx)(e.p,{children:"This document specifiers the TuGraph HTTP RESTful API."}),"\n",(0,r.jsxs)(e.p,{children:["\u26a0\ufe0f ",(0,r.jsx)(e.strong,{children:"All the other RESTful APIs excluding the three below will be deprived after 4/30/2023."})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.strong,{children:"Login"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.strong,{children:"Query"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.strong,{children:"Store Procedures"})}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"2protocols-and-data-format",children:"2.Protocols And Data Format"}),"\n",(0,r.jsx)(e.h3,{id:"21protocols",children:"2.1.Protocols"}),"\n",(0,r.jsxs)(e.p,{children:["Both HTTP and HTTPS protocols are supported by TuGraph. The system uses HTTP protocol by default. To use HTTPS, the ",(0,r.jsx)(e.code,{children:"ssl_auth"})," option should be set to ",(0,r.jsx)(e.code,{children:"true"})," in the DB configuration."]}),"\n",(0,r.jsx)(e.h3,{id:"22request",children:"2.2.Request"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph supports HTTP GET/POST/PUT/DELETE requests, in which:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"GET"})," requests are used for read-only requests, such as getting vertex properties, edge properties, etc."]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"POST"})," requests are used to create entities, submit Cypher, and to manage and call stored procedures;"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"PUT"})," requests are used to modify existing entities, for example, to modify vertex properties, edge properties, etc."]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"DELETE"})," requests are used to delete existing entities, such as vertices, edges, etc."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.p,{children:["In high-availability mode, users can set ",(0,r.jsx)(e.code,{children:"ServerVersion"})," in the request header to make sure the request is never served with an outdated version.\nThe current ",(0,r.jsx)(e.code,{children:"ServerVersion"})," can be obtained from the header returned by the server."]}),"\n",(0,r.jsx)(e.h3,{id:"23response",children:"2.3.Response"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph returns the following HTTP status codes:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"200 OK"}),": operation is successful."]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"307 Temporary Redirect"}),": the operation is redirected, typically in high-availability mode, to the master."]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"400 Bad Request"}),": incorrect input, such as URI error, or invalid parameters."]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"500 Internal Server Error"}),": server error."]}),"\n"]}),"\n",(0,r.jsxs)(e.p,{children:["When the operation is successful, the JSON response contains the return value of the operation. When the operation is redirected, the ",(0,r.jsx)(e.code,{children:"location"})," field in the returned HTTP header contains the redirect destination address.\nWhen an input error or server error occurs, the JSON response contains a ",(0,r.jsx)(e.code,{children:"error_message"})," field that describes the error."]}),"\n",(0,r.jsxs)(e.p,{children:["In high-availability mode, the server will set ",(0,r.jsx)(e.code,{children:"server_version"})," field in the header to inform the client of the data version of the current server. When clients switch between several different servers, this version number guarantees that the client will not read from an outdated server."]}),"\n",(0,r.jsx)(e.h3,{id:"24data-format",children:"2.4.Data Format"}),"\n",(0,r.jsxs)(e.p,{children:["The server and clients exchange data in JSON format. When sending a request, the header of the HTTP request should be set with ",(0,r.jsx)(e.code,{children:"Accept:application/json, Content-Type:app/json"}),".\nFor example, to create a new vertex, the request header should look like the following:"]}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" Accept: application/json; charset=UTF-8\n Content-Type: application/json\n server_version: 12\n"})}),"\n",(0,r.jsx)(e.h3,{id:"25uri-format",children:"2.5.URI Format"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph REST API provides access to: web visualization, login, db info, label, index, node, relationship, cypher, task, cpp_plugin, and python_plugin.\nThe URI format used for each function is as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"URI"}),(0,r.jsx)(e.th,{children:"Description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/web"}),(0,r.jsx)(e.td,{children:"web visualization"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/cypher"}),(0,r.jsx)(e.td,{children:"cypher request"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/acl"}),(0,r.jsx)(e.td,{children:"access control"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/user"}),(0,r.jsx)(e.td,{children:"user management"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/login"}),(0,r.jsx)(e.td,{children:"user login"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/info"}),(0,r.jsx)(e.td,{children:"database status and information"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/task"}),(0,r.jsx)(e.td,{children:"task management"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/db"}),(0,r.jsx)(e.td,{children:"subgraph management"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:"For each subgraph, the following interfaces are provided:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"URI"}),(0,r.jsx)(e.th,{children:"Description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/db"}),(0,r.jsx)(e.td,{children:"create, modify, and delete subgraph"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/node"]}),(0,r.jsx)(e.td,{children:"vertex operations"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/relationship"]}),(0,r.jsx)(e.td,{children:"edge operations"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/label"]}),(0,r.jsx)(e.td,{children:"label-related operations"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/index"]}),(0,r.jsx)(e.td,{children:"index-related operations"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/cypher"]}),(0,r.jsx)(e.td,{children:"subgraph-specific cypher operation"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/cpp_plugin"]}),(0,r.jsx)(e.td,{children:"C++ plugin(stored procedure)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/python_plugin"]}),(0,r.jsx)(e.td,{children:"Python plugin(stored procedure)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/import"]}),(0,r.jsx)(e.td,{children:"online import"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/misc"]}),(0,r.jsx)(e.td,{children:"other operations"})]})]})]}),"\n",(0,r.jsx)(e.h2,{id:"3login",children:"3.Login"}),"\n",(0,r.jsxs)(e.p,{children:["The system creates an administrator by default, whose username is ",(0,r.jsx)(e.em,{children:"admin"})," and password is ",(0,r.jsx)(e.em,{children:"73@TuGraph"}),". For security reasons, please remember to change your password after first starting the server."]}),"\n",(0,r.jsx)(e.h3,{id:"31user-login",children:"3.1.User Login"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph provides JWT-based user authentication. To log in to the server, the REST client should send a login request containing a username and password. Upon success, the client will receive a signed token in the form of a Json Web Token (JWT) and a Boolean variable (default_password) to determine whether it is the default password. The jwt token should be stored by the client and used for each subsequent request."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/login"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user"}),(0,r.jsx)(e.td,{children:"username"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"password"}),(0,r.jsx)(e.td,{children:"password"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"jwt"}),(0,r.jsx)(e.td,{children:"token"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"default_password"}),(0,r.jsx)(e.td,{children:"whether it is the default password"}),(0,r.jsx)(e.td,{children:"Bool"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/login\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "user":"admin",\n "password":"73@TuGraph"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek",\n "default_password": true\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"32token-refresh",children:"3.2.Token Refresh"}),"\n",(0,r.jsx)(e.p,{children:"After the token expires, the front-end initiates a refresh token interface, and the back-end verifies the validity of the token.\nIf the verification passes, a new token is generated; if the verification fails, status code 401 is returned."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/refresh"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Authorization"}),(0,r.jsx)(e.td,{children:"token"}),(0,r.jsx)(e.td,{children:"String"})]})})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"jwt"}),(0,r.jsx)(e.td,{children:"token"}),(0,r.jsx)(e.td,{children:"String"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/refresh\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "Authorization": "Bearer eyJhbGciOiJIUz32NiIsInR5cCI6IkpXVDJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byj3fYVAH4D88dfTD_zYQ_uAvdizTMek"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek"\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"33modify-token-validity-period",children:"3.3.Modify Token Validity Period"}),"\n",(0,r.jsx)(e.p,{children:"To modify the validity period of Token, three parameters need to be transmitted: jwt, refresh_time and expire_time, among which jwt is used to verify the user\u2019s identity. When refresh_time and expire_time are equal to 0, the validity period is indefinite. When refresh_time exceeds, you need to call the refresh interface to obtain a new Token; When expire_time expires, you need to log in again. (This interface call needs to confirm the security by itself, do not call unless necessary)"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/update_token_time"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Authorization"}),(0,r.jsx)(e.td,{children:"token"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"refresh_time"}),(0,r.jsx)(e.td,{children:"Valid time (deafult set to 0)"}),(0,r.jsx)(e.td,{children:"Int64"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"expire_time"}),(0,r.jsx)(e.td,{children:"Expire time (deafult set to 0)"}),(0,r.jsx)(e.td,{children:"Int64"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example request."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/update_token_time\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "Authorization" : "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmbWEuYWkiLCJwYXNzd29yZCI6IjczQFR1R3JhcGgiLCJ1c2VyIjoiYWRtaW4ifQ.o_yb5veSJkuy-ieBp4MqTk-tC1grcKotgVbgNJ0TyTU",\n "refresh_time":0\n "expire_time":0\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example response."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h3,{id:"34query-token-validity-period",children:"3.4.Query Token validity period"}),"\n",(0,r.jsx)(e.p,{children:"To query the validity period of the Token, you need to transmit jwt to verify the user's identity, and return, refresh_time and expire_time, where refresh_time indicates the refresh time, and you need to call the refresh interface to obtain a new Token when it exceeds; expire_time indicates the expiration time, and you need to log in again when it exceeds."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/get_token_time"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Authorization"}),(0,r.jsx)(e.td,{children:"token"}),(0,r.jsx)(e.td,{children:"String"})]})})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),': if successful, return "refresh_time" and "expire_time".']}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example request."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/get_token_time\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "Authorization" : "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmbWEuYWkiLCJwYXNzd29yZCI6IjczQFR1R3JhcGgiLCJ1c2VyIjoiYWRtaW4ifQ.o_yb5veSJkuy-ieBp4MqTk-tC1grcKotgVbgNJ0TyTU",\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example response."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "refresh_time":600,\n "expire_time":3600\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"35logout",children:"3.5.Logout"}),"\n",(0,r.jsx)(e.p,{children:"The user logs out and deletes the token at the same time."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/logout"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Authorization"}),(0,r.jsx)(e.td,{children:"token"}),(0,r.jsx)(e.td,{children:"String"})]})})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/refresh\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "Authorization" : "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmbWEuYWkiLCJwYXNzd29yZCI6IjczQFR1R3JhcGgiLCJ1c2VyIjoiYWRtaW4ifQ.o_yb5veSJkuy-ieBp4MqTk-tC1grcKotgVbgNJ0TyTU"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h2,{id:"4query",children:"4.Query"}),"\n",(0,r.jsx)(e.p,{children:"URI format is:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/cypher\n"})}),"\n",(0,r.jsx)(e.h3,{id:"41call-cypher",children:"4.1.Call Cypher"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/cypher"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph"}),(0,r.jsx)(e.td,{children:"subgraph name"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"cypher"}),(0,r.jsx)(e.td,{children:"Cypher query"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"result"}),(0,r.jsx)(e.td,{children:"running results"}),(0,r.jsx)(e.td,{children:"List"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"elapsed"}),(0,r.jsx)(e.td,{children:"running time in seconds"}),(0,r.jsx)(e.td,{children:"Float"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"header"}),(0,r.jsx)(e.td,{children:"header of the results"}),(0,r.jsx)(e.td,{children:"List"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"size"}),(0,r.jsx)(e.td,{children:"number of results"}),(0,r.jsx)(e.td,{children:"Integer"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which ",(0,r.jsx)(e.code,{children:"header"})," is a list with each element in the form of:"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"the name of column"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"type"}),(0,r.jsx)(e.td,{children:"column data type, 0 is scalar, 1 is vertex id, 2 is vector"}),(0,r.jsx)(e.td,{})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/cypher\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "graph": "default",\n "script": "MATCH (n) RETURN n,n.name LIMIT 10"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "elapsed": 0.001224517822265625,\n "header": [\n {\n "name": "n",\n "type": 1\n },\n {\n "name": "n.name",\n "type": 0\n }\n ]\n "result": [\n [\n 0,\n "Rachel Kempson"\n ],\n [\n 1,\n "Michael Redgrave"\n ],\n [\n 2,\n "Vanessa Redgrave"\n ]\n ],\n "size": 3\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"42call-cypher-with-parameters",children:"4.2.Call Cypher with Parameters"}),"\n",(0,r.jsx)(e.p,{children:"Cypher supports querying with parameters. When a Cypher query with parameters is called, TuGraph caches the execution plan for that query to speed up the following queries of the same kind."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/cypher"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph"}),(0,r.jsx)(e.td,{children:"subgraph name"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"cypher"}),(0,r.jsx)(e.td,{children:"Cypher query"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"parameters"}),(0,r.jsx)(e.td,{children:"parameters"}),(0,r.jsx)(e.td,{children:"List"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n",(0,r.jsxs)(e.p,{children:["Same as ",(0,r.jsx)(e.a,{href:"#Call-Cypher",children:"Call Cypher"}),"."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/graph1/cypher\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "graph": "default",\n "script": "MATCH (n:Person {name:$param1}) RETURN n.birthyear",\n "parameters": {\n "$param1": "Lindsay Lohan"\n }\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "elapsed": 0.005886077880859375,\n "header": [\n {\n "name": "n.birthyear",\n "type": 0\n }\n ],\n "result": [\n [\n 1986\n ]\n ],\n "size": 1\n }\n'})}),"\n",(0,r.jsx)(e.h2,{id:"5stored-procedures",children:"5.Stored Procedures"}),"\n",(0,r.jsx)(e.p,{children:"URI format is:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/db/{graph_name}/cpp_plugin|python_plugin\n"})}),"\n",(0,r.jsx)(e.h3,{id:"51create-stored-procedure",children:"5.1.Create Stored Procedure"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/cpp_plugin|python_plugin"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"name of the plugin"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"description"}),(0,r.jsx)(e.td,{children:"description of the plugin"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"code_base64"}),(0,r.jsx)(e.td,{children:"code of plugin encoded in base64"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"read_only"}),(0,r.jsx)(e.td,{children:"whether it is a read-only stored procedure"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"code_type"}),(0,r.jsx)(e.td,{children:"type of plugin code, can be zip/cpp/so for cpp_plugin, while py for python_plugin"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsxs)(e.em,{children:["Note: read-only plugins are more efficient than write plugins. Always specify ",(0,r.jsx)(e.code,{children:"read-only=true"})," for read-only transactions."]})}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/graph1/cpp_plugin\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "name" : "echo",\n "description" : "A test plugin that returns the input",\n "code_base64" : "{base64 encoded echo.so}",\n "read_only" : true,\n "code_type" : "zip"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h3,{id:"52list-stored-procedures",children:"5.2.List Stored Procedures"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/cpp_plugin|python_plugin"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": A list in which each element is a plugin description, in the format of:"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"name of the stored procedure"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"description"}),(0,r.jsx)(e.td,{children:"description of the stored procedure"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"read_only"}),(0,r.jsx)(e.td,{children:"whether the stored procedure is read-only"}),(0,r.jsx)(e.td,{children:"Bool"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/cpp_plugin\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n [\n {\n "description":"adds a vertex label to the db",\n "name":"add_label",\n "read_only":false\n },\n {\n "description": "scans graph and get number of edges",\n "name": "scan_graph",\n "read_only": true\n }\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"53retrieve-stored-procedure-detail",children:"5.3.Retrieve Stored Procedure Detail"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/cpp_plugin|python_plugin/{plugin_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": Procedure detail, including code, in the format of:"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"Procedure name"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"description"}),(0,r.jsx)(e.td,{children:"Procedure descrition"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"read_only"}),(0,r.jsx)(e.td,{children:"Read only or not"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"code_base64"}),(0,r.jsx)(e.td,{children:"\u5b58\u50a8\u8fc7\u7a0b\u7684\u4ee3\u7801"}),(0,r.jsx)(e.td,{children:"String, Base64 encoded"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"code_type"}),(0,r.jsx)(e.td,{children:"Type of procedue code, can be zip/cpp/so for cpp_plugin, while py for python_plugin"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example request."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/cpp_plugin/echo\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example response."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "name" : "echo",\n "description" : "A test plugin that returns the input",\n "code_base64" : "{base64 encoded echo.zip}",\n "read_only" : true,\n "code_type" : "zip"\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"54call-stored-procedure",children:"5.4.Call Stored Procedure"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/cpp_plugin|python_plugin/{plugin_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),": String input."]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"data"}),(0,r.jsx)(e.td,{children:"input data"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"timeout"}),(0,r.jsx)(e.td,{children:"timeout in seconds, defaults to 0, which means no timeout"}),(0,r.jsx)(e.td,{children:"Float"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"result"}),(0,r.jsx)(e.td,{children:"running results"}),(0,r.jsx)(e.td,{children:"String"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/graph1/python_plugin/echo\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n data : "Hello!\\n\u4f60\u597d\uff01\\nKonichiwa!",\n timeout : 0,\n in_process : true\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "result": "Hello!\\n\u4f60\u597d\uff01\\nKonichiwa!"\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"55delete-stored-procedure",children:"5.5.Delete Stored Procedure"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/cpp_plugin|python_plugin/{plugin_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/db/graph1/cpp_plugin/example_plugin\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h2,{id:"6deprecated",children:"6.Deprecated"}),"\n",(0,r.jsx)(e.p,{children:"The APIs below will be removed after 4/30/2023."}),"\n",(0,r.jsx)(e.h3,{id:"61user-management",children:"6.1.User Management"}),"\n",(0,r.jsx)(e.h4,{id:"611add-user",children:"6.1.1.Add User"}),"\n",(0,r.jsx)(e.p,{children:"Add a new user and set the initial password for the user. Only administrators have permission to add new users. The username can only have letters, numbers, and underscores, and should not begin with a number. The password can contain any character. The username and password have a maximum length of 64 bytes."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/user"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user"}),(0,r.jsx)(e.td,{children:"username"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"password"}),(0,r.jsx)(e.td,{children:"password"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"is_admin"}),(0,r.jsx)(e.td,{children:"whether the user is an administrator or not"}),(0,r.jsx)(e.td,{children:"Bool"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/user\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n \u2022 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek\n Input:\n {\n "user": "USER1",\n "password": "AN_INITIAL_PASSWORD",\n "is_admin": false\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"612change-password",children:"6.1.2.Change Password"}),"\n",(0,r.jsx)(e.p,{children:"Users can change their own passwords, in which case the original password needs to be verified."}),"\n",(0,r.jsx)(e.p,{children:"Administrators can change the passwords of any user and promote non-admin users to administrators, or demote administrator users to regular users. When modifying another user's password, the original password of the user is not needed."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/user/{user_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": PUT"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"current_password"}),(0,r.jsx)(e.td,{children:"user's current password, if modifying its own password"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"new_password"}),(0,r.jsx)(e.td,{children:"user's new password"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"is_admin"}),(0,r.jsx)(e.td,{children:"should this user be administrator or not, used when promoting or demoting users"}),(0,r.jsx)(e.td,{children:"Bool"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/user/user1\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n \u2022 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek\n Input:\n {\n "current_password": "THE_CURRENT_PASSWORD"\n "new_password": "A_NEW_PASSWORD"\n "is_admin": true\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"613list-all-users",children:"6.1.3.List All Users"}),"\n",(0,r.jsx)(e.p,{children:"List all users of the database. Only administrators are allowed to perform this operation."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/user/"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": a dictionary of {",(0,r.jsx)(e.code,{children:"user_name"}),":",(0,r.jsx)(e.code,{children:"is_admin"}),"}"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/user\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n \u2022 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:'\u2022 200: OK\nOutput:\n{\n "admin": true,\n "guest1": false\n}\n'})}),"\n",(0,r.jsx)(e.h4,{id:"614delete-user",children:"6.1.4.Delete User"}),"\n",(0,r.jsx)(e.p,{children:"Delete a user from the DB. Only administrators have permission to do so."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/user/{user_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/user/guest1\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n \u2022 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h3,{id:"62access-control",children:"6.2.Access Control"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph has four access levels. Different users can have different permissions for each subgraph. The four access levels are as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Access Level"}),(0,r.jsx)(e.th,{children:"Description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"NONE"}),(0,r.jsx)(e.td,{children:"no access"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"READ"}),(0,r.jsx)(e.td,{children:"read-only"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"WRITE"}),(0,r.jsx)(e.td,{children:"can read and write vertexes and edges of the subgraph"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"FULL"}),(0,r.jsx)(e.td,{children:"full access, including changing metadata (label, index), managing stored procedures and deleting all data in the subgraph"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:"Administrators have full access on all subgraphs, and a newly created non-admin user does not have access for any subgraph. Users who have full access on a subgraph can set the access level for other users on that subgraph."}),"\n",(0,r.jsx)(e.h4,{id:"621query-users-access-level",children:"6.2.1.Query User's Access Level"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/acl/?user={user_name}&graph={graph_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.p,{children:["When both ",(0,r.jsx)(e.code,{children:"user"})," and ",(0,r.jsx)(e.code,{children:"graph"})," are specified, the user's access level for the subgraph is returned, such as ",(0,r.jsx)(e.code,{children:"READ"}),"."]}),"\n",(0,r.jsxs)(e.p,{children:["When only ",(0,r.jsx)(e.code,{children:"user"})," is specified, all subgraphs that the user can access (access level not ",(0,r.jsx)(e.code,{children:"NONE"}),") are returned, as well as the user's access level on the subgraph."]}),"\n",(0,r.jsxs)(e.p,{children:["When only ",(0,r.jsx)(e.code,{children:"graph"})," is specified, all users who have access level on this graph (excluding administrators, who have implicit ",(0,r.jsx)(e.code,{children:"FULL"})," access) and their access levels are returned. This operation requires administrator permission."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/acl/?user=user1\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "graph1": "READ",\n "graph2": "WRITE",\n "graph3": "FULL"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"622change-users-access-level",children:"6.2.2.Change User's Access Level"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/acl"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": PUT"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user"}),(0,r.jsx)(e.td,{children:"username"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph"}),(0,r.jsx)(e.td,{children:"subgraph's name"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"acl"}),(0,r.jsx)(e.td,{children:"access level"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 PUT http://localhost:7070/acl\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek\n Input:\n {\n "user": "user1",\n "graph": "graph1",\n "acl": "FULL"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"623remove-users-access-right",children:"6.2.3.Remove User's Access Right"}),"\n",(0,r.jsxs)(e.p,{children:["This is equivalent to setting access level to ",(0,r.jsx)(e.code,{children:"NONE"}),"."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/acl/?user={user_name}&graph={graph_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/acl/?user=user1&graph=graph1\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h3,{id:"63server-status",children:"6.3.Server Status"}),"\n",(0,r.jsx)(e.h4,{id:"631modify-server-configuration",children:"6.3.1.Modify Server Configuration"}),"\n",(0,r.jsx)(e.p,{children:"Modifying the server configuration will take effect immediately after the configuration modification and will affect all servers. These configurations take precedence over configuration files and command line arguments."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/config"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": PUT"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db_async"}),(0,r.jsx)(e.td,{children:"Whether to enable asynchronous mode"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"optimistic_txn"}),(0,r.jsx)(e.td,{children:"Whether to use optimistic transaction lock by default"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"enable_audit_log"}),(0,r.jsx)(e.td,{children:"Whether to enable audit logging"}),(0,r.jsx)(e.td,{children:"Bool"})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": If successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example request."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 PUT http://localhost:7070/config\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "db_async": true,\n "enable_audit_log": false\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example response."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"632current-server-status",children:"6.3.2.Current Server Status"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"lgraph_version"}),(0,r.jsx)(e.td,{children:"TuGraph version"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"git_branch"}),(0,r.jsx)(e.td,{children:"server's git branch"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"git_commit"}),(0,r.jsx)(e.td,{children:"server's git commit version"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"web_commit"}),(0,r.jsx)(e.td,{children:"web client commit version"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"cpp_id"}),(0,r.jsx)(e.td,{children:"cpp compiler id"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"cpp_version"}),(0,r.jsx)(e.td,{children:"cpp compiler version"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"python_version"}),(0,r.jsx)(e.td,{children:"python lib version"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"cpu"}),(0,r.jsx)(e.td,{children:"cpu information"}),(0,r.jsxs)(e.td,{children:["Dictionary, format refers ",(0,r.jsx)(e.a,{href:"#CPU-Status",children:"CPU Status"})]})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"disk"}),(0,r.jsx)(e.td,{children:"disk IO information"}),(0,r.jsxs)(e.td,{children:["Dictionary, format refers ",(0,r.jsx)(e.a,{href:"#Disk-Status",children:"Disk Status"})]})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"memory"}),(0,r.jsx)(e.td,{children:"memory information"}),(0,r.jsxs)(e.td,{children:["Dictionary, format refers ",(0,r.jsx)(e.a,{href:"#Memory-Status",children:"Memory Status"})]})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db_space"}),(0,r.jsx)(e.td,{children:"graph database storage"}),(0,r.jsxs)(e.td,{children:["Dictionary, format refers ",(0,r.jsx)(e.a,{href:"#Graph-Database-Storage",children:"Graph Database Storage"})]})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db_config"}),(0,r.jsx)(e.td,{children:"graph database configuration"}),(0,r.jsxs)(e.td,{children:["Dictionary, format refers ",(0,r.jsx)(e.a,{href:"#Graph-Database-Configuration",children:"Graph Database Configuration"})]})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"up_time"}),(0,r.jsx)(e.td,{children:"database's online running time"}),(0,r.jsx)(e.td,{children:"Integer"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "lgraph_version": "1.2.0",\n "git_branch": "master",\n "git_commit": "9e2977d",\n "web_commit": "1e2823d",\n "cpu_id": "GUN",\n "cpu_version": "4.8.5",\n "python_version": "3.2",\n "node": "/node",\n "relationship": "/relationship",\n "cpu": {\n "self": 25,\n "server": 35,\n "unit": "%"\n },\n "disk": {\n "read": 2000,\n "write": 2000,\n "unit": "B/s"\n },\n "memory": {\n "self": 25016,\n "server_avail": 46865636,\n "server_total": 65860552,\n "unit": "KB"\n },\n "db_space": {\n "space": 57344,\n "unit": "B"\n },\n "db_config": {\n "db_async": false,\n "disable_auth": false,\n "enable_ha": false,\n ...\n },\n "up_time": 3235\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"633cpu-status",children:"6.3.3.CPU Status"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/cpu"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"self"}),(0,r.jsx)(e.td,{children:"TuGraph CPU usage"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"server"}),(0,r.jsx)(e.td,{children:"server's CPU usage"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"unit"}),(0,r.jsx)(e.td,{children:"metric unit"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/cpu\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "self": 25,\n "server": 35,\n "unit": "%"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"634disk-status",children:"6.3.4.Disk Status"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/disk"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"read"}),(0,r.jsx)(e.td,{children:"server's disk read rate"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"write"}),(0,r.jsx)(e.td,{children:"server's disk wrtie rate"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"unit"}),(0,r.jsx)(e.td,{children:"metric unit"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example request."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/disk\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example response."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "read": 2000,\n "write": 2000,\n "unit": "B/s"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"635memory-status",children:"6.3.5.Memory Status"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/memory"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"self"}),(0,r.jsx)(e.td,{children:"TuGraph memory usage"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"server_avail"}),(0,r.jsx)(e.td,{children:"server's available memory"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"server_total"}),(0,r.jsx)(e.td,{children:"server's total memory"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"unit"}),(0,r.jsx)(e.td,{children:"metric unit"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/memory\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "self": 25016,\n "server_avail": 46865636,\n "server_total": 65860552,\n "unit": "KB"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"636database-size",children:"6.3.6.Database Size"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/db_space"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"space"}),(0,r.jsx)(e.td,{children:"total size of the database"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"unit"}),(0,r.jsx)(e.td,{children:"metric unit"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/db_space\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "space": 57344,\n "unit": "B"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"637db-configuration",children:"6.3.7.DB Configuration"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/db_config"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"async"}),(0,r.jsx)(e.td,{children:"asynchronous mode"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"disable_auth"}),(0,r.jsx)(e.td,{children:"whether to disable authentication"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"enable_ha"}),(0,r.jsx)(e.td,{children:"whether to enable high-availability mode"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"enable_rpc"}),(0,r.jsx)(e.td,{children:"whether to enable RPC server"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"host"}),(0,r.jsx)(e.td,{children:"bound host address"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"port"}),(0,r.jsx)(e.td,{children:"port of REST server"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"rpc_port"}),(0,r.jsx)(e.td,{children:"port of RPC server"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"thread_limit"}),(0,r.jsx)(e.td,{children:"limit of available threads for the graph database"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"use_ssl"}),(0,r.jsx)(e.td,{children:"whether to use SSL for authentication"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"verbose"}),(0,r.jsx)(e.td,{children:"verbose level of the output"}),(0,r.jsx)(e.td,{children:"Integer"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/db_config\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "async":false,\n "disable_auth":false,\n "enable_ha":false,\n "enable_rpc":false,\n "host":"127.0.0.1",\n "port":7070,\n "rpc_port":9091,\n "thread_limit":0,\n "use_ssl":false,\n "verbose":2\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"637high-availability-server-list",children:"6.3.7.High Availability Server List"}),"\n",(0,r.jsx)(e.p,{children:"Get a list of replication servers. Valid only in high-availability mode."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/peers"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and a list of server information, each of server information is formatted as:"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"rpc_address"}),(0,r.jsx)(e.td,{children:"server's RPC address"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"rest_address"}),(0,r.jsx)(e.td,{children:"server's REST address"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"state"}),(0,r.jsx)(e.td,{children:"server state"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["The server state can be ",(0,r.jsx)(e.code,{children:"MASTER"}),", ",(0,r.jsx)(e.code,{children:"SLAVE"}),", or ",(0,r.jsx)(e.code,{children:"OFFLINE"}),"."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/peers\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n {\n "rest_address":"192.168.1.22:17071",\n "rpc_address":"192.168.1.22:19091",\n "state":"MASTER"\n },\n {\n "rest_address":"192.168.1.22:17072",\n "rpc_address":"192.168.1.22:19092",\n "state":"SLAVE"\n }\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"638current-leader-information",children:"6.3.8.Current Leader Information"}),"\n",(0,r.jsx)(e.p,{children:"Get information of current leader. Valid only in HA mode."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/leader"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and the current leader server information, which is formatted as:"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"rpc_address"}),(0,r.jsx)(e.td,{children:"server's RPC address"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"rest_address"}),(0,r.jsx)(e.td,{children:"server's REST address"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/leader\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "rest_address":"192.168.1.22:17071",\n "rpc_address":"192.168.1.22:19091"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"639server-statistics",children:"6.3.9.Server Statistics"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/statistics"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and the current server statistics, which is formatted as:"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"requests/second"}),(0,r.jsx)(e.td,{children:"number of requests processed per second"}),(0,r.jsx)(e.td,{children:"Float"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"writes/second"}),(0,r.jsx)(e.td,{children:"number of write requests processed per second"}),(0,r.jsx)(e.td,{children:"Float"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"running_tasks"}),(0,r.jsx)(e.td,{children:"number of requests in progress"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"failure_rate"}),(0,r.jsx)(e.td,{children:"request failure rate"}),(0,r.jsx)(e.td,{children:"Float"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/statistics\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "failure_rate": 0.023,\n "requests/second": 122.3,\n "running_tasks": 10,\n "writes/second": 12.4\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"6310get-audit-logs",children:"6.3.10.Get Audit Logs"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/log/?begin_time={begin_time}&end_time={end_time}&user={user}&num_log={num_log}&descending_order={descending_order}"})]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"begin_time"}),(0,r.jsx)(e.td,{children:"start time of the queried log (required, format YYYY-mm-dd HH:MM:SS)"}),(0,r.jsx)(e.td,{children:"Timestamp"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"end_time"}),(0,r.jsx)(e.td,{children:"end time of the queried log (default is current time, format YYYY-mm-dd HH:MM:SS)"}),(0,r.jsx)(e.td,{children:"Timestamp"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user"}),(0,r.jsx)(e.td,{children:"the operator of the queried log (administrator can query all users' logs, ordinary users can only query their own logs)"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"num_log"}),(0,r.jsx)(e.td,{children:"maximum number of logs to return (default 100)"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"descending_order"}),(0,r.jsx)(e.td,{children:"whether to sort the result in descending order(default is true)"}),(0,r.jsx)(e.td,{children:"Bool"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and a list of audit logs, each of which is an action log in the format of:"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"index"}),(0,r.jsx)(e.td,{children:"the index of the operation"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"begin_time"}),(0,r.jsx)(e.td,{children:"the start time of the operation"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"end_time"}),(0,r.jsx)(e.td,{children:"the end time of the operation"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user"}),(0,r.jsx)(e.td,{children:"the user of the operation"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph"}),(0,r.jsx)(e.td,{children:"the graph of the operation"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"type"}),(0,r.jsx)(e.td,{children:"the type of the operation"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"read_write"}),(0,r.jsx)(e.td,{children:"the operation is read operation or write operation"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"success"}),(0,r.jsx)(e.td,{children:"whether the operation is successful"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"content"}),(0,r.jsx)(e.td,{children:"the content of the operation"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/log/?begin_time=2020-02-17%2015:00:00&end_time=2020-02-20%2012:00:00&user=admin&num_log=100&descending_order=false\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n {\n "begin_time": "2020-02-17 15:27:15",\n "content": "post /login Successful",\n "end_time": "2020-02-17 15:27:15",\n "graph": "",\n "index": 1,\n "read_write": "read",\n "success": true,\n "type": "Security",\n "user":"admin"\n },\n {\n "begin_time": "2020-02-17 15:27:15",\n "content": "Load plugin : `echo` Successful",\n "end_time": "2020-02-17 15:27:15",\n "graph": "default",\n "index": 2,\n "read_write": "write",\n "success": true,\n "type": "Plugin",\n "user": "admin"\n },\n ...\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"64task-management",children:"6.4.Task Management"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph tracks long-running tasks such as complex Cypher queries and plugins. Administrators can query currently running tasks through the REST API and choose to abort the queries if necessary."}),"\n",(0,r.jsx)(e.p,{children:"The URI format for task management is :"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/task/{task_id}\n"})}),"\n",(0,r.jsx)(e.h4,{id:"641list-running-tasks",children:"6.4.1.List Running Tasks"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/task"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"The returned JSON is an array, each of which is formatted as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"description"}),(0,r.jsx)(e.td,{children:"the description of the task"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"time_elapsed"}),(0,r.jsx)(e.td,{children:"time the task has been executing for, in seconds"}),(0,r.jsx)(e.td,{children:"Float"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"task_id"}),(0,r.jsx)(e.td,{children:"the ID of the task"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/task\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n {\n "description" : "[CPP_PLUGIN] scan_graph",\n "time_elapsed" : 13.987,\n "task_id" : "3_10"\n },\n {\n "description" : "[CYPHER] MATCH(n) return n",\n "time_elapsed" : 30.887,\n "task_id" : "2_6"\n }\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"642abort-task",children:"6.4.2.Abort Task"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/task/{task_id}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.p,{children:["Where ",(0,r.jsx)(e.code,{children:"task_id"})," is the ",(0,r.jsx)(e.code,{children:"task_id"})," returned by ",(0,r.jsx)(e.code,{children:"GET /task"})," ."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/task/3_10\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h3,{id:"65subgraph-management",children:"6.5.Subgraph Management"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph supports multiple subgraphs and all subgraphs are completely independent from others. Different subgraphs can have different permissions to different users. Administrators can add, modify and delete subgraphs."}),"\n",(0,r.jsx)(e.h4,{id:"651create-new-subgraph",children:"6.5.1.Create New Subgraph"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"the name of subgraph"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"config"}),(0,r.jsx)(e.td,{children:"the configuration of subgraph"}),(0,r.jsx)(e.td,{children:"Dictionary, in the format of {{column name 1}:{column value 1},...}"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "name":"graph1"\n "config" : {\n "max_size_GB":2048,\n "async":True\n }\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"652delete-subgraph",children:"6.5.2.Delete Subgraph"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/db/graph1\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"653list-all-subgraphs",children:"6.5.3.List All Subgraphs"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": The list of all subgraphs."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "graph1": {\n "max_size_gb":1024,\n "async":false\n }\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"66label",children:"6.6.Label"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph is a strong-schema database. In each subgraph, each vertex and edge need to have a predefined data format. The data format is determined by Label. Users can use the REST API to add, delete, and query labels and their corresponding data format."}),"\n",(0,r.jsx)(e.p,{children:"The URI format of the Label operation is"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/db/{graph_name}/label/{type}/{label_name}\n"})}),"\n",(0,r.jsxs)(e.p,{children:["Where the {type} can be ",(0,r.jsx)(e.code,{children:"node"})," or ",(0,r.jsx)(e.code,{children:"relationship"}),"."]}),"\n",(0,r.jsx)(e.h4,{id:"661create-label",children:"6.6.1.Create Label"}),"\n",(0,r.jsx)(e.p,{children:"A label is created with a fixed data format. A label must be defined before any node or relationship can be created with that label."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/label"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"the name of label"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"fields"}),(0,r.jsx)(e.td,{children:"data column definition"}),(0,r.jsx)(e.td,{children:"List"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"is_vertex"}),(0,r.jsx)(e.td,{children:"whether it is a vertex Label"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"primary"}),(0,r.jsx)(e.td,{children:"vertex primary property"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"edge_constraints"}),(0,r.jsx)(e.td,{children:"edge constraints"}),(0,r.jsx)(e.td,{children:"List"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"primary"})," should be set when ",(0,r.jsx)(e.code,{children:"is_vertex"})," is ",(0,r.jsx)(e.code,{children:"true"}),". This field is only available for Vertex, and must be set when creating Vertex."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"edge_constraints"})," could be set when ",(0,r.jsx)(e.code,{children:"is_vertex"})," is ",(0,r.jsx)(e.code,{children:"false"}),", This field is only available for Edge. This field limits the combination of starting and ending vertex of the edge, for example: ",(0,r.jsx)(e.code,{children:'[["vertex_label1","vertex_label2"],["vertex_label3","vertex_label4"]]'}),", which limits the edge direction can only be from ",(0,r.jsx)(e.code,{children:"vertex_label1"})," to ",(0,r.jsx)(e.code,{children:"vertex_label2"})," or from ",(0,r.jsx)(e.code,{children:"vertex_label3"})," to ",(0,r.jsx)(e.code,{children:"vertex_label4"}),". If you don't want to have any constraints, just leave this field unset."]}),"\n",(0,r.jsxs)(e.p,{children:["In which ",(0,r.jsx)(e.code,{children:"fields"})," is an array, in which each element defines a column of data, as follows:"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"the name of the column"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"type"}),(0,r.jsx)(e.td,{children:"the data type of the column"}),(0,r.jsx)(e.td,{children:"String, with following types: int8, int16, int32, int64, float, double, string, date, datetime, binary, blob"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"optional"}),(0,r.jsx)(e.td,{children:"whether the data can be empty (optional, default is false)"}),(0,r.jsx)(e.td,{children:"Bool"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/{graph_name}/label\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "name":"Actor",\n "fields": [\n {"name":"uid", "type":"int64", "optional":false},\n {"name":"name", "type":"string", "optional":true}\n ],\n "is_vertex":true,\n "primary" : "uid"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"662list-all-labels",children:"6.6.2.List All Labels"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/label"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"edge"}),(0,r.jsx)(e.td,{children:"the list of edge labels"}),(0,r.jsx)(e.td,{children:"List"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"vertex"}),(0,r.jsx)(e.td,{children:"the list of vertex labels"}),(0,r.jsx)(e.td,{children:"List"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/label\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "edge": [\n "HAS_CHILD",\n "MARRIED",\n "BORN_IN",\n "DIRECTED",\n "WROTE_MUSIC_FOR",\n "ACTED_IN"\n ],\n "vertex": [\n "Person",\n "City",\n "Film"\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"663get-label-data-format",children:"6.6.3.Get Label Data Format"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/label/{[node|relationship]}/{label_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": Data column definition table as a dictionary, in which each key is the column name, and corresponding value is the column definition defined as follows:"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"optional"}),(0,r.jsx)(e.td,{children:"whether the column value can be empty"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"type"}),(0,r.jsx)(e.td,{children:"the type of the column value"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/label/node/person\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "age":{\n "optional":false,\n "type":"int16"\n },\n "id":{\n "optional":false,\n "type":"int8"\n },\n "name":{\n "optional":false,\n "type":"string"\n }\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"664schema-import",children:"6.6.4.Schema Import"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/schema/text"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"description"}),(0,r.jsx)(e.td,{children:"Graph labels description"}),(0,r.jsx)(e.td,{children:"String"})]})})]}),"\n",(0,r.jsxs)(e.p,{children:["The detail description can refer to ",(0,r.jsx)(e.code,{children:"TuGraph Manual"}),"."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"Schema import will check the new schema and original schema in database if compatible or not. If yes, this request will add the label only in new schema. If no, will return an error code."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example request."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/graph1/schema/text\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "description": "{\\\\"schema\\\\":[{\\\\"label\\\\":\\\\"actor\\\\",\\\\"primary\\\\":\\\\"aid\\\\",\\\\"properties\\\\":[{\\\\"name\\\\":\\\\"aid\\\\",\\\\"type\\\\":\\\\"STRING\\\\"}],\\\\"type\\\\":\\\\"VERTEX\\\\"}]}"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:"The value of the above description is the following json serialized string :"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json",children:'{\n "schema": [\n {\n "label": "actor",\n "type": "VERTEX",\n "properties": [{ "name": "aid", "type": "STRING" }],\n "primary": "aid"\n }\n ]\n}\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example response."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "log": ""\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"67vertex-operation",children:"6.7.Vertex Operation"}),"\n",(0,r.jsx)(e.p,{children:"URI format is:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/db/{graph_name}/node/{vid}\n"})}),"\n",(0,r.jsxs)(e.p,{children:["in which ",(0,r.jsx)(e.code,{children:"vid"})," is a unique integer identifying the vertex, which can be obtained when creating new vertexes or by looking up index."]}),"\n",(0,r.jsx)(e.h4,{id:"671list-vertex-and-label-number",children:"6.7.1.List Vertex and Label Number"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"num_label"}),(0,r.jsx)(e.td,{children:"the number of vertex label"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"num_vertex"}),(0,r.jsx)(e.td,{children:"the number of vertex"}),(0,r.jsx)(e.td,{children:"Integer"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsxs)(e.em,{children:["Note: ",(0,r.jsx)(e.code,{children:"num_vertex"})," returns an estimate of the number of vertexes, not the exact number. To get the exact number, please use Cypher queries."]})}),"\n",(0,r.jsx)(e.h4,{id:"672create-new-vertex",children:"6.7.2.Create New Vertex"}),"\n",(0,r.jsx)(e.p,{children:"Insert a vertex into the database."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label"}),(0,r.jsx)(e.td,{children:"the name of label"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"property"}),(0,r.jsx)(e.td,{children:"the properties of the vertex"}),(0,r.jsx)(e.td,{children:"Dictionary"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which ",(0,r.jsx)(e.code,{children:"property"})," is a dictionary of {",(0,r.jsx)(e.code,{children:"column_name"}),":",(0,r.jsx)(e.code,{children:"column_value"}),"}."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and the new vertex's vid, which can be used in later vertex operations."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/{graph_name}/node\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "label" : "Person",\n "property" : {\n "name" : "Passerby A",\n "birthyear" : 1989\n }\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n 21\n }\n"})}),"\n",(0,r.jsx)(e.h4,{id:"673batch-create-vertexes",children:"6.7.3.Batch Create Vertexes"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph allows multiple vertices to be inserted as one batch to reduce network overhead."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label"}),(0,r.jsx)(e.td,{children:"the name of Label"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"fields"}),(0,r.jsx)(e.td,{children:"the column names"}),(0,r.jsx)(e.td,{children:"List"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"values"}),(0,r.jsx)(e.td,{children:"the values of each vertex"}),(0,r.jsx)(e.td,{children:"List"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which ",(0,r.jsx)(e.code,{children:"fields"})," is a list of strings specifying column names, and ",(0,r.jsx)(e.code,{children:"values"})," is a list in which each element is a list of ",(0,r.jsx)(e.code,{children:"column_values"})," corresponding to the column names as specified in ",(0,r.jsx)(e.code,{children:"fields"}),"."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200, and return the vid list of newly added vertices in the JSON content, where each vid corresponds to each vertex in the request."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/{graph_name}/node\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "label" : "Person",\n "fields" : ["name", "birthyear"],\n "values" : [["alex", 2000],\n ["bob", 1999]]\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n 22,\n 23\n ]\n }\n"})}),"\n",(0,r.jsx)(e.h4,{id:"674get-vertex",children:"6.7.4.Get Vertex"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{vertex_id}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label"}),(0,r.jsx)(e.td,{children:"the name of Label"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"property"}),(0,r.jsx)(e.td,{children:"property"}),(0,r.jsx)(e.td,{children:"Dictionary, in the format of {column_name_1:column_value_1, ...}"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/node/5\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "property": {\n "birthyear": 1963,\n "name": "Natasha Richardson"\n },\n "label": "Person"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"675delete-vertex",children:"6.7.5.Delete Vertex"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{vertex_id}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200, and also the following content in JSON:"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"in"}),(0,r.jsx)(e.td,{children:"number of incoming edges of the deleted vertex"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"out"}),(0,r.jsx)(e.td,{children:"number of outgoing edges of the deleted vertex"}),(0,r.jsx)(e.td,{children:"Integer"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/db/{graph_name}/node/4\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "in": 0,\n "out": 0\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"676get-vertex-property",children:"6.7.6.Get Vertex Property"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{vertex_id}/property"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": Vertex properties as a dictionary of {",(0,r.jsx)(e.code,{children:"column_name"}),":",(0,r.jsx)(e.code,{children:"column_value"}),"}"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/node/5/property\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "birthyear": 1963,\n "name": "Natasha Richardson"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"677get-vertex-field",children:"6.7.7.Get Vertex Field"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{vertex_id}/property/{field}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": Value corresponding to the specified ",(0,r.jsx)(e.code,{children:"field"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/node/5/property/name\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "Natasha Richardson"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"678update-vertex-property",children:"6.7.8.Update Vertex Property"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{vertex_id}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": PUT"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"property"}),(0,r.jsx)(e.td,{children:"properties to update"}),(0,r.jsx)(e.td,{children:"Dictionary"})]})})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 PUT http://localhost:7070/db/{graph_name}/node/5\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "property" : {\n "birthyear" : 1964,\n "mobile" : "13737299333"\n }\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h3,{id:"68edge-operation",children:"6.8.Edge Operation"}),"\n",(0,r.jsx)(e.p,{children:"URI format is:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/db/{graph_name}/relationship/{euid}\n"})}),"\n",(0,r.jsxs)(e.p,{children:["in which ",(0,r.jsx)(e.code,{children:"euid"})," is a string uniquely identifying the edge, which can be obtained when creating edges or by iterating through the edges of a vertex."]}),"\n",(0,r.jsx)(e.h4,{id:"681create-edge",children:"6.8.1.Create Edge"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{src_vid}/relationship"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label"}),(0,r.jsx)(e.td,{children:"the label of edge"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"destination"}),(0,r.jsxs)(e.td,{children:["the ",(0,r.jsx)(e.code,{children:"vid"})," of destination vertex"]}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"property"}),(0,r.jsx)(e.td,{children:"the property of edge"}),(0,r.jsx)(e.td,{children:"Dictionary"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and the ",(0,r.jsx)(e.code,{children:"euid"})," of new created edge (type is String)."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/{graph_name}/node/{src}/relationship\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "destination" : 14,\n "label" : "BORN_IN",\n "property" : {}\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "1_14_1_0"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"682batch-create-edges",children:"6.8.2.Batch Create Edges"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/relationship"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label"}),(0,r.jsx)(e.td,{children:"the label of edge"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"fields"}),(0,r.jsx)(e.td,{children:"the data column name"}),(0,r.jsx)(e.td,{children:"List"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"edge"}),(0,r.jsx)(e.td,{children:"the data of edge"}),(0,r.jsx)(e.td,{children:"List"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:"where the edge is a list of data, each of which specifies and edge, defined as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"source"}),(0,r.jsx)(e.td,{children:"source vertex id"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"destination"}),(0,r.jsx)(e.td,{children:"destination vertex id"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"values"}),(0,r.jsx)(e.td,{children:"the data list"}),(0,r.jsx)(e.td,{children:"List"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which ",(0,r.jsx)(e.code,{children:"values"})," is a list of column values, each of which correspond to the a column name specified in ",(0,r.jsx)(e.code,{children:"fields"}),"."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and the list of ",(0,r.jsx)(e.code,{children:"euid"}),"s of the newly created edges."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/{graph_name}/relationship\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "label" : "knows",\n "fields" : ["from_year", "weight"],\n "edge" : [\n {"source":0, "destination":1, "values":[2011, 0.8]},\n {"source":1, "destination":2, "values":[2008, 0.9]}\n ]\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n "0_1_0_0",\n "1_2_0_0"\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"683list-out-going-edges",children:"6.8.3.List Out-going Edges"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{src}/relationship/out"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": The list of ",(0,r.jsx)(e.code,{children:"euid"}),"s of source vertex's out-going edges."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/node/4/relationship/out\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n "4_5_0_0",\n "4_7_1_2"\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"684list-incoming-edges",children:"6.8.4.List Incoming Edges"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{dst}/relationship/in"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": The list of ",(0,r.jsx)(e.code,{children:"euid"}),"s of destination vertex's incoming edges."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/node/4/relationship/in\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n "0_4_0_0",\n "3_4_3_1"\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"685list-all-edges",children:"6.8.5.List All Edges"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{src}/relationship/all"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"in"}),(0,r.jsxs)(e.td,{children:["list of incoming edges' ",(0,r.jsx)(e.code,{children:"euid"}),"s"]}),(0,r.jsx)(e.td,{children:"List"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"out"}),(0,r.jsxs)(e.td,{children:["list of outgoing edges' ",(0,r.jsx)(e.code,{children:"euid"}),"s"]}),(0,r.jsx)(e.td,{children:"List"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/node/4/relationship/all\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "out": [\n "4_5_0_0",\n "4_7_1_2"\n ],\n "in": [\n "0_4_0_0",\n "3_4_3_1"\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"686get-edge-information",children:"6.8.6.Get Edge Information"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/relationship/{euid}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label"}),(0,r.jsx)(e.td,{children:"the label of the edge"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"property"}),(0,r.jsx)(e.td,{children:"the properties of the edge"}),(0,r.jsx)(e.td,{children:"Dictionary"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/relationship/0_4_0_0\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "property": {\n },\n "label": "MARRIED"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"687delete-edge",children:"6.8.7.Delete Edge"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/relationship/{euid}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/db/graph1/relationship/14_0_1_0\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"688get-edge-properties",children:"6.8.8.Get Edge Properties"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/relationship/{euid}/property"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": The dictionary of edge's properties."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/relationship/14_0_2_0/property\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n {\n "weight": 0.8,\n "begin": 20180922\n }\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"689get-edge-field",children:"6.8.9.Get Edge Field"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/relationship/{euid}/property/{field}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and the value corresponding to given ",(0,r.jsx)(e.code,{children:"field"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/relationship/17_0_2_2/property/charactername\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "Henri Ducard"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"6810update-edge-property",children:"6.8.10.Update Edge Property"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/relationship/{euid}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": PUT"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"property"}),(0,r.jsx)(e.td,{children:"properties to be updated"}),(0,r.jsx)(e.td,{children:"Dictionary"})]})})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 PUT http://localhost:7070/db/graph1/relationship/17_0_2_2\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "property" : {\n "charactername" : "Henri Ducard/passer a"\n }\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h3,{id:"69index",children:"6.9.Index"}),"\n",(0,r.jsx)(e.p,{children:"URI format is:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/db/{graph_name}/index/{label}/{field}\n"})}),"\n",(0,r.jsx)(e.h4,{id:"691create-index",children:"6.9.1.Create Index"}),"\n",(0,r.jsx)(e.p,{children:"Create an index on a (label, field) pair. Blocks until the index is successfully built."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/index"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label"}),(0,r.jsx)(e.td,{children:"the name of label"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field"}),(0,r.jsx)(e.td,{children:"field to be indexed"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"type"}),(0,r.jsx)(e.td,{children:"the type of index, 0 means nonunique index, 1 means unique index, 2 means pair_unique index"}),(0,r.jsx)(e.td,{children:"int"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/graph1/index\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "label": "Person",\n "field": "birthyear",\n "is_unique" : false\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"692list-all-indexes",children:"6.9.2.List All Indexes"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/index"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": A list of index specifications, each of which has the same format as use in ",(0,r.jsx)(e.a,{href:"#Create-Index",children:"Create Index"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/index\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n {\n "field": "name",\n "label": "City",\n "is_unique": false\n },\n {\n "field": "title",\n "label": "Film",\n "is_unique": false\n },\n {\n "field": "name",\n "label": "Person",\n "is_unique": true\n },\n {\n "label": "Person",\n "field": "age",\n "is_unique": false\n }\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"693list-indexes-related-with-specified-label",children:"6.9.3.List Indexes Related with Specified Label"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/index/{label}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": A list of index specifications, each of which has the same format as use in ",(0,r.jsx)(e.a,{href:"#Create-Index",children:"Create Index"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/index/Person\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n {\n "label": "Person",\n "field": "name",\n "is_unique": true\n },\n {\n "label": "Person",\n "field": "age",\n "is_unique": false\n }\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"694delete-index",children:"6.9.4.Delete Index"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/index/{label}/{field}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/db/graph1/index/Person/name\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"695get-vertex-by-index",children:"6.9.5.Get Vertex by Index"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/index/{label}/?field={field}&value={value}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": A list of ",(0,r.jsx)(e.code,{children:"vid"}),"s."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/index/Person/?field=birthyear&value=1986\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n Output:\n {\n [\n 1,\n 8\n ]\n }\n"})}),"\n",(0,r.jsx)(e.h3,{id:"610data-import",children:"6.10.Data Import"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/import/text"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"description"}),(0,r.jsx)(e.td,{children:"description of the file content"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"data"}),(0,r.jsx)(e.td,{children:"contents of the file to be imported (recommended to have a size of 16MB, has a hard limit of 17MB)"}),(0,r.jsx)(e.td,{children:"Strings / Arrays / Objects"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"continue_on_error"}),(0,r.jsxs)(e.td,{children:["whether to continue import when an error occurred (optional, default is ",(0,r.jsx)(e.code,{children:"false"}),")"]}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"delimiter"}),(0,r.jsxs)(e.td,{children:["delimiter used in the data file (optional, default is ",(0,r.jsx)(e.code,{children:"\u201c,\u201d"}),")"]}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["The details of the ",(0,r.jsx)(e.code,{children:"description"})," field can be found in ",(0,r.jsx)(e.a,{href:"/tugraph-db/en/utility-tools/data-import",children:"TuGraph Import Tool"}),"."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"delimiter"})," can be a single character or multi-character string, but must not contain ",(0,r.jsx)(e.code,{children:"\\r"})," or ",(0,r.jsx)(e.code,{children:"\\n"}),"."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"data"})," can be one of the following:"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["String, such as ",(0,r.jsx)(e.code,{children:'"1,2\\n3,4\\n"'})]}),"\n",(0,r.jsxs)(e.li,{children:["Array of ASCII codes, such as ",(0,r.jsx)(e.code,{children:"[49,44,50,10,51,44,52,10]"})]}),"\n",(0,r.jsxs)(e.li,{children:["Dictionary shaped like the above array, such as ",(0,r.jsx)(e.code,{children:'{"0":49,"1":44,"2":50,"3":10,"4":51,"5":44,"6":52,"7":10}'})]}),"\n"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n",(0,r.jsxs)(e.p,{children:["The system ",(0,r.jsx)(e.strong,{children:"will not"})," automatically perform actions such as creating a new label, adding an index, and so on. Before you do this, please make sure that the label involved already exists and has an appropriate index."]}),"\n",(0,r.jsxs)(e.p,{children:["If the import is successful, return code 200 and return log information (possibly empty) in the ",(0,r.jsx)(e.code,{children:"log"})," field. Otherwise, returns status code 400. None of the data is imported on failure, and error message is set in ",(0,r.jsx)(e.code,{children:"error_message"}),"."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/graph1/import/text\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "description": "{\\\\"files\\\\":[{\\\\"columns\\\\":[\\\\"SRC_ID\\\\",\\\\"role\\\\",\\\\"DST_ID\\\\"],\\\\"format\\\\":\\\\"CSV\\\\",\\\\"label\\\\":\\\\"role\\\\",\\\\"SRC_ID\\\\":\\\\"actor\\\\",\\\\"DST_ID\\\\":\\\\"movie\\\\"}]}"}",\n "data": "1,Role1,2\\n3,Role2,4\\n",\n "continue_on_error": true\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:"The value of the above description is the following json serialized string :"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json",children:'{\n "files": [\n {\n "format": "CSV",\n "label": "role",\n "SRC_ID": "actor",\n "DST_ID": "movie",\n "columns": ["SRC_ID", "role", "DST_ID"]\n }\n ]\n}\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "log": "Missing src uid 1\\n"\n }\n'})}),"\n",(0,r.jsxs)(e.p,{children:["Because the request specifies ",(0,r.jsx)(e.code,{children:"continue_on_error: true"}),", the returned ",(0,r.jsx)(e.code,{children:"log"})," indicates that the first edge cannot be inserted because there is no vertex with uid==1, while the second edge was imported successfully."]}),"\n",(0,r.jsx)(e.h3,{id:"611miscellany",children:"6.11.Miscellany"}),"\n",(0,r.jsx)(e.p,{children:"URI format is:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/db/{graph_name}/misc\n"})}),"\n",(0,r.jsx)(e.h4,{id:"6111extract-subgraph",children:"6.11.1.Extract Subgraph"}),"\n",(0,r.jsxs)(e.p,{children:["Give a set of ",(0,r.jsx)(e.code,{children:"vid"}),"s and return the minimum subgraph which contains the vertex set and the edges between them."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/misc/sub_graph"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"vertex_ids"}),(0,r.jsx)(e.td,{children:"vertex id set"}),(0,r.jsx)(e.td,{children:"List"})]})})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"nodes"}),(0,r.jsx)(e.td,{children:"vertex information"}),(0,r.jsx)(e.td,{children:"List, each element contains vid, label, and properties."})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"relationships"}),(0,r.jsx)(e.td,{children:"edge information"}),(0,r.jsx)(e.td,{children:"List, each element contains src, dst, euid, label, and properties."})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/graph1/misc/sub_graph\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "vertex_ids": [2, 5, 14, 20]\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "nodes": [\n {\n "label": "Person",\n "properties": {\n "birthyear": 1937,\n "name": "Vanessa Redgrave"\n },\n "vid": 2\n },\n {\n "label": "Person",\n "properties": {\n "birthyear": 1963,\n "name": "Natasha Richardson"\n },\n "vid": 5\n },\n {\n "label": "City",\n "properties": {\n "name": "London"\n },\n "vid": 14\n },\n {\n "label": "Film",\n "properties": {\n "title": "Camelot"\n },\n "vid": 20\n }\n ],\n "relationships": [\n {\n "destination": 5,\n "label": "HAS_CHILD",\n "properties": {\n "birthyear": 1937,\n "name": "Vanessa Redgrave"\n },\n "source": 2\n },\n {\n "destination": 14,\n "label": "BORN_IN",\n "properties": {\n "birthyear": 1937,\n "name": "Vanessa Redgrave"\n },\n "source": 2\n },\n {\n "destination": 20,\n "label": "ACTED_IN",\n "properties": {\n "birthyear": 1937,\n "charactername": "Guenevere",\n "name": "Vanessa Redgrave"\n },\n "source": 2\n },\n {\n "destination": 14,\n "label": "BORN_IN",\n "properties": {\n "birthyear": 1963,\n "name": "Natasha Richardson"\n },\n "source": 5\n }\n ]\n }\n'})})]})}function o(n={}){const{wrapper:e}={...(0,i.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(x,{...n})}):x(n)}},8453:(n,e,s)=>{s.d(e,{R:()=>l,x:()=>t});var r=s(6540);const i={},d=r.createContext(i);function l(n){const e=r.useContext(d);return r.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function t(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:l(n.components),r.createElement(d.Provider,{value:e},n.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3282],{7160:(n,e,s)=>{s.r(e),s.d(e,{assets:()=>c,contentTitle:()=>l,default:()=>o,frontMatter:()=>d,metadata:()=>t,toc:()=>h});var r=s(4848),i=s(8453);const d={},l="TuGraph RESTful API Legacy",t={id:"client-tools/restful-api-legacy",title:"TuGraph RESTful API Legacy",description:"This document describes how to call the Rest API of TuGrpah.",source:"@site/../docs/en-US/source/7.client-tools/9.restful-api-legacy.md",sourceDirName:"7.client-tools",slug:"/client-tools/restful-api-legacy",permalink:"/tugraph-db/en/client-tools/restful-api-legacy",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:9,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"RPC API",permalink:"/tugraph-db/en/client-tools/rpc-api"},next:{title:"Cypher API",permalink:"/tugraph-db/en/query/cypher"}},c={},h=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Protocols And Data Format",id:"2protocols-and-data-format",level:2},{value:"2.1.Protocols",id:"21protocols",level:3},{value:"2.2.Request",id:"22request",level:3},{value:"2.3.Response",id:"23response",level:3},{value:"2.4.Data Format",id:"24data-format",level:3},{value:"2.5.URI Format",id:"25uri-format",level:3},{value:"3.Login",id:"3login",level:2},{value:"3.1.User Login",id:"31user-login",level:3},{value:"3.2.Token Refresh",id:"32token-refresh",level:3},{value:"3.3.Modify Token Validity Period",id:"33modify-token-validity-period",level:3},{value:"3.4.Query Token validity period",id:"34query-token-validity-period",level:3},{value:"3.5.Logout",id:"35logout",level:3},{value:"4.Query",id:"4query",level:2},{value:"4.1.Call Cypher",id:"41call-cypher",level:3},{value:"4.2.Call Cypher with Parameters",id:"42call-cypher-with-parameters",level:3},{value:"5.Stored Procedures",id:"5stored-procedures",level:2},{value:"5.1.Create Stored Procedure",id:"51create-stored-procedure",level:3},{value:"5.2.List Stored Procedures",id:"52list-stored-procedures",level:3},{value:"5.3.Retrieve Stored Procedure Detail",id:"53retrieve-stored-procedure-detail",level:3},{value:"5.4.Call Stored Procedure",id:"54call-stored-procedure",level:3},{value:"5.5.Delete Stored Procedure",id:"55delete-stored-procedure",level:3},{value:"6.Deprecated",id:"6deprecated",level:2},{value:"6.1.User Management",id:"61user-management",level:3},{value:"6.1.1.Add User",id:"611add-user",level:4},{value:"6.1.2.Change Password",id:"612change-password",level:4},{value:"6.1.3.List All Users",id:"613list-all-users",level:4},{value:"6.1.4.Delete User",id:"614delete-user",level:4},{value:"6.2.Access Control",id:"62access-control",level:3},{value:"6.2.1.Query User's Access Level",id:"621query-users-access-level",level:4},{value:"6.2.2.Change User's Access Level",id:"622change-users-access-level",level:4},{value:"6.2.3.Remove User's Access Right",id:"623remove-users-access-right",level:4},{value:"6.3.Server Status",id:"63server-status",level:3},{value:"6.3.1.Modify Server Configuration",id:"631modify-server-configuration",level:4},{value:"6.3.2.Current Server Status",id:"632current-server-status",level:4},{value:"6.3.3.CPU Status",id:"633cpu-status",level:4},{value:"6.3.4.Disk Status",id:"634disk-status",level:4},{value:"6.3.5.Memory Status",id:"635memory-status",level:4},{value:"6.3.6.Database Size",id:"636database-size",level:4},{value:"6.3.7.DB Configuration",id:"637db-configuration",level:4},{value:"6.3.7.High Availability Server List",id:"637high-availability-server-list",level:4},{value:"6.3.8.Current Leader Information",id:"638current-leader-information",level:4},{value:"6.3.9.Server Statistics",id:"639server-statistics",level:4},{value:"6.3.10.Get Audit Logs",id:"6310get-audit-logs",level:4},{value:"6.4.Task Management",id:"64task-management",level:3},{value:"6.4.1.List Running Tasks",id:"641list-running-tasks",level:4},{value:"6.4.2.Abort Task",id:"642abort-task",level:4},{value:"6.5.Subgraph Management",id:"65subgraph-management",level:3},{value:"6.5.1.Create New Subgraph",id:"651create-new-subgraph",level:4},{value:"6.5.2.Delete Subgraph",id:"652delete-subgraph",level:4},{value:"6.5.3.List All Subgraphs",id:"653list-all-subgraphs",level:4},{value:"6.6.Label",id:"66label",level:3},{value:"6.6.1.Create Label",id:"661create-label",level:4},{value:"6.6.2.List All Labels",id:"662list-all-labels",level:4},{value:"6.6.3.Get Label Data Format",id:"663get-label-data-format",level:4},{value:"6.6.4.Schema Import",id:"664schema-import",level:4},{value:"6.7.Vertex Operation",id:"67vertex-operation",level:3},{value:"6.7.1.List Vertex and Label Number",id:"671list-vertex-and-label-number",level:4},{value:"6.7.2.Create New Vertex",id:"672create-new-vertex",level:4},{value:"6.7.3.Batch Create Vertexes",id:"673batch-create-vertexes",level:4},{value:"6.7.4.Get Vertex",id:"674get-vertex",level:4},{value:"6.7.5.Delete Vertex",id:"675delete-vertex",level:4},{value:"6.7.6.Get Vertex Property",id:"676get-vertex-property",level:4},{value:"6.7.7.Get Vertex Field",id:"677get-vertex-field",level:4},{value:"6.7.8.Update Vertex Property",id:"678update-vertex-property",level:4},{value:"6.8.Edge Operation",id:"68edge-operation",level:3},{value:"6.8.1.Create Edge",id:"681create-edge",level:4},{value:"6.8.2.Batch Create Edges",id:"682batch-create-edges",level:4},{value:"6.8.3.List Out-going Edges",id:"683list-out-going-edges",level:4},{value:"6.8.4.List Incoming Edges",id:"684list-incoming-edges",level:4},{value:"6.8.5.List All Edges",id:"685list-all-edges",level:4},{value:"6.8.6.Get Edge Information",id:"686get-edge-information",level:4},{value:"6.8.7.Delete Edge",id:"687delete-edge",level:4},{value:"6.8.8.Get Edge Properties",id:"688get-edge-properties",level:4},{value:"6.8.9.Get Edge Field",id:"689get-edge-field",level:4},{value:"6.8.10.Update Edge Property",id:"6810update-edge-property",level:4},{value:"6.9.Index",id:"69index",level:3},{value:"6.9.1.Create Index",id:"691create-index",level:4},{value:"6.9.2.List All Indexes",id:"692list-all-indexes",level:4},{value:"6.9.3.List Indexes Related with Specified Label",id:"693list-indexes-related-with-specified-label",level:4},{value:"6.9.4.Delete Index",id:"694delete-index",level:4},{value:"6.9.5.Get Vertex by Index",id:"695get-vertex-by-index",level:4},{value:"6.10.Data Import",id:"610data-import",level:3},{value:"6.11.Miscellany",id:"611miscellany",level:3},{value:"6.11.1.Extract Subgraph",id:"6111extract-subgraph",level:4}];function x(n){const e={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...n.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.header,{children:(0,r.jsx)(e.h1,{id:"tugraph-restful-api-legacy",children:"TuGraph RESTful API Legacy"})}),"\n",(0,r.jsxs)(e.blockquote,{children:["\n",(0,r.jsx)(e.p,{children:"This document describes how to call the Rest API of TuGrpah."}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph provides HTTP RESTful APIs, which allow users to access TuGraph servers through HTTP requests remotely."}),"\n",(0,r.jsx)(e.p,{children:"This document specifiers the TuGraph HTTP RESTful API."}),"\n",(0,r.jsxs)(e.p,{children:["\u26a0\ufe0f ",(0,r.jsx)(e.strong,{children:"All the other RESTful APIs excluding the three below will be deprived after 4/30/2023."})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.strong,{children:"Login"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.strong,{children:"Query"})}),"\n",(0,r.jsx)(e.li,{children:(0,r.jsx)(e.strong,{children:"Store Procedures"})}),"\n"]}),"\n",(0,r.jsx)(e.h2,{id:"2protocols-and-data-format",children:"2.Protocols And Data Format"}),"\n",(0,r.jsx)(e.h3,{id:"21protocols",children:"2.1.Protocols"}),"\n",(0,r.jsxs)(e.p,{children:["Both HTTP and HTTPS protocols are supported by TuGraph. The system uses HTTP protocol by default. To use HTTPS, the ",(0,r.jsx)(e.code,{children:"ssl_auth"})," option should be set to ",(0,r.jsx)(e.code,{children:"true"})," in the DB configuration."]}),"\n",(0,r.jsx)(e.h3,{id:"22request",children:"2.2.Request"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph supports HTTP GET/POST/PUT/DELETE requests, in which:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"GET"})," requests are used for read-only requests, such as getting vertex properties, edge properties, etc."]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"POST"})," requests are used to create entities, submit Cypher, and to manage and call stored procedures;"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"PUT"})," requests are used to modify existing entities, for example, to modify vertex properties, edge properties, etc."]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"DELETE"})," requests are used to delete existing entities, such as vertices, edges, etc."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.p,{children:["In high-availability mode, users can set ",(0,r.jsx)(e.code,{children:"ServerVersion"})," in the request header to make sure the request is never served with an outdated version.\nThe current ",(0,r.jsx)(e.code,{children:"ServerVersion"})," can be obtained from the header returned by the server."]}),"\n",(0,r.jsx)(e.h3,{id:"23response",children:"2.3.Response"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph returns the following HTTP status codes:"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"200 OK"}),": operation is successful."]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"307 Temporary Redirect"}),": the operation is redirected, typically in high-availability mode, to the master."]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"400 Bad Request"}),": incorrect input, such as URI error, or invalid parameters."]}),"\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"500 Internal Server Error"}),": server error."]}),"\n"]}),"\n",(0,r.jsxs)(e.p,{children:["When the operation is successful, the JSON response contains the return value of the operation. When the operation is redirected, the ",(0,r.jsx)(e.code,{children:"location"})," field in the returned HTTP header contains the redirect destination address.\nWhen an input error or server error occurs, the JSON response contains a ",(0,r.jsx)(e.code,{children:"error_message"})," field that describes the error."]}),"\n",(0,r.jsxs)(e.p,{children:["In high-availability mode, the server will set ",(0,r.jsx)(e.code,{children:"server_version"})," field in the header to inform the client of the data version of the current server. When clients switch between several different servers, this version number guarantees that the client will not read from an outdated server."]}),"\n",(0,r.jsx)(e.h3,{id:"24data-format",children:"2.4.Data Format"}),"\n",(0,r.jsxs)(e.p,{children:["The server and clients exchange data in JSON format. When sending a request, the header of the HTTP request should be set with ",(0,r.jsx)(e.code,{children:"Accept:application/json, Content-Type:app/json"}),".\nFor example, to create a new vertex, the request header should look like the following:"]}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" Accept: application/json; charset=UTF-8\n Content-Type: application/json\n server_version: 12\n"})}),"\n",(0,r.jsx)(e.h3,{id:"25uri-format",children:"2.5.URI Format"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph REST API provides access to: web visualization, login, db info, label, index, node, relationship, cypher, task, cpp_plugin, and python_plugin.\nThe URI format used for each function is as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"URI"}),(0,r.jsx)(e.th,{children:"Description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/web"}),(0,r.jsx)(e.td,{children:"web visualization"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/cypher"}),(0,r.jsx)(e.td,{children:"cypher request"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/acl"}),(0,r.jsx)(e.td,{children:"access control"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/user"}),(0,r.jsx)(e.td,{children:"user management"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/login"}),(0,r.jsx)(e.td,{children:"user login"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/info"}),(0,r.jsx)(e.td,{children:"database status and information"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/task"}),(0,r.jsx)(e.td,{children:"task management"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/db"}),(0,r.jsx)(e.td,{children:"subgraph management"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:"For each subgraph, the following interfaces are provided:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"URI"}),(0,r.jsx)(e.th,{children:"Description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"/db"}),(0,r.jsx)(e.td,{children:"create, modify, and delete subgraph"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/node"]}),(0,r.jsx)(e.td,{children:"vertex operations"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/relationship"]}),(0,r.jsx)(e.td,{children:"edge operations"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/label"]}),(0,r.jsx)(e.td,{children:"label-related operations"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/index"]}),(0,r.jsx)(e.td,{children:"index-related operations"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/cypher"]}),(0,r.jsx)(e.td,{children:"subgraph-specific cypher operation"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/cpp_plugin"]}),(0,r.jsx)(e.td,{children:"C++ plugin(stored procedure)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/python_plugin"]}),(0,r.jsx)(e.td,{children:"Python plugin(stored procedure)"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/import"]}),(0,r.jsx)(e.td,{children:"online import"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsxs)(e.td,{children:["/db/",(0,r.jsx)(e.em,{children:"{graph_name}"}),"/misc"]}),(0,r.jsx)(e.td,{children:"other operations"})]})]})]}),"\n",(0,r.jsx)(e.h2,{id:"3login",children:"3.Login"}),"\n",(0,r.jsxs)(e.p,{children:["The system creates an administrator by default, whose username is ",(0,r.jsx)(e.em,{children:"admin"})," and password is ",(0,r.jsx)(e.em,{children:"73@TuGraph"}),". For security reasons, please remember to change your password after first starting the server."]}),"\n",(0,r.jsx)(e.h3,{id:"31user-login",children:"3.1.User Login"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph provides JWT-based user authentication. To log in to the server, the REST client should send a login request containing a username and password. Upon success, the client will receive a signed token in the form of a Json Web Token (JWT) and a Boolean variable (default_password) to determine whether it is the default password. The jwt token should be stored by the client and used for each subsequent request."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/login"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user"}),(0,r.jsx)(e.td,{children:"username"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"password"}),(0,r.jsx)(e.td,{children:"password"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"jwt"}),(0,r.jsx)(e.td,{children:"token"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"default_password"}),(0,r.jsx)(e.td,{children:"whether it is the default password"}),(0,r.jsx)(e.td,{children:"Bool"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/login\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "user":"admin",\n "password":"73@TuGraph"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek",\n "default_password": true\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"32token-refresh",children:"3.2.Token Refresh"}),"\n",(0,r.jsx)(e.p,{children:"After the token expires, the front-end initiates a refresh token interface, and the back-end verifies the validity of the token.\nIf the verification passes, a new token is generated; if the verification fails, status code 401 is returned."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/refresh"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Authorization"}),(0,r.jsx)(e.td,{children:"token"}),(0,r.jsx)(e.td,{children:"String"})]})})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"jwt"}),(0,r.jsx)(e.td,{children:"token"}),(0,r.jsx)(e.td,{children:"String"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/refresh\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "Authorization": "Bearer eyJhbGciOiJIUz32NiIsInR5cCI6IkpXVDJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byj3fYVAH4D88dfTD_zYQ_uAvdizTMek"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek"\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"33modify-token-validity-period",children:"3.3.Modify Token Validity Period"}),"\n",(0,r.jsx)(e.p,{children:"To modify the validity period of Token, three parameters need to be transmitted: jwt, refresh_time and expire_time, among which jwt is used to verify the user\u2019s identity. When refresh_time and expire_time are equal to 0, the validity period is indefinite. When refresh_time exceeds, you need to call the refresh interface to obtain a new Token; When expire_time expires, you need to log in again. (This interface call needs to confirm the security by itself, do not call unless necessary)"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/update_token_time"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Authorization"}),(0,r.jsx)(e.td,{children:"token"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"refresh_time"}),(0,r.jsx)(e.td,{children:"Valid time (deafult set to 0)"}),(0,r.jsx)(e.td,{children:"Int64"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"expire_time"}),(0,r.jsx)(e.td,{children:"Expire time (deafult set to 0)"}),(0,r.jsx)(e.td,{children:"Int64"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example request."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/update_token_time\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "Authorization" : "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmbWEuYWkiLCJwYXNzd29yZCI6IjczQFR1R3JhcGgiLCJ1c2VyIjoiYWRtaW4ifQ.o_yb5veSJkuy-ieBp4MqTk-tC1grcKotgVbgNJ0TyTU",\n "refresh_time":0\n "expire_time":0\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example response."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h3,{id:"34query-token-validity-period",children:"3.4.Query Token validity period"}),"\n",(0,r.jsx)(e.p,{children:"To query the validity period of the Token, you need to transmit jwt to verify the user's identity, and return, refresh_time and expire_time, where refresh_time indicates the refresh time, and you need to call the refresh interface to obtain a new Token when it exceeds; expire_time indicates the expiration time, and you need to log in again when it exceeds."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/get_token_time"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Authorization"}),(0,r.jsx)(e.td,{children:"token"}),(0,r.jsx)(e.td,{children:"String"})]})})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),': if successful, return "refresh_time" and "expire_time".']}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example request."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/get_token_time\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "Authorization" : "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmbWEuYWkiLCJwYXNzd29yZCI6IjczQFR1R3JhcGgiLCJ1c2VyIjoiYWRtaW4ifQ.o_yb5veSJkuy-ieBp4MqTk-tC1grcKotgVbgNJ0TyTU",\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example response."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "refresh_time":600,\n "expire_time":3600\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"35logout",children:"3.5.Logout"}),"\n",(0,r.jsx)(e.p,{children:"The user logs out and deletes the token at the same time."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/logout"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"Authorization"}),(0,r.jsx)(e.td,{children:"token"}),(0,r.jsx)(e.td,{children:"String"})]})})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/refresh\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "Authorization" : "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJmbWEuYWkiLCJwYXNzd29yZCI6IjczQFR1R3JhcGgiLCJ1c2VyIjoiYWRtaW4ifQ.o_yb5veSJkuy-ieBp4MqTk-tC1grcKotgVbgNJ0TyTU"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h2,{id:"4query",children:"4.Query"}),"\n",(0,r.jsx)(e.p,{children:"URI format is:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/cypher\n"})}),"\n",(0,r.jsx)(e.h3,{id:"41call-cypher",children:"4.1.Call Cypher"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/cypher"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph"}),(0,r.jsx)(e.td,{children:"subgraph name"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"cypher"}),(0,r.jsx)(e.td,{children:"Cypher query"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"result"}),(0,r.jsx)(e.td,{children:"running results"}),(0,r.jsx)(e.td,{children:"List"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"elapsed"}),(0,r.jsx)(e.td,{children:"running time in seconds"}),(0,r.jsx)(e.td,{children:"Float"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"header"}),(0,r.jsx)(e.td,{children:"header of the results"}),(0,r.jsx)(e.td,{children:"List"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"size"}),(0,r.jsx)(e.td,{children:"number of results"}),(0,r.jsx)(e.td,{children:"Integer"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which ",(0,r.jsx)(e.code,{children:"header"})," is a list with each element in the form of:"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"the name of column"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"type"}),(0,r.jsx)(e.td,{children:"column data type, 0 is scalar, 1 is vertex id, 2 is vector"}),(0,r.jsx)(e.td,{})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/cypher\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "graph": "default",\n "script": "MATCH (n) RETURN n,n.name LIMIT 10"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "elapsed": 0.001224517822265625,\n "header": [\n {\n "name": "n",\n "type": 1\n },\n {\n "name": "n.name",\n "type": 0\n }\n ]\n "result": [\n [\n 0,\n "Rachel Kempson"\n ],\n [\n 1,\n "Michael Redgrave"\n ],\n [\n 2,\n "Vanessa Redgrave"\n ]\n ],\n "size": 3\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"42call-cypher-with-parameters",children:"4.2.Call Cypher with Parameters"}),"\n",(0,r.jsx)(e.p,{children:"Cypher supports querying with parameters. When a Cypher query with parameters is called, TuGraph caches the execution plan for that query to speed up the following queries of the same kind."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/cypher"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph"}),(0,r.jsx)(e.td,{children:"subgraph name"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"cypher"}),(0,r.jsx)(e.td,{children:"Cypher query"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"parameters"}),(0,r.jsx)(e.td,{children:"parameters"}),(0,r.jsx)(e.td,{children:"List"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n",(0,r.jsxs)(e.p,{children:["Same as ",(0,r.jsx)(e.a,{href:"#Call-Cypher",children:"Call Cypher"}),"."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/graph1/cypher\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "graph": "default",\n "script": "MATCH (n:Person {name:$param1}) RETURN n.birthyear",\n "parameters": {\n "$param1": "Lindsay Lohan"\n }\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "elapsed": 0.005886077880859375,\n "header": [\n {\n "name": "n.birthyear",\n "type": 0\n }\n ],\n "result": [\n [\n 1986\n ]\n ],\n "size": 1\n }\n'})}),"\n",(0,r.jsx)(e.h2,{id:"5stored-procedures",children:"5.Stored Procedures"}),"\n",(0,r.jsx)(e.p,{children:"URI format is:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/db/{graph_name}/cpp_plugin|python_plugin\n"})}),"\n",(0,r.jsx)(e.h3,{id:"51create-stored-procedure",children:"5.1.Create Stored Procedure"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/cpp_plugin|python_plugin"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"name of the plugin"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"description"}),(0,r.jsx)(e.td,{children:"description of the plugin"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"code_base64"}),(0,r.jsx)(e.td,{children:"code of plugin encoded in base64"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"read_only"}),(0,r.jsx)(e.td,{children:"whether it is a read-only stored procedure"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"code_type"}),(0,r.jsx)(e.td,{children:"type of plugin code, can be zip/cpp/so for cpp_plugin, while py for python_plugin"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsxs)(e.em,{children:["Note: read-only plugins are more efficient than write plugins. Always specify ",(0,r.jsx)(e.code,{children:"read-only=true"})," for read-only transactions."]})}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/graph1/cpp_plugin\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "name" : "echo",\n "description" : "A test plugin that returns the input",\n "code_base64" : "{base64 encoded echo.so}",\n "read_only" : true,\n "code_type" : "zip"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h3,{id:"52list-stored-procedures",children:"5.2.List Stored Procedures"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/cpp_plugin|python_plugin"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": A list in which each element is a plugin description, in the format of:"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"name of the stored procedure"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"description"}),(0,r.jsx)(e.td,{children:"description of the stored procedure"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"read_only"}),(0,r.jsx)(e.td,{children:"whether the stored procedure is read-only"}),(0,r.jsx)(e.td,{children:"Bool"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/cpp_plugin\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n [\n {\n "description":"adds a vertex label to the db",\n "name":"add_label",\n "read_only":false\n },\n {\n "description": "scans graph and get number of edges",\n "name": "scan_graph",\n "read_only": true\n }\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"53retrieve-stored-procedure-detail",children:"5.3.Retrieve Stored Procedure Detail"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/cpp_plugin|python_plugin/{plugin_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": Procedure detail, including code, in the format of:"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"Procedure name"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"description"}),(0,r.jsx)(e.td,{children:"Procedure descrition"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"read_only"}),(0,r.jsx)(e.td,{children:"Read only or not"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"code_base64"}),(0,r.jsx)(e.td,{children:"\u5b58\u50a8\u8fc7\u7a0b\u7684\u4ee3\u7801"}),(0,r.jsx)(e.td,{children:"String, Base64 encoded"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"code_type"}),(0,r.jsx)(e.td,{children:"Type of procedue code, can be zip/cpp/so for cpp_plugin, while py for python_plugin"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example request."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/cpp_plugin/echo\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example response."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "name" : "echo",\n "description" : "A test plugin that returns the input",\n "code_base64" : "{base64 encoded echo.zip}",\n "read_only" : true,\n "code_type" : "zip"\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"54call-stored-procedure",children:"5.4.Call Stored Procedure"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/cpp_plugin|python_plugin/{plugin_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),": String input."]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"data"}),(0,r.jsx)(e.td,{children:"input data"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"timeout"}),(0,r.jsx)(e.td,{children:"timeout in seconds, defaults to 0, which means no timeout"}),(0,r.jsx)(e.td,{children:"Float"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"result"}),(0,r.jsx)(e.td,{children:"running results"}),(0,r.jsx)(e.td,{children:"String"})]})})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/graph1/python_plugin/echo\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n data : "Hello!\\n\u4f60\u597d\uff01\\nKonichiwa!",\n timeout : 0,\n in_process : true\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "result": "Hello!\\n\u4f60\u597d\uff01\\nKonichiwa!"\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"55delete-stored-procedure",children:"5.5.Delete Stored Procedure"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/cpp_plugin|python_plugin/{plugin_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/db/graph1/cpp_plugin/example_plugin\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h2,{id:"6deprecated",children:"6.Deprecated"}),"\n",(0,r.jsx)(e.p,{children:"The APIs below will be removed after 4/30/2023."}),"\n",(0,r.jsx)(e.h3,{id:"61user-management",children:"6.1.User Management"}),"\n",(0,r.jsx)(e.h4,{id:"611add-user",children:"6.1.1.Add User"}),"\n",(0,r.jsx)(e.p,{children:"Add a new user and set the initial password for the user. Only administrators have permission to add new users. The username can only have letters, numbers, and underscores, and should not begin with a number. The password can contain any character. The username and password have a maximum length of 64 bytes."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/user"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user"}),(0,r.jsx)(e.td,{children:"username"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"password"}),(0,r.jsx)(e.td,{children:"password"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"is_admin"}),(0,r.jsx)(e.td,{children:"whether the user is an administrator or not"}),(0,r.jsx)(e.td,{children:"Bool"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/user\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n \u2022 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek\n Input:\n {\n "user": "USER1",\n "password": "AN_INITIAL_PASSWORD",\n "is_admin": false\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"612change-password",children:"6.1.2.Change Password"}),"\n",(0,r.jsx)(e.p,{children:"Users can change their own passwords, in which case the original password needs to be verified."}),"\n",(0,r.jsx)(e.p,{children:"Administrators can change the passwords of any user and promote non-admin users to administrators, or demote administrator users to regular users. When modifying another user's password, the original password of the user is not needed."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/user/{user_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": PUT"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"current_password"}),(0,r.jsx)(e.td,{children:"user's current password, if modifying its own password"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"new_password"}),(0,r.jsx)(e.td,{children:"user's new password"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"is_admin"}),(0,r.jsx)(e.td,{children:"should this user be administrator or not, used when promoting or demoting users"}),(0,r.jsx)(e.td,{children:"Bool"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/user/user1\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n \u2022 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek\n Input:\n {\n "current_password": "THE_CURRENT_PASSWORD"\n "new_password": "A_NEW_PASSWORD"\n "is_admin": true\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"613list-all-users",children:"6.1.3.List All Users"}),"\n",(0,r.jsx)(e.p,{children:"List all users of the database. Only administrators are allowed to perform this operation."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/user/"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": a dictionary of {",(0,r.jsx)(e.code,{children:"user_name"}),":",(0,r.jsx)(e.code,{children:"is_admin"}),"}"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/user\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n \u2022 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:'\u2022 200: OK\nOutput:\n{\n "admin": true,\n "guest1": false\n}\n'})}),"\n",(0,r.jsx)(e.h4,{id:"614delete-user",children:"6.1.4.Delete User"}),"\n",(0,r.jsx)(e.p,{children:"Delete a user from the DB. Only administrators have permission to do so."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/user/{user_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/user/guest1\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n \u2022 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h3,{id:"62access-control",children:"6.2.Access Control"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph has four access levels. Different users can have different permissions for each subgraph. The four access levels are as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Access Level"}),(0,r.jsx)(e.th,{children:"Description"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"NONE"}),(0,r.jsx)(e.td,{children:"no access"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"READ"}),(0,r.jsx)(e.td,{children:"read-only"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"WRITE"}),(0,r.jsx)(e.td,{children:"can read and write vertexes and edges of the subgraph"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"FULL"}),(0,r.jsx)(e.td,{children:"full access, including changing metadata (label, index), managing stored procedures and deleting all data in the subgraph"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:"Administrators have full access on all subgraphs, and a newly created non-admin user does not have access for any subgraph. Users who have full access on a subgraph can set the access level for other users on that subgraph."}),"\n",(0,r.jsx)(e.h4,{id:"621query-users-access-level",children:"6.2.1.Query User's Access Level"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/acl/?user={user_name}&graph={graph_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(e.p,{children:["When both ",(0,r.jsx)(e.code,{children:"user"})," and ",(0,r.jsx)(e.code,{children:"graph"})," are specified, the user's access level for the subgraph is returned, such as ",(0,r.jsx)(e.code,{children:"READ"}),"."]}),"\n",(0,r.jsxs)(e.p,{children:["When only ",(0,r.jsx)(e.code,{children:"user"})," is specified, all subgraphs that the user can access (access level not ",(0,r.jsx)(e.code,{children:"NONE"}),") are returned, as well as the user's access level on the subgraph."]}),"\n",(0,r.jsxs)(e.p,{children:["When only ",(0,r.jsx)(e.code,{children:"graph"})," is specified, all users who have access level on this graph (excluding administrators, who have implicit ",(0,r.jsx)(e.code,{children:"FULL"})," access) and their access levels are returned. This operation requires administrator permission."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/acl/?user=user1\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "graph1": "READ",\n "graph2": "WRITE",\n "graph3": "FULL"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"622change-users-access-level",children:"6.2.2.Change User's Access Level"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/acl"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": PUT"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user"}),(0,r.jsx)(e.td,{children:"username"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph"}),(0,r.jsx)(e.td,{children:"subgraph's name"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"acl"}),(0,r.jsx)(e.td,{children:"access level"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 PUT http://localhost:7070/acl\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek\n Input:\n {\n "user": "user1",\n "graph": "graph1",\n "acl": "FULL"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"623remove-users-access-right",children:"6.2.3.Remove User's Access Right"}),"\n",(0,r.jsxs)(e.p,{children:["This is equivalent to setting access level to ",(0,r.jsx)(e.code,{children:"NONE"}),"."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/acl/?user={user_name}&graph={graph_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/acl/?user=user1&graph=graph1\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6dHJ1ZSwiaXNzIjoiZm1hLmFpIiwidXNlcl9pZCI6ImFkbWluIn0.SHaqrjKLaI4byjbEYVAH4D88dOTD_zYQ_uAvdizTMek\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h3,{id:"63server-status",children:"6.3.Server Status"}),"\n",(0,r.jsx)(e.h4,{id:"631modify-server-configuration",children:"6.3.1.Modify Server Configuration"}),"\n",(0,r.jsx)(e.p,{children:"Modifying the server configuration will take effect immediately after the configuration modification and will affect all servers. These configurations take precedence over configuration files and command line arguments."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/config"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": PUT"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db_async"}),(0,r.jsx)(e.td,{children:"Whether to enable asynchronous mode"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"optimistic_txn"}),(0,r.jsx)(e.td,{children:"Whether to use optimistic transaction lock by default"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"enable_audit_log"}),(0,r.jsx)(e.td,{children:"Whether to enable audit logging"}),(0,r.jsx)(e.td,{children:"Bool"})]})]})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": If successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example request."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 PUT http://localhost:7070/config\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "db_async": true,\n "enable_audit_log": false\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example response."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"632current-server-status",children:"6.3.2.Current Server Status"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"lgraph_version"}),(0,r.jsx)(e.td,{children:"TuGraph version"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"git_branch"}),(0,r.jsx)(e.td,{children:"server's git branch"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"git_commit"}),(0,r.jsx)(e.td,{children:"server's git commit version"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"web_commit"}),(0,r.jsx)(e.td,{children:"web client commit version"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"cpp_id"}),(0,r.jsx)(e.td,{children:"cpp compiler id"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"cpp_version"}),(0,r.jsx)(e.td,{children:"cpp compiler version"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"python_version"}),(0,r.jsx)(e.td,{children:"python lib version"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"cpu"}),(0,r.jsx)(e.td,{children:"cpu information"}),(0,r.jsxs)(e.td,{children:["Dictionary, format refers ",(0,r.jsx)(e.a,{href:"#CPU-Status",children:"CPU Status"})]})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"disk"}),(0,r.jsx)(e.td,{children:"disk IO information"}),(0,r.jsxs)(e.td,{children:["Dictionary, format refers ",(0,r.jsx)(e.a,{href:"#Disk-Status",children:"Disk Status"})]})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"memory"}),(0,r.jsx)(e.td,{children:"memory information"}),(0,r.jsxs)(e.td,{children:["Dictionary, format refers ",(0,r.jsx)(e.a,{href:"#Memory-Status",children:"Memory Status"})]})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db_space"}),(0,r.jsx)(e.td,{children:"graph database storage"}),(0,r.jsxs)(e.td,{children:["Dictionary, format refers ",(0,r.jsx)(e.a,{href:"#Graph-Database-Storage",children:"Graph Database Storage"})]})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"db_config"}),(0,r.jsx)(e.td,{children:"graph database configuration"}),(0,r.jsxs)(e.td,{children:["Dictionary, format refers ",(0,r.jsx)(e.a,{href:"#Graph-Database-Configuration",children:"Graph Database Configuration"})]})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"up_time"}),(0,r.jsx)(e.td,{children:"database's online running time"}),(0,r.jsx)(e.td,{children:"Integer"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "lgraph_version": "1.2.0",\n "git_branch": "master",\n "git_commit": "9e2977d",\n "web_commit": "1e2823d",\n "cpu_id": "GUN",\n "cpu_version": "4.8.5",\n "python_version": "3.2",\n "node": "/node",\n "relationship": "/relationship",\n "cpu": {\n "self": 25,\n "server": 35,\n "unit": "%"\n },\n "disk": {\n "read": 2000,\n "write": 2000,\n "unit": "B/s"\n },\n "memory": {\n "self": 25016,\n "server_avail": 46865636,\n "server_total": 65860552,\n "unit": "KB"\n },\n "db_space": {\n "space": 57344,\n "unit": "B"\n },\n "db_config": {\n "db_async": false,\n "disable_auth": false,\n "enable_ha": false,\n ...\n },\n "up_time": 3235\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"633cpu-status",children:"6.3.3.CPU Status"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/cpu"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"self"}),(0,r.jsx)(e.td,{children:"TuGraph CPU usage"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"server"}),(0,r.jsx)(e.td,{children:"server's CPU usage"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"unit"}),(0,r.jsx)(e.td,{children:"metric unit"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/cpu\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "self": 25,\n "server": 35,\n "unit": "%"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"634disk-status",children:"6.3.4.Disk Status"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/disk"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"read"}),(0,r.jsx)(e.td,{children:"server's disk read rate"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"write"}),(0,r.jsx)(e.td,{children:"server's disk wrtie rate"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"unit"}),(0,r.jsx)(e.td,{children:"metric unit"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example request."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/disk\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example response."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "read": 2000,\n "write": 2000,\n "unit": "B/s"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"635memory-status",children:"6.3.5.Memory Status"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/memory"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"self"}),(0,r.jsx)(e.td,{children:"TuGraph memory usage"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"server_avail"}),(0,r.jsx)(e.td,{children:"server's available memory"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"server_total"}),(0,r.jsx)(e.td,{children:"server's total memory"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"unit"}),(0,r.jsx)(e.td,{children:"metric unit"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/memory\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "self": 25016,\n "server_avail": 46865636,\n "server_total": 65860552,\n "unit": "KB"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"636database-size",children:"6.3.6.Database Size"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/db_space"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"space"}),(0,r.jsx)(e.td,{children:"total size of the database"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"unit"}),(0,r.jsx)(e.td,{children:"metric unit"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/db_space\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "space": 57344,\n "unit": "B"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"637db-configuration",children:"6.3.7.DB Configuration"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/db_config"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"async"}),(0,r.jsx)(e.td,{children:"asynchronous mode"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"disable_auth"}),(0,r.jsx)(e.td,{children:"whether to disable authentication"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"enable_ha"}),(0,r.jsx)(e.td,{children:"whether to enable high-availability mode"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"enable_rpc"}),(0,r.jsx)(e.td,{children:"whether to enable RPC server"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"host"}),(0,r.jsx)(e.td,{children:"bound host address"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"port"}),(0,r.jsx)(e.td,{children:"port of REST server"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"rpc_port"}),(0,r.jsx)(e.td,{children:"port of RPC server"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"thread_limit"}),(0,r.jsx)(e.td,{children:"limit of available threads for the graph database"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"use_ssl"}),(0,r.jsx)(e.td,{children:"whether to use SSL for authentication"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"verbose"}),(0,r.jsx)(e.td,{children:"verbose level of the output"}),(0,r.jsx)(e.td,{children:"Integer"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/db_config\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "async":false,\n "disable_auth":false,\n "enable_ha":false,\n "enable_rpc":false,\n "host":"127.0.0.1",\n "port":7070,\n "rpc_port":9091,\n "thread_limit":0,\n "use_ssl":false,\n "verbose":2\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"637high-availability-server-list",children:"6.3.7.High Availability Server List"}),"\n",(0,r.jsx)(e.p,{children:"Get a list of replication servers. Valid only in high-availability mode."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/peers"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and a list of server information, each of server information is formatted as:"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"rpc_address"}),(0,r.jsx)(e.td,{children:"server's RPC address"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"rest_address"}),(0,r.jsx)(e.td,{children:"server's REST address"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"state"}),(0,r.jsx)(e.td,{children:"server state"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["The server state can be ",(0,r.jsx)(e.code,{children:"MASTER"}),", ",(0,r.jsx)(e.code,{children:"SLAVE"}),", or ",(0,r.jsx)(e.code,{children:"OFFLINE"}),"."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/peers\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n {\n "rest_address":"192.168.1.22:17071",\n "rpc_address":"192.168.1.22:19091",\n "state":"MASTER"\n },\n {\n "rest_address":"192.168.1.22:17072",\n "rpc_address":"192.168.1.22:19092",\n "state":"SLAVE"\n }\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"638current-leader-information",children:"6.3.8.Current Leader Information"}),"\n",(0,r.jsx)(e.p,{children:"Get information of current leader. Valid only in HA mode."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/leader"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and the current leader server information, which is formatted as:"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"rpc_address"}),(0,r.jsx)(e.td,{children:"server's RPC address"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"rest_address"}),(0,r.jsx)(e.td,{children:"server's REST address"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/leader\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "rest_address":"192.168.1.22:17071",\n "rpc_address":"192.168.1.22:19091"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"639server-statistics",children:"6.3.9.Server Statistics"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/statistics"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and the current server statistics, which is formatted as:"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"requests/second"}),(0,r.jsx)(e.td,{children:"number of requests processed per second"}),(0,r.jsx)(e.td,{children:"Float"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"writes/second"}),(0,r.jsx)(e.td,{children:"number of write requests processed per second"}),(0,r.jsx)(e.td,{children:"Float"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"running_tasks"}),(0,r.jsx)(e.td,{children:"number of requests in progress"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"failure_rate"}),(0,r.jsx)(e.td,{children:"request failure rate"}),(0,r.jsx)(e.td,{children:"Float"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/statistics\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "failure_rate": 0.023,\n "requests/second": 122.3,\n "running_tasks": 10,\n "writes/second": 12.4\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"6310get-audit-logs",children:"6.3.10.Get Audit Logs"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/info/log/?begin_time={begin_time}&end_time={end_time}&user={user}&num_log={num_log}&descending_order={descending_order}"})]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"begin_time"}),(0,r.jsx)(e.td,{children:"start time of the queried log (required, format YYYY-mm-dd HH:MM:SS)"}),(0,r.jsx)(e.td,{children:"Timestamp"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"end_time"}),(0,r.jsx)(e.td,{children:"end time of the queried log (default is current time, format YYYY-mm-dd HH:MM:SS)"}),(0,r.jsx)(e.td,{children:"Timestamp"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user"}),(0,r.jsx)(e.td,{children:"the operator of the queried log (administrator can query all users' logs, ordinary users can only query their own logs)"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"num_log"}),(0,r.jsx)(e.td,{children:"maximum number of logs to return (default 100)"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"descending_order"}),(0,r.jsx)(e.td,{children:"whether to sort the result in descending order(default is true)"}),(0,r.jsx)(e.td,{children:"Bool"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and a list of audit logs, each of which is an action log in the format of:"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"index"}),(0,r.jsx)(e.td,{children:"the index of the operation"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"begin_time"}),(0,r.jsx)(e.td,{children:"the start time of the operation"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"end_time"}),(0,r.jsx)(e.td,{children:"the end time of the operation"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"user"}),(0,r.jsx)(e.td,{children:"the user of the operation"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"graph"}),(0,r.jsx)(e.td,{children:"the graph of the operation"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"type"}),(0,r.jsx)(e.td,{children:"the type of the operation"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"read_write"}),(0,r.jsx)(e.td,{children:"the operation is read operation or write operation"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"success"}),(0,r.jsx)(e.td,{children:"whether the operation is successful"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"content"}),(0,r.jsx)(e.td,{children:"the content of the operation"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/info/log/?begin_time=2020-02-17%2015:00:00&end_time=2020-02-20%2012:00:00&user=admin&num_log=100&descending_order=false\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n {\n "begin_time": "2020-02-17 15:27:15",\n "content": "post /login Successful",\n "end_time": "2020-02-17 15:27:15",\n "graph": "",\n "index": 1,\n "read_write": "read",\n "success": true,\n "type": "Security",\n "user":"admin"\n },\n {\n "begin_time": "2020-02-17 15:27:15",\n "content": "Load plugin : `echo` Successful",\n "end_time": "2020-02-17 15:27:15",\n "graph": "default",\n "index": 2,\n "read_write": "write",\n "success": true,\n "type": "Plugin",\n "user": "admin"\n },\n ...\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"64task-management",children:"6.4.Task Management"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph tracks long-running tasks such as complex Cypher queries and plugins. Administrators can query currently running tasks through the REST API and choose to abort the queries if necessary."}),"\n",(0,r.jsx)(e.p,{children:"The URI format for task management is :"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/task/{task_id}\n"})}),"\n",(0,r.jsx)(e.h4,{id:"641list-running-tasks",children:"6.4.1.List Running Tasks"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/task"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"The returned JSON is an array, each of which is formatted as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"description"}),(0,r.jsx)(e.td,{children:"the description of the task"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"time_elapsed"}),(0,r.jsx)(e.td,{children:"time the task has been executing for, in seconds"}),(0,r.jsx)(e.td,{children:"Float"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"task_id"}),(0,r.jsx)(e.td,{children:"the ID of the task"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/task\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n {\n "description" : "[CPP_PLUGIN] scan_graph",\n "time_elapsed" : 13.987,\n "task_id" : "3_10"\n },\n {\n "description" : "[CYPHER] MATCH(n) return n",\n "time_elapsed" : 30.887,\n "task_id" : "2_6"\n }\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"642abort-task",children:"6.4.2.Abort Task"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/task/{task_id}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.p,{children:["Where ",(0,r.jsx)(e.code,{children:"task_id"})," is the ",(0,r.jsx)(e.code,{children:"task_id"})," returned by ",(0,r.jsx)(e.code,{children:"GET /task"})," ."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/task/3_10\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h3,{id:"65subgraph-management",children:"6.5.Subgraph Management"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph supports multiple subgraphs and all subgraphs are completely independent from others. Different subgraphs can have different permissions to different users. Administrators can add, modify and delete subgraphs."}),"\n",(0,r.jsx)(e.h4,{id:"651create-new-subgraph",children:"6.5.1.Create New Subgraph"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"the name of subgraph"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"config"}),(0,r.jsx)(e.td,{children:"the configuration of subgraph"}),(0,r.jsx)(e.td,{children:"Dictionary, in the format of {{column name 1}:{column value 1},...}"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "name":"graph1"\n "config" : {\n "max_size_GB":2048,\n "async":True\n }\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"652delete-subgraph",children:"6.5.2.Delete Subgraph"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/db/graph1\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"653list-all-subgraphs",children:"6.5.3.List All Subgraphs"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": The list of all subgraphs."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "graph1": {\n "max_size_gb":1024,\n "async":false\n }\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"66label",children:"6.6.Label"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph is a strong-schema database. In each subgraph, each vertex and edge need to have a predefined data format. The data format is determined by Label. Users can use the REST API to add, delete, and query labels and their corresponding data format."}),"\n",(0,r.jsx)(e.p,{children:"The URI format of the Label operation is"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/db/{graph_name}/label/{type}/{label_name}\n"})}),"\n",(0,r.jsxs)(e.p,{children:["Where the {type} can be ",(0,r.jsx)(e.code,{children:"node"})," or ",(0,r.jsx)(e.code,{children:"relationship"}),"."]}),"\n",(0,r.jsx)(e.h4,{id:"661create-label",children:"6.6.1.Create Label"}),"\n",(0,r.jsx)(e.p,{children:"A label is created with a fixed data format. A label must be defined before any node or relationship can be created with that label."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/label"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"the name of label"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"fields"}),(0,r.jsx)(e.td,{children:"data column definition"}),(0,r.jsx)(e.td,{children:"List"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"is_vertex"}),(0,r.jsx)(e.td,{children:"whether it is a vertex Label"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"primary"}),(0,r.jsx)(e.td,{children:"vertex primary property"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"edge_constraints"}),(0,r.jsx)(e.td,{children:"edge constraints"}),(0,r.jsx)(e.td,{children:"List"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"primary"})," should be set when ",(0,r.jsx)(e.code,{children:"is_vertex"})," is ",(0,r.jsx)(e.code,{children:"true"}),". This field is only available for Vertex, and must be set when creating Vertex."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"edge_constraints"})," could be set when ",(0,r.jsx)(e.code,{children:"is_vertex"})," is ",(0,r.jsx)(e.code,{children:"false"}),", This field is only available for Edge. This field limits the combination of starting and ending vertex of the edge, for example: ",(0,r.jsx)(e.code,{children:'[["vertex_label1","vertex_label2"],["vertex_label3","vertex_label4"]]'}),", which limits the edge direction can only be from ",(0,r.jsx)(e.code,{children:"vertex_label1"})," to ",(0,r.jsx)(e.code,{children:"vertex_label2"})," or from ",(0,r.jsx)(e.code,{children:"vertex_label3"})," to ",(0,r.jsx)(e.code,{children:"vertex_label4"}),". If you don't want to have any constraints, just leave this field unset."]}),"\n",(0,r.jsxs)(e.p,{children:["In which ",(0,r.jsx)(e.code,{children:"fields"})," is an array, in which each element defines a column of data, as follows:"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"name"}),(0,r.jsx)(e.td,{children:"the name of the column"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"type"}),(0,r.jsx)(e.td,{children:"the data type of the column"}),(0,r.jsx)(e.td,{children:"String, with following types: int8, int16, int32, int64, float, double, string, date, datetime, binary, blob"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"optional"}),(0,r.jsx)(e.td,{children:"whether the data can be empty (optional, default is false)"}),(0,r.jsx)(e.td,{children:"Bool"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/{graph_name}/label\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "name":"Actor",\n "fields": [\n {"name":"uid", "type":"int64", "optional":false},\n {"name":"name", "type":"string", "optional":true}\n ],\n "is_vertex":true,\n "primary" : "uid"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"662list-all-labels",children:"6.6.2.List All Labels"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/label"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"edge"}),(0,r.jsx)(e.td,{children:"the list of edge labels"}),(0,r.jsx)(e.td,{children:"List"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"vertex"}),(0,r.jsx)(e.td,{children:"the list of vertex labels"}),(0,r.jsx)(e.td,{children:"List"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/label\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "edge": [\n "HAS_CHILD",\n "MARRIED",\n "BORN_IN",\n "DIRECTED",\n "WROTE_MUSIC_FOR",\n "ACTED_IN"\n ],\n "vertex": [\n "Person",\n "City",\n "Film"\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"663get-label-data-format",children:"6.6.3.Get Label Data Format"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/label/{[node|relationship]}/{label_name}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": Data column definition table as a dictionary, in which each key is the column name, and corresponding value is the column definition defined as follows:"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"optional"}),(0,r.jsx)(e.td,{children:"whether the column value can be empty"}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"type"}),(0,r.jsx)(e.td,{children:"the type of the column value"}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/label/node/person\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "age":{\n "optional":false,\n "type":"int16"\n },\n "id":{\n "optional":false,\n "type":"int8"\n },\n "name":{\n "optional":false,\n "type":"string"\n }\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"664schema-import",children:"6.6.4.Schema Import"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/schema/text"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"description"}),(0,r.jsx)(e.td,{children:"Graph labels description"}),(0,r.jsx)(e.td,{children:"String"})]})})]}),"\n",(0,r.jsxs)(e.p,{children:["The detail description can refer to ",(0,r.jsx)(e.code,{children:"TuGraph Manual"}),"."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:"Schema import will check the new schema and original schema in database if compatible or not. If yes, this request will add the label only in new schema. If no, will return an error code."}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example request."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/graph1/schema/text\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "description": "{\\\\"schema\\\\":[{\\\\"label\\\\":\\\\"actor\\\\",\\\\"primary\\\\":\\\\"aid\\\\",\\\\"properties\\\\":[{\\\\"name\\\\":\\\\"aid\\\\",\\\\"type\\\\":\\\\"STRING\\\\"}],\\\\"type\\\\":\\\\"VERTEX\\\\"}]}"\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:"The value of the above description is the following json serialized string :"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json",children:'{\n "schema": [\n {\n "label": "actor",\n "type": "VERTEX",\n "properties": [{ "name": "aid", "type": "STRING" }],\n "primary": "aid"\n }\n ]\n}\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example response."})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "log": ""\n }\n'})}),"\n",(0,r.jsx)(e.h3,{id:"67vertex-operation",children:"6.7.Vertex Operation"}),"\n",(0,r.jsx)(e.p,{children:"URI format is:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/db/{graph_name}/node/{vid}\n"})}),"\n",(0,r.jsxs)(e.p,{children:["in which ",(0,r.jsx)(e.code,{children:"vid"})," is a unique integer identifying the vertex, which can be obtained when creating new vertexes or by looking up index."]}),"\n",(0,r.jsx)(e.h4,{id:"671list-vertex-and-label-number",children:"6.7.1.List Vertex and Label Number"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"num_label"}),(0,r.jsx)(e.td,{children:"the number of vertex label"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"num_vertex"}),(0,r.jsx)(e.td,{children:"the number of vertex"}),(0,r.jsx)(e.td,{children:"Integer"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsxs)(e.em,{children:["Note: ",(0,r.jsx)(e.code,{children:"num_vertex"})," returns an estimate of the number of vertexes, not the exact number. To get the exact number, please use Cypher queries."]})}),"\n",(0,r.jsx)(e.h4,{id:"672create-new-vertex",children:"6.7.2.Create New Vertex"}),"\n",(0,r.jsx)(e.p,{children:"Insert a vertex into the database."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label"}),(0,r.jsx)(e.td,{children:"the name of label"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"property"}),(0,r.jsx)(e.td,{children:"the properties of the vertex"}),(0,r.jsx)(e.td,{children:"Dictionary"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which ",(0,r.jsx)(e.code,{children:"property"})," is a dictionary of {",(0,r.jsx)(e.code,{children:"column_name"}),":",(0,r.jsx)(e.code,{children:"column_value"}),"}."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and the new vertex's vid, which can be used in later vertex operations."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/{graph_name}/node\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "label" : "Person",\n "property" : {\n "name" : "Passerby A",\n "birthyear" : 1989\n }\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n 21\n }\n"})}),"\n",(0,r.jsx)(e.h4,{id:"673batch-create-vertexes",children:"6.7.3.Batch Create Vertexes"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph allows multiple vertices to be inserted as one batch to reduce network overhead."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label"}),(0,r.jsx)(e.td,{children:"the name of Label"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"fields"}),(0,r.jsx)(e.td,{children:"the column names"}),(0,r.jsx)(e.td,{children:"List"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"values"}),(0,r.jsx)(e.td,{children:"the values of each vertex"}),(0,r.jsx)(e.td,{children:"List"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which ",(0,r.jsx)(e.code,{children:"fields"})," is a list of strings specifying column names, and ",(0,r.jsx)(e.code,{children:"values"})," is a list in which each element is a list of ",(0,r.jsx)(e.code,{children:"column_values"})," corresponding to the column names as specified in ",(0,r.jsx)(e.code,{children:"fields"}),"."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200, and return the vid list of newly added vertices in the JSON content, where each vid corresponds to each vertex in the request."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/{graph_name}/node\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "label" : "Person",\n "fields" : ["name", "birthyear"],\n "values" : [["alex", 2000],\n ["bob", 1999]]\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n 22,\n 23\n ]\n }\n"})}),"\n",(0,r.jsx)(e.h4,{id:"674get-vertex",children:"6.7.4.Get Vertex"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{vertex_id}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label"}),(0,r.jsx)(e.td,{children:"the name of Label"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"property"}),(0,r.jsx)(e.td,{children:"property"}),(0,r.jsx)(e.td,{children:"Dictionary, in the format of {column_name_1:column_value_1, ...}"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/node/5\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "property": {\n "birthyear": 1963,\n "name": "Natasha Richardson"\n },\n "label": "Person"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"675delete-vertex",children:"6.7.5.Delete Vertex"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{vertex_id}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200, and also the following content in JSON:"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"in"}),(0,r.jsx)(e.td,{children:"number of incoming edges of the deleted vertex"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"out"}),(0,r.jsx)(e.td,{children:"number of outgoing edges of the deleted vertex"}),(0,r.jsx)(e.td,{children:"Integer"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/db/{graph_name}/node/4\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "in": 0,\n "out": 0\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"676get-vertex-property",children:"6.7.6.Get Vertex Property"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{vertex_id}/property"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": Vertex properties as a dictionary of {",(0,r.jsx)(e.code,{children:"column_name"}),":",(0,r.jsx)(e.code,{children:"column_value"}),"}"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/node/5/property\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "birthyear": 1963,\n "name": "Natasha Richardson"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"677get-vertex-field",children:"6.7.7.Get Vertex Field"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{vertex_id}/property/{field}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": Value corresponding to the specified ",(0,r.jsx)(e.code,{children:"field"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/node/5/property/name\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "Natasha Richardson"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"678update-vertex-property",children:"6.7.8.Update Vertex Property"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{vertex_id}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": PUT"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"property"}),(0,r.jsx)(e.td,{children:"properties to update"}),(0,r.jsx)(e.td,{children:"Dictionary"})]})})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 PUT http://localhost:7070/db/{graph_name}/node/5\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "property" : {\n "birthyear" : 1964,\n "mobile" : "13737299333"\n }\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h3,{id:"68edge-operation",children:"6.8.Edge Operation"}),"\n",(0,r.jsx)(e.p,{children:"URI format is:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/db/{graph_name}/relationship/{euid}\n"})}),"\n",(0,r.jsxs)(e.p,{children:["in which ",(0,r.jsx)(e.code,{children:"euid"})," is a string uniquely identifying the edge, which can be obtained when creating edges or by iterating through the edges of a vertex."]}),"\n",(0,r.jsx)(e.h4,{id:"681create-edge",children:"6.8.1.Create Edge"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{src_vid}/relationship"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label"}),(0,r.jsx)(e.td,{children:"the label of edge"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"destination"}),(0,r.jsxs)(e.td,{children:["the ",(0,r.jsx)(e.code,{children:"vid"})," of destination vertex"]}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"property"}),(0,r.jsx)(e.td,{children:"the property of edge"}),(0,r.jsx)(e.td,{children:"Dictionary"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and the ",(0,r.jsx)(e.code,{children:"euid"})," of new created edge (type is String)."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/{graph_name}/node/{src}/relationship\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "destination" : 14,\n "label" : "BORN_IN",\n "property" : {}\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "1_14_1_0"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"682batch-create-edges",children:"6.8.2.Batch Create Edges"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/relationship"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label"}),(0,r.jsx)(e.td,{children:"the label of edge"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"fields"}),(0,r.jsx)(e.td,{children:"the data column name"}),(0,r.jsx)(e.td,{children:"List"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"edge"}),(0,r.jsx)(e.td,{children:"the data of edge"}),(0,r.jsx)(e.td,{children:"List"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:"where the edge is a list of data, each of which specifies and edge, defined as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"source"}),(0,r.jsx)(e.td,{children:"source vertex id"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"destination"}),(0,r.jsx)(e.td,{children:"destination vertex id"}),(0,r.jsx)(e.td,{children:"Integer"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"values"}),(0,r.jsx)(e.td,{children:"the data list"}),(0,r.jsx)(e.td,{children:"List"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["in which ",(0,r.jsx)(e.code,{children:"values"})," is a list of column values, each of which correspond to the a column name specified in ",(0,r.jsx)(e.code,{children:"fields"}),"."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and the list of ",(0,r.jsx)(e.code,{children:"euid"}),"s of the newly created edges."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/{graph_name}/relationship\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "label" : "knows",\n "fields" : ["from_year", "weight"],\n "edge" : [\n {"source":0, "destination":1, "values":[2011, 0.8]},\n {"source":1, "destination":2, "values":[2008, 0.9]}\n ]\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n "0_1_0_0",\n "1_2_0_0"\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"683list-out-going-edges",children:"6.8.3.List Out-going Edges"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{src}/relationship/out"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": The list of ",(0,r.jsx)(e.code,{children:"euid"}),"s of source vertex's out-going edges."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/node/4/relationship/out\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n "4_5_0_0",\n "4_7_1_2"\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"684list-incoming-edges",children:"6.8.4.List Incoming Edges"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{dst}/relationship/in"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": The list of ",(0,r.jsx)(e.code,{children:"euid"}),"s of destination vertex's incoming edges."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/node/4/relationship/in\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n "0_4_0_0",\n "3_4_3_1"\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"685list-all-edges",children:"6.8.5.List All Edges"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/node/{src}/relationship/all"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"in"}),(0,r.jsxs)(e.td,{children:["list of incoming edges' ",(0,r.jsx)(e.code,{children:"euid"}),"s"]}),(0,r.jsx)(e.td,{children:"List"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"out"}),(0,r.jsxs)(e.td,{children:["list of outgoing edges' ",(0,r.jsx)(e.code,{children:"euid"}),"s"]}),(0,r.jsx)(e.td,{children:"List"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/{graph_name}/node/4/relationship/all\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "out": [\n "4_5_0_0",\n "4_7_1_2"\n ],\n "in": [\n "0_4_0_0",\n "3_4_3_1"\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"686get-edge-information",children:"6.8.6.Get Edge Information"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/relationship/{euid}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label"}),(0,r.jsx)(e.td,{children:"the label of the edge"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"property"}),(0,r.jsx)(e.td,{children:"the properties of the edge"}),(0,r.jsx)(e.td,{children:"Dictionary"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/relationship/0_4_0_0\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "property": {\n },\n "label": "MARRIED"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"687delete-edge",children:"6.8.7.Delete Edge"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/relationship/{euid}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/db/graph1/relationship/14_0_1_0\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"688get-edge-properties",children:"6.8.8.Get Edge Properties"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/relationship/{euid}/property"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": The dictionary of edge's properties."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/relationship/14_0_2_0/property\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n {\n "weight": 0.8,\n "begin": 20180922\n }\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"689get-edge-field",children:"6.8.9.Get Edge Field"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/relationship/{euid}/property/{field}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200 and the value corresponding to given ",(0,r.jsx)(e.code,{children:"field"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/relationship/17_0_2_2/property/charactername\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n "Henri Ducard"\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"6810update-edge-property",children:"6.8.10.Update Edge Property"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/relationship/{euid}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": PUT"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"property"}),(0,r.jsx)(e.td,{children:"properties to be updated"}),(0,r.jsx)(e.td,{children:"Dictionary"})]})})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 PUT http://localhost:7070/db/graph1/relationship/17_0_2_2\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "property" : {\n "charactername" : "Henri Ducard/passer a"\n }\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h3,{id:"69index",children:"6.9.Index"}),"\n",(0,r.jsx)(e.p,{children:"URI format is:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/db/{graph_name}/index/{label}/{field}\n"})}),"\n",(0,r.jsx)(e.h4,{id:"691create-index",children:"6.9.1.Create Index"}),"\n",(0,r.jsx)(e.p,{children:"Create an index on a (label, field) pair. Blocks until the index is successfully built."}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/index"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"label"}),(0,r.jsx)(e.td,{children:"the name of label"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"field"}),(0,r.jsx)(e.td,{children:"field to be indexed"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"type"}),(0,r.jsx)(e.td,{children:"the type of index, 0 means nonunique index, 1 means unique index, 2 means pair_unique index"}),(0,r.jsx)(e.td,{children:"int"})]})]})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/graph1/index\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json\n Input:\n {\n "label": "Person",\n "field": "birthyear",\n "is_unique" : false\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"692list-all-indexes",children:"6.9.2.List All Indexes"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/index"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": A list of index specifications, each of which has the same format as use in ",(0,r.jsx)(e.a,{href:"#Create-Index",children:"Create Index"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/index\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n {\n "field": "name",\n "label": "City",\n "is_unique": false\n },\n {\n "field": "title",\n "label": "Film",\n "is_unique": false\n },\n {\n "field": "name",\n "label": "Person",\n "is_unique": true\n },\n {\n "label": "Person",\n "field": "age",\n "is_unique": false\n }\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"693list-indexes-related-with-specified-label",children:"6.9.3.List Indexes Related with Specified Label"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/index/{label}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": A list of index specifications, each of which has the same format as use in ",(0,r.jsx)(e.a,{href:"#Create-Index",children:"Create Index"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/index/Person\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n \u2022 Content-Type: application/json; charset=UTF-8\n Output:\n {\n [\n {\n "label": "Person",\n "field": "name",\n "is_unique": true\n },\n {\n "label": "Person",\n "field": "age",\n "is_unique": false\n }\n ]\n }\n'})}),"\n",(0,r.jsx)(e.h4,{id:"694delete-index",children:"6.9.4.Delete Index"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/index/{label}/{field}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": DELETE"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": if successful, return status code 200."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 DELETE http://localhost:7070/db/graph1/index/Person/name\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n"})}),"\n",(0,r.jsx)(e.h4,{id:"695get-vertex-by-index",children:"6.9.5.Get Vertex by Index"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/index/{label}/?field={field}&value={value}"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": GET"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),": A list of ",(0,r.jsx)(e.code,{children:"vid"}),"s."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 GET http://localhost:7070/db/graph1/index/Person/?field=birthyear&value=1986\n \u2022 Accept: application/json; charset=UTF-8\n"})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" \u2022 200: OK\n Output:\n {\n [\n 1,\n 8\n ]\n }\n"})}),"\n",(0,r.jsx)(e.h3,{id:"610data-import",children:"6.10.Data Import"}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/import/text"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"description"}),(0,r.jsx)(e.td,{children:"description of the file content"}),(0,r.jsx)(e.td,{children:"String"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"data"}),(0,r.jsx)(e.td,{children:"contents of the file to be imported (recommended to have a size of 16MB, has a hard limit of 17MB)"}),(0,r.jsx)(e.td,{children:"Strings / Arrays / Objects"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"continue_on_error"}),(0,r.jsxs)(e.td,{children:["whether to continue import when an error occurred (optional, default is ",(0,r.jsx)(e.code,{children:"false"}),")"]}),(0,r.jsx)(e.td,{children:"Bool"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"delimiter"}),(0,r.jsxs)(e.td,{children:["delimiter used in the data file (optional, default is ",(0,r.jsx)(e.code,{children:"\u201c,\u201d"}),")"]}),(0,r.jsx)(e.td,{children:"String"})]})]})]}),"\n",(0,r.jsxs)(e.p,{children:["The details of the ",(0,r.jsx)(e.code,{children:"description"})," field can be found in ",(0,r.jsx)(e.a,{href:"/tugraph-db/en/utility-tools/data-import",children:"TuGraph Import Tool"}),"."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"delimiter"})," can be a single character or multi-character string, but must not contain ",(0,r.jsx)(e.code,{children:"\\r"})," or ",(0,r.jsx)(e.code,{children:"\\n"}),"."]}),"\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.code,{children:"data"})," can be one of the following:"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["String, such as ",(0,r.jsx)(e.code,{children:'"1,2\\n3,4\\n"'})]}),"\n",(0,r.jsxs)(e.li,{children:["Array of ASCII codes, such as ",(0,r.jsx)(e.code,{children:"[49,44,50,10,51,44,52,10]"})]}),"\n",(0,r.jsxs)(e.li,{children:["Dictionary shaped like the above array, such as ",(0,r.jsx)(e.code,{children:'{"0":49,"1":44,"2":50,"3":10,"4":51,"5":44,"6":52,"7":10}'})]}),"\n"]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n",(0,r.jsxs)(e.p,{children:["The system ",(0,r.jsx)(e.strong,{children:"will not"})," automatically perform actions such as creating a new label, adding an index, and so on. Before you do this, please make sure that the label involved already exists and has an appropriate index."]}),"\n",(0,r.jsxs)(e.p,{children:["If the import is successful, return code 200 and return log information (possibly empty) in the ",(0,r.jsx)(e.code,{children:"log"})," field. Otherwise, returns status code 400. None of the data is imported on failure, and error message is set in ",(0,r.jsx)(e.code,{children:"error_message"}),"."]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/graph1/import/text\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "description": "{\\\\"files\\\\":[{\\\\"columns\\\\":[\\\\"SRC_ID\\\\",\\\\"role\\\\",\\\\"DST_ID\\\\"],\\\\"format\\\\":\\\\"CSV\\\\",\\\\"label\\\\":\\\\"role\\\\",\\\\"SRC_ID\\\\":\\\\"actor\\\\",\\\\"DST_ID\\\\":\\\\"movie\\\\"}]}"}",\n "data": "1,Role1,2\\n3,Role2,4\\n",\n "continue_on_error": true\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:"The value of the above description is the following json serialized string :"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-json",children:'{\n "files": [\n {\n "format": "CSV",\n "label": "role",\n "SRC_ID": "actor",\n "DST_ID": "movie",\n "columns": ["SRC_ID", "role", "DST_ID"]\n }\n ]\n}\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "log": "Missing src uid 1\\n"\n }\n'})}),"\n",(0,r.jsxs)(e.p,{children:["Because the request specifies ",(0,r.jsx)(e.code,{children:"continue_on_error: true"}),", the returned ",(0,r.jsx)(e.code,{children:"log"})," indicates that the first edge cannot be inserted because there is no vertex with uid==1, while the second edge was imported successfully."]}),"\n",(0,r.jsx)(e.h3,{id:"611miscellany",children:"6.11.Miscellany"}),"\n",(0,r.jsx)(e.p,{children:"URI format is:"}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:" http://{host}:{port}/db/{graph_name}/misc\n"})}),"\n",(0,r.jsx)(e.h4,{id:"6111extract-subgraph",children:"6.11.1.Extract Subgraph"}),"\n",(0,r.jsxs)(e.p,{children:["Give a set of ",(0,r.jsx)(e.code,{children:"vid"}),"s and return the minimum subgraph which contains the vertex set and the edges between them."]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"URI"}),": ",(0,r.jsx)(e.code,{children:"/db/{graph_name}/misc/sub_graph"})]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,r.jsxs)(e.li,{children:["\n",(0,r.jsxs)(e.p,{children:[(0,r.jsx)(e.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"Description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsx)(e.tbody,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"vertex_ids"}),(0,r.jsx)(e.td,{children:"vertex id set"}),(0,r.jsx)(e.td,{children:"List"})]})})]}),"\n",(0,r.jsxs)(e.ul,{children:["\n",(0,r.jsxs)(e.li,{children:[(0,r.jsx)(e.strong,{children:"RESPONSE"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Field"}),(0,r.jsx)(e.th,{children:"description"}),(0,r.jsx)(e.th,{children:"Type"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"nodes"}),(0,r.jsx)(e.td,{children:"vertex information"}),(0,r.jsx)(e.td,{children:"List, each element contains vid, label, and properties."})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"relationships"}),(0,r.jsx)(e.td,{children:"edge information"}),(0,r.jsx)(e.td,{children:"List, each element contains src, dst, euid, label, and properties."})]})]})]}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Request:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 POST http://localhost:7070/db/graph1/misc/sub_graph\n \u2022 Accept: application/json; charset=UTF-8\n \u2022 Content-Type: application/json; charset=UTF-8\n Input:\n {\n "vertex_ids": [2, 5, 14, 20]\n }\n'})}),"\n",(0,r.jsx)(e.p,{children:(0,r.jsx)(e.strong,{children:"Example Response:"})}),"\n",(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{children:' \u2022 200: OK\n Output:\n {\n "nodes": [\n {\n "label": "Person",\n "properties": {\n "birthyear": 1937,\n "name": "Vanessa Redgrave"\n },\n "vid": 2\n },\n {\n "label": "Person",\n "properties": {\n "birthyear": 1963,\n "name": "Natasha Richardson"\n },\n "vid": 5\n },\n {\n "label": "City",\n "properties": {\n "name": "London"\n },\n "vid": 14\n },\n {\n "label": "Film",\n "properties": {\n "title": "Camelot"\n },\n "vid": 20\n }\n ],\n "relationships": [\n {\n "destination": 5,\n "label": "HAS_CHILD",\n "properties": {\n "birthyear": 1937,\n "name": "Vanessa Redgrave"\n },\n "source": 2\n },\n {\n "destination": 14,\n "label": "BORN_IN",\n "properties": {\n "birthyear": 1937,\n "name": "Vanessa Redgrave"\n },\n "source": 2\n },\n {\n "destination": 20,\n "label": "ACTED_IN",\n "properties": {\n "birthyear": 1937,\n "charactername": "Guenevere",\n "name": "Vanessa Redgrave"\n },\n "source": 2\n },\n {\n "destination": 14,\n "label": "BORN_IN",\n "properties": {\n "birthyear": 1963,\n "name": "Natasha Richardson"\n },\n "source": 5\n }\n ]\n }\n'})})]})}function o(n={}){const{wrapper:e}={...(0,i.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(x,{...n})}):x(n)}},8453:(n,e,s)=>{s.d(e,{R:()=>l,x:()=>t});var r=s(6540);const i={},d=r.createContext(i);function l(n){const e=r.useContext(d);return r.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function t(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(i):n.components||i:l(n.components),r.createElement(d.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/8534c110.827af05f.js b/assets/js/8534c110.e6f55f35.js similarity index 99% rename from assets/js/8534c110.827af05f.js rename to assets/js/8534c110.e6f55f35.js index 8a962d5f94..55dc2325b8 100644 --- a/assets/js/8534c110.827af05f.js +++ b/assets/js/8534c110.e6f55f35.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4892],{9339:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>l,contentTitle:()=>d,default:()=>c,frontMatter:()=>i,metadata:()=>a,toc:()=>o});var t=n(4848),s=n(8453);const i={},d="DEMO",a={id:"quick-start/demo/movie",title:"DEMO:Movie",description:"This document mainly introduces the usage of the movie demo.",source:"@site/../docs/en-US/source/3.quick-start/2.demo/1.movie.md",sourceDirName:"3.quick-start/2.demo",slug:"/quick-start/demo/movie",permalink:"/tugraph-db/en/quick-start/demo/movie",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Quick Start",permalink:"/tugraph-db/en/quick-start/preparation"},next:{title:"DEMO:Wandering Earth",permalink:"/tugraph-db/en/quick-start/demo/wandering-earth"}},l={},o=[{value:"1.Modeling and Data Import",id:"1modeling-and-data-import",level:2},{value:"2.Query Examples",id:"2query-examples",level:2},{value:"2.1.Example One",id:"21example-one",level:3},{value:"2.2.Example Two",id:"22example-two",level:3},{value:"2.3.Example Three",id:"23example-three",level:3},{value:"2.4.Example Four",id:"24example-four",level:3},{value:"2.5.Example Five",id:"25example-five",level:3},{value:"2.6.Example Six",id:"26example-six",level:3},{value:"2.7.Example Seven",id:"27example-seven",level:3}];function h(e){const r={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"demo",children:"DEMO:Movie"})}),"\n",(0,t.jsxs)(r.blockquote,{children:["\n",(0,t.jsx)(r.p,{children:"This document mainly introduces the usage of the movie demo."}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"1modeling-and-data-import",children:"1.Modeling and Data Import"}),"\n",(0,t.jsx)(r.p,{children:'After logging in, click "Create Graph Project", select the movie dataset, fill in the graph project configuration, and the system will automatically complete the creation of the Movie scenario graph project.Other scenarios can also be created in the same manner.'}),"\n",(0,t.jsx)(r.p,{children:"Movie\uff1a"}),"\n",(0,t.jsx)(r.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/1.Guide/2.quick-start.png",alt:"movie_schema",style:{zoom:"25%"}}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Label"}),(0,t.jsx)(r.th,{children:"Type"}),(0,t.jsx)(r.th,{children:"Description"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"movie"}),(0,t.jsx)(r.td,{children:"Vertex"}),(0,t.jsx)(r.td,{children:'Represents a specific movie, such as "Forrest Gump".'})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"person"}),(0,t.jsx)(r.td,{children:"Vertex"}),(0,t.jsx)(r.td,{children:"Represents a person, who may be an actor, director, or screenwriter for a movie."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"genre"}),(0,t.jsx)(r.td,{children:"Vertex"}),(0,t.jsx)(r.td,{children:"Represents the genre of a movie, such as drama, horror."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"keyword"}),(0,t.jsx)(r.td,{children:"Vertex"}),(0,t.jsx)(r.td,{children:'Represents some keywords related to the movie, such as "save the world", "virtual reality", "subway".'})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"user"}),(0,t.jsx)(r.td,{children:"Vertex"}),(0,t.jsx)(r.td,{children:"Represents a user who watches movies."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"produce"}),(0,t.jsx)(r.td,{children:"Edge"}),(0,t.jsx)(r.td,{children:"Represents the relationship between the producer of a movie."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"acted_in"}),(0,t.jsx)(r.td,{children:"Edge"}),(0,t.jsx)(r.td,{children:"Represents the relationship between actors and the movies they have appeared in."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"direct"}),(0,t.jsx)(r.td,{children:"Edge"}),(0,t.jsx)(r.td,{children:"Represents the relationship between a movie and its director."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"write"}),(0,t.jsx)(r.td,{children:"Edge"}),(0,t.jsx)(r.td,{children:"Represents the screenwriting relationship of a movie."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"has_genre"}),(0,t.jsx)(r.td,{children:"Edge"}),(0,t.jsx)(r.td,{children:"Represents the genre classification of a movie."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"has_keyword"}),(0,t.jsx)(r.td,{children:"Edge"}),(0,t.jsx)(r.td,{children:"Represents some keywords of a movie, which are more specific labels for classification."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"rate"}),(0,t.jsx)(r.td,{children:"Edge"}),(0,t.jsx)(r.td,{children:"Represents the rating given by a user to a movie."})]})]})]}),"\n",(0,t.jsx)(r.h2,{id:"2query-examples",children:"2.Query Examples"}),"\n",(0,t.jsx)(r.h3,{id:"21example-one",children:"2.1.Example One"}),"\n",(0,t.jsx)(r.p,{children:"Query all actors of the movie 'Forrest Gump' and return the subgraph composed of the movie and the actors."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"MATCH (m:movie {title: 'Forrest Gump'})<-[:acted_in]-(a:person) RETURN a, m\n"})}),"\n",(0,t.jsx)(r.h3,{id:"22example-two",children:"2.2.Example Two"}),"\n",(0,t.jsx)(r.p,{children:"Query all actors of the movie 'Forrest Gump' and list the roles they played in the movie."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"MATCH (m:movie {title: 'Forrest Gump'})<-[r:acted_in]-(a:person) RETURN a.name,r.role\n"})}),"\n",(0,t.jsx)(r.h3,{id:"23example-three",children:"2.3.Example Three"}),"\n",(0,t.jsx)(r.p,{children:"Query all movies rated below 3 by Michael."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"MATCH (u:user {login: 'Michael'})-[r:rate]->(m:movie) WHERE r.stars < 3 RETURN m.title, r.stars\n"})}),"\n",(0,t.jsx)(r.h3,{id:"24example-four",children:"2.4.Example Four"}),"\n",(0,t.jsx)(r.p,{children:"Query users who have the same dislike of movies as Michael, where the standard for dislike is a rating of less than three."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"MATCH (u:user {login: 'Michael'})-[r:rate]->(m:movie)<-[s:rate]-(v) WHERE r.stars < 3 AND s.stars < 3 RETURN u, m, v\n"})}),"\n",(0,t.jsx)(r.h3,{id:"25example-five",children:"2.5.Example Five"}),"\n",(0,t.jsx)(r.p,{children:"Recommend movies to Michael by first finding users who dislike the same movies as Michael, and then filtering out the movies that these users like."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"MATCH (u:user {login: 'Michael'})-[r:rate]->(m:movie)<-[s:rate]-(v)-[r2:rate]->(m2:movie) WHERE r.stars < 3 AND s.stars < 3 AND r2.stars > 3 RETURN u, m, v, m2\n"})}),"\n",(0,t.jsx)(r.h3,{id:"26example-six",children:"2.6.Example Six"}),"\n",(0,t.jsx)(r.p,{children:"Query the movies that Michael's friends like."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"MATCH (u:user {login: 'Michael'})-[:is_friend]->(v:user)-[r:rate]->(m:movie) WHERE r.stars > 3 RETURN u, v, m\n"})}),"\n",(0,t.jsx)(r.h3,{id:"27example-seven",children:"2.7.Example Seven"}),"\n",(0,t.jsx)(r.p,{children:"By querying the movies that people who gave 'Forrest Gump' a high rating also like, recommend similar movies to users who like 'Forrest Gump'."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"MATCH (m:movie {title:'Forrest Gump'})<-[r:rate]-(u:user)-[r2:rate]->(m2:movie) WHERE r.stars>3 AND r2.stars>3 RETURN m, u,m2\n"})})]})}function c(e={}){const{wrapper:r}={...(0,s.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,r,n)=>{n.d(r,{R:()=>d,x:()=>a});var t=n(6540);const s={},i=t.createContext(s);function d(e){const r=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),t.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4892],{9339:(e,r,n)=>{n.r(r),n.d(r,{assets:()=>l,contentTitle:()=>d,default:()=>c,frontMatter:()=>i,metadata:()=>a,toc:()=>o});var t=n(4848),s=n(8453);const i={},d="DEMO",a={id:"quick-start/demo/movie",title:"DEMO:Movie",description:"This document mainly introduces the usage of the movie demo.",source:"@site/../docs/en-US/source/3.quick-start/2.demo/1.movie.md",sourceDirName:"3.quick-start/2.demo",slug:"/quick-start/demo/movie",permalink:"/tugraph-db/en/quick-start/demo/movie",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Quick Start",permalink:"/tugraph-db/en/quick-start/preparation"},next:{title:"DEMO:Wandering Earth",permalink:"/tugraph-db/en/quick-start/demo/wandering-earth"}},l={},o=[{value:"1.Modeling and Data Import",id:"1modeling-and-data-import",level:2},{value:"2.Query Examples",id:"2query-examples",level:2},{value:"2.1.Example One",id:"21example-one",level:3},{value:"2.2.Example Two",id:"22example-two",level:3},{value:"2.3.Example Three",id:"23example-three",level:3},{value:"2.4.Example Four",id:"24example-four",level:3},{value:"2.5.Example Five",id:"25example-five",level:3},{value:"2.6.Example Six",id:"26example-six",level:3},{value:"2.7.Example Seven",id:"27example-seven",level:3}];function h(e){const r={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.header,{children:(0,t.jsx)(r.h1,{id:"demo",children:"DEMO:Movie"})}),"\n",(0,t.jsxs)(r.blockquote,{children:["\n",(0,t.jsx)(r.p,{children:"This document mainly introduces the usage of the movie demo."}),"\n"]}),"\n",(0,t.jsx)(r.h2,{id:"1modeling-and-data-import",children:"1.Modeling and Data Import"}),"\n",(0,t.jsx)(r.p,{children:'After logging in, click "Create Graph Project", select the movie dataset, fill in the graph project configuration, and the system will automatically complete the creation of the Movie scenario graph project.Other scenarios can also be created in the same manner.'}),"\n",(0,t.jsx)(r.p,{children:"Movie\uff1a"}),"\n",(0,t.jsx)(r.img,{src:"https://tugraph-web-static.oss-cn-beijing.aliyuncs.com/%E6%96%87%E6%A1%A3/1.Guide/2.quick-start.png",alt:"movie_schema",style:{zoom:"25%"}}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Label"}),(0,t.jsx)(r.th,{children:"Type"}),(0,t.jsx)(r.th,{children:"Description"})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"movie"}),(0,t.jsx)(r.td,{children:"Vertex"}),(0,t.jsx)(r.td,{children:'Represents a specific movie, such as "Forrest Gump".'})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"person"}),(0,t.jsx)(r.td,{children:"Vertex"}),(0,t.jsx)(r.td,{children:"Represents a person, who may be an actor, director, or screenwriter for a movie."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"genre"}),(0,t.jsx)(r.td,{children:"Vertex"}),(0,t.jsx)(r.td,{children:"Represents the genre of a movie, such as drama, horror."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"keyword"}),(0,t.jsx)(r.td,{children:"Vertex"}),(0,t.jsx)(r.td,{children:'Represents some keywords related to the movie, such as "save the world", "virtual reality", "subway".'})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"user"}),(0,t.jsx)(r.td,{children:"Vertex"}),(0,t.jsx)(r.td,{children:"Represents a user who watches movies."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"produce"}),(0,t.jsx)(r.td,{children:"Edge"}),(0,t.jsx)(r.td,{children:"Represents the relationship between the producer of a movie."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"acted_in"}),(0,t.jsx)(r.td,{children:"Edge"}),(0,t.jsx)(r.td,{children:"Represents the relationship between actors and the movies they have appeared in."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"direct"}),(0,t.jsx)(r.td,{children:"Edge"}),(0,t.jsx)(r.td,{children:"Represents the relationship between a movie and its director."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"write"}),(0,t.jsx)(r.td,{children:"Edge"}),(0,t.jsx)(r.td,{children:"Represents the screenwriting relationship of a movie."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"has_genre"}),(0,t.jsx)(r.td,{children:"Edge"}),(0,t.jsx)(r.td,{children:"Represents the genre classification of a movie."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"has_keyword"}),(0,t.jsx)(r.td,{children:"Edge"}),(0,t.jsx)(r.td,{children:"Represents some keywords of a movie, which are more specific labels for classification."})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"rate"}),(0,t.jsx)(r.td,{children:"Edge"}),(0,t.jsx)(r.td,{children:"Represents the rating given by a user to a movie."})]})]})]}),"\n",(0,t.jsx)(r.h2,{id:"2query-examples",children:"2.Query Examples"}),"\n",(0,t.jsx)(r.h3,{id:"21example-one",children:"2.1.Example One"}),"\n",(0,t.jsx)(r.p,{children:"Query all actors of the movie 'Forrest Gump' and return the subgraph composed of the movie and the actors."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"MATCH (m:movie {title: 'Forrest Gump'})<-[:acted_in]-(a:person) RETURN a, m\n"})}),"\n",(0,t.jsx)(r.h3,{id:"22example-two",children:"2.2.Example Two"}),"\n",(0,t.jsx)(r.p,{children:"Query all actors of the movie 'Forrest Gump' and list the roles they played in the movie."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"MATCH (m:movie {title: 'Forrest Gump'})<-[r:acted_in]-(a:person) RETURN a.name,r.role\n"})}),"\n",(0,t.jsx)(r.h3,{id:"23example-three",children:"2.3.Example Three"}),"\n",(0,t.jsx)(r.p,{children:"Query all movies rated below 3 by Michael."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"MATCH (u:user {login: 'Michael'})-[r:rate]->(m:movie) WHERE r.stars < 3 RETURN m.title, r.stars\n"})}),"\n",(0,t.jsx)(r.h3,{id:"24example-four",children:"2.4.Example Four"}),"\n",(0,t.jsx)(r.p,{children:"Query users who have the same dislike of movies as Michael, where the standard for dislike is a rating of less than three."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"MATCH (u:user {login: 'Michael'})-[r:rate]->(m:movie)<-[s:rate]-(v) WHERE r.stars < 3 AND s.stars < 3 RETURN u, m, v\n"})}),"\n",(0,t.jsx)(r.h3,{id:"25example-five",children:"2.5.Example Five"}),"\n",(0,t.jsx)(r.p,{children:"Recommend movies to Michael by first finding users who dislike the same movies as Michael, and then filtering out the movies that these users like."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"MATCH (u:user {login: 'Michael'})-[r:rate]->(m:movie)<-[s:rate]-(v)-[r2:rate]->(m2:movie) WHERE r.stars < 3 AND s.stars < 3 AND r2.stars > 3 RETURN u, m, v, m2\n"})}),"\n",(0,t.jsx)(r.h3,{id:"26example-six",children:"2.6.Example Six"}),"\n",(0,t.jsx)(r.p,{children:"Query the movies that Michael's friends like."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"MATCH (u:user {login: 'Michael'})-[:is_friend]->(v:user)-[r:rate]->(m:movie) WHERE r.stars > 3 RETURN u, v, m\n"})}),"\n",(0,t.jsx)(r.h3,{id:"27example-seven",children:"2.7.Example Seven"}),"\n",(0,t.jsx)(r.p,{children:"By querying the movies that people who gave 'Forrest Gump' a high rating also like, recommend similar movies to users who like 'Forrest Gump'."}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"MATCH (m:movie {title:'Forrest Gump'})<-[r:rate]-(u:user)-[r2:rate]->(m2:movie) WHERE r.stars>3 AND r2.stars>3 RETURN m, u,m2\n"})})]})}function c(e={}){const{wrapper:r}={...(0,s.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,r,n)=>{n.d(r,{R:()=>d,x:()=>a});var t=n(6540);const s={},i=t.createContext(s);function d(e){const r=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),t.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8652d030.3a5cdcb6.js b/assets/js/8652d030.4ac43b0d.js similarity index 99% rename from assets/js/8652d030.3a5cdcb6.js rename to assets/js/8652d030.4ac43b0d.js index 6851b6905e..8c3ad1163e 100644 --- a/assets/js/8652d030.3a5cdcb6.js +++ b/assets/js/8652d030.4ac43b0d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5965],{756:(n,e,r)=>{r.r(e),r.d(e,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>i,metadata:()=>o,toc:()=>d});var a=r(4848),t=r(8453);const i={},s="TuGraph DataX",o={id:"utility-tools/tugraph-datax",title:"TuGraph DataX",description:"This document mainly introduces the installation, compilation and usage examples of TuGraph DataX",source:"@site/../docs/en-US/source/6.utility-tools/7.tugraph-datax.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/tugraph-datax",permalink:"/tugraph-db/en/utility-tools/tugraph-datax",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:7,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Tugraph CLI",permalink:"/tugraph-db/en/utility-tools/tugraph-cli"},next:{title:"TuGraph Explorer",permalink:"/tugraph-db/en/utility-tools/tugraph-explorer"}},l={},d=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Compile and Install",id:"2compile-and-install",level:2},{value:"3.Import TuGraph",id:"3import-tugraph",level:2},{value:"3.1.Text data imported into TuGraph with DataX",id:"31text-data-imported-into-tugraph-with-datax",level:3},{value:"3.2.MySQL's data imported into TuGraph with DataX",id:"32mysqls-data-imported-into-tugraph-with-datax",level:3},{value:"4.Export TuGraph",id:"4export-tugraph",level:2},{value:"4.1. Configuration example",id:"41-configuration-example",level:3},{value:"4.2. Parameter Description",id:"42-parameter-description",level:3}];function h(n){const e={a:"a",blockquote:"blockquote",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...n.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(e.header,{children:(0,a.jsx)(e.h1,{id:"tugraph-datax",children:"TuGraph DataX"})}),"\n",(0,a.jsxs)(e.blockquote,{children:["\n",(0,a.jsx)(e.p,{children:"This document mainly introduces the installation, compilation and usage examples of TuGraph DataX"}),"\n"]}),"\n",(0,a.jsx)(e.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,a.jsxs)(e.p,{children:["On the basis of Ali's open source DataX, TuGraph implements the support of writing plug-ins and jsonline data format, and other data sources can write data into TuGraph through DataX.\nTuGraph DataX introduces ",(0,a.jsx)(e.a,{href:"https://github.com/TuGraph-family/DataX",children:"https://github.com/TuGraph-family/DataX"}),", Supported features include:"]}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:"Import TuGraph from various heterogeneous data sources such as MySQL, SQL Server,Oracle, PostgreSQL, HDFS, Hive, HBase, OTS, ODPS, Kafka and so on."}),"\n"]}),"\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:"Import TuGraph to the corresponding target source (to be developed)."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(e.p,{children:["Reference for DataX Original Project Introduction ",(0,a.jsx)(e.a,{href:"https://github.com/alibaba/DataX",children:"https://github.com/alibaba/DataX"})]}),"\n",(0,a.jsx)(e.h2,{id:"2compile-and-install",children:"2.Compile and Install"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-bash",children:"git clone https://github.com/TuGraph-family/DataX.git\nyum install maven\nmvn -U clean package assembly:assembly -Dmaven.test.skip=true\n"})}),"\n",(0,a.jsx)(e.p,{children:"The compiled DataX file is in the target directory"}),"\n",(0,a.jsx)(e.h2,{id:"3import-tugraph",children:"3.Import TuGraph"}),"\n",(0,a.jsx)(e.h3,{id:"31text-data-imported-into-tugraph-with-datax",children:"3.1.Text data imported into TuGraph with DataX"}),"\n",(0,a.jsxs)(e.p,{children:["Using the data from the lgraph_import section of the TuGraph manual as an example, we have three csv data files, as follows:\n",(0,a.jsx)(e.code,{children:"actors.csv"})]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"\nnm015950,Stephen Chow\nnm0628806,Man-Tat Ng\nnm0156444,Cecilia Cheung\nnm2514879,Yuqi Zhang\n\n"})}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.code,{children:"movies.csv"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"\ntt0188766,King of Comedy,1999,7.3\ntt0286112,Shaolin Soccer,2001,7.3\ntt4701660,The Mermaid,2016,6.3\n\n"})}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.code,{children:"roles.csv"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"\nnm015950,Tianchou Yin,tt0188766\nnm015950,Steel Leg,tt0286112\nnm0628806,,tt0188766\nnm0628806,coach,tt0286112\nnm0156444,PiaoPiao Liu,tt0188766\nnm2514879,Ruolan Li,tt4701660\n\n"})}),"\n",(0,a.jsxs)(e.p,{children:["Then create three DataX job profiles:\n",(0,a.jsx)(e.code,{children:"job_actors.json"})]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "job": {\n "setting": {\n "speed": {\n "channel": 1\n }\n },\n "content": [\n {\n "reader": {\n "name": "txtfilereader",\n "parameter": {\n "path": ["actors.csv"],\n "encoding": "UTF-8",\n "column": [\n {\n "index": 0,\n "type": "string"\n },\n {\n "index": 1,\n "type": "string"\n }\n ],\n "fieldDelimiter": ","\n }\n },\n "writer": {\n "name": "tugraphwriter",\n "parameter": {\n "host": "127.0.0.1",\n "port": 7071,\n "username": "admin",\n "password": "73@TuGraph",\n "graphName": "default",\n "schema": [\n {\n "label": "actor",\n "type": "VERTEX",\n "properties": [\n { "name": "aid", "type": "STRING" },\n { "name": "name", "type": "STRING" }\n ],\n "primary": "aid"\n }\n ],\n "files": [\n {\n "label": "actor",\n "format": "JSON",\n "columns": ["aid", "name"]\n }\n ]\n }\n }\n }\n ]\n }\n}\n'})}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.code,{children:"job_movies.json"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "job": {\n "setting": {\n "speed": {\n "channel": 1\n }\n },\n "content": [\n {\n "reader": {\n "name": "txtfilereader",\n "parameter": {\n "path": ["movies.csv"],\n "encoding": "UTF-8",\n "column": [\n {\n "index": 0,\n "type": "string"\n },\n {\n "index": 1,\n "type": "string"\n },\n {\n "index": 2,\n "type": "string"\n },\n {\n "index": 3,\n "type": "string"\n }\n ],\n "fieldDelimiter": ","\n }\n },\n "writer": {\n "name": "tugraphwriter",\n "parameter": {\n "host": "127.0.0.1",\n "port": 7071,\n "username": "admin",\n "password": "73@TuGraph",\n "graphName": "default",\n "schema": [\n {\n "label": "movie",\n "type": "VERTEX",\n "properties": [\n { "name": "mid", "type": "STRING" },\n { "name": "name", "type": "STRING" },\n { "name": "year", "type": "STRING" },\n { "name": "rate", "type": "FLOAT", "optional": true }\n ],\n "primary": "mid"\n }\n ],\n "files": [\n {\n "label": "movie",\n "format": "JSON",\n "columns": ["mid", "name", "year", "rate"]\n }\n ]\n }\n }\n }\n ]\n }\n}\n'})}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.code,{children:"job_roles.json"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "job": {\n "setting": {\n "speed": {\n "channel": 1\n }\n },\n "content": [\n {\n "reader": {\n "name": "txtfilereader",\n "parameter": {\n "path": ["roles.csv"],\n "encoding": "UTF-8",\n "column": [\n {\n "index": 0,\n "type": "string"\n },\n {\n "index": 1,\n "type": "string"\n },\n {\n "index": 2,\n "type": "string"\n }\n ],\n "fieldDelimiter": ","\n }\n },\n "writer": {\n "name": "tugraphwriter",\n "parameter": {\n "host": "127.0.0.1",\n "port": 7071,\n "username": "admin",\n "password": "73@TuGraph",\n "graphName": "default",\n "schema": [\n {\n "label": "play_in",\n "type": "EDGE",\n "properties": [{ "name": "role", "type": "STRING" }]\n }\n ],\n "files": [\n {\n "label": "play_in",\n "format": "JSON",\n "SRC_ID": "actor",\n "DST_ID": "movie",\n "columns": ["SRC_ID", "role", "DST_ID"]\n }\n ]\n }\n }\n }\n ]\n }\n}\n'})}),"\n",(0,a.jsxs)(e.p,{children:[(0,a.jsx)(e.code,{children:"/lgraph_server -c lgraph_standalone.json -d 'run'"})," 'Start TuGraph and run the following commands in sequence:"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"python3 datax/bin/datax.py job_actors.json\n"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"python3 datax/bin/datax.py job_movies.json\n"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"python3 datax/bin/datax.py job_roles.json\n"})}),"\n",(0,a.jsx)(e.h3,{id:"32mysqls-data-imported-into-tugraph-with-datax",children:"3.2.MySQL's data imported into TuGraph with DataX"}),"\n",(0,a.jsx)(e.p,{children:"We create the following table of movies under 'test' database"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-sql",children:"CREATE TABLE `movies` (\n `mid` varchar(200) NOT NULL,\n `name` varchar(100) NOT NULL,\n `year` int(11) NOT NULL,\n `rate` float(5,2) unsigned NOT NULL,\n PRIMARY KEY (`mid`)\n);\n"})}),"\n",(0,a.jsx)(e.p,{children:"Insert some data into the table"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-sql",children:"insert into\ntest.movies (mid, name, year, rate)\nvalues\n('tt0188766', 'King of Comedy', 1999, 7.3),\n('tt0286112', 'Shaolin Soccer', 2001, 7.3),\n('tt4701660', 'The Mermaid', 2016, 6.3);\n"})}),"\n",(0,a.jsx)(e.p,{children:"Create a DataX job configuration file"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.code,{children:"job_mysql_to_tugraph.json"})}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.strong,{children:"Configuring Field"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "job": {\n "setting": {\n "speed": {\n "channel": 1\n }\n },\n "content": [\n {\n "reader": {\n "name": "mysqlreader",\n "parameter": {\n "username": "root",\n "password": "root",\n "column": ["mid", "name", "year", "rate"],\n "splitPk": "mid",\n "connection": [\n {\n "table": ["movies"],\n "jdbcUrl": ["jdbc:mysql://127.0.0.1:3306/test?useSSL=false"]\n }\n ]\n }\n },\n "writer": {\n "name": "tugraphwriter",\n "parameter": {\n "host": "127.0.0.1",\n "port": 7071,\n "username": "admin",\n "password": "73@TuGraph",\n "graphName": "default",\n "schema": [\n {\n "label": "movie",\n "type": "VERTEX",\n "properties": [\n { "name": "mid", "type": "STRING" },\n { "name": "name", "type": "STRING" },\n { "name": "year", "type": "STRING" },\n { "name": "rate", "type": "FLOAT", "optional": true }\n ],\n "primary": "mid"\n }\n ],\n "files": [\n {\n "label": "movie",\n "format": "JSON",\n "columns": ["mid", "name", "year", "rate"]\n }\n ]\n }\n }\n }\n ]\n }\n}\n'})}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.strong,{children:"Write simple sql"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "job": {\n "setting": {\n "speed": {\n "channel": 1\n }\n },\n "content": [\n {\n "reader": {\n "name": "mysqlreader",\n "parameter": {\n "username": "root",\n "password": "root",\n "connection": [\n {\n "querySql": [\n "select mid, name, year, rate from test.movies where year > 2000;"\n ],\n "jdbcUrl": ["jdbc:mysql://127.0.0.1:3306/test?useSSL=false"]\n }\n ]\n }\n },\n "writer": {\n "name": "tugraphwriter",\n "parameter": {\n "host": "127.0.0.1",\n "port": 7071,\n "username": "admin",\n "password": "73@TuGraph",\n "graphName": "default",\n "schema": [\n {\n "label": "movie",\n "type": "VERTEX",\n "properties": [\n { "name": "mid", "type": "STRING" },\n { "name": "name", "type": "STRING" },\n { "name": "year", "type": "STRING" },\n { "name": "rate", "type": "FLOAT", "optional": true }\n ],\n "primary": "mid"\n }\n ],\n "files": [\n {\n "label": "movie",\n "format": "JSON",\n "columns": ["mid", "name", "year", "rate"]\n }\n ]\n }\n }\n }\n ]\n }\n}\n'})}),"\n",(0,a.jsxs)(e.p,{children:[(0,a.jsx)(e.code,{children:"./lgraph_server -c lgraph_standalone.json -d 'run'"})," Start TuGraph and run the following command\uff1a"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-shell",children:"python3 datax/bin/datax.py job_mysql_to_tugraph.json\n"})}),"\n",(0,a.jsx)(e.h2,{id:"4export-tugraph",children:"4.Export TuGraph"}),"\n",(0,a.jsx)(e.h3,{id:"41-configuration-example",children:"4.1. Configuration example"}),"\n",(0,a.jsx)(e.p,{children:"TuGraph supports exporting data using DataX. Use the following configuration to export data to text data"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "job": {\n "setting": {\n "speed": {\n "channel": 1\n }\n },\n "content": [\n {\n "reader": {\n "name": "tugraphreader",\n "parameter": {\n "username": "admin",\n "password": "73@TuGraph",\n "graphName": "Movie_8C5C",\n "queryCypher": "match (n:person) return n.id,n.name,n.born;",\n "url": "bolt://100.83.30.35:27687"\n }\n },\n "writer": {\n "name": "txtfilewriter",\n "parameter": {\n "path": "./result",\n "fileName": "luohw",\n "writeMode": "truncate"\n }\n }\n }\n ]\n }\n}\n'})}),"\n",(0,a.jsx)(e.p,{children:"Using this configuration file, you can export all the id, name and born attributes of the person node in the TuGraph Movie_8C5C subgraph,\nexport them to the result directory under the current directory, and the file name is luohw+random suffix."}),"\n",(0,a.jsx)(e.h3,{id:"42-parameter-description",children:"4.2. Parameter Description"}),"\n",(0,a.jsx)(e.p,{children:"When using DataX to export TuGraph data, you need to set the reader to tugraphreader and configure the following 5 parameters:"}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.strong,{children:"url"})}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["Description: TuGraph's bolt server address ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Required: Yes ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Default value: None ",(0,a.jsx)(e.br,{})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.strong,{children:"username"})}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["Description: TuGraph's username ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Required: Yes ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Default value: None ",(0,a.jsx)(e.br,{})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.strong,{children:"password"})}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["Description: TuGraph's password ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Required: Yes ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Default value: None ",(0,a.jsx)(e.br,{})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.strong,{children:"graphName"})}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["Description: The selected TuGraph subgraph to be synchronized ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Required: Yes ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Default value: None ",(0,a.jsx)(e.br,{})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.strong,{children:"queryCypher"})}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["Description: Read data in TuGraph through cypher statements ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Required: No ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Default value: None ",(0,a.jsx)(e.br,{})]}),"\n"]}),"\n"]}),"\n"]})]})}function c(n={}){const{wrapper:e}={...(0,t.R)(),...n.components};return e?(0,a.jsx)(e,{...n,children:(0,a.jsx)(h,{...n})}):h(n)}},8453:(n,e,r)=>{r.d(e,{R:()=>s,x:()=>o});var a=r(6540);const t={},i=a.createContext(t);function s(n){const e=a.useContext(i);return a.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function o(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(t):n.components||t:s(n.components),a.createElement(i.Provider,{value:e},n.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5965],{756:(n,e,r)=>{r.r(e),r.d(e,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>i,metadata:()=>o,toc:()=>d});var a=r(4848),t=r(8453);const i={},s="TuGraph DataX",o={id:"utility-tools/tugraph-datax",title:"TuGraph DataX",description:"This document mainly introduces the installation, compilation and usage examples of TuGraph DataX",source:"@site/../docs/en-US/source/6.utility-tools/7.tugraph-datax.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/tugraph-datax",permalink:"/tugraph-db/en/utility-tools/tugraph-datax",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:7,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Tugraph CLI",permalink:"/tugraph-db/en/utility-tools/tugraph-cli"},next:{title:"TuGraph Explorer",permalink:"/tugraph-db/en/utility-tools/tugraph-explorer"}},l={},d=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Compile and Install",id:"2compile-and-install",level:2},{value:"3.Import TuGraph",id:"3import-tugraph",level:2},{value:"3.1.Text data imported into TuGraph with DataX",id:"31text-data-imported-into-tugraph-with-datax",level:3},{value:"3.2.MySQL's data imported into TuGraph with DataX",id:"32mysqls-data-imported-into-tugraph-with-datax",level:3},{value:"4.Export TuGraph",id:"4export-tugraph",level:2},{value:"4.1. Configuration example",id:"41-configuration-example",level:3},{value:"4.2. Parameter Description",id:"42-parameter-description",level:3}];function h(n){const e={a:"a",blockquote:"blockquote",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...n.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(e.header,{children:(0,a.jsx)(e.h1,{id:"tugraph-datax",children:"TuGraph DataX"})}),"\n",(0,a.jsxs)(e.blockquote,{children:["\n",(0,a.jsx)(e.p,{children:"This document mainly introduces the installation, compilation and usage examples of TuGraph DataX"}),"\n"]}),"\n",(0,a.jsx)(e.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,a.jsxs)(e.p,{children:["On the basis of Ali's open source DataX, TuGraph implements the support of writing plug-ins and jsonline data format, and other data sources can write data into TuGraph through DataX.\nTuGraph DataX introduces ",(0,a.jsx)(e.a,{href:"https://github.com/TuGraph-family/DataX",children:"https://github.com/TuGraph-family/DataX"}),", Supported features include:"]}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:"Import TuGraph from various heterogeneous data sources such as MySQL, SQL Server,Oracle, PostgreSQL, HDFS, Hive, HBase, OTS, ODPS, Kafka and so on."}),"\n"]}),"\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:"Import TuGraph to the corresponding target source (to be developed)."}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(e.p,{children:["Reference for DataX Original Project Introduction ",(0,a.jsx)(e.a,{href:"https://github.com/alibaba/DataX",children:"https://github.com/alibaba/DataX"})]}),"\n",(0,a.jsx)(e.h2,{id:"2compile-and-install",children:"2.Compile and Install"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-bash",children:"git clone https://github.com/TuGraph-family/DataX.git\nyum install maven\nmvn -U clean package assembly:assembly -Dmaven.test.skip=true\n"})}),"\n",(0,a.jsx)(e.p,{children:"The compiled DataX file is in the target directory"}),"\n",(0,a.jsx)(e.h2,{id:"3import-tugraph",children:"3.Import TuGraph"}),"\n",(0,a.jsx)(e.h3,{id:"31text-data-imported-into-tugraph-with-datax",children:"3.1.Text data imported into TuGraph with DataX"}),"\n",(0,a.jsxs)(e.p,{children:["Using the data from the lgraph_import section of the TuGraph manual as an example, we have three csv data files, as follows:\n",(0,a.jsx)(e.code,{children:"actors.csv"})]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"\nnm015950,Stephen Chow\nnm0628806,Man-Tat Ng\nnm0156444,Cecilia Cheung\nnm2514879,Yuqi Zhang\n\n"})}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.code,{children:"movies.csv"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"\ntt0188766,King of Comedy,1999,7.3\ntt0286112,Shaolin Soccer,2001,7.3\ntt4701660,The Mermaid,2016,6.3\n\n"})}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.code,{children:"roles.csv"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"\nnm015950,Tianchou Yin,tt0188766\nnm015950,Steel Leg,tt0286112\nnm0628806,,tt0188766\nnm0628806,coach,tt0286112\nnm0156444,PiaoPiao Liu,tt0188766\nnm2514879,Ruolan Li,tt4701660\n\n"})}),"\n",(0,a.jsxs)(e.p,{children:["Then create three DataX job profiles:\n",(0,a.jsx)(e.code,{children:"job_actors.json"})]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "job": {\n "setting": {\n "speed": {\n "channel": 1\n }\n },\n "content": [\n {\n "reader": {\n "name": "txtfilereader",\n "parameter": {\n "path": ["actors.csv"],\n "encoding": "UTF-8",\n "column": [\n {\n "index": 0,\n "type": "string"\n },\n {\n "index": 1,\n "type": "string"\n }\n ],\n "fieldDelimiter": ","\n }\n },\n "writer": {\n "name": "tugraphwriter",\n "parameter": {\n "host": "127.0.0.1",\n "port": 7071,\n "username": "admin",\n "password": "73@TuGraph",\n "graphName": "default",\n "schema": [\n {\n "label": "actor",\n "type": "VERTEX",\n "properties": [\n { "name": "aid", "type": "STRING" },\n { "name": "name", "type": "STRING" }\n ],\n "primary": "aid"\n }\n ],\n "files": [\n {\n "label": "actor",\n "format": "JSON",\n "columns": ["aid", "name"]\n }\n ]\n }\n }\n }\n ]\n }\n}\n'})}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.code,{children:"job_movies.json"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "job": {\n "setting": {\n "speed": {\n "channel": 1\n }\n },\n "content": [\n {\n "reader": {\n "name": "txtfilereader",\n "parameter": {\n "path": ["movies.csv"],\n "encoding": "UTF-8",\n "column": [\n {\n "index": 0,\n "type": "string"\n },\n {\n "index": 1,\n "type": "string"\n },\n {\n "index": 2,\n "type": "string"\n },\n {\n "index": 3,\n "type": "string"\n }\n ],\n "fieldDelimiter": ","\n }\n },\n "writer": {\n "name": "tugraphwriter",\n "parameter": {\n "host": "127.0.0.1",\n "port": 7071,\n "username": "admin",\n "password": "73@TuGraph",\n "graphName": "default",\n "schema": [\n {\n "label": "movie",\n "type": "VERTEX",\n "properties": [\n { "name": "mid", "type": "STRING" },\n { "name": "name", "type": "STRING" },\n { "name": "year", "type": "STRING" },\n { "name": "rate", "type": "FLOAT", "optional": true }\n ],\n "primary": "mid"\n }\n ],\n "files": [\n {\n "label": "movie",\n "format": "JSON",\n "columns": ["mid", "name", "year", "rate"]\n }\n ]\n }\n }\n }\n ]\n }\n}\n'})}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.code,{children:"job_roles.json"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "job": {\n "setting": {\n "speed": {\n "channel": 1\n }\n },\n "content": [\n {\n "reader": {\n "name": "txtfilereader",\n "parameter": {\n "path": ["roles.csv"],\n "encoding": "UTF-8",\n "column": [\n {\n "index": 0,\n "type": "string"\n },\n {\n "index": 1,\n "type": "string"\n },\n {\n "index": 2,\n "type": "string"\n }\n ],\n "fieldDelimiter": ","\n }\n },\n "writer": {\n "name": "tugraphwriter",\n "parameter": {\n "host": "127.0.0.1",\n "port": 7071,\n "username": "admin",\n "password": "73@TuGraph",\n "graphName": "default",\n "schema": [\n {\n "label": "play_in",\n "type": "EDGE",\n "properties": [{ "name": "role", "type": "STRING" }]\n }\n ],\n "files": [\n {\n "label": "play_in",\n "format": "JSON",\n "SRC_ID": "actor",\n "DST_ID": "movie",\n "columns": ["SRC_ID", "role", "DST_ID"]\n }\n ]\n }\n }\n }\n ]\n }\n}\n'})}),"\n",(0,a.jsxs)(e.p,{children:[(0,a.jsx)(e.code,{children:"/lgraph_server -c lgraph_standalone.json -d 'run'"})," 'Start TuGraph and run the following commands in sequence:"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"python3 datax/bin/datax.py job_actors.json\n"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"python3 datax/bin/datax.py job_movies.json\n"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{children:"python3 datax/bin/datax.py job_roles.json\n"})}),"\n",(0,a.jsx)(e.h3,{id:"32mysqls-data-imported-into-tugraph-with-datax",children:"3.2.MySQL's data imported into TuGraph with DataX"}),"\n",(0,a.jsx)(e.p,{children:"We create the following table of movies under 'test' database"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-sql",children:"CREATE TABLE `movies` (\n `mid` varchar(200) NOT NULL,\n `name` varchar(100) NOT NULL,\n `year` int(11) NOT NULL,\n `rate` float(5,2) unsigned NOT NULL,\n PRIMARY KEY (`mid`)\n);\n"})}),"\n",(0,a.jsx)(e.p,{children:"Insert some data into the table"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-sql",children:"insert into\ntest.movies (mid, name, year, rate)\nvalues\n('tt0188766', 'King of Comedy', 1999, 7.3),\n('tt0286112', 'Shaolin Soccer', 2001, 7.3),\n('tt4701660', 'The Mermaid', 2016, 6.3);\n"})}),"\n",(0,a.jsx)(e.p,{children:"Create a DataX job configuration file"}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.code,{children:"job_mysql_to_tugraph.json"})}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.strong,{children:"Configuring Field"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "job": {\n "setting": {\n "speed": {\n "channel": 1\n }\n },\n "content": [\n {\n "reader": {\n "name": "mysqlreader",\n "parameter": {\n "username": "root",\n "password": "root",\n "column": ["mid", "name", "year", "rate"],\n "splitPk": "mid",\n "connection": [\n {\n "table": ["movies"],\n "jdbcUrl": ["jdbc:mysql://127.0.0.1:3306/test?useSSL=false"]\n }\n ]\n }\n },\n "writer": {\n "name": "tugraphwriter",\n "parameter": {\n "host": "127.0.0.1",\n "port": 7071,\n "username": "admin",\n "password": "73@TuGraph",\n "graphName": "default",\n "schema": [\n {\n "label": "movie",\n "type": "VERTEX",\n "properties": [\n { "name": "mid", "type": "STRING" },\n { "name": "name", "type": "STRING" },\n { "name": "year", "type": "STRING" },\n { "name": "rate", "type": "FLOAT", "optional": true }\n ],\n "primary": "mid"\n }\n ],\n "files": [\n {\n "label": "movie",\n "format": "JSON",\n "columns": ["mid", "name", "year", "rate"]\n }\n ]\n }\n }\n }\n ]\n }\n}\n'})}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.strong,{children:"Write simple sql"})}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "job": {\n "setting": {\n "speed": {\n "channel": 1\n }\n },\n "content": [\n {\n "reader": {\n "name": "mysqlreader",\n "parameter": {\n "username": "root",\n "password": "root",\n "connection": [\n {\n "querySql": [\n "select mid, name, year, rate from test.movies where year > 2000;"\n ],\n "jdbcUrl": ["jdbc:mysql://127.0.0.1:3306/test?useSSL=false"]\n }\n ]\n }\n },\n "writer": {\n "name": "tugraphwriter",\n "parameter": {\n "host": "127.0.0.1",\n "port": 7071,\n "username": "admin",\n "password": "73@TuGraph",\n "graphName": "default",\n "schema": [\n {\n "label": "movie",\n "type": "VERTEX",\n "properties": [\n { "name": "mid", "type": "STRING" },\n { "name": "name", "type": "STRING" },\n { "name": "year", "type": "STRING" },\n { "name": "rate", "type": "FLOAT", "optional": true }\n ],\n "primary": "mid"\n }\n ],\n "files": [\n {\n "label": "movie",\n "format": "JSON",\n "columns": ["mid", "name", "year", "rate"]\n }\n ]\n }\n }\n }\n ]\n }\n}\n'})}),"\n",(0,a.jsxs)(e.p,{children:[(0,a.jsx)(e.code,{children:"./lgraph_server -c lgraph_standalone.json -d 'run'"})," Start TuGraph and run the following command\uff1a"]}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-shell",children:"python3 datax/bin/datax.py job_mysql_to_tugraph.json\n"})}),"\n",(0,a.jsx)(e.h2,{id:"4export-tugraph",children:"4.Export TuGraph"}),"\n",(0,a.jsx)(e.h3,{id:"41-configuration-example",children:"4.1. Configuration example"}),"\n",(0,a.jsx)(e.p,{children:"TuGraph supports exporting data using DataX. Use the following configuration to export data to text data"}),"\n",(0,a.jsx)(e.pre,{children:(0,a.jsx)(e.code,{className:"language-json",children:'{\n "job": {\n "setting": {\n "speed": {\n "channel": 1\n }\n },\n "content": [\n {\n "reader": {\n "name": "tugraphreader",\n "parameter": {\n "username": "admin",\n "password": "73@TuGraph",\n "graphName": "Movie_8C5C",\n "queryCypher": "match (n:person) return n.id,n.name,n.born;",\n "url": "bolt://100.83.30.35:27687"\n }\n },\n "writer": {\n "name": "txtfilewriter",\n "parameter": {\n "path": "./result",\n "fileName": "luohw",\n "writeMode": "truncate"\n }\n }\n }\n ]\n }\n}\n'})}),"\n",(0,a.jsx)(e.p,{children:"Using this configuration file, you can export all the id, name and born attributes of the person node in the TuGraph Movie_8C5C subgraph,\nexport them to the result directory under the current directory, and the file name is luohw+random suffix."}),"\n",(0,a.jsx)(e.h3,{id:"42-parameter-description",children:"4.2. Parameter Description"}),"\n",(0,a.jsx)(e.p,{children:"When using DataX to export TuGraph data, you need to set the reader to tugraphreader and configure the following 5 parameters:"}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.strong,{children:"url"})}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["Description: TuGraph's bolt server address ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Required: Yes ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Default value: None ",(0,a.jsx)(e.br,{})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.strong,{children:"username"})}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["Description: TuGraph's username ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Required: Yes ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Default value: None ",(0,a.jsx)(e.br,{})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.strong,{children:"password"})}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["Description: TuGraph's password ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Required: Yes ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Default value: None ",(0,a.jsx)(e.br,{})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.strong,{children:"graphName"})}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["Description: The selected TuGraph subgraph to be synchronized ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Required: Yes ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Default value: None ",(0,a.jsx)(e.br,{})]}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(e.li,{children:["\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.strong,{children:"queryCypher"})}),"\n",(0,a.jsxs)(e.ul,{children:["\n",(0,a.jsxs)(e.li,{children:["Description: Read data in TuGraph through cypher statements ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Required: No ",(0,a.jsx)(e.br,{})]}),"\n",(0,a.jsxs)(e.li,{children:["Default value: None ",(0,a.jsx)(e.br,{})]}),"\n"]}),"\n"]}),"\n"]})]})}function c(n={}){const{wrapper:e}={...(0,t.R)(),...n.components};return e?(0,a.jsx)(e,{...n,children:(0,a.jsx)(h,{...n})}):h(n)}},8453:(n,e,r)=>{r.d(e,{R:()=>s,x:()=>o});var a=r(6540);const t={},i=a.createContext(t);function s(n){const e=a.useContext(i);return a.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function o(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(t):n.components||t:s(n.components),a.createElement(i.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/86859d92.2091b9a5.js b/assets/js/86859d92.2fa3acf6.js similarity index 99% rename from assets/js/86859d92.2091b9a5.js rename to assets/js/86859d92.2fa3acf6.js index f949f395cf..13042fcdb2 100644 --- a/assets/js/86859d92.2091b9a5.js +++ b/assets/js/86859d92.2fa3acf6.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3882],{539:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>h,metadata:()=>a,toc:()=>u});var r=t(4848),i=t(8453);const h={},s="Guide",a={id:"guide",title:"Guide",description:"Here is the document map that helps users learn and use the TuGraph community version quickly.",source:"@site/../docs/en-US/source/1.guide.md",sourceDirName:".",slug:"/guide",permalink:"/tugraph-db/en/guide",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",next:{title:"What is Graph",permalink:"/tugraph-db/en/introduction/what-is-graph"}},c={},u=[{value:"Quick Start",id:"quick-start",level:2},{value:"Development Guide",id:"development-guide",level:2},{value:"Community Contribution",id:"community-contribution",level:2},{value:"Main warehouse",id:"main-warehouse",level:2},{value:"Video Center",id:"video-center",level:2},{value:"TuGraph-Latest-Version",id:"tugraph-latest-version",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"guide",children:"Guide"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"Here is the document map that helps users learn and use the TuGraph community version quickly."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"quick-start",children:"Quick Start"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Understand ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/introduction/what-is-graph",children:"What is a Graph"}),",",(0,r.jsx)(n.a,{href:"/tugraph-db/en/introduction/scenarios",children:"The application scenarios of graph"}),",",(0,r.jsx)(n.a,{href:"/tugraph-db/en/introduction/what-is-tugraph",children:"What is TuGraph"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Quickly Install and deploy TuGraph:",(0,r.jsx)(n.a,{href:"/tugraph-db/en/installation&running/cloud-deployment",children:"Cloud Deployment"}),",",(0,r.jsx)(n.a,{href:"/tugraph-db/en/installation&running/docker-deployment",children:"Docker Deployment"}),"Rapid deployment TuGraph."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Quickly get started with DEMO:",(0,r.jsx)(n.a,{href:"/tugraph-db/en/quick-start/demo/movie",children:"Movie"}),",",(0,r.jsx)(n.a,{href:"/tugraph-db/en/quick-start/demo/wandering-earth",children:"The Wandering Earth"}),",",(0,r.jsx)(n.a,{href:"/tugraph-db/en/quick-start/demo/the-three-body",children:"Three Body"}),",",(0,r.jsx)(n.a,{href:"/tugraph-db/en/quick-start/demo/three-kingdoms",children:"Three Kingdoms"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["User Guide:",(0,r.jsx)(n.a,{href:"/tugraph-db/en/user-guide/tugraph-browser",children:"TuGraph Browser"}),",",(0,r.jsx)(n.a,{href:"/tugraph-db/en/user-guide/tugraph-browser-legacy",children:"TuGraph Browser Legacy"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"development-guide",children:"Development Guide"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Client Tools: ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/client-tools/bolt-client",children:"Bolt Client"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["TuGraph Query Language:",(0,r.jsx)(n.a,{href:"/tugraph-db/en/query/cypher",children:"Cypher API"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Procedure And Algorithm:",(0,r.jsx)(n.a,{href:"/tugraph-db/en/olap&procedure/procedure/",children:"Procedure API (POG API)"}),"\u3001",(0,r.jsx)(n.a,{href:"/tugraph-db/en/olap&procedure/olap/tutorial",children:"OLAP API"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["C++/Python Procedure Interfaces:",(0,r.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(137).A+"",children:"C++/Python Procedure API"}),"\u3002"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"community-contribution",children:"Community Contribution"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Before starting to contribute, you can learn ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/contributor-manual/contributing",children:"how to contribute"})]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["If you want to understand the division of community roles, please visit ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/contributor-manual/community-roles",children:"community roles"})]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"main-warehouse",children:"Main warehouse"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["TuGraph-DB repository: ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-db",children:"https://github.com/TuGraph-family/tugraph-db"})]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Visual interface: ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-db-browser",children:"https://github.com/TuGraph-family/tugraph-db-browser"})]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Java client: ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-db-client-java",children:"https://github.com/TuGraph-family/tugraph-db-client-java"})]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Simple test method based on twitter data: ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/gdbms-microbenchmark",children:"https://github.com/TuGraph-family/gdbms-microbenchmark"})]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Test method based on standard LDBC-SNB: ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-snb-interactive",children:"https://github.com/TuGraph-family/tugraph-snb-interactive"})]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["TuGraph-Analytics repository: ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-analytics",children:"https://github.com/TuGraph-family/tugraph-analytics"})]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"video-center",children:"Video Center"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"https://space.bilibili.com/1196053065/channel/seriesdetail?sid=2593741",children:"Get started quickly with TuGraph"})}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"https://space.bilibili.com/1196053065/channel/seriesdetail?sid=3009777",children:"TuGraph technology sharing collection"})}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"https://www.bilibili.com/video/BV15U4y1r7AW/",children:"Understand graph calculation in 3 minutes"})}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"tugraph-latest-version",children:"TuGraph-Latest-Version"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"File"}),(0,r.jsx)(n.th,{children:"Link"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS7 runtime package"}),(0,r.jsx)(n.td,{children:"tugraph-4.5.0-1.el7.x86_64.rpm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-4.5.0-1.el7.x86_64.rpm",children:"Download"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS8 runtime package"}),(0,r.jsx)(n.td,{children:"tugraph-4.5.0-1.el8.x86_64.rpm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-4.5.0-1.el8.x86_64.rpm",children:"Download"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Ubuntu18.04 runtime package"}),(0,r.jsx)(n.td,{children:"tugraph-4.5.0-1.x86_64.deb"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-4.5.0-1.x86_64.deb",children:"Download"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS7 runtime image"}),(0,r.jsx)(n.td,{children:"tugraph-runtime-centos7-4.5.0.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-runtime-centos7-4.5.0.tar",children:"Download"}),", ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-runtime-centos7",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS8 runtime image"}),(0,r.jsx)(n.td,{children:"tugraph-runtime-centos8-4.5.0.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-runtime-centos8-4.5.0.tar",children:"Download"}),", ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-runtime-centos8",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Ubuntu18.04 runtime image"}),(0,r.jsx)(n.td,{children:"tugraph-runtime-ubuntu18.04-4.5.0.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-runtime-ubuntu18.04-4.5.0.tar",children:"Download"})," , ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-runtime-ubuntu18.04",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS7 mini runtime package"}),(0,r.jsx)(n.td,{children:"tugraph-mini-4.5.0-1.el7.x86_64.rpm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-mini-4.5.0-1.el7.x86_64.rpm",children:"Download"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS8 mini runtime package"}),(0,r.jsx)(n.td,{children:"tugraph-mini-4.5.0-1.el8.x86_64.rpm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-mini-4.5.0-1.el8.x86_64.rpm",children:"Download"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Ubuntu18.04 mini runtime package"}),(0,r.jsx)(n.td,{children:"tugraph-mini-4.5.0-1.x86_64.deb"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-mini-4.5.0-1.x86_64.deb",children:"Download"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS7 mini runtime image"}),(0,r.jsx)(n.td,{children:"tugraph-mini-runtime-centos7-4.5.0.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-mini-runtime-centos7-4.5.0.tar",children:"Download"})," , ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-mini-runtime-centos7",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS8 mini runtime image"}),(0,r.jsx)(n.td,{children:"tugraph-mini-runtime-centos8-4.5.0.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-mini-runtime-centos8-4.5.0.tar",children:"Download"})," , ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-mini-runtime-centos8",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Ubuntu18.04 mini runtime image"}),(0,r.jsx)(n.td,{children:"tugraph-mini-runtime-ubuntu18.04-4.5.0.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-mini-runtime-ubuntu18.04-4.5.0.tar",children:"Download"}),", ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-mini-runtime-ubuntu18.04",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS7 compilation image"}),(0,r.jsx)(n.td,{children:"tugraph-compile-centos7-1.3.2.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-docker-compile/tugraph-compile-centos7-1.3.2.tar",children:"Download"}),", ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-compile-centos7",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS8 compilation image"}),(0,r.jsx)(n.td,{children:"tugraph-compile-centos8-1.3.2.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-docker-compile/tugraph-compile-centos8-1.3.2.tar",children:"Download"}),", ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-compile-centos8",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Ubuntu18.04 compilation image"}),(0,r.jsx)(n.td,{children:"tugraph-compile-ubuntu18.04-1.3.2.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-docker-compile/tugraph-compile-ubuntu18.04-1.3.2.tar",children:"Download"})," , ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-compile-ubuntu18.04",children:"Visit"})]})]})]})]}),"\n",(0,r.jsxs)(n.p,{children:["For the version update log, see: ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-db/blob/master/release/CHANGELOG_CN.md",children:"Link"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you don't know how to use installation packages and images, please refer to ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/best-practices/selection",children:"Environment and Version Selection"}),"."]})]})}function l(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},137:(e,n,t)=>{t.d(n,{A:()=>r});const r=t.p+"assets/files/index-90ee395bc1dca6015837e5ccb32c96e1.rst"},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var r=t(6540);const i={},h=r.createContext(i);function s(e){const n=r.useContext(h);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(h.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3882],{539:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>h,metadata:()=>a,toc:()=>u});var r=t(4848),i=t(8453);const h={},s="Guide",a={id:"guide",title:"Guide",description:"Here is the document map that helps users learn and use the TuGraph community version quickly.",source:"@site/../docs/en-US/source/1.guide.md",sourceDirName:".",slug:"/guide",permalink:"/tugraph-db/en/guide",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",next:{title:"What is Graph",permalink:"/tugraph-db/en/introduction/what-is-graph"}},c={},u=[{value:"Quick Start",id:"quick-start",level:2},{value:"Development Guide",id:"development-guide",level:2},{value:"Community Contribution",id:"community-contribution",level:2},{value:"Main warehouse",id:"main-warehouse",level:2},{value:"Video Center",id:"video-center",level:2},{value:"TuGraph-Latest-Version",id:"tugraph-latest-version",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"guide",children:"Guide"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"Here is the document map that helps users learn and use the TuGraph community version quickly."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"quick-start",children:"Quick Start"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Understand ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/introduction/what-is-graph",children:"What is a Graph"}),",",(0,r.jsx)(n.a,{href:"/tugraph-db/en/introduction/scenarios",children:"The application scenarios of graph"}),",",(0,r.jsx)(n.a,{href:"/tugraph-db/en/introduction/what-is-tugraph",children:"What is TuGraph"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Quickly Install and deploy TuGraph:",(0,r.jsx)(n.a,{href:"/tugraph-db/en/installation&running/cloud-deployment",children:"Cloud Deployment"}),",",(0,r.jsx)(n.a,{href:"/tugraph-db/en/installation&running/docker-deployment",children:"Docker Deployment"}),"Rapid deployment TuGraph."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Quickly get started with DEMO:",(0,r.jsx)(n.a,{href:"/tugraph-db/en/quick-start/demo/movie",children:"Movie"}),",",(0,r.jsx)(n.a,{href:"/tugraph-db/en/quick-start/demo/wandering-earth",children:"The Wandering Earth"}),",",(0,r.jsx)(n.a,{href:"/tugraph-db/en/quick-start/demo/the-three-body",children:"Three Body"}),",",(0,r.jsx)(n.a,{href:"/tugraph-db/en/quick-start/demo/three-kingdoms",children:"Three Kingdoms"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["User Guide:",(0,r.jsx)(n.a,{href:"/tugraph-db/en/user-guide/tugraph-browser",children:"TuGraph Browser"}),",",(0,r.jsx)(n.a,{href:"/tugraph-db/en/user-guide/tugraph-browser-legacy",children:"TuGraph Browser Legacy"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"development-guide",children:"Development Guide"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Client Tools: ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/client-tools/bolt-client",children:"Bolt Client"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["TuGraph Query Language:",(0,r.jsx)(n.a,{href:"/tugraph-db/en/query/cypher",children:"Cypher API"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Procedure And Algorithm:",(0,r.jsx)(n.a,{href:"/tugraph-db/en/olap&procedure/procedure/",children:"Procedure API (POG API)"}),"\u3001",(0,r.jsx)(n.a,{href:"/tugraph-db/en/olap&procedure/olap/tutorial",children:"OLAP API"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["C++/Python Procedure Interfaces:",(0,r.jsx)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(137).A+"",children:"C++/Python Procedure API"}),"\u3002"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"community-contribution",children:"Community Contribution"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Before starting to contribute, you can learn ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/contributor-manual/contributing",children:"how to contribute"})]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["If you want to understand the division of community roles, please visit ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/contributor-manual/community-roles",children:"community roles"})]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"main-warehouse",children:"Main warehouse"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["TuGraph-DB repository: ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-db",children:"https://github.com/TuGraph-family/tugraph-db"})]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Visual interface: ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-db-browser",children:"https://github.com/TuGraph-family/tugraph-db-browser"})]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Java client: ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-db-client-java",children:"https://github.com/TuGraph-family/tugraph-db-client-java"})]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Simple test method based on twitter data: ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/gdbms-microbenchmark",children:"https://github.com/TuGraph-family/gdbms-microbenchmark"})]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["Test method based on standard LDBC-SNB: ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-snb-interactive",children:"https://github.com/TuGraph-family/tugraph-snb-interactive"})]}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:["TuGraph-Analytics repository: ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-analytics",children:"https://github.com/TuGraph-family/tugraph-analytics"})]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"video-center",children:"Video Center"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"https://space.bilibili.com/1196053065/channel/seriesdetail?sid=2593741",children:"Get started quickly with TuGraph"})}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"https://space.bilibili.com/1196053065/channel/seriesdetail?sid=3009777",children:"TuGraph technology sharing collection"})}),"\n"]}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.a,{href:"https://www.bilibili.com/video/BV15U4y1r7AW/",children:"Understand graph calculation in 3 minutes"})}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"tugraph-latest-version",children:"TuGraph-Latest-Version"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Description"}),(0,r.jsx)(n.th,{children:"File"}),(0,r.jsx)(n.th,{children:"Link"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS7 runtime package"}),(0,r.jsx)(n.td,{children:"tugraph-4.5.0-1.el7.x86_64.rpm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-4.5.0-1.el7.x86_64.rpm",children:"Download"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS8 runtime package"}),(0,r.jsx)(n.td,{children:"tugraph-4.5.0-1.el8.x86_64.rpm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-4.5.0-1.el8.x86_64.rpm",children:"Download"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Ubuntu18.04 runtime package"}),(0,r.jsx)(n.td,{children:"tugraph-4.5.0-1.x86_64.deb"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-4.5.0-1.x86_64.deb",children:"Download"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS7 runtime image"}),(0,r.jsx)(n.td,{children:"tugraph-runtime-centos7-4.5.0.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-runtime-centos7-4.5.0.tar",children:"Download"}),", ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-runtime-centos7",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS8 runtime image"}),(0,r.jsx)(n.td,{children:"tugraph-runtime-centos8-4.5.0.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-runtime-centos8-4.5.0.tar",children:"Download"}),", ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-runtime-centos8",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Ubuntu18.04 runtime image"}),(0,r.jsx)(n.td,{children:"tugraph-runtime-ubuntu18.04-4.5.0.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-runtime-ubuntu18.04-4.5.0.tar",children:"Download"})," , ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-runtime-ubuntu18.04",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS7 mini runtime package"}),(0,r.jsx)(n.td,{children:"tugraph-mini-4.5.0-1.el7.x86_64.rpm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-mini-4.5.0-1.el7.x86_64.rpm",children:"Download"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS8 mini runtime package"}),(0,r.jsx)(n.td,{children:"tugraph-mini-4.5.0-1.el8.x86_64.rpm"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-mini-4.5.0-1.el8.x86_64.rpm",children:"Download"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Ubuntu18.04 mini runtime package"}),(0,r.jsx)(n.td,{children:"tugraph-mini-4.5.0-1.x86_64.deb"}),(0,r.jsx)(n.td,{children:(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-mini-4.5.0-1.x86_64.deb",children:"Download"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS7 mini runtime image"}),(0,r.jsx)(n.td,{children:"tugraph-mini-runtime-centos7-4.5.0.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-mini-runtime-centos7-4.5.0.tar",children:"Download"})," , ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-mini-runtime-centos7",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS8 mini runtime image"}),(0,r.jsx)(n.td,{children:"tugraph-mini-runtime-centos8-4.5.0.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-mini-runtime-centos8-4.5.0.tar",children:"Download"})," , ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-mini-runtime-centos8",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Ubuntu18.04 mini runtime image"}),(0,r.jsx)(n.td,{children:"tugraph-mini-runtime-ubuntu18.04-4.5.0.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-4.5.0/tugraph-mini-runtime-ubuntu18.04-4.5.0.tar",children:"Download"}),", ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-mini-runtime-ubuntu18.04",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS7 compilation image"}),(0,r.jsx)(n.td,{children:"tugraph-compile-centos7-1.3.2.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-docker-compile/tugraph-compile-centos7-1.3.2.tar",children:"Download"}),", ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-compile-centos7",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CentOS8 compilation image"}),(0,r.jsx)(n.td,{children:"tugraph-compile-centos8-1.3.2.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-docker-compile/tugraph-compile-centos8-1.3.2.tar",children:"Download"}),", ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-compile-centos8",children:"Visit"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Ubuntu18.04 compilation image"}),(0,r.jsx)(n.td,{children:"tugraph-compile-ubuntu18.04-1.3.2.tar"}),(0,r.jsxs)(n.td,{children:[(0,r.jsx)(n.a,{href:"https://tugraph-web.oss-cn-beijing.aliyuncs.com/tugraph/tugraph-docker-compile/tugraph-compile-ubuntu18.04-1.3.2.tar",children:"Download"})," , ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/r/tugraph/tugraph-compile-ubuntu18.04",children:"Visit"})]})]})]})]}),"\n",(0,r.jsxs)(n.p,{children:["For the version update log, see: ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-db/blob/master/release/CHANGELOG_CN.md",children:"Link"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you don't know how to use installation packages and images, please refer to ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/best-practices/selection",children:"Environment and Version Selection"}),"."]})]})}function l(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},137:(e,n,t)=>{t.d(n,{A:()=>r});const r=t.p+"assets/files/index-90ee395bc1dca6015837e5ccb32c96e1.rst"},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var r=t(6540);const i={},h=r.createContext(i);function s(e){const n=r.useContext(h);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(h.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8e6640c6.97eff1d8.js b/assets/js/8e6640c6.0951c84b.js similarity index 98% rename from assets/js/8e6640c6.97eff1d8.js rename to assets/js/8e6640c6.0951c84b.js index c5da5859bb..22cd25b706 100644 --- a/assets/js/8e6640c6.97eff1d8.js +++ b/assets/js/8e6640c6.0951c84b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[2817],{401:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>u,contentTitle:()=>i,default:()=>l,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var o=t(4848),n=t(8453);const s={},i="Rust Stored Procedures",a={id:"olap&procedure/procedure/Rust-procedure",title:"Rust Stored Procedures",description:"1. Introduction",source:"@site/../docs/en-US/source/9.olap&procedure/1.procedure/5.Rust-procedure.md",sourceDirName:"9.olap&procedure/1.procedure",slug:"/olap&procedure/procedure/Rust-procedure",permalink:"/tugraph-db/en/olap&procedure/procedure/Rust-procedure",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Traversal API",permalink:"/tugraph-db/en/olap&procedure/procedure/traversal"},next:{title:"Bootstrap program",permalink:"/tugraph-db/en/olap&procedure/olap/tutorial"}},u={},d=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2. How to Use",id:"2-how-to-use",level:2},{value:"3. API Documentation",id:"3-api-documentation",level:2}];function c(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.header,{children:(0,o.jsx)(r.h1,{id:"rust-stored-procedures",children:"Rust Stored Procedures"})}),"\n",(0,o.jsx)(r.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,o.jsx)(r.p,{children:"Rust stored procedures currently only support v1 version. TuGraph supports plugins in any language that can be compiled into a dynamic library. Rust, as a rising star in system programming languages, has significant advantages in terms of safety, reliability, and ergonomics compared to C++."}),"\n",(0,o.jsxs)(r.p,{children:["We provide the Rust binding library for TuGraph to support calling lgrahp API in Rust. We also provide the ",(0,o.jsx)(r.a,{href:"https://crates.io/crates/tugraph-plugin-util",children:"tugraph-plugin-util"})," utility library to help simplify the process of writing Rust plugins."]}),"\n",(0,o.jsx)(r.h2,{id:"2-how-to-use",children:"2. How to Use"}),"\n",(0,o.jsx)(r.p,{children:"Using Rust stored procedures involves three steps:"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsxs)(r.li,{children:["Compilation: Compile the Rust source code into a dynamic library (so file). We have prepared a comprehensive plugin development tutorial that covers everything from IDE plugin installation and environment setup to compilation. Please refer to the ",(0,o.jsx)(r.code,{children:"rust-tugraph-plugin-tutorial"})," for detailed instructions."]}),"\n",(0,o.jsxs)(r.li,{children:["Loading: Load the dynamic library (so file) into the server. This can be done through the REST or RPC interface, similar to the usage of C++ libraries. Please refer to the documentation for more details on the ",(0,o.jsx)(r.a,{href:"/tugraph-db/en/olap&procedure/procedure/",children:"Procedure v1 API"}),"."]}),"\n",(0,o.jsx)(r.li,{children:"Execution: Once the library is loaded, use it as you would with a C++ stored procedure. The process is the same and does not need further explanation."}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"3-api-documentation",children:"3. API Documentation"}),"\n",(0,o.jsxs)(r.p,{children:["In the Rust community, all code and documentation can be found on ",(0,o.jsx)(r.a,{href:"https://crates.io/crates/tugraph",children:(0,o.jsx)(r.code,{children:"crates.io"})})," and ",(0,o.jsx)(r.a,{href:"https://docs.rs/tugraph/latest/tugraph",children:(0,o.jsx)(r.code,{children:"docs.rs"})}),"."]})]})}function l(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453:(e,r,t)=>{t.d(r,{R:()=>i,x:()=>a});var o=t(6540);const n={},s=o.createContext(n);function i(e){const r=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),o.createElement(s.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[2817],{401:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>u,contentTitle:()=>i,default:()=>l,frontMatter:()=>s,metadata:()=>a,toc:()=>d});var o=t(4848),n=t(8453);const s={},i="Rust Stored Procedures",a={id:"olap&procedure/procedure/Rust-procedure",title:"Rust Stored Procedures",description:"1. Introduction",source:"@site/../docs/en-US/source/9.olap&procedure/1.procedure/5.Rust-procedure.md",sourceDirName:"9.olap&procedure/1.procedure",slug:"/olap&procedure/procedure/Rust-procedure",permalink:"/tugraph-db/en/olap&procedure/procedure/Rust-procedure",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Traversal API",permalink:"/tugraph-db/en/olap&procedure/procedure/traversal"},next:{title:"Bootstrap program",permalink:"/tugraph-db/en/olap&procedure/olap/tutorial"}},u={},d=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2. How to Use",id:"2-how-to-use",level:2},{value:"3. API Documentation",id:"3-api-documentation",level:2}];function c(e){const r={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.header,{children:(0,o.jsx)(r.h1,{id:"rust-stored-procedures",children:"Rust Stored Procedures"})}),"\n",(0,o.jsx)(r.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,o.jsx)(r.p,{children:"Rust stored procedures currently only support v1 version. TuGraph supports plugins in any language that can be compiled into a dynamic library. Rust, as a rising star in system programming languages, has significant advantages in terms of safety, reliability, and ergonomics compared to C++."}),"\n",(0,o.jsxs)(r.p,{children:["We provide the Rust binding library for TuGraph to support calling lgrahp API in Rust. We also provide the ",(0,o.jsx)(r.a,{href:"https://crates.io/crates/tugraph-plugin-util",children:"tugraph-plugin-util"})," utility library to help simplify the process of writing Rust plugins."]}),"\n",(0,o.jsx)(r.h2,{id:"2-how-to-use",children:"2. How to Use"}),"\n",(0,o.jsx)(r.p,{children:"Using Rust stored procedures involves three steps:"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsxs)(r.li,{children:["Compilation: Compile the Rust source code into a dynamic library (so file). We have prepared a comprehensive plugin development tutorial that covers everything from IDE plugin installation and environment setup to compilation. Please refer to the ",(0,o.jsx)(r.code,{children:"rust-tugraph-plugin-tutorial"})," for detailed instructions."]}),"\n",(0,o.jsxs)(r.li,{children:["Loading: Load the dynamic library (so file) into the server. This can be done through the REST or RPC interface, similar to the usage of C++ libraries. Please refer to the documentation for more details on the ",(0,o.jsx)(r.a,{href:"/tugraph-db/en/olap&procedure/procedure/",children:"Procedure v1 API"}),"."]}),"\n",(0,o.jsx)(r.li,{children:"Execution: Once the library is loaded, use it as you would with a C++ stored procedure. The process is the same and does not need further explanation."}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"3-api-documentation",children:"3. API Documentation"}),"\n",(0,o.jsxs)(r.p,{children:["In the Rust community, all code and documentation can be found on ",(0,o.jsx)(r.a,{href:"https://crates.io/crates/tugraph",children:(0,o.jsx)(r.code,{children:"crates.io"})})," and ",(0,o.jsx)(r.a,{href:"https://docs.rs/tugraph/latest/tugraph",children:(0,o.jsx)(r.code,{children:"docs.rs"})}),"."]})]})}function l(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453:(e,r,t)=>{t.d(r,{R:()=>i,x:()=>a});var o=t(6540);const n={},s=o.createContext(n);function i(e){const r=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function a(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),o.createElement(s.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8fce0df1.db80b012.js b/assets/js/8fce0df1.91a02b91.js similarity index 99% rename from assets/js/8fce0df1.db80b012.js rename to assets/js/8fce0df1.91a02b91.js index 213e96d5fb..e253020be6 100644 --- a/assets/js/8fce0df1.db80b012.js +++ b/assets/js/8fce0df1.91a02b91.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3590],{9658:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var a=n(4848),r=n(8453);const i={},o="Multi Level Interfaces",s={id:"introduction/characteristics/multi-level-Interfaces",title:"Multi Level Interfaces",description:"This document mainly introduces the design concept of TuGraph's multi-level interfaces.",source:"@site/../docs/en-US/source/2.introduction/5.characteristics/2.multi-level-Interfaces.md",sourceDirName:"2.introduction/5.characteristics",slug:"/introduction/characteristics/multi-level-Interfaces",permalink:"/tugraph-db/en/introduction/characteristics/multi-level-Interfaces",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Performance Oriented",permalink:"/tugraph-db/en/introduction/characteristics/performance-oriented"},next:{title:"HTAP",permalink:"/tugraph-db/en/introduction/characteristics/htap"}},c={},l=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Client Interface",id:"2client-interface",level:3},{value:"3.Server Interface",id:"3server-interface",level:3}];function d(e){const t={blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"multi-level-interfaces",children:"Multi Level Interfaces"})}),"\n",(0,a.jsxs)(t.blockquote,{children:["\n",(0,a.jsx)(t.p,{children:"This document mainly introduces the design concept of TuGraph's multi-level interfaces."}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,a.jsx)(t.p,{children:"The multi-level interface is a balance between usability and high performance that TuGraph has designed to meet a variety of use cases. For example, Cypher, a declarative graph query language, can abstract away the implementation details of a graph database and express queries based on the graph model. However, Cypher's high-level descriptions cannot be efficiently translated into low-level execution, so TuGraph provides a procedural language, Procedure API, to achieve optimal database performance."}),"\n",(0,a.jsx)(t.p,{children:"Interfaces can be roughly divided into client interfaces and server interfaces. Most operations are performed on the server, and the client only does data encapsulation and parsing. The client and server are connected through a network, and TuGraph supports both flexible short-connection REST protocol and more efficient long-connection RPC protocol, which can be selected according to different business scenarios."}),"\n",(0,a.jsx)(t.p,{children:"The server interfaces are all at the calculation layer and are logically separated from the graph data storage by a Core API layer."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Multi Level Interfaces",src:n(6239).A+"",width:"742",height:"476"})}),"\n",(0,a.jsx)(t.h3,{id:"2client-interface",children:"2.Client Interface"}),"\n",(0,a.jsx)(t.p,{children:"The client interface refers to the interface executed on the client and is typically used for integration into software applications. TuGraph's client interface is relatively simple, including login/logout, data import/export, stored procedure loading and calling, and Cypher operations. Cypher integrates most of the functions, including data operations, graph model operations, operations and account management."}),"\n",(0,a.jsx)(t.p,{children:"Since the parameters and return values of Cypher are strings, JAVA OGM is a structured wrapper for Cypher, meaning that query results can be encapsulated into a typed object for ease of use."}),"\n",(0,a.jsx)(t.h3,{id:"3server-interface",children:"3.Server Interface"}),"\n",(0,a.jsx)(t.p,{children:"The server interface includes Cypher, Procedure API, OLAP API, and GNN PI, which provide services for graph transaction engines, graph analysis engines, and graph neural network engines. The characteristics of each interface are explained in detail below."}),"\n",(0,a.jsxs)(t.blockquote,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Cypher"})," is an abstract description of query logic that is independent of execution logic and is more user-friendly for graph database applications, similar to the SQL language of relational databases. TuGraph's Cypher language mainly follows the OpenCypher query standard open-sourced by Neo4j and extends auxiliary functions such as operations and maintenance management. Descriptive graph query language will become the main data operation method for graph databases, but generating the optimal execution plan between description and execution still requires a long way to go in both academia and industry."]}),"\n"]}),"\n",(0,a.jsxs)(t.blockquote,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Procedure API"})," is designed to bridge the gap between descriptive graph query language and optimal performance. TuGraph's Procedure API provides a simple wrapper on top of the Core API, which maximizes the storage's performance efficiency and is the upper limit of Cypher optimization performance. Python Procedure API is a cross-language wrapper on top of C++ Procedure API, but the copying of values during translation may result in some performance loss, and its advantage lies mainly in the ease of use of the Python language. The traversal API is a parallel-executing Procedure interface that is more similar to set operations in terms of description, such as expanding all outgoing neighbors of a point set to obtain a new point set."]}),"\n"]}),"\n",(0,a.jsxs)(t.blockquote,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"OLAP API"}),' belongs to the category of "graph computing systems" and exports snapshots of graph data from storage that supports insert, update, delete, and query operations to support read-only complex graph analysis in a more compact data storage format. OLAP API encapsulates data structures that support high-concurrency execution, including Vector, Bitmap, and CSR-based graph snapshot data structures, and provides a set of concurrent fast point-edge operation frameworks. After the graph analysis task is completed, the data can be written back to the graph database through the interface.']}),"\n"]}),"\n",(0,a.jsxs)(t.blockquote,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"GNN API"})," mainly provides the interfaces needed for graph neural network applications and can be integrated with machine learning frameworks such as PyTorch. TuGraph's GNN PI mainly integrates DGL and completes the entire process from graph storage to graph neural network application in the Python language environment."]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Except for Cypher's interpretive execution, all other server interfaces are compiled and executed, meaning that the corresponding code needs to be sent to the server and compiled (which may take some time) before execution on the server. Therefore, it is usually necessary to load the program first, then find it in the list of loaded applications, and execute it after passing in the input parameters."})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},6239:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/multi-level-Interfaces-en-78e3e2c8e270a26703bede09a6377d7e.png"},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>s});var a=n(6540);const r={},i=a.createContext(r);function o(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3590],{9658:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var a=n(4848),r=n(8453);const i={},o="Multi Level Interfaces",s={id:"introduction/characteristics/multi-level-Interfaces",title:"Multi Level Interfaces",description:"This document mainly introduces the design concept of TuGraph's multi-level interfaces.",source:"@site/../docs/en-US/source/2.introduction/5.characteristics/2.multi-level-Interfaces.md",sourceDirName:"2.introduction/5.characteristics",slug:"/introduction/characteristics/multi-level-Interfaces",permalink:"/tugraph-db/en/introduction/characteristics/multi-level-Interfaces",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Performance Oriented",permalink:"/tugraph-db/en/introduction/characteristics/performance-oriented"},next:{title:"HTAP",permalink:"/tugraph-db/en/introduction/characteristics/htap"}},c={},l=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Client Interface",id:"2client-interface",level:3},{value:"3.Server Interface",id:"3server-interface",level:3}];function d(e){const t={blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"multi-level-interfaces",children:"Multi Level Interfaces"})}),"\n",(0,a.jsxs)(t.blockquote,{children:["\n",(0,a.jsx)(t.p,{children:"This document mainly introduces the design concept of TuGraph's multi-level interfaces."}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,a.jsx)(t.p,{children:"The multi-level interface is a balance between usability and high performance that TuGraph has designed to meet a variety of use cases. For example, Cypher, a declarative graph query language, can abstract away the implementation details of a graph database and express queries based on the graph model. However, Cypher's high-level descriptions cannot be efficiently translated into low-level execution, so TuGraph provides a procedural language, Procedure API, to achieve optimal database performance."}),"\n",(0,a.jsx)(t.p,{children:"Interfaces can be roughly divided into client interfaces and server interfaces. Most operations are performed on the server, and the client only does data encapsulation and parsing. The client and server are connected through a network, and TuGraph supports both flexible short-connection REST protocol and more efficient long-connection RPC protocol, which can be selected according to different business scenarios."}),"\n",(0,a.jsx)(t.p,{children:"The server interfaces are all at the calculation layer and are logically separated from the graph data storage by a Core API layer."}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.img,{alt:"Multi Level Interfaces",src:n(6239).A+"",width:"742",height:"476"})}),"\n",(0,a.jsx)(t.h3,{id:"2client-interface",children:"2.Client Interface"}),"\n",(0,a.jsx)(t.p,{children:"The client interface refers to the interface executed on the client and is typically used for integration into software applications. TuGraph's client interface is relatively simple, including login/logout, data import/export, stored procedure loading and calling, and Cypher operations. Cypher integrates most of the functions, including data operations, graph model operations, operations and account management."}),"\n",(0,a.jsx)(t.p,{children:"Since the parameters and return values of Cypher are strings, JAVA OGM is a structured wrapper for Cypher, meaning that query results can be encapsulated into a typed object for ease of use."}),"\n",(0,a.jsx)(t.h3,{id:"3server-interface",children:"3.Server Interface"}),"\n",(0,a.jsx)(t.p,{children:"The server interface includes Cypher, Procedure API, OLAP API, and GNN PI, which provide services for graph transaction engines, graph analysis engines, and graph neural network engines. The characteristics of each interface are explained in detail below."}),"\n",(0,a.jsxs)(t.blockquote,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Cypher"})," is an abstract description of query logic that is independent of execution logic and is more user-friendly for graph database applications, similar to the SQL language of relational databases. TuGraph's Cypher language mainly follows the OpenCypher query standard open-sourced by Neo4j and extends auxiliary functions such as operations and maintenance management. Descriptive graph query language will become the main data operation method for graph databases, but generating the optimal execution plan between description and execution still requires a long way to go in both academia and industry."]}),"\n"]}),"\n",(0,a.jsxs)(t.blockquote,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"Procedure API"})," is designed to bridge the gap between descriptive graph query language and optimal performance. TuGraph's Procedure API provides a simple wrapper on top of the Core API, which maximizes the storage's performance efficiency and is the upper limit of Cypher optimization performance. Python Procedure API is a cross-language wrapper on top of C++ Procedure API, but the copying of values during translation may result in some performance loss, and its advantage lies mainly in the ease of use of the Python language. The traversal API is a parallel-executing Procedure interface that is more similar to set operations in terms of description, such as expanding all outgoing neighbors of a point set to obtain a new point set."]}),"\n"]}),"\n",(0,a.jsxs)(t.blockquote,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"OLAP API"}),' belongs to the category of "graph computing systems" and exports snapshots of graph data from storage that supports insert, update, delete, and query operations to support read-only complex graph analysis in a more compact data storage format. OLAP API encapsulates data structures that support high-concurrency execution, including Vector, Bitmap, and CSR-based graph snapshot data structures, and provides a set of concurrent fast point-edge operation frameworks. After the graph analysis task is completed, the data can be written back to the graph database through the interface.']}),"\n"]}),"\n",(0,a.jsxs)(t.blockquote,{children:["\n",(0,a.jsxs)(t.p,{children:[(0,a.jsx)(t.strong,{children:"GNN API"})," mainly provides the interfaces needed for graph neural network applications and can be integrated with machine learning frameworks such as PyTorch. TuGraph's GNN PI mainly integrates DGL and completes the entire process from graph storage to graph neural network application in the Python language environment."]}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"Except for Cypher's interpretive execution, all other server interfaces are compiled and executed, meaning that the corresponding code needs to be sent to the server and compiled (which may take some time) before execution on the server. Therefore, it is usually necessary to load the program first, then find it in the list of loaded applications, and execute it after passing in the input parameters."})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},6239:(e,t,n)=>{n.d(t,{A:()=>a});const a=n.p+"assets/images/multi-level-Interfaces-en-78e3e2c8e270a26703bede09a6377d7e.png"},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>s});var a=n(6540);const r={},i=a.createContext(r);function o(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/916cc991.c73c9a1b.js b/assets/js/916cc991.5136f99f.js similarity index 99% rename from assets/js/916cc991.c73c9a1b.js rename to assets/js/916cc991.5136f99f.js index 3b2c58250e..a16c783faf 100644 --- a/assets/js/916cc991.c73c9a1b.js +++ b/assets/js/916cc991.5136f99f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8466],{7256:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>o,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var s=t(4848),r=t(8453);const i={},d="TuGraph RESTful API",l={id:"client-tools/restful-api",title:"TuGraph RESTful API",description:"This document describes how to call the Rest API of TuGrpah.",source:"@site/../docs/en-US/source/7.client-tools/7.restful-api.md",sourceDirName:"7.client-tools",slug:"/client-tools/restful-api",permalink:"/tugraph-db/en/client-tools/restful-api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:7,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph console client",permalink:"/tugraph-db/en/client-tools/bolt-console-client"},next:{title:"RPC API",permalink:"/tugraph-db/en/client-tools/rpc-api"}},h={},c=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Request And Response Format",id:"2request-and-response-format",level:2},{value:"2.1.Standard Response Format",id:"21standard-response-format",level:3},{value:"2.2. Request Type",id:"22-request-type",level:3},{value:"2.2.1. User Login",id:"221-user-login",level:4},{value:"2.2.2. User Logout",id:"222-user-logout",level:4},{value:"2.2.3. Refresh Token",id:"223-refresh-token",level:4},{value:"2.2.4. Call Cypher",id:"224-call-cypher",level:4},{value:"2.2.5. Upload File",id:"225-upload-file",level:4},{value:"2.2.6. Check File",id:"226-check-file",level:4},{value:"2.2.7. Delete Cached File",id:"227-delete-cached-file",level:4},{value:"2.2.8. Import Schema",id:"228-import-schema",level:4},{value:"2.2.9. Import Data",id:"229-import-data",level:4},{value:"2.2.10. Import Progress Query",id:"2210-import-progress-query",level:4}];function a(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"tugraph-restful-api",children:"TuGraph RESTful API"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"This document describes how to call the Rest API of TuGrpah."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,s.jsx)(n.p,{children:"TuGraph provides HTTP RESTful APIs, which allow users to access TuGraph servers through HTTP requests remotely."}),"\n",(0,s.jsx)(n.p,{children:"This document specifiers the TuGraph HTTP RESTful API."}),"\n",(0,s.jsx)(n.h2,{id:"2request-and-response-format",children:"2.Request And Response Format"}),"\n",(0,s.jsx)(n.p,{children:"Tugraph HTTP Server receives requests in json format\uff0cAfter authentication, fields in the request are extracted, the request is processed according to the defined interface logic, and the response in json format is returned."}),"\n",(0,s.jsx)(n.h3,{id:"21standard-response-format",children:"2.1.Standard Response Format"}),"\n",(0,s.jsx)(n.p,{children:"Each response is returned in the standard response format, as follows\uff1a"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"errorCode"}),(0,s.jsx)(n.td,{children:"error code"}),(0,s.jsx)(n.td,{children:"int"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"success"}),(0,s.jsx)(n.td,{children:"Whether the request was successful"}),(0,s.jsx)(n.td,{children:"int"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"errorMessage"}),(0,s.jsx)(n.td,{children:"error message"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"data"}),(0,s.jsx)(n.td,{children:"the response information returned when the request is successful"}),(0,s.jsx)(n.td,{children:"json string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"22-request-type",children:"2.2. Request Type"}),"\n",(0,s.jsx)(n.h4,{id:"221-user-login",children:"2.2.1. User Login"}),"\n",(0,s.jsx)(n.p,{children:"The user sends the login request to the server with the user name and password. After successful login, the client receives a signed token (the Json Web Token) and a Boolean variable (default_password) to determine whether it is the default password. The jwt token stored by the client and added to the Authorization domain of the request header in subsequent requests. If the login fails, you will receive the Authentication failed error."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /login"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"userName"}),(0,s.jsx)(n.td,{children:"name of the user"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"password"}),(0,s.jsx)(n.td,{children:"password of the user"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00 and the token will be included in data"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"authorization"}),(0,s.jsx)(n.td,{children:"token"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"default_password"}),(0,s.jsx)(n.td,{children:"whether the password is the default password"}),(0,s.jsx)(n.td,{children:"bool"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example request."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:' {"userName" : "test", "password" : "123456"}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"222-user-logout",children:"2.2.2. User Logout"}),"\n",(0,s.jsx)(n.p,{children:"When a user logs out, the authenticated token is deleted. and the user needs to log in again to obtain a new token when sending subsequent requests."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /logout"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":\nThe http request header carries the token returned by login interface, and the body has no parameters"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00, and data is empty"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"223-refresh-token",children:"2.2.3. Refresh Token"}),"\n",(0,s.jsx)(n.p,{children:"If the delivered token becomes invalid, you need to invoke this interface for re-authentication. The token is valid within one hour after the first login and needs to be refreshed"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /refresh"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":\nThe http request header carries the token returned by login interface, and the body has no parameters"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00, and the token will be included in data"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"authorization"}),(0,s.jsx)(n.td,{children:"token"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})})]}),"\n",(0,s.jsx)(n.h4,{id:"224-call-cypher",children:"2.2.4. Call Cypher"}),"\n",(0,s.jsx)(n.p,{children:"User manipulation of data and models in tugraph requires calling the cypher interface and is initiated through the standard cypher query language"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /cypher"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"graph"}),(0,s.jsx)(n.td,{children:"the name of the subgraph to be queried"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"script"}),(0,s.jsx)(n.td,{children:"query statement"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00, and the query results will be included in data"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"result"}),(0,s.jsx)(n.td,{children:"query results"}),(0,s.jsx)(n.td,{children:"json string"}),(0,s.jsx)(n.td,{children:"yes"})]})})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example request."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:' {"script" : "Match (n) return n", "graph" : "default"}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"225-upload-file",children:"2.2.5. Upload File"}),"\n",(0,s.jsx)(n.p,{children:"This interface is used to upload local files to the TuGraph machine. You can upload text/binary files, large files, and small files. For large files, the client must split the files, and each file fragment must not be larger than 1MB. Parameters Begin-Pos and Size correspond to the offset and fragment size of this fragment in the complete file. The parameter must be placed in the header of the http request, and the request body contains only the file fragment content. The request header of this interface contains more than token parameters"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /upload_file"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"header parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"File-Name"}),(0,s.jsx)(n.td,{children:"the name of the file"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Begin-Pos"}),(0,s.jsx)(n.td,{children:"Offset of the start position of the current file fragment within the file"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Size"}),(0,s.jsx)(n.td,{children:"the current file fragment size"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00"]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"226-check-file",children:"2.2.6. Check File"}),"\n",(0,s.jsx)(n.p,{children:"this interface is used to check the correctness of uploaded files. If the check succeeds, the system returns a success message when the same file is uploaded again"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /check_file"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"fileName"}),(0,s.jsx)(n.td,{children:"the name of the file"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"checkSum"}),(0,s.jsx)(n.td,{children:"the checksum of the file"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:'yes when flag set to "1"'})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"fileSize"}),(0,s.jsx)(n.td,{children:"the size of the file"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:'yes when flag set to "2"'})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"flag"}),(0,s.jsx)(n.td,{children:'If flag is "1", check md5. If flag is "2"\uff0ccheck file size'}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"pass"}),(0,s.jsx)(n.td,{children:"true on success, false otherwise"}),(0,s.jsx)(n.td,{children:"bool"}),(0,s.jsx)(n.td,{children:"yes"})]})})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example request."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'{"fileName" : "test.csv", "checkSum" : "$MD5", "flag" : \u201c1\u201d}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"227-delete-cached-file",children:"2.2.7. Delete Cached File"}),"\n",(0,s.jsx)(n.p,{children:"The admin user can delete all the files uploaded by anyone. Other users can delete their own files. You can delete a file with a specified name, a file uploaded by a specified user, or all files"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /clear_cache"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"fileName"}),(0,s.jsx)(n.td,{children:"the name of the file"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:'yes when flag set to "0"'})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"userName"}),(0,s.jsx)(n.td,{children:"the name of the user"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:'yes when flag set to "1"'})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"flag"}),(0,s.jsx)(n.td,{children:"When flag is set to 0, the file specified by fileName is deleted; when flag is set to 1, all files uploaded by userName are deleted; when flag is set to 2, all files are deleted"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example request."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'{"fileName" : "test.csv", "userName" : "test", "flag" : \u201c1\u201d}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"228-import-schema",children:"2.2.8. Import Schema"}),"\n",(0,s.jsx)(n.p,{children:"This interface can create a schema model based on the schema information specified by description parameter. For details about the schema format, refer to data-import.md"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /import_schema"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"graph"}),(0,s.jsx)(n.td,{children:"name of the subgraph"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"description"}),(0,s.jsx)(n.td,{children:"schema infomation"}),(0,s.jsx)(n.td,{children:"json string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example request."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'{\n\t"graph": "test_graph",\n\t"description": {\n\t\t"schema": [{\n\t\t\t"label": "Person",\n\t\t\t"type": "VERTEX",\n\t\t\t"primary": "name",\n\t\t\t"properties": [{\n\t\t\t\t"name": "name",\n\t\t\t\t"type": "STRING"\n\t\t\t}, {\n\t\t\t\t"name": "birthyear",\n\t\t\t\t"type": "INT16",\n\t\t\t\t"optional": true\n\t\t\t}, {\n\t\t\t\t"name": "phone",\n\t\t\t\t"type": "INT16",\n\t\t\t\t"unique": true,\n\t\t\t\t"index": true\n\t\t\t}]\n\t\t}, {\n\t\t\t"label": "City",\n\t\t\t"type": "VERTEX",\n\t\t\t"primary": "name",\n\t\t\t"properties": [{\n\t\t\t\t"name": "name",\n\t\t\t\t"type": "STRING"\n\t\t\t}]\n\t\t}, {\n\t\t\t"label": "Film",\n\t\t\t"type": "VERTEX",\n\t\t\t"primary": "title",\n\t\t\t"properties": [{\n\t\t\t\t"name": "title",\n\t\t\t\t"type": "STRING"\n\t\t\t}]\n\t\t}, {\n\t\t\t"label": "HAS_CHILD",\n\t\t\t"type": "EDGE"\n\t\t}, {\n\t\t\t"label": "MARRIED",\n\t\t\t"type": "EDGE"\n\t\t}, {\n\t\t\t"label": "BORN_IN",\n\t\t\t"type": "EDGE",\n\t\t\t"properties": [{\n\t\t\t\t"name": "weight",\n\t\t\t\t"type": "FLOAT",\n\t\t\t\t"optional": true\n\t\t\t}]\n\t\t}, {\n\t\t\t"label": "DIRECTED",\n\t\t\t"type": "EDGE"\n\t\t}, {\n\t\t\t"label": "WROTE_MUSIC_FOR",\n\t\t\t"type": "EDGE"\n\t\t}, {\n\t\t\t"label": "ACTED_IN",\n\t\t\t"type": "EDGE",\n\t\t\t"properties": [{\n\t\t\t\t"name": "charactername",\n\t\t\t\t"type": "STRING"\n\t\t\t}]\n\t\t}, {\n\t\t\t"label": "PLAY_IN",\n\t\t\t"type": "EDGE",\n\t\t\t"properties": [{\n\t\t\t\t"name": "role",\n\t\t\t\t"type": "STRING",\n\t\t\t\t"optional": true\n\t\t\t}],\n\t\t\t"constraints": [\n\t\t\t\t["Person", "Film"]\n\t\t\t]\n\t\t}]\n\t}\n}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"229-import-data",children:"2.2.9. Import Data"}),"\n",(0,s.jsx)(n.p,{children:"This interface allows users to specify uploaded and verified files as data files and import them to the subgraph specified by the graph parameter. The import process is asynchronous, and the server returns a task id after receiving the import request"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /import_data"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"graph"}),(0,s.jsx)(n.td,{children:"name of the subgraph"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"schema"}),(0,s.jsx)(n.td,{children:"schema infomation"}),(0,s.jsx)(n.td,{children:"json string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"delimiter"}),(0,s.jsx)(n.td,{children:"column delimiter"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"continueOnError"}),(0,s.jsx)(n.td,{children:"Whether to skip the error and continue when an error occurs"}),(0,s.jsx)(n.td,{children:"boolean"}),(0,s.jsx)(n.td,{children:"no"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"skipPackages"}),(0,s.jsx)(n.td,{children:"number of packets skipped"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"no"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"taskId"}),(0,s.jsx)(n.td,{children:"used to restart the failed task"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"no"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"flag"}),(0,s.jsx)(n.td,{children:"If flag is set to 1, the data file is deleted after the import is successful"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"no"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"other"}),(0,s.jsx)(n.td,{children:"other parameter"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"no"})]})]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"taskId"}),(0,s.jsx)(n.td,{children:"task id is used to find a import task"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example request."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'{\n "graph": "default", //\u5bfc\u5165\u7684\u5b50\u56fe\u540d\u79f0\n "delimiter": ",",\t\t\t\t\t\t//\u6570\u636e\u5206\u9694\u7b26\n "continueOnError": true,\t\t//\u9047\u5230\u9519\u8bef\u65f6\u662f\u5426\u8df3\u8fc7\u9519\u8bef\u6570\u636e\u5e76\u7ee7\u7eed\u5bfc\u5165\n "skipPackages": \u201c0\u201d,\t\t\t\t\t//\u8df3\u8fc7\u7684\u5305\u4e2a\u6570\n "flag" : "1",\n\t "schema": {\n\t\t"files": [{\n\t\t\t"DST_ID": "Film",\t\t\t\t//\u7ec8\u70b9label\u7c7b\u578b\n\t\t\t"SRC_ID": "Person",\t\t\t//\u8d77\u70b9label\u7c7b\u578b\n\t\t\t"columns": [\t\t\t\t\t\t//\u6570\u636e\u683c\u5f0f\u8bf4\u660e\n\t\t\t\t"SRC_ID",\t\t\t\t\t\t\t//\u8d77\u70b9id\n\t\t\t\t"DST_ID",\t\t\t\t\t\t\t//\u7ec8\u70b9id\n "SKIP",\t\t\t\t\t\t\t\t//\u8868\u793a\u8df3\u8fc7\u6b64\u5217\u6570\u636e\n\t\t\t\t"charactername"\t\t\t\t//\u5c5e\u6027\u540d\u79f0\n\t\t\t],\n\t\t\t"format": "CSV",\t\t\t\t//\u6570\u636e\u6587\u4ef6\u683c\u5f0f\u7c7b\u578b,\u652f\u6301csv\u548cjson\n\t\t\t"path": "acted_in.csv",\t//\u6570\u636e\u6587\u4ef6\u540d\u79f0\n\t\t\t"header": 0, \t\t\t\t\t\t//\u6570\u636e\u4ece\u7b2c\u51e0\u884c\u5f00\u59cb\n\t\t\t"label": "ACTED_IN"\t\t\t//\u8fb9\u7684\u7c7b\u578b\n\t\t}]\n\t}\n}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"2210-import-progress-query",children:"2.2.10. Import Progress Query"}),"\n",(0,s.jsx)(n.p,{children:"This interface is used to query the execution progress of a import task"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /import_progress"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"taskId"}),(0,s.jsx)(n.td,{children:"task id returned by import_data interface"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"\u662f"})]})})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"success"}),(0,s.jsx)(n.td,{children:"whether import is successful"}),(0,s.jsx)(n.td,{children:"boolean"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"reason"}),(0,s.jsx)(n.td,{children:"reason of the import failure"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes if success is false"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"progress"}),(0,s.jsx)(n.td,{children:"import progress at the current time"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example request."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'{"taskId" : "$taskId"}\n'})})]})}function o(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>d,x:()=>l});var s=t(6540);const r={},i=s.createContext(r);function d(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8466],{7256:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>o,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var s=t(4848),r=t(8453);const i={},d="TuGraph RESTful API",l={id:"client-tools/restful-api",title:"TuGraph RESTful API",description:"This document describes how to call the Rest API of TuGrpah.",source:"@site/../docs/en-US/source/7.client-tools/7.restful-api.md",sourceDirName:"7.client-tools",slug:"/client-tools/restful-api",permalink:"/tugraph-db/en/client-tools/restful-api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:7,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph console client",permalink:"/tugraph-db/en/client-tools/bolt-console-client"},next:{title:"RPC API",permalink:"/tugraph-db/en/client-tools/rpc-api"}},h={},c=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Request And Response Format",id:"2request-and-response-format",level:2},{value:"2.1.Standard Response Format",id:"21standard-response-format",level:3},{value:"2.2. Request Type",id:"22-request-type",level:3},{value:"2.2.1. User Login",id:"221-user-login",level:4},{value:"2.2.2. User Logout",id:"222-user-logout",level:4},{value:"2.2.3. Refresh Token",id:"223-refresh-token",level:4},{value:"2.2.4. Call Cypher",id:"224-call-cypher",level:4},{value:"2.2.5. Upload File",id:"225-upload-file",level:4},{value:"2.2.6. Check File",id:"226-check-file",level:4},{value:"2.2.7. Delete Cached File",id:"227-delete-cached-file",level:4},{value:"2.2.8. Import Schema",id:"228-import-schema",level:4},{value:"2.2.9. Import Data",id:"229-import-data",level:4},{value:"2.2.10. Import Progress Query",id:"2210-import-progress-query",level:4}];function a(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"tugraph-restful-api",children:"TuGraph RESTful API"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"This document describes how to call the Rest API of TuGrpah."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,s.jsx)(n.p,{children:"TuGraph provides HTTP RESTful APIs, which allow users to access TuGraph servers through HTTP requests remotely."}),"\n",(0,s.jsx)(n.p,{children:"This document specifiers the TuGraph HTTP RESTful API."}),"\n",(0,s.jsx)(n.h2,{id:"2request-and-response-format",children:"2.Request And Response Format"}),"\n",(0,s.jsx)(n.p,{children:"Tugraph HTTP Server receives requests in json format\uff0cAfter authentication, fields in the request are extracted, the request is processed according to the defined interface logic, and the response in json format is returned."}),"\n",(0,s.jsx)(n.h3,{id:"21standard-response-format",children:"2.1.Standard Response Format"}),"\n",(0,s.jsx)(n.p,{children:"Each response is returned in the standard response format, as follows\uff1a"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"errorCode"}),(0,s.jsx)(n.td,{children:"error code"}),(0,s.jsx)(n.td,{children:"int"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"success"}),(0,s.jsx)(n.td,{children:"Whether the request was successful"}),(0,s.jsx)(n.td,{children:"int"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"errorMessage"}),(0,s.jsx)(n.td,{children:"error message"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"data"}),(0,s.jsx)(n.td,{children:"the response information returned when the request is successful"}),(0,s.jsx)(n.td,{children:"json string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"22-request-type",children:"2.2. Request Type"}),"\n",(0,s.jsx)(n.h4,{id:"221-user-login",children:"2.2.1. User Login"}),"\n",(0,s.jsx)(n.p,{children:"The user sends the login request to the server with the user name and password. After successful login, the client receives a signed token (the Json Web Token) and a Boolean variable (default_password) to determine whether it is the default password. The jwt token stored by the client and added to the Authorization domain of the request header in subsequent requests. If the login fails, you will receive the Authentication failed error."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /login"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"userName"}),(0,s.jsx)(n.td,{children:"name of the user"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"password"}),(0,s.jsx)(n.td,{children:"password of the user"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00 and the token will be included in data"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"authorization"}),(0,s.jsx)(n.td,{children:"token"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"default_password"}),(0,s.jsx)(n.td,{children:"whether the password is the default password"}),(0,s.jsx)(n.td,{children:"bool"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example request."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:' {"userName" : "test", "password" : "123456"}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"222-user-logout",children:"2.2.2. User Logout"}),"\n",(0,s.jsx)(n.p,{children:"When a user logs out, the authenticated token is deleted. and the user needs to log in again to obtain a new token when sending subsequent requests."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /logout"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":\nThe http request header carries the token returned by login interface, and the body has no parameters"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00, and data is empty"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"223-refresh-token",children:"2.2.3. Refresh Token"}),"\n",(0,s.jsx)(n.p,{children:"If the delivered token becomes invalid, you need to invoke this interface for re-authentication. The token is valid within one hour after the first login and needs to be refreshed"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /refresh"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":\nThe http request header carries the token returned by login interface, and the body has no parameters"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00, and the token will be included in data"]}),"\n"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"authorization"}),(0,s.jsx)(n.td,{children:"token"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})})]}),"\n",(0,s.jsx)(n.h4,{id:"224-call-cypher",children:"2.2.4. Call Cypher"}),"\n",(0,s.jsx)(n.p,{children:"User manipulation of data and models in tugraph requires calling the cypher interface and is initiated through the standard cypher query language"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /cypher"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"graph"}),(0,s.jsx)(n.td,{children:"the name of the subgraph to be queried"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"script"}),(0,s.jsx)(n.td,{children:"query statement"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00, and the query results will be included in data"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"result"}),(0,s.jsx)(n.td,{children:"query results"}),(0,s.jsx)(n.td,{children:"json string"}),(0,s.jsx)(n.td,{children:"yes"})]})})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example request."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:' {"script" : "Match (n) return n", "graph" : "default"}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"225-upload-file",children:"2.2.5. Upload File"}),"\n",(0,s.jsx)(n.p,{children:"This interface is used to upload local files to the TuGraph machine. You can upload text/binary files, large files, and small files. For large files, the client must split the files, and each file fragment must not be larger than 1MB. Parameters Begin-Pos and Size correspond to the offset and fragment size of this fragment in the complete file. The parameter must be placed in the header of the http request, and the request body contains only the file fragment content. The request header of this interface contains more than token parameters"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /upload_file"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"header parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"File-Name"}),(0,s.jsx)(n.td,{children:"the name of the file"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Begin-Pos"}),(0,s.jsx)(n.td,{children:"Offset of the start position of the current file fragment within the file"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Size"}),(0,s.jsx)(n.td,{children:"the current file fragment size"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00"]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"226-check-file",children:"2.2.6. Check File"}),"\n",(0,s.jsx)(n.p,{children:"this interface is used to check the correctness of uploaded files. If the check succeeds, the system returns a success message when the same file is uploaded again"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /check_file"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"fileName"}),(0,s.jsx)(n.td,{children:"the name of the file"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"checkSum"}),(0,s.jsx)(n.td,{children:"the checksum of the file"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:'yes when flag set to "1"'})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"fileSize"}),(0,s.jsx)(n.td,{children:"the size of the file"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:'yes when flag set to "2"'})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"flag"}),(0,s.jsx)(n.td,{children:'If flag is "1", check md5. If flag is "2"\uff0ccheck file size'}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"pass"}),(0,s.jsx)(n.td,{children:"true on success, false otherwise"}),(0,s.jsx)(n.td,{children:"bool"}),(0,s.jsx)(n.td,{children:"yes"})]})})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example request."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'{"fileName" : "test.csv", "checkSum" : "$MD5", "flag" : \u201c1\u201d}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"227-delete-cached-file",children:"2.2.7. Delete Cached File"}),"\n",(0,s.jsx)(n.p,{children:"The admin user can delete all the files uploaded by anyone. Other users can delete their own files. You can delete a file with a specified name, a file uploaded by a specified user, or all files"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /clear_cache"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"fileName"}),(0,s.jsx)(n.td,{children:"the name of the file"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:'yes when flag set to "0"'})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"userName"}),(0,s.jsx)(n.td,{children:"the name of the user"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:'yes when flag set to "1"'})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"flag"}),(0,s.jsx)(n.td,{children:"When flag is set to 0, the file specified by fileName is deleted; when flag is set to 1, all files uploaded by userName are deleted; when flag is set to 2, all files are deleted"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example request."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'{"fileName" : "test.csv", "userName" : "test", "flag" : \u201c1\u201d}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"228-import-schema",children:"2.2.8. Import Schema"}),"\n",(0,s.jsx)(n.p,{children:"This interface can create a schema model based on the schema information specified by description parameter. For details about the schema format, refer to data-import.md"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /import_schema"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"graph"}),(0,s.jsx)(n.td,{children:"name of the subgraph"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"description"}),(0,s.jsx)(n.td,{children:"schema infomation"}),(0,s.jsx)(n.td,{children:"json string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example request."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'{\n\t"graph": "test_graph",\n\t"description": {\n\t\t"schema": [{\n\t\t\t"label": "Person",\n\t\t\t"type": "VERTEX",\n\t\t\t"primary": "name",\n\t\t\t"properties": [{\n\t\t\t\t"name": "name",\n\t\t\t\t"type": "STRING"\n\t\t\t}, {\n\t\t\t\t"name": "birthyear",\n\t\t\t\t"type": "INT16",\n\t\t\t\t"optional": true\n\t\t\t}, {\n\t\t\t\t"name": "phone",\n\t\t\t\t"type": "INT16",\n\t\t\t\t"unique": true,\n\t\t\t\t"index": true\n\t\t\t}]\n\t\t}, {\n\t\t\t"label": "City",\n\t\t\t"type": "VERTEX",\n\t\t\t"primary": "name",\n\t\t\t"properties": [{\n\t\t\t\t"name": "name",\n\t\t\t\t"type": "STRING"\n\t\t\t}]\n\t\t}, {\n\t\t\t"label": "Film",\n\t\t\t"type": "VERTEX",\n\t\t\t"primary": "title",\n\t\t\t"properties": [{\n\t\t\t\t"name": "title",\n\t\t\t\t"type": "STRING"\n\t\t\t}]\n\t\t}, {\n\t\t\t"label": "HAS_CHILD",\n\t\t\t"type": "EDGE"\n\t\t}, {\n\t\t\t"label": "MARRIED",\n\t\t\t"type": "EDGE"\n\t\t}, {\n\t\t\t"label": "BORN_IN",\n\t\t\t"type": "EDGE",\n\t\t\t"properties": [{\n\t\t\t\t"name": "weight",\n\t\t\t\t"type": "FLOAT",\n\t\t\t\t"optional": true\n\t\t\t}]\n\t\t}, {\n\t\t\t"label": "DIRECTED",\n\t\t\t"type": "EDGE"\n\t\t}, {\n\t\t\t"label": "WROTE_MUSIC_FOR",\n\t\t\t"type": "EDGE"\n\t\t}, {\n\t\t\t"label": "ACTED_IN",\n\t\t\t"type": "EDGE",\n\t\t\t"properties": [{\n\t\t\t\t"name": "charactername",\n\t\t\t\t"type": "STRING"\n\t\t\t}]\n\t\t}, {\n\t\t\t"label": "PLAY_IN",\n\t\t\t"type": "EDGE",\n\t\t\t"properties": [{\n\t\t\t\t"name": "role",\n\t\t\t\t"type": "STRING",\n\t\t\t\t"optional": true\n\t\t\t}],\n\t\t\t"constraints": [\n\t\t\t\t["Person", "Film"]\n\t\t\t]\n\t\t}]\n\t}\n}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"229-import-data",children:"2.2.9. Import Data"}),"\n",(0,s.jsx)(n.p,{children:"This interface allows users to specify uploaded and verified files as data files and import them to the subgraph specified by the graph parameter. The import process is asynchronous, and the server returns a task id after receiving the import request"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /import_data"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"graph"}),(0,s.jsx)(n.td,{children:"name of the subgraph"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"schema"}),(0,s.jsx)(n.td,{children:"schema infomation"}),(0,s.jsx)(n.td,{children:"json string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"delimiter"}),(0,s.jsx)(n.td,{children:"column delimiter"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"continueOnError"}),(0,s.jsx)(n.td,{children:"Whether to skip the error and continue when an error occurs"}),(0,s.jsx)(n.td,{children:"boolean"}),(0,s.jsx)(n.td,{children:"no"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"skipPackages"}),(0,s.jsx)(n.td,{children:"number of packets skipped"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"no"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"taskId"}),(0,s.jsx)(n.td,{children:"used to restart the failed task"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"no"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"flag"}),(0,s.jsx)(n.td,{children:"If flag is set to 1, the data file is deleted after the import is successful"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"no"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"other"}),(0,s.jsx)(n.td,{children:"other parameter"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"no"})]})]})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"taskId"}),(0,s.jsx)(n.td,{children:"task id is used to find a import task"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example request."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'{\n "graph": "default", //\u5bfc\u5165\u7684\u5b50\u56fe\u540d\u79f0\n "delimiter": ",",\t\t\t\t\t\t//\u6570\u636e\u5206\u9694\u7b26\n "continueOnError": true,\t\t//\u9047\u5230\u9519\u8bef\u65f6\u662f\u5426\u8df3\u8fc7\u9519\u8bef\u6570\u636e\u5e76\u7ee7\u7eed\u5bfc\u5165\n "skipPackages": \u201c0\u201d,\t\t\t\t\t//\u8df3\u8fc7\u7684\u5305\u4e2a\u6570\n "flag" : "1",\n\t "schema": {\n\t\t"files": [{\n\t\t\t"DST_ID": "Film",\t\t\t\t//\u7ec8\u70b9label\u7c7b\u578b\n\t\t\t"SRC_ID": "Person",\t\t\t//\u8d77\u70b9label\u7c7b\u578b\n\t\t\t"columns": [\t\t\t\t\t\t//\u6570\u636e\u683c\u5f0f\u8bf4\u660e\n\t\t\t\t"SRC_ID",\t\t\t\t\t\t\t//\u8d77\u70b9id\n\t\t\t\t"DST_ID",\t\t\t\t\t\t\t//\u7ec8\u70b9id\n "SKIP",\t\t\t\t\t\t\t\t//\u8868\u793a\u8df3\u8fc7\u6b64\u5217\u6570\u636e\n\t\t\t\t"charactername"\t\t\t\t//\u5c5e\u6027\u540d\u79f0\n\t\t\t],\n\t\t\t"format": "CSV",\t\t\t\t//\u6570\u636e\u6587\u4ef6\u683c\u5f0f\u7c7b\u578b,\u652f\u6301csv\u548cjson\n\t\t\t"path": "acted_in.csv",\t//\u6570\u636e\u6587\u4ef6\u540d\u79f0\n\t\t\t"header": 0, \t\t\t\t\t\t//\u6570\u636e\u4ece\u7b2c\u51e0\u884c\u5f00\u59cb\n\t\t\t"label": "ACTED_IN"\t\t\t//\u8fb9\u7684\u7c7b\u578b\n\t\t}]\n\t}\n}\n'})}),"\n",(0,s.jsx)(n.h4,{id:"2210-import-progress-query",children:"2.2.10. Import Progress Query"}),"\n",(0,s.jsx)(n.p,{children:"This interface is used to query the execution progress of a import task"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"URI"}),": /import_progress"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"METHOD"}),": POST"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"REQUEST"}),":"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"taskId"}),(0,s.jsx)(n.td,{children:"task id returned by import_data interface"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"\u662f"})]})})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"RESPONSE"}),":\nIf successful, the success field in the returned response message will be set to 00"]}),"\n"]}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"body parameter"}),(0,s.jsx)(n.th,{children:"parameter description"}),(0,s.jsx)(n.th,{children:"parameter type"}),(0,s.jsx)(n.th,{children:"necessary"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"success"}),(0,s.jsx)(n.td,{children:"whether import is successful"}),(0,s.jsx)(n.td,{children:"boolean"}),(0,s.jsx)(n.td,{children:"yes"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"reason"}),(0,s.jsx)(n.td,{children:"reason of the import failure"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes if success is false"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"progress"}),(0,s.jsx)(n.td,{children:"import progress at the current time"}),(0,s.jsx)(n.td,{children:"string"}),(0,s.jsx)(n.td,{children:"yes"})]})]})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example request."})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'{"taskId" : "$taskId"}\n'})})]})}function o(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>d,x:()=>l});var s=t(6540);const r={},i=s.createContext(r);function d(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/99926a12.92c42b8a.js b/assets/js/99926a12.0be987ce.js similarity index 98% rename from assets/js/99926a12.92c42b8a.js rename to assets/js/99926a12.0be987ce.js index 6ecc918790..466199c8ec 100644 --- a/assets/js/99926a12.92c42b8a.js +++ b/assets/js/99926a12.0be987ce.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[2594],{5440:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>t,metadata:()=>c,toc:()=>a});var o=i(4848),r=i(8453);const t={},s="Compile",c={id:"installation&running/compile",title:"Compile",description:"This document mainly describes how to compile TuGraph from source code.",source:"@site/../docs/en-US/source/5.installation&running/6.compile.md",sourceDirName:"5.installation&running",slug:"/installation&running/compile",permalink:"/tugraph-db/en/installation&running/compile",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:6,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Cloud Deployment",permalink:"/tugraph-db/en/installation&running/cloud-deployment"},next:{title:"Tugraph Running",permalink:"/tugraph-db/en/installation&running/tugraph-running"}},l={},a=[{value:"1.Prerequisites",id:"1prerequisites",level:2},{value:"2.compile",id:"2compile",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"compile",children:"Compile"})}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"This document mainly describes how to compile TuGraph from source code."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"1prerequisites",children:"1.Prerequisites"}),"\n",(0,o.jsxs)(n.p,{children:["It is recommended to build TuGraph on a Linux system. Meanwhile, Docker is a good choice. If you want to set up a new environment, please refer to ",(0,o.jsx)(n.a,{href:"/tugraph-db/en/installation&running/docker-deployment",children:"Dockerfile"}),"\u3002"]}),"\n",(0,o.jsx)(n.h2,{id:"2compile",children:"2.compile"}),"\n",(0,o.jsx)(n.p,{children:"Here are steps to compile TuGraph:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["run ",(0,o.jsx)(n.code,{children:"deps/build_deps.sh"})," to build tugraph-web if you need. Skip this step otherwise."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"cmake .. -DOURSYSTEM=centos"})," or ",(0,o.jsx)(n.code,{children:"cmake .. -DOURSYSTEM=ubuntu"})]}),"\n",(0,o.jsxs)(n.li,{children:["If compiling on an arm machine (such as a Mac with M1 chip), add ",(0,o.jsx)(n.code,{children:"-DENABLE_BUILD_ON_AARCH64=ON"})]}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.code,{children:"make"})}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"make package"})," or ",(0,o.jsx)(n.code,{children:"cpack --config CPackConfig.cmake"})]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Example:\n",(0,o.jsx)(n.code,{children:"tugraph/tugraph-compile-centos7"}),"Docker environment"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ git clone --recursive https://github.com/TuGraph-family/tugraph-db.git\n$ cd tugraph-db\n$ deps/build_deps.sh\n$ mkdir build && cd build\n$ cmake .. -DOURSYSTEM=centos7\n$ make\n$ make package\n"})})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>c});var o=i(6540);const r={},t=o.createContext(r);function s(e){const n=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[2594],{5440:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>t,metadata:()=>c,toc:()=>a});var o=i(4848),r=i(8453);const t={},s="Compile",c={id:"installation&running/compile",title:"Compile",description:"This document mainly describes how to compile TuGraph from source code.",source:"@site/../docs/en-US/source/5.installation&running/6.compile.md",sourceDirName:"5.installation&running",slug:"/installation&running/compile",permalink:"/tugraph-db/en/installation&running/compile",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:6,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Cloud Deployment",permalink:"/tugraph-db/en/installation&running/cloud-deployment"},next:{title:"Tugraph Running",permalink:"/tugraph-db/en/installation&running/tugraph-running"}},l={},a=[{value:"1.Prerequisites",id:"1prerequisites",level:2},{value:"2.compile",id:"2compile",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"compile",children:"Compile"})}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"This document mainly describes how to compile TuGraph from source code."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"1prerequisites",children:"1.Prerequisites"}),"\n",(0,o.jsxs)(n.p,{children:["It is recommended to build TuGraph on a Linux system. Meanwhile, Docker is a good choice. If you want to set up a new environment, please refer to ",(0,o.jsx)(n.a,{href:"/tugraph-db/en/installation&running/docker-deployment",children:"Dockerfile"}),"\u3002"]}),"\n",(0,o.jsx)(n.h2,{id:"2compile",children:"2.compile"}),"\n",(0,o.jsx)(n.p,{children:"Here are steps to compile TuGraph:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["run ",(0,o.jsx)(n.code,{children:"deps/build_deps.sh"})," to build tugraph-web if you need. Skip this step otherwise."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"cmake .. -DOURSYSTEM=centos"})," or ",(0,o.jsx)(n.code,{children:"cmake .. -DOURSYSTEM=ubuntu"})]}),"\n",(0,o.jsxs)(n.li,{children:["If compiling on an arm machine (such as a Mac with M1 chip), add ",(0,o.jsx)(n.code,{children:"-DENABLE_BUILD_ON_AARCH64=ON"})]}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.code,{children:"make"})}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"make package"})," or ",(0,o.jsx)(n.code,{children:"cpack --config CPackConfig.cmake"})]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Example:\n",(0,o.jsx)(n.code,{children:"tugraph/tugraph-compile-centos7"}),"Docker environment"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ git clone --recursive https://github.com/TuGraph-family/tugraph-db.git\n$ cd tugraph-db\n$ deps/build_deps.sh\n$ mkdir build && cd build\n$ cmake .. -DOURSYSTEM=centos7\n$ make\n$ make package\n"})})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>s,x:()=>c});var o=i(6540);const r={},t=o.createContext(r);function s(e){const n=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9c8d271c.5282d178.js b/assets/js/9c8d271c.4a8a3f1b.js similarity index 99% rename from assets/js/9c8d271c.5282d178.js rename to assets/js/9c8d271c.4a8a3f1b.js index a6be0a9f4f..4dd512446c 100644 --- a/assets/js/9c8d271c.5282d178.js +++ b/assets/js/9c8d271c.4a8a3f1b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[1578],{4029:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>a});var r=t(4848),d=t(8453);const i={},s="TuGraph Roadmap",o={id:"contributor-manual/roadmap",title:"TuGraph Roadmap",description:"1. Introduction",source:"@site/../docs/en-US/source/12.contributor-manual/5.roadmap.md",sourceDirName:"12.contributor-manual",slug:"/contributor-manual/roadmap",permalink:"/tugraph-db/en/contributor-manual/roadmap",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Corporate Contributor License Agreement",permalink:"/tugraph-db/en/contributor-manual/corporate-cla"},next:{title:"Importing Data from Relational Databases to TuGraph",permalink:"/tugraph-db/en/best-practices/rdbms-to-tugraph"}},l={},a=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2. Completed Functionalities",id:"2-completed-functionalities",level:2},{value:"3. Functional Updates in 2024",id:"3-functional-updates-in-2024",level:2},{value:"4. Community Collaboration Features",id:"4-community-collaboration-features",level:2}];function c(n){const e={h1:"h1",h2:"h2",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,d.R)(),...n.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.header,{children:(0,r.jsx)(e.h1,{id:"tugraph-roadmap",children:"TuGraph Roadmap"})}),"\n",(0,r.jsx)(e.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,r.jsx)(e.p,{children:"This document outlines the future development plans for TuGraph, including features currently under development, those\nnot in the development pipeline, and completed functionalities not included in the open-source version."}),"\n",(0,r.jsx)(e.p,{children:"TuGraph aims to be an open-source, high-performance graph database. It adopts a centralized storage approach for graph\ndata and, in the short term, does not consider data sharding. Instead, it employs a master-slave replication mode to\naddress high-concurrency read scenarios, while utilizing cloud-based storage solutions to address storage capacity\nchallenges."}),"\n",(0,r.jsx)(e.h2,{id:"2-completed-functionalities",children:"2. Completed Functionalities"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph was open-sourced on September 1, 2022, and has received regular bug fixes and enhancements based on community\nfeedback."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Version"}),(0,r.jsx)(e.th,{children:"Functionality"}),(0,r.jsx)(e.th,{children:"Date"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.3.0"}),(0,r.jsx)(e.td,{children:"Initial open-source release"}),(0,r.jsx)(e.td,{children:"2022.9.1"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.3.1"}),(0,r.jsx)(e.td,{children:"Refactored graph analysis engine with multi-mode support"}),(0,r.jsx)(e.td,{children:"2022.10.14"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.3.2"}),(0,r.jsx)(e.td,{children:"Added OGM support and improved unit test coverage"}),(0,r.jsx)(e.td,{children:"2022.11.21"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.3.3"}),(0,r.jsx)(e.td,{children:"Iterative improvements to link authentication mechanism and addition of English documentation"}),(0,r.jsx)(e.td,{children:"2022.12.23"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.3.4"}),(0,r.jsx)(e.td,{children:"Cloud deployment support and streamlined LDBC SNB Audit process"}),(0,r.jsx)(e.td,{children:"2023.1.28"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.4.0"}),(0,r.jsx)(e.td,{children:"Added support for OLAP Python API and upgraded offline data import"}),(0,r.jsx)(e.td,{children:"2023.3.11"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.5.0"}),(0,r.jsx)(e.td,{children:"Introduced POG (Procedures On Graph query language), frontend upgrades"}),(0,r.jsx)(e.td,{children:"2023.6.5"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.5.1"}),(0,r.jsx)(e.td,{children:"Added learning engine, Procedure Rust API, and storage-property separation"}),(0,r.jsx)(e.td,{children:"2023.7.14"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.6.0"}),(0,r.jsx)(e.td,{children:"High availability support, log system upgrade"}),(0,r.jsx)(e.td,{children:"2023.8.11"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"4.0.0"}),(0,r.jsx)(e.td,{children:"ISO GQL support, 11 new open-source graph algorithms, m1 Docker support"}),(0,r.jsx)(e.td,{children:"2023.9.6"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"4.0.1"}),(0,r.jsx)(e.td,{children:"Support for temporal edge sorting, 5 new open-source graph algorithms"}),(0,r.jsx)(e.td,{children:"2023.9.28"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"4.1.0"}),(0,r.jsx)(e.td,{children:"Bolt protocol support, fast online full import, support for geospatial data types"}),(0,r.jsx)(e.td,{children:"2023.12.25"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:"In addition, TuGraph has established a comprehensive quality system, including automated unit testing, integration\ntesting, and performance testing."}),"\n",(0,r.jsx)(e.p,{children:'For more detailed information, refer to the "[root]/release/CHANGELOG.md" file in the source code directory.'}),"\n",(0,r.jsx)(e.h2,{id:"3-functional-updates-in-2024",children:"3. Functional Updates in 2024"}),"\n",(0,r.jsx)(e.p,{children:"In addition to the aforementioned core functionalities, the following components are planned for development in 2024."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Version"}),(0,r.jsx)(e.th,{children:"Functionality"}),(0,r.jsx)(e.th,{children:"Planned Date"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"4.2.x"}),(0,r.jsx)(e.td,{children:"HA support for Witness role and management tools"}),(0,r.jsx)(e.td,{children:"2024.3"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"4.2.x"}),(0,r.jsx)(e.td,{children:"Bolt support for stream processing and parameterized queries"}),(0,r.jsx)(e.td,{children:"2024.3"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"GeaX support for Cypher"}),(0,r.jsx)(e.td,{children:"2024.6"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Support for composite indexes"}),(0,r.jsx)(e.td,{children:"2024.6"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Optimization of data import functionality"}),(0,r.jsx)(e.td,{children:"2024.6"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"[Community Feature] Support for geospatial data types"}),(0,r.jsx)(e.td,{children:"2024.6"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Enhanced Cypher capabilities"}),(0,r.jsx)(e.td,{children:"2024.9"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Support for rapid schema changes"}),(0,r.jsx)(e.td,{children:"2024.9"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Vectorization support"}),(0,r.jsx)(e.td,{children:"2024.12"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"RPQ support"}),(0,r.jsx)(e.td,{children:"2024.12"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"[Optional] Query engine upgrade"}),(0,r.jsx)(e.td,{children:"2024.12"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"[Community Feature] Support for GraphAr"}),(0,r.jsx)(e.td,{children:"2024.12"})]})]})]}),"\n",(0,r.jsx)(e.h2,{id:"4-community-collaboration-features",children:"4. Community Collaboration Features"}),"\n",(0,r.jsx)(e.p,{children:"Currently, the development team's resources are limited, and we cannot implement all the desired features for TuGraph.\nHowever, during the feature planning process, we have identified a range of ideas worth exploring. The team has\nconducted some initial exploration, and we welcome community collaboration in developing the following features:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Version"}),(0,r.jsx)(e.th,{children:"Functionality"}),(0,r.jsx)(e.th,{children:"Planned Date"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Rich graph algorithm library"}),(0,r.jsx)(e.td,{children:"2024.x"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Support for default attribute values"}),(0,r.jsx)(e.td,{children:"2024.x"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Best practice of embedded TuGraph-DB usage"}),(0,r.jsx)(e.td,{children:"2024.x"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Support for transaction in Bolt clients"}),(0,r.jsx)(e.td,{children:"2024.x"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Support for composite data types like List, Map, and Decimal"}),(0,r.jsx)(e.td,{children:"2024.x"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Support of multiple storage engine"}),(0,r.jsx)(e.td,{children:"2024.x"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:'For simpler features, we will label them as "good first issue" on GitHub issues, and we welcome discussions from\ntechnology enthusiasts interested in graph databases.'})]})}function h(n={}){const{wrapper:e}={...(0,d.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(c,{...n})}):c(n)}},8453:(n,e,t)=>{t.d(e,{R:()=>s,x:()=>o});var r=t(6540);const d={},i=r.createContext(d);function s(n){const e=r.useContext(i);return r.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function o(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(d):n.components||d:s(n.components),r.createElement(i.Provider,{value:e},n.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[1578],{4029:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>o,toc:()=>a});var r=t(4848),d=t(8453);const i={},s="TuGraph Roadmap",o={id:"contributor-manual/roadmap",title:"TuGraph Roadmap",description:"1. Introduction",source:"@site/../docs/en-US/source/12.contributor-manual/5.roadmap.md",sourceDirName:"12.contributor-manual",slug:"/contributor-manual/roadmap",permalink:"/tugraph-db/en/contributor-manual/roadmap",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Corporate Contributor License Agreement",permalink:"/tugraph-db/en/contributor-manual/corporate-cla"},next:{title:"Importing Data from Relational Databases to TuGraph",permalink:"/tugraph-db/en/best-practices/rdbms-to-tugraph"}},l={},a=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2. Completed Functionalities",id:"2-completed-functionalities",level:2},{value:"3. Functional Updates in 2024",id:"3-functional-updates-in-2024",level:2},{value:"4. Community Collaboration Features",id:"4-community-collaboration-features",level:2}];function c(n){const e={h1:"h1",h2:"h2",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,d.R)(),...n.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(e.header,{children:(0,r.jsx)(e.h1,{id:"tugraph-roadmap",children:"TuGraph Roadmap"})}),"\n",(0,r.jsx)(e.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,r.jsx)(e.p,{children:"This document outlines the future development plans for TuGraph, including features currently under development, those\nnot in the development pipeline, and completed functionalities not included in the open-source version."}),"\n",(0,r.jsx)(e.p,{children:"TuGraph aims to be an open-source, high-performance graph database. It adopts a centralized storage approach for graph\ndata and, in the short term, does not consider data sharding. Instead, it employs a master-slave replication mode to\naddress high-concurrency read scenarios, while utilizing cloud-based storage solutions to address storage capacity\nchallenges."}),"\n",(0,r.jsx)(e.h2,{id:"2-completed-functionalities",children:"2. Completed Functionalities"}),"\n",(0,r.jsx)(e.p,{children:"TuGraph was open-sourced on September 1, 2022, and has received regular bug fixes and enhancements based on community\nfeedback."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Version"}),(0,r.jsx)(e.th,{children:"Functionality"}),(0,r.jsx)(e.th,{children:"Date"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.3.0"}),(0,r.jsx)(e.td,{children:"Initial open-source release"}),(0,r.jsx)(e.td,{children:"2022.9.1"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.3.1"}),(0,r.jsx)(e.td,{children:"Refactored graph analysis engine with multi-mode support"}),(0,r.jsx)(e.td,{children:"2022.10.14"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.3.2"}),(0,r.jsx)(e.td,{children:"Added OGM support and improved unit test coverage"}),(0,r.jsx)(e.td,{children:"2022.11.21"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.3.3"}),(0,r.jsx)(e.td,{children:"Iterative improvements to link authentication mechanism and addition of English documentation"}),(0,r.jsx)(e.td,{children:"2022.12.23"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.3.4"}),(0,r.jsx)(e.td,{children:"Cloud deployment support and streamlined LDBC SNB Audit process"}),(0,r.jsx)(e.td,{children:"2023.1.28"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.4.0"}),(0,r.jsx)(e.td,{children:"Added support for OLAP Python API and upgraded offline data import"}),(0,r.jsx)(e.td,{children:"2023.3.11"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.5.0"}),(0,r.jsx)(e.td,{children:"Introduced POG (Procedures On Graph query language), frontend upgrades"}),(0,r.jsx)(e.td,{children:"2023.6.5"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.5.1"}),(0,r.jsx)(e.td,{children:"Added learning engine, Procedure Rust API, and storage-property separation"}),(0,r.jsx)(e.td,{children:"2023.7.14"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"3.6.0"}),(0,r.jsx)(e.td,{children:"High availability support, log system upgrade"}),(0,r.jsx)(e.td,{children:"2023.8.11"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"4.0.0"}),(0,r.jsx)(e.td,{children:"ISO GQL support, 11 new open-source graph algorithms, m1 Docker support"}),(0,r.jsx)(e.td,{children:"2023.9.6"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"4.0.1"}),(0,r.jsx)(e.td,{children:"Support for temporal edge sorting, 5 new open-source graph algorithms"}),(0,r.jsx)(e.td,{children:"2023.9.28"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"4.1.0"}),(0,r.jsx)(e.td,{children:"Bolt protocol support, fast online full import, support for geospatial data types"}),(0,r.jsx)(e.td,{children:"2023.12.25"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:"In addition, TuGraph has established a comprehensive quality system, including automated unit testing, integration\ntesting, and performance testing."}),"\n",(0,r.jsx)(e.p,{children:'For more detailed information, refer to the "[root]/release/CHANGELOG.md" file in the source code directory.'}),"\n",(0,r.jsx)(e.h2,{id:"3-functional-updates-in-2024",children:"3. Functional Updates in 2024"}),"\n",(0,r.jsx)(e.p,{children:"In addition to the aforementioned core functionalities, the following components are planned for development in 2024."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Version"}),(0,r.jsx)(e.th,{children:"Functionality"}),(0,r.jsx)(e.th,{children:"Planned Date"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"4.2.x"}),(0,r.jsx)(e.td,{children:"HA support for Witness role and management tools"}),(0,r.jsx)(e.td,{children:"2024.3"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"4.2.x"}),(0,r.jsx)(e.td,{children:"Bolt support for stream processing and parameterized queries"}),(0,r.jsx)(e.td,{children:"2024.3"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"GeaX support for Cypher"}),(0,r.jsx)(e.td,{children:"2024.6"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Support for composite indexes"}),(0,r.jsx)(e.td,{children:"2024.6"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Optimization of data import functionality"}),(0,r.jsx)(e.td,{children:"2024.6"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"[Community Feature] Support for geospatial data types"}),(0,r.jsx)(e.td,{children:"2024.6"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Enhanced Cypher capabilities"}),(0,r.jsx)(e.td,{children:"2024.9"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Support for rapid schema changes"}),(0,r.jsx)(e.td,{children:"2024.9"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Vectorization support"}),(0,r.jsx)(e.td,{children:"2024.12"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"RPQ support"}),(0,r.jsx)(e.td,{children:"2024.12"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"[Optional] Query engine upgrade"}),(0,r.jsx)(e.td,{children:"2024.12"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"[Community Feature] Support for GraphAr"}),(0,r.jsx)(e.td,{children:"2024.12"})]})]})]}),"\n",(0,r.jsx)(e.h2,{id:"4-community-collaboration-features",children:"4. Community Collaboration Features"}),"\n",(0,r.jsx)(e.p,{children:"Currently, the development team's resources are limited, and we cannot implement all the desired features for TuGraph.\nHowever, during the feature planning process, we have identified a range of ideas worth exploring. The team has\nconducted some initial exploration, and we welcome community collaboration in developing the following features:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(e.table,{children:[(0,r.jsx)(e.thead,{children:(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.th,{children:"Version"}),(0,r.jsx)(e.th,{children:"Functionality"}),(0,r.jsx)(e.th,{children:"Planned Date"})]})}),(0,r.jsxs)(e.tbody,{children:[(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Rich graph algorithm library"}),(0,r.jsx)(e.td,{children:"2024.x"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Support for default attribute values"}),(0,r.jsx)(e.td,{children:"2024.x"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Best practice of embedded TuGraph-DB usage"}),(0,r.jsx)(e.td,{children:"2024.x"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Support for transaction in Bolt clients"}),(0,r.jsx)(e.td,{children:"2024.x"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Support for composite data types like List, Map, and Decimal"}),(0,r.jsx)(e.td,{children:"2024.x"})]}),(0,r.jsxs)(e.tr,{children:[(0,r.jsx)(e.td,{children:"x.x.x"}),(0,r.jsx)(e.td,{children:"Support of multiple storage engine"}),(0,r.jsx)(e.td,{children:"2024.x"})]})]})]}),"\n",(0,r.jsx)(e.p,{children:'For simpler features, we will label them as "good first issue" on GitHub issues, and we welcome discussions from\ntechnology enthusiasts interested in graph databases.'})]})}function h(n={}){const{wrapper:e}={...(0,d.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(c,{...n})}):c(n)}},8453:(n,e,t)=>{t.d(e,{R:()=>s,x:()=>o});var r=t(6540);const d={},i=r.createContext(d);function s(n){const e=r.useContext(i);return r.useMemo((function(){return"function"==typeof n?n(e):{...e,...n}}),[e,n])}function o(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(d):n.components||d:s(n.components),r.createElement(i.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/9d582788.f13b8533.js b/assets/js/9d582788.a06cb8e8.js similarity index 99% rename from assets/js/9d582788.f13b8533.js rename to assets/js/9d582788.a06cb8e8.js index 5859c1f6ff..42eb1e8d2b 100644 --- a/assets/js/9d582788.f13b8533.js +++ b/assets/js/9d582788.a06cb8e8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6194],{5925:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var i=n(4848),s=n(8453);const r={},a="OlapBase API",o={id:"olap&procedure/olap/olap-base-api",title:"OlapBase API",description:"This document will introduce how to use the OlapBase API",source:"@site/../docs/en-US/source/9.olap&procedure/2.olap/2.olap-base-api.md",sourceDirName:"9.olap&procedure/2.olap",slug:"/olap&procedure/olap/olap-base-api",permalink:"/tugraph-db/en/olap&procedure/olap/olap-base-api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Bootstrap program",permalink:"/tugraph-db/en/olap&procedure/olap/tutorial"},next:{title:"OlapOnDB API",permalink:"/tugraph-db/en/olap&procedure/olap/olap-on-db-api"}},l={},d=[{value:"1.The overview",id:"1the-overview",level:2},{value:"2.Configuration requirements",id:"2configuration-requirements",level:2},{value:"3.Atomic operations",id:"3atomic-operations",level:2},{value:"4.Vertex Class ParallelBitset",id:"4vertex-class-parallelbitset",level:2},{value:"4.1ParallelBitset Class",id:"41parallelbitset-class",level:3},{value:"5.Vertex Array Class ParallelVector",id:"5vertex-array-class-parallelvector",level:2},{value:"5.1.ParallelVector Class",id:"51parallelvector-class",level:3},{value:"6.Customize data structures",id:"6customize-data-structures",level:2},{value:"6.1.Basic data types",id:"61basic-data-types",level:3},{value:"6.2.Combining data structures",id:"62combining-data-structures",level:3},{value:"7.Graph class OlapBase",id:"7graph-class-olapbase",level:2},{value:"7.1.Basic Information",id:"71basic-information",level:3},{value:"7.2.node sets and edge sets and their related operations",id:"72node-sets-and-edge-sets-and-their-related-operations",level:3},{value:"7.3.Locking mechanism",id:"73locking-mechanism",level:3},{value:"7.4.Batch Processing Operations",id:"74batch-processing-operations",level:3}];function c(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"olapbase-api",children:"OlapBase API"})}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"This document will introduce how to use the OlapBase API"}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"1the-overview",children:"1.The overview"}),"\n",(0,i.jsx)(t.p,{children:"This manual will introduce the configuration of the TuGraph graph computing system. Combined with the code, several important files and interfaces in TuGraph are introduced."}),"\n",(0,i.jsx)(t.h2,{id:"2configuration-requirements",children:"2.Configuration requirements"}),"\n",(0,i.jsx)(t.p,{children:"To develop and compile applications using the TuGraph graph computing system, the configuration required:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"linux operating system, currently running successfully on Ubuntu16.04.2 and Centos7 systems."}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Compiler that supports C++ 14, requires GCC version 5.4.1 or later."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"3atomic-operations",children:"3.Atomic operations"}),"\n",(0,i.jsx)(t.p,{children:"TuGraph uses multi-threading technology for batch operations, in which case memory access conflicts may occur. In order to ensure the correctness of modification operations in parallel computing, TuGraph implements atomic operations. The code section can be found in the lgraph_atomic.cpp file under the lgraph folder."}),"\n",(0,i.jsx)(t.p,{children:'TuGraph also customizes 4 commonly used atomic operations. When we need to modify the data of vertices in multithreaded mode, we should use atomic operations to ensure the correctness of the modification operation in parallel environment. In addition to these four atomic operations, users can also use "cas" to build their own atomic operation functions.'}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"bool cas(T \\* ptr, T oldv, T newv)"})," : If the value pointed to by ptr is equal to oldv, the value pointed to by ptr is assigned to newv and returns true. Otherwise, false is returned"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"bool write_min(T \\*a, T b)"})," : If b is smaller than the value pointed to by a, then assign the value pointed to by a to b and return true, otherwise return false."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"bool write_max(T \\*a, T b)"})," : If b is larger than the value pointed to by a, then assign the value pointed to by a to b and return true, otherwise return false."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void write_add(T \\*a, T b)"})," : adds the value of b to the value pointed to by a."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void write_sub(T \\*a, T b)"})," : subtract the value of b from the value pointed to by a."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"4vertex-class-parallelbitset",children:"4.Vertex Class ParallelBitset"}),"\n",(0,i.jsx)(t.p,{children:"When using TuGraph for batch operations, you need to use a vertex set to represent the vertices you want to process. ParallelBitset implements a vertex collection class that represents vertices in bits and thus saves a significant amount of memory. The corresponding code can be found in the olap_base.h file in the lgraph folder."}),"\n",(0,i.jsx)(t.h3,{id:"41parallelbitset-class",children:"4.1ParallelBitset Class"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"size_t Size()"}),"\uff1aIndicates the number of vertices in the Bitmap."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"ParallelBitset(size_t size)"}),"\uff1aInitialize size and data, the length of data is (size >> 6)+1."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Clear()"}),"\uff1aclears the collection."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Fill()"}),"\uff1aadd all vertices to the set."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"bool Has(size_t i)"}),"\uff1acheck if vertex i is in the set."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"bool Add(size_t i)"}),"\uff1aadd vertex i to the set."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Swap(ParallelBitset &other)"}),"\uff1aexchange elements with another set of ParallelBitset."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"5vertex-array-class-parallelvector",children:"5.Vertex Array Class ParallelVector"}),"\n",(0,i.jsx)(t.p,{children:"When using TuGraph for batch operations, you need to use an array of vertices to represent the result of processing vertices. ParallelVector implements the vertex array class. The corresponding code can be found in the olap_base.h file in the lgraph folder."}),"\n",(0,i.jsx)(t.h3,{id:"51parallelvector-class",children:"5.1.ParallelVector Class"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"ParallelVector(size_t capacity)"})," Builds ParallelVector. capacity is the initial size of the vertex array"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"T& operator[](size_t i)"})," : data with subscript i"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"T \\*begin()"})," : ParallelVector the starting pointer"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"T \\*end()"})," : ParallelVector the end pointer to Parallelvector. begin and end are similar to the begin and end Pointers of a vector. You can use these Pointers to access an array sequentially"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"T&Back ()"})," : ParallelVector the last data"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"T \\*Data()"})," : represents the data in the array itself"]}),"\n",(0,i.jsx)(t.li,{children:"`void Destroy()' : empty the ParallelVector array and delete the array"}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"size_t Size()"})," : indicates the number of data in ParallelVector"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"size_t Capacity()"})," : indicates the capacity of ParallelVector"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Resize(size_t size)"})," : Change ParallelVector to size, which must be greater than or equal to the size before the change"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Clear()"})," : empty the data in ParallelVector"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void ReAlloc(size_t capacity)"})," : ParallelVector is allocated with new capacity. If data exists in the array, it is migrated to the new memory"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Fill(T elem)"})," : Assign elem to all data on ParallelVector"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Append(const T&elem, bool atomic = true)"})," : Add a piece of data at the end of ParallelVector"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Swap(ParallelVector &other)"})," : to exchange data with other parallelvectors"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"ParallelVector Copy()"})," : copies the current ParallelVector data into the Copy array"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"6customize-data-structures",children:"6.Customize data structures"}),"\n",(0,i.jsx)(t.h3,{id:"61basic-data-types",children:"6.1.Basic data types"}),"\n",(0,i.jsx)(t.p,{children:"We customize the data structure representation of points and edges to save memory space while covering all vertices:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"'Empty' : indicates a special data type with empty content."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"62combining-data-structures",children:"6.2.Combining data structures"}),"\n",(0,i.jsx)(t.p,{children:"In order to facilitate calculation, we define several data structures of point and edge data according to different calculation scenarios, which are as follows:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"EdgeUnit"})," : represents an edge of weight type EdgeData, used to parse the input file, and contains three member variables:"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"size_t src"})," : the starting vertex of an edge"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"size_t dst"})," : the end of an edge"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"EdgeData edge_data"})," : edge weight"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"AdjUnit"})," : represents an edge of weight type EdgeData, used during batch computation, and contains two member variables:"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"size_t neighbour"})," : indicates the neighbor vertex of an edge"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"EdgeData edge_data"})," : edge weight"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"AdjList"})," : Adjacency list of vertices with weights of type EdgeData, often used to represent the set of incoming and outgoing edges of vertices and containing two member variables:"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"AdjUnit \\* begin"})," : indicates the start pointer of the list"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"AdjUnit \\* end"})," : The end pointer of the list. begin and end are similar to the begin and end Pointers of a vector. You can use these Pointers to loop through the adjacency list."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"7graph-class-olapbase",children:"7.Graph class OlapBase"}),"\n",(0,i.jsx)(t.p,{children:"Graph class OlapBase is the main class for TuGraph to load graphs and calculate graphs. OlapBase is commonly used to represent graphs with weights of type EdgeData. See olap_base.hpp under lgraph folder for the code. This chapter covers the types and API interfaces commonly used in Graph classes. The classes used by the Procedure, Embed, and Standalone functions described above are all subclasses of this class."}),"\n",(0,i.jsx)(t.h3,{id:"71basic-information",children:"7.1.Basic Information"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"size_t NumVertices()"})," : obtains the number of vertices"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"size_t NumEdges()"})," : Gets the number of edges"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"size_t OutDegree(size_t vid)"})," : indicates the outdegree of the vid of the vertex"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"size_t InDegree(size_t vid)"})," : indicates the input degree of vertex vid"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"72node-sets-and-edge-sets-and-their-related-operations",children:"7.2.node sets and edge sets and their related operations"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"ParallelVector AllocVertexArray()"})," : Allocates an array of type VertexData with size as the number of vertices"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"void fill_vertex_array(V \\* array, V value)"})," : assigns values to all elements in the array"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"ParallelBitset AllocVertexSubset()"})," : Assigns a subset of ParallelBitsets to denote whether the state of all vertices is activated"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"AdjList OutEdges(size_t vid)'"}),": gets the set of all outgoing edges of vertex v"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"AdjList InEdges(size_t vid)"})," : Obtains the set of all incoming edges of vertex v"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"void Transpose()"})," : transpose of a directed graph"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"LoadFromArray(char \\* edge_array, VertexId input_vertices, EdgeId input_edges, EdgeDirectionPolicy (edge_direction_policy) "}),": Loads the graph data from the array, contains four parameters, the meaning of which are respectively:"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"edge_array"})," : reads the data from the array into the graph. Normally, the array contains multiple edges."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"input_vertices"}),": specifies the number of vertices read into the graph by the array."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"input_edges"})," : specifies the number of edges that the array reads into the image."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"edge_direction_policy"})," : indicates that the graph is directed or undirected. The graph can be divided into three modes: DUAL_DIRECTION, MAKE_SYMMETRIC, and INPUT_SYMMETRIC. For details, see 'enum EdgeDirectionPolicy' in the config.h file in the core folder."]}),"\n",(0,i.jsx)(t.h3,{id:"73locking-mechanism",children:"7.3.Locking mechanism"}),"\n",(0,i.jsx)(t.p,{children:"TuGraph implements a pair of locks to control the program's access to vertex data. Respectively is:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void AcquireVertexLock(size_t vid)"})," : locks a vertex vid and prohibits other threads from accessing the vertex data corresponding to this lock"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void ReleaseVertexLock(size_t vid)"})," : unlocks the vertex vid and all threads can access the vertex data corresponding to the lock"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"VertexLockGuard GuardVertexLock(size_t vid)"})," : When the vid operation is performed, the vertex vid is locked, and the lock is automatically released upon exiting the scope"]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"74batch-processing-operations",children:"7.4.Batch Processing Operations"}),"\n",(0,i.jsx)(t.p,{children:"TuGraph provides two batch operations to do a point-centered batch process in parallel. Respectively is:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-c++",children:'/*\n Function Name:ReducedSum ProcessVertexInRange(std::function work, size_t lower, size_t upper,\n ReducedSum zero = 0,std::function reduce =reduce_plus)\n\n The work function executes the work function on nodes whose numbers are between lower and upper in the Graph. The fourth parameter indicates the accumulated base, which defaults to 0.The fifth parameter indicates that the iteration reduce function operation is performed on the return value of each node processed by work, and the default operation is the accumulation operation.\nFor details, please refer to include/lgraph/olap_base.h\n\n Example: Count the number of vertices in the parent array that have outgoing edges\n*/\n\nauto vertex_num = graph.ProcessVertexInRange(\n [&](size_t i) {\n if (graph.OutDegree(parent[i]) > 0) {\n return 1;\n }\n },\n 0, parent.Size()\n);\nprintf("the number is %lu\\n",vertex_num);\n'})}),"\n",(0,i.jsx)(t.p,{children:"graph is the instantiated object of graph class OlapBase"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-C++",children:'/*\n Function Name:ReducedSum ProcessVertexActive(std::function work, ParallelBitset &active_vertices,\n ReducedSum zero = 0,std::function reduce =reduce_plus)\n\n Function: Execute the work function for the node that corresponds to 1 in active_vertices. The third parameter represents the cumulative cardinality, which is 0 by default.\n\n The fourth parameter indicates that the iteration reduce function operation is performed on the return value of each node processed by work, and the default operation is the accumulation operation.\n\n For specific implementation, please refer to the specific code in /include/lgraph/olap_base\n\n\n\n Example: Output all the out-degree neighbors of nodes 1, 2, and 3 in the Graph, and count the total out-degree of these three nodes\n*/\n\nauto active_in = graph.AllocVertexSubset();\nactive_in.Add(1);\nactive_in.Add(2);\nactive_in.Add(3);\nauto total_outdegree = graph.ProcessVertexActive(\n [&](size_t vi) {\n size_t local_outdegree = 0;\n for (auto & edge : graph.OutEdges(vi)) {\n size_t dst = edge.neighbour;\n printf("node %lu has neighbour %lu\\n",vi,dst);\n local_outdegree += 1;\n }\n return local_outdegree;\n },\n active_in\n);\nprintf("total outdegree of node1,2,3 is %lu\\n",total_outdegree);\n'})})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>o});var i=n(6540);const s={},r=i.createContext(s);function a(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6194],{5925:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>d});var i=n(4848),s=n(8453);const r={},a="OlapBase API",o={id:"olap&procedure/olap/olap-base-api",title:"OlapBase API",description:"This document will introduce how to use the OlapBase API",source:"@site/../docs/en-US/source/9.olap&procedure/2.olap/2.olap-base-api.md",sourceDirName:"9.olap&procedure/2.olap",slug:"/olap&procedure/olap/olap-base-api",permalink:"/tugraph-db/en/olap&procedure/olap/olap-base-api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Bootstrap program",permalink:"/tugraph-db/en/olap&procedure/olap/tutorial"},next:{title:"OlapOnDB API",permalink:"/tugraph-db/en/olap&procedure/olap/olap-on-db-api"}},l={},d=[{value:"1.The overview",id:"1the-overview",level:2},{value:"2.Configuration requirements",id:"2configuration-requirements",level:2},{value:"3.Atomic operations",id:"3atomic-operations",level:2},{value:"4.Vertex Class ParallelBitset",id:"4vertex-class-parallelbitset",level:2},{value:"4.1ParallelBitset Class",id:"41parallelbitset-class",level:3},{value:"5.Vertex Array Class ParallelVector",id:"5vertex-array-class-parallelvector",level:2},{value:"5.1.ParallelVector Class",id:"51parallelvector-class",level:3},{value:"6.Customize data structures",id:"6customize-data-structures",level:2},{value:"6.1.Basic data types",id:"61basic-data-types",level:3},{value:"6.2.Combining data structures",id:"62combining-data-structures",level:3},{value:"7.Graph class OlapBase",id:"7graph-class-olapbase",level:2},{value:"7.1.Basic Information",id:"71basic-information",level:3},{value:"7.2.node sets and edge sets and their related operations",id:"72node-sets-and-edge-sets-and-their-related-operations",level:3},{value:"7.3.Locking mechanism",id:"73locking-mechanism",level:3},{value:"7.4.Batch Processing Operations",id:"74batch-processing-operations",level:3}];function c(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"olapbase-api",children:"OlapBase API"})}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:"This document will introduce how to use the OlapBase API"}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"1the-overview",children:"1.The overview"}),"\n",(0,i.jsx)(t.p,{children:"This manual will introduce the configuration of the TuGraph graph computing system. Combined with the code, several important files and interfaces in TuGraph are introduced."}),"\n",(0,i.jsx)(t.h2,{id:"2configuration-requirements",children:"2.Configuration requirements"}),"\n",(0,i.jsx)(t.p,{children:"To develop and compile applications using the TuGraph graph computing system, the configuration required:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"linux operating system, currently running successfully on Ubuntu16.04.2 and Centos7 systems."}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsx)(t.p,{children:"Compiler that supports C++ 14, requires GCC version 5.4.1 or later."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"3atomic-operations",children:"3.Atomic operations"}),"\n",(0,i.jsx)(t.p,{children:"TuGraph uses multi-threading technology for batch operations, in which case memory access conflicts may occur. In order to ensure the correctness of modification operations in parallel computing, TuGraph implements atomic operations. The code section can be found in the lgraph_atomic.cpp file under the lgraph folder."}),"\n",(0,i.jsx)(t.p,{children:'TuGraph also customizes 4 commonly used atomic operations. When we need to modify the data of vertices in multithreaded mode, we should use atomic operations to ensure the correctness of the modification operation in parallel environment. In addition to these four atomic operations, users can also use "cas" to build their own atomic operation functions.'}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"bool cas(T \\* ptr, T oldv, T newv)"})," : If the value pointed to by ptr is equal to oldv, the value pointed to by ptr is assigned to newv and returns true. Otherwise, false is returned"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"bool write_min(T \\*a, T b)"})," : If b is smaller than the value pointed to by a, then assign the value pointed to by a to b and return true, otherwise return false."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"bool write_max(T \\*a, T b)"})," : If b is larger than the value pointed to by a, then assign the value pointed to by a to b and return true, otherwise return false."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void write_add(T \\*a, T b)"})," : adds the value of b to the value pointed to by a."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void write_sub(T \\*a, T b)"})," : subtract the value of b from the value pointed to by a."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"4vertex-class-parallelbitset",children:"4.Vertex Class ParallelBitset"}),"\n",(0,i.jsx)(t.p,{children:"When using TuGraph for batch operations, you need to use a vertex set to represent the vertices you want to process. ParallelBitset implements a vertex collection class that represents vertices in bits and thus saves a significant amount of memory. The corresponding code can be found in the olap_base.h file in the lgraph folder."}),"\n",(0,i.jsx)(t.h3,{id:"41parallelbitset-class",children:"4.1ParallelBitset Class"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"size_t Size()"}),"\uff1aIndicates the number of vertices in the Bitmap."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"ParallelBitset(size_t size)"}),"\uff1aInitialize size and data, the length of data is (size >> 6)+1."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Clear()"}),"\uff1aclears the collection."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Fill()"}),"\uff1aadd all vertices to the set."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"bool Has(size_t i)"}),"\uff1acheck if vertex i is in the set."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"bool Add(size_t i)"}),"\uff1aadd vertex i to the set."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Swap(ParallelBitset &other)"}),"\uff1aexchange elements with another set of ParallelBitset."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"5vertex-array-class-parallelvector",children:"5.Vertex Array Class ParallelVector"}),"\n",(0,i.jsx)(t.p,{children:"When using TuGraph for batch operations, you need to use an array of vertices to represent the result of processing vertices. ParallelVector implements the vertex array class. The corresponding code can be found in the olap_base.h file in the lgraph folder."}),"\n",(0,i.jsx)(t.h3,{id:"51parallelvector-class",children:"5.1.ParallelVector Class"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"ParallelVector(size_t capacity)"})," Builds ParallelVector. capacity is the initial size of the vertex array"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"T& operator[](size_t i)"})," : data with subscript i"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"T \\*begin()"})," : ParallelVector the starting pointer"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"T \\*end()"})," : ParallelVector the end pointer to Parallelvector. begin and end are similar to the begin and end Pointers of a vector. You can use these Pointers to access an array sequentially"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"T&Back ()"})," : ParallelVector the last data"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"T \\*Data()"})," : represents the data in the array itself"]}),"\n",(0,i.jsx)(t.li,{children:"`void Destroy()' : empty the ParallelVector array and delete the array"}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"size_t Size()"})," : indicates the number of data in ParallelVector"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"size_t Capacity()"})," : indicates the capacity of ParallelVector"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Resize(size_t size)"})," : Change ParallelVector to size, which must be greater than or equal to the size before the change"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Clear()"})," : empty the data in ParallelVector"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void ReAlloc(size_t capacity)"})," : ParallelVector is allocated with new capacity. If data exists in the array, it is migrated to the new memory"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Fill(T elem)"})," : Assign elem to all data on ParallelVector"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Append(const T&elem, bool atomic = true)"})," : Add a piece of data at the end of ParallelVector"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void Swap(ParallelVector &other)"})," : to exchange data with other parallelvectors"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"ParallelVector Copy()"})," : copies the current ParallelVector data into the Copy array"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"6customize-data-structures",children:"6.Customize data structures"}),"\n",(0,i.jsx)(t.h3,{id:"61basic-data-types",children:"6.1.Basic data types"}),"\n",(0,i.jsx)(t.p,{children:"We customize the data structure representation of points and edges to save memory space while covering all vertices:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"'Empty' : indicates a special data type with empty content."}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"62combining-data-structures",children:"6.2.Combining data structures"}),"\n",(0,i.jsx)(t.p,{children:"In order to facilitate calculation, we define several data structures of point and edge data according to different calculation scenarios, which are as follows:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"EdgeUnit"})," : represents an edge of weight type EdgeData, used to parse the input file, and contains three member variables:"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"size_t src"})," : the starting vertex of an edge"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"size_t dst"})," : the end of an edge"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"EdgeData edge_data"})," : edge weight"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"AdjUnit"})," : represents an edge of weight type EdgeData, used during batch computation, and contains two member variables:"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"size_t neighbour"})," : indicates the neighbor vertex of an edge"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"EdgeData edge_data"})," : edge weight"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"AdjList"})," : Adjacency list of vertices with weights of type EdgeData, often used to represent the set of incoming and outgoing edges of vertices and containing two member variables:"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"AdjUnit \\* begin"})," : indicates the start pointer of the list"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"AdjUnit \\* end"})," : The end pointer of the list. begin and end are similar to the begin and end Pointers of a vector. You can use these Pointers to loop through the adjacency list."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"7graph-class-olapbase",children:"7.Graph class OlapBase"}),"\n",(0,i.jsx)(t.p,{children:"Graph class OlapBase is the main class for TuGraph to load graphs and calculate graphs. OlapBase is commonly used to represent graphs with weights of type EdgeData. See olap_base.hpp under lgraph folder for the code. This chapter covers the types and API interfaces commonly used in Graph classes. The classes used by the Procedure, Embed, and Standalone functions described above are all subclasses of this class."}),"\n",(0,i.jsx)(t.h3,{id:"71basic-information",children:"7.1.Basic Information"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"size_t NumVertices()"})," : obtains the number of vertices"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"size_t NumEdges()"})," : Gets the number of edges"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"size_t OutDegree(size_t vid)"})," : indicates the outdegree of the vid of the vertex"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"size_t InDegree(size_t vid)"})," : indicates the input degree of vertex vid"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"72node-sets-and-edge-sets-and-their-related-operations",children:"7.2.node sets and edge sets and their related operations"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"ParallelVector AllocVertexArray()"})," : Allocates an array of type VertexData with size as the number of vertices"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"void fill_vertex_array(V \\* array, V value)"})," : assigns values to all elements in the array"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"ParallelBitset AllocVertexSubset()"})," : Assigns a subset of ParallelBitsets to denote whether the state of all vertices is activated"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"AdjList OutEdges(size_t vid)'"}),": gets the set of all outgoing edges of vertex v"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"AdjList InEdges(size_t vid)"})," : Obtains the set of all incoming edges of vertex v"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"void Transpose()"})," : transpose of a directed graph"]}),"\n"]}),"\n",(0,i.jsxs)(t.li,{children:["\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"LoadFromArray(char \\* edge_array, VertexId input_vertices, EdgeId input_edges, EdgeDirectionPolicy (edge_direction_policy) "}),": Loads the graph data from the array, contains four parameters, the meaning of which are respectively:"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"edge_array"})," : reads the data from the array into the graph. Normally, the array contains multiple edges."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"input_vertices"}),": specifies the number of vertices read into the graph by the array."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"input_edges"})," : specifies the number of edges that the array reads into the image."]}),"\n",(0,i.jsxs)(t.p,{children:[(0,i.jsx)(t.code,{children:"edge_direction_policy"})," : indicates that the graph is directed or undirected. The graph can be divided into three modes: DUAL_DIRECTION, MAKE_SYMMETRIC, and INPUT_SYMMETRIC. For details, see 'enum EdgeDirectionPolicy' in the config.h file in the core folder."]}),"\n",(0,i.jsx)(t.h3,{id:"73locking-mechanism",children:"7.3.Locking mechanism"}),"\n",(0,i.jsx)(t.p,{children:"TuGraph implements a pair of locks to control the program's access to vertex data. Respectively is:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void AcquireVertexLock(size_t vid)"})," : locks a vertex vid and prohibits other threads from accessing the vertex data corresponding to this lock"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"void ReleaseVertexLock(size_t vid)"})," : unlocks the vertex vid and all threads can access the vertex data corresponding to the lock"]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"VertexLockGuard GuardVertexLock(size_t vid)"})," : When the vid operation is performed, the vertex vid is locked, and the lock is automatically released upon exiting the scope"]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"74batch-processing-operations",children:"7.4.Batch Processing Operations"}),"\n",(0,i.jsx)(t.p,{children:"TuGraph provides two batch operations to do a point-centered batch process in parallel. Respectively is:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-c++",children:'/*\n Function Name:ReducedSum ProcessVertexInRange(std::function work, size_t lower, size_t upper,\n ReducedSum zero = 0,std::function reduce =reduce_plus)\n\n The work function executes the work function on nodes whose numbers are between lower and upper in the Graph. The fourth parameter indicates the accumulated base, which defaults to 0.The fifth parameter indicates that the iteration reduce function operation is performed on the return value of each node processed by work, and the default operation is the accumulation operation.\nFor details, please refer to include/lgraph/olap_base.h\n\n Example: Count the number of vertices in the parent array that have outgoing edges\n*/\n\nauto vertex_num = graph.ProcessVertexInRange(\n [&](size_t i) {\n if (graph.OutDegree(parent[i]) > 0) {\n return 1;\n }\n },\n 0, parent.Size()\n);\nprintf("the number is %lu\\n",vertex_num);\n'})}),"\n",(0,i.jsx)(t.p,{children:"graph is the instantiated object of graph class OlapBase"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-C++",children:'/*\n Function Name:ReducedSum ProcessVertexActive(std::function work, ParallelBitset &active_vertices,\n ReducedSum zero = 0,std::function reduce =reduce_plus)\n\n Function: Execute the work function for the node that corresponds to 1 in active_vertices. The third parameter represents the cumulative cardinality, which is 0 by default.\n\n The fourth parameter indicates that the iteration reduce function operation is performed on the return value of each node processed by work, and the default operation is the accumulation operation.\n\n For specific implementation, please refer to the specific code in /include/lgraph/olap_base\n\n\n\n Example: Output all the out-degree neighbors of nodes 1, 2, and 3 in the Graph, and count the total out-degree of these three nodes\n*/\n\nauto active_in = graph.AllocVertexSubset();\nactive_in.Add(1);\nactive_in.Add(2);\nactive_in.Add(3);\nauto total_outdegree = graph.ProcessVertexActive(\n [&](size_t vi) {\n size_t local_outdegree = 0;\n for (auto & edge : graph.OutEdges(vi)) {\n size_t dst = edge.neighbour;\n printf("node %lu has neighbour %lu\\n",vi,dst);\n local_outdegree += 1;\n }\n return local_outdegree;\n },\n active_in\n);\nprintf("total outdegree of node1,2,3 is %lu\\n",total_outdegree);\n'})})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>o});var i=n(6540);const s={},r=i.createContext(s);function a(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9f7ad7a9.4070ff00.js b/assets/js/9f7ad7a9.29558be6.js similarity index 98% rename from assets/js/9f7ad7a9.4070ff00.js rename to assets/js/9f7ad7a9.29558be6.js index f1c7adfcd1..4bc980d506 100644 --- a/assets/js/9f7ad7a9.4070ff00.js +++ b/assets/js/9f7ad7a9.29558be6.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6919],{1668:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>d,default:()=>c,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var r=n(4848),i=n(8453);const a={},d="Demo The World",s={id:"quick-start/demo/round-the-world",title:"Demo:Round The World",description:"This document mainly introduces the usage of the round-the-world demo.",source:"@site/../docs/en-US/source/3.quick-start/2.demo/5.round-the-world.md",sourceDirName:"3.quick-start/2.demo",slug:"/quick-start/demo/round-the-world",permalink:"/tugraph-db/en/quick-start/demo/round-the-world",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Three Kingdoms",permalink:"/tugraph-db/en/quick-start/demo/three-kingdoms"},next:{title:"TuGraph Browser",permalink:"/tugraph-db/en/user-guide/tugraph-browser"}},o={},l=[{value:"Brief",id:"brief",level:2},{value:"Example",id:"example",level:2},{value:"Login Page",id:"login-page",level:3},{value:"Query Page",id:"query-page",level:3},{value:"Query Example",id:"query-example",level:3}];function h(e){const t={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"demo-the-world",children:"Demo:Round The World"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"This document mainly introduces the usage of the round-the-world demo."}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"brief",children:"Brief"}),"\n",(0,r.jsx)(t.p,{children:'Based on the virtual background of "Around the World in 80 Days" and partial public historical flight data, it helps users design optimal flight plans for multiple cities.'}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Demo designed custom website service"}),"\n",(0,r.jsx)(t.li,{children:"The data source is a foreign open source website and does not include mainland city flight data"}),"\n",(0,r.jsx)(t.li,{children:"The flight prices in the data are simulated data and do not represent real prices."}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"example",children:"Example"}),"\n",(0,r.jsx)(t.h3,{id:"login-page",children:"Login Page"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"data",src:n(5941).A+"",width:"2556",height:"1358"})}),"\n",(0,r.jsx)(t.h3,{id:"query-page",children:"Query Page"}),"\n",(0,r.jsx)(t.p,{children:"Click on the login page to enter the query page."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"data",src:n(5662).A+"",width:"2558",height:"1361"})}),"\n",(0,r.jsx)(t.h3,{id:"query-example",children:"Query Example"}),"\n",(0,r.jsx)(t.p,{children:"Select no more than 8 cities from the city list in the lower left corner, click Query to return the recommended flight plan, and return the 10 path plans with the lowest cost and shortest flight time, provided that the interval between previous and later flights is 2-6 hours."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"data",src:n(7960).A+"",width:"2557",height:"1360"})}),"\n",(0,r.jsxs)(t.p,{children:["For detailed instructions, see the ",(0,r.jsx)(t.a,{href:"https://github.com/TuGraph-family/tugraph-db-demo/tree/main/round_the_world",children:"Round The World Demo"})," document."]})]})}function c(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},5662:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/flight_page-52024a09a0e4385775cfe4b1a1c94016.jpg"},5941:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/main_page-482d2f905c0e41f6410f7d21a9bc37de.jpg"},7960:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/search_example-39f5b10fdbf276e8025bbf2f3e27d468.jpg"},8453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>s});var r=n(6540);const i={},a=r.createContext(i);function d(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6919],{1668:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>d,default:()=>c,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var r=n(4848),i=n(8453);const a={},d="Demo The World",s={id:"quick-start/demo/round-the-world",title:"Demo:Round The World",description:"This document mainly introduces the usage of the round-the-world demo.",source:"@site/../docs/en-US/source/3.quick-start/2.demo/5.round-the-world.md",sourceDirName:"3.quick-start/2.demo",slug:"/quick-start/demo/round-the-world",permalink:"/tugraph-db/en/quick-start/demo/round-the-world",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Three Kingdoms",permalink:"/tugraph-db/en/quick-start/demo/three-kingdoms"},next:{title:"TuGraph Browser",permalink:"/tugraph-db/en/user-guide/tugraph-browser"}},o={},l=[{value:"Brief",id:"brief",level:2},{value:"Example",id:"example",level:2},{value:"Login Page",id:"login-page",level:3},{value:"Query Page",id:"query-page",level:3},{value:"Query Example",id:"query-example",level:3}];function h(e){const t={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"demo-the-world",children:"Demo:Round The World"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"This document mainly introduces the usage of the round-the-world demo."}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"brief",children:"Brief"}),"\n",(0,r.jsx)(t.p,{children:'Based on the virtual background of "Around the World in 80 Days" and partial public historical flight data, it helps users design optimal flight plans for multiple cities.'}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Demo designed custom website service"}),"\n",(0,r.jsx)(t.li,{children:"The data source is a foreign open source website and does not include mainland city flight data"}),"\n",(0,r.jsx)(t.li,{children:"The flight prices in the data are simulated data and do not represent real prices."}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"example",children:"Example"}),"\n",(0,r.jsx)(t.h3,{id:"login-page",children:"Login Page"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"data",src:n(5941).A+"",width:"2556",height:"1358"})}),"\n",(0,r.jsx)(t.h3,{id:"query-page",children:"Query Page"}),"\n",(0,r.jsx)(t.p,{children:"Click on the login page to enter the query page."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"data",src:n(5662).A+"",width:"2558",height:"1361"})}),"\n",(0,r.jsx)(t.h3,{id:"query-example",children:"Query Example"}),"\n",(0,r.jsx)(t.p,{children:"Select no more than 8 cities from the city list in the lower left corner, click Query to return the recommended flight plan, and return the 10 path plans with the lowest cost and shortest flight time, provided that the interval between previous and later flights is 2-6 hours."}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"data",src:n(7960).A+"",width:"2557",height:"1360"})}),"\n",(0,r.jsxs)(t.p,{children:["For detailed instructions, see the ",(0,r.jsx)(t.a,{href:"https://github.com/TuGraph-family/tugraph-db-demo/tree/main/round_the_world",children:"Round The World Demo"})," document."]})]})}function c(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},5662:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/flight_page-52024a09a0e4385775cfe4b1a1c94016.jpg"},5941:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/main_page-482d2f905c0e41f6410f7d21a9bc37de.jpg"},7960:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/search_example-39f5b10fdbf276e8025bbf2f3e27d468.jpg"},8453:(e,t,n)=>{n.d(t,{R:()=>d,x:()=>s});var r=n(6540);const i={},a=r.createContext(i);function d(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:d(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a30dc11a.485c65f4.js b/assets/js/a30dc11a.e94a0bdf.js similarity index 99% rename from assets/js/a30dc11a.485c65f4.js rename to assets/js/a30dc11a.e94a0bdf.js index 22ea57a3ee..822255b9e2 100644 --- a/assets/js/a30dc11a.485c65f4.js +++ b/assets/js/a30dc11a.e94a0bdf.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8973],{74:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var r=i(4848),a=i(8453);const o={},t="Docker Deployment",s={id:"installation&running/docker-deployment",title:"Docker Deployment",description:"This document introduces the creation and download of Docker images for TuGraph Compile and TuGraph Runtime.",source:"@site/../docs/en-US/source/5.installation&running/3.docker-deployment.md",sourceDirName:"5.installation&running",slug:"/installation&running/docker-deployment",permalink:"/tugraph-db/en/installation&running/docker-deployment",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Environment Mode",permalink:"/tugraph-db/en/installation&running/environment-mode"},next:{title:"Local Package Deployment",permalink:"/tugraph-db/en/installation&running/local-package-deployment"}},c={},l=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Existing Docker Images",id:"2existing-docker-images",level:2},{value:"2.1.Image Download",id:"21image-download",level:3},{value:"2.2.Naming Convention",id:"22naming-convention",level:3},{value:"2.2.1.TuGraph Compile Image",id:"221tugraph-compile-image",level:4},{value:"2.2.2.TuGraph Runtime Image",id:"222tugraph-runtime-image",level:4},{value:"2.2.3.TuGraph Mini Runtime Image",id:"223tugraph-mini-runtime-image",level:4},{value:"2.3.Common Docker Operations",id:"23common-docker-operations",level:3},{value:"2.4. M1 Supports",id:"24-m1-supports",level:3},{value:"2.5. Running service",id:"25-running-service",level:3},{value:"3. Best Practice in Using and Developing Docker Images for TuGraph-DB",id:"3-best-practice-in-using-and-developing-docker-images-for-tugraph-db",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"docker-deployment",children:"Docker Deployment"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"This document introduces the creation and download of Docker images for TuGraph Compile and TuGraph Runtime."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"TuGraph Compile Image: Provides a compilation environment and can be used for TuGraph compilation and testing."}),"\n",(0,r.jsx)(n.li,{children:"TuGraph Runtime Image: Provides a binary executable environment with TuGraph library and executable files."}),"\n",(0,r.jsx)(n.li,{children:"TuGraph Mini Runtime Image: Provides a binary executable environment without Java and Python functions in TuGraph, no C++ plugin compilation and execution, only so upload."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"2existing-docker-images",children:"2.Existing Docker Images"}),"\n",(0,r.jsx)(n.h3,{id:"21image-download",children:"2.1.Image Download"}),"\n",(0,r.jsxs)(n.p,{children:["The images are hosted on ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/u/tugraph",children:"DockerHub"})," and can be downloaded and used directly."]}),"\n",(0,r.jsxs)(n.p,{children:["For the latest version of Docker address, see the TuGraph-Latest-Version section in ",(0,r.jsx)(n.a,{href:"../../1.guide.md",children:"Guide"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"22naming-convention",children:"2.2.Naming Convention"}),"\n",(0,r.jsx)(n.h4,{id:"221tugraph-compile-image",children:"2.2.1.TuGraph Compile Image"}),"\n",(0,r.jsx)(n.p,{children:"Provides a compilation environment and can be used for TuGraph compilation."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"tugraph/tugraph-compile-[os name & version]:[tugraph compile version]"})}),"\n",(0,r.jsxs)(n.p,{children:["For example: ",(0,r.jsx)(n.code,{children:"tugraph/tugraph-compile-centos7:1.2.0"})]}),"\n",(0,r.jsx)(n.h4,{id:"222tugraph-runtime-image",children:"2.2.2.TuGraph Runtime Image"}),"\n",(0,r.jsx)(n.p,{children:"Provides a binary executable environment with TuGraph library and executable files."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"tugraph/tugraph-runtime-[os name & version]:[tugraph-runtime version]"})}),"\n",(0,r.jsxs)(n.p,{children:["For example:",(0,r.jsx)(n.code,{children:"tugraph/tugraph-runtime-centos7:3.4.0"})]}),"\n",(0,r.jsx)(n.h4,{id:"223tugraph-mini-runtime-image",children:"2.2.3.TuGraph Mini Runtime Image"}),"\n",(0,r.jsx)(n.p,{children:"Provides a binary executable environment without Java and Python functions in TuGraph, no C++ plugin compilation and execution, only so upload."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"tugraph/tugraph-mini-runtime-[os name & version]:[tugraph-runtime version]"})}),"\n",(0,r.jsxs)(n.p,{children:["For example: ",(0,r.jsx)(n.code,{children:"tugraph/tugraph-mini-runtime-centos7:3.4.0"})]}),"\n",(0,r.jsx)(n.h3,{id:"23common-docker-operations",children:"2.3.Common Docker Operations"}),"\n",(0,r.jsxs)(n.p,{children:["Docker is generated from Dockerfile. Note that creating images requires downloading dependencies, so network issues may cause slow creation or creation failure. Do not overwrite images unless the tag is ",(0,r.jsx)(n.code,{children:"latest"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"build Compile image"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker build -f tugraph-compile-centos7-Dockerfile -t tugraph/tugraph-compile-centos7:1.2.0 .\n"})}),"\n",(0,r.jsx)(n.p,{children:"build Runtime / Mini Runtime image"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker build --build-arg FILEPATH="${rpm_path_in_oss}" --build-arg FILENAME="${rpm_name}" -f tugraph-compile-centos7-Dockerfile -t tugraph/tugraph-runtime-centos7:1.2.0 .\n'})}),"\n",(0,r.jsx)(n.p,{children:"Modify image name"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker tag ${image_name}:${image_tag} tugraph/tugraph-runtime-centos7:3.3.0\n"})}),"\n",(0,r.jsx)(n.p,{children:"push image"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker push tugraph/tugraph-compile-centos7:1.2.0 .\n"})}),"\n",(0,r.jsx)(n.p,{children:"pull image"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker pull tugraph/tugraph-compile-centos7:1.2.0\n"})}),"\n",(0,r.jsx)(n.p,{children:"save image"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker save ${image_name}:${image_tag} | gzip > lgraph_latest.tar.gz\n"})}),"\n",(0,r.jsx)(n.p,{children:"load image"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker load --input lgraph_latest.tar.gz\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Refer to the ",(0,r.jsx)(n.a,{href:"https://docs.docker.com/engine/reference/commandline/cli",children:"docker official documentation"})," for other Docker operations."]}),"\n",(0,r.jsx)(n.h3,{id:"24-m1-supports",children:"2.4. M1 Supports"}),"\n",(0,r.jsx)(n.p,{children:"Running amd64 containers on M1-chip machines may cause unknown errors. TuGraph provides arm64 images for M1 machines. Contains compile and runtime images."}),"\n",(0,r.jsxs)(n.p,{children:["In ",(0,r.jsx)(n.code,{children:"tugraph-runtime-centos7:3.6.0"})," and ",(0,r.jsx)(n.code,{children:"tugraph-compile-centos7:1.2.7"})," and later, ",(0,r.jsx)(n.code,{children:"tugraph-runtime-centos7"})," and ",(0,r.jsx)(n.code,{children:"tugraph-compile-centos7"})," provide images of two architectures: linux/amd64 and linux/arm64/v8. You can obtain the arm64 architecture image through docker pull on the M1 machine."]}),"\n",(0,r.jsx)(n.h3,{id:"25-running-service",children:"2.5. Running service"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Pull the docker images"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"docker pull tugraph/tugraph-runtime-centos7:${VERSION}\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Start docker"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:" docker run -d -p 7070:7070 -p 7687:7687 -p 9090:9090 -v /root/tugraph/data:/var/lib/lgraph/data -v /root/tugraph/log:/var/log/lgraph_log \\\n --name tugraph_demo ${REPOSITORY}:${VERSION}\n\n# ${REPOSITORY} is the image address,${VERSION}is the version number.\n# 7070 is default http port\uff0cfor tugraph-db-browser accessing..\n# 7687 is bolt port, for neo4j client accessing.\n# 9090 is default RPC port\uff0cfor RPC client accessing.\n\n# The default data directory is /var/lib/lgraph/data and the default log directory is /var/log/lgraph_log,\n# which is configured in the tugraph configuration file at /usr/local/etc/lgraph.json inside the docker.\n# This command mounts the data directory and log directory to /root/tugraph/ on the host for persistence,\n# which you can modify according to your actual situation.\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"3-best-practice-in-using-and-developing-docker-images-for-tugraph-db",children:"3. Best Practice in Using and Developing Docker Images for TuGraph-DB"}),"\n",(0,r.jsx)(n.p,{children:"Please carefully read the points below and follow them if you are new to contribute to TuGraph."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"To get rid of too much docker layer, please add your dependency to the Docker with the style writing ENV and RUN in a\nsingle line."}),"\n",(0,r.jsx)(n.li,{children:"For the packages/resources you need to build the dependency, use the original ones instead of tweaking them without\ntracking by VCS. And then contact TuGraph team to upload it to OSS to accelerate the building process, as the urls you\nsee in the Dockerfiles."}),"\n",(0,r.jsx)(n.li,{children:"To make the development more efficient, you would better start from adding dependencies to base TuGraph Compile Images\nand then reproduce the process in the Dockerfile after confirming the enviroment works."}),"\n",(0,r.jsx)(n.li,{children:"CI uses the docker images. Please check the dependency problems if your CI fails."}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>s});var r=i(6540);const a={},o=r.createContext(a);function t(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8973],{74:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var r=i(4848),a=i(8453);const o={},t="Docker Deployment",s={id:"installation&running/docker-deployment",title:"Docker Deployment",description:"This document introduces the creation and download of Docker images for TuGraph Compile and TuGraph Runtime.",source:"@site/../docs/en-US/source/5.installation&running/3.docker-deployment.md",sourceDirName:"5.installation&running",slug:"/installation&running/docker-deployment",permalink:"/tugraph-db/en/installation&running/docker-deployment",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Environment Mode",permalink:"/tugraph-db/en/installation&running/environment-mode"},next:{title:"Local Package Deployment",permalink:"/tugraph-db/en/installation&running/local-package-deployment"}},c={},l=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Existing Docker Images",id:"2existing-docker-images",level:2},{value:"2.1.Image Download",id:"21image-download",level:3},{value:"2.2.Naming Convention",id:"22naming-convention",level:3},{value:"2.2.1.TuGraph Compile Image",id:"221tugraph-compile-image",level:4},{value:"2.2.2.TuGraph Runtime Image",id:"222tugraph-runtime-image",level:4},{value:"2.2.3.TuGraph Mini Runtime Image",id:"223tugraph-mini-runtime-image",level:4},{value:"2.3.Common Docker Operations",id:"23common-docker-operations",level:3},{value:"2.4. M1 Supports",id:"24-m1-supports",level:3},{value:"2.5. Running service",id:"25-running-service",level:3},{value:"3. Best Practice in Using and Developing Docker Images for TuGraph-DB",id:"3-best-practice-in-using-and-developing-docker-images-for-tugraph-db",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"docker-deployment",children:"Docker Deployment"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"This document introduces the creation and download of Docker images for TuGraph Compile and TuGraph Runtime."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"TuGraph Compile Image: Provides a compilation environment and can be used for TuGraph compilation and testing."}),"\n",(0,r.jsx)(n.li,{children:"TuGraph Runtime Image: Provides a binary executable environment with TuGraph library and executable files."}),"\n",(0,r.jsx)(n.li,{children:"TuGraph Mini Runtime Image: Provides a binary executable environment without Java and Python functions in TuGraph, no C++ plugin compilation and execution, only so upload."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"2existing-docker-images",children:"2.Existing Docker Images"}),"\n",(0,r.jsx)(n.h3,{id:"21image-download",children:"2.1.Image Download"}),"\n",(0,r.jsxs)(n.p,{children:["The images are hosted on ",(0,r.jsx)(n.a,{href:"https://hub.docker.com/u/tugraph",children:"DockerHub"})," and can be downloaded and used directly."]}),"\n",(0,r.jsxs)(n.p,{children:["For the latest version of Docker address, see the TuGraph-Latest-Version section in ",(0,r.jsx)(n.a,{href:"../../1.guide.md",children:"Guide"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"22naming-convention",children:"2.2.Naming Convention"}),"\n",(0,r.jsx)(n.h4,{id:"221tugraph-compile-image",children:"2.2.1.TuGraph Compile Image"}),"\n",(0,r.jsx)(n.p,{children:"Provides a compilation environment and can be used for TuGraph compilation."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"tugraph/tugraph-compile-[os name & version]:[tugraph compile version]"})}),"\n",(0,r.jsxs)(n.p,{children:["For example: ",(0,r.jsx)(n.code,{children:"tugraph/tugraph-compile-centos7:1.2.0"})]}),"\n",(0,r.jsx)(n.h4,{id:"222tugraph-runtime-image",children:"2.2.2.TuGraph Runtime Image"}),"\n",(0,r.jsx)(n.p,{children:"Provides a binary executable environment with TuGraph library and executable files."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"tugraph/tugraph-runtime-[os name & version]:[tugraph-runtime version]"})}),"\n",(0,r.jsxs)(n.p,{children:["For example:",(0,r.jsx)(n.code,{children:"tugraph/tugraph-runtime-centos7:3.4.0"})]}),"\n",(0,r.jsx)(n.h4,{id:"223tugraph-mini-runtime-image",children:"2.2.3.TuGraph Mini Runtime Image"}),"\n",(0,r.jsx)(n.p,{children:"Provides a binary executable environment without Java and Python functions in TuGraph, no C++ plugin compilation and execution, only so upload."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"tugraph/tugraph-mini-runtime-[os name & version]:[tugraph-runtime version]"})}),"\n",(0,r.jsxs)(n.p,{children:["For example: ",(0,r.jsx)(n.code,{children:"tugraph/tugraph-mini-runtime-centos7:3.4.0"})]}),"\n",(0,r.jsx)(n.h3,{id:"23common-docker-operations",children:"2.3.Common Docker Operations"}),"\n",(0,r.jsxs)(n.p,{children:["Docker is generated from Dockerfile. Note that creating images requires downloading dependencies, so network issues may cause slow creation or creation failure. Do not overwrite images unless the tag is ",(0,r.jsx)(n.code,{children:"latest"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"build Compile image"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker build -f tugraph-compile-centos7-Dockerfile -t tugraph/tugraph-compile-centos7:1.2.0 .\n"})}),"\n",(0,r.jsx)(n.p,{children:"build Runtime / Mini Runtime image"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:'docker build --build-arg FILEPATH="${rpm_path_in_oss}" --build-arg FILENAME="${rpm_name}" -f tugraph-compile-centos7-Dockerfile -t tugraph/tugraph-runtime-centos7:1.2.0 .\n'})}),"\n",(0,r.jsx)(n.p,{children:"Modify image name"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker tag ${image_name}:${image_tag} tugraph/tugraph-runtime-centos7:3.3.0\n"})}),"\n",(0,r.jsx)(n.p,{children:"push image"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker push tugraph/tugraph-compile-centos7:1.2.0 .\n"})}),"\n",(0,r.jsx)(n.p,{children:"pull image"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker pull tugraph/tugraph-compile-centos7:1.2.0\n"})}),"\n",(0,r.jsx)(n.p,{children:"save image"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker save ${image_name}:${image_tag} | gzip > lgraph_latest.tar.gz\n"})}),"\n",(0,r.jsx)(n.p,{children:"load image"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker load --input lgraph_latest.tar.gz\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Refer to the ",(0,r.jsx)(n.a,{href:"https://docs.docker.com/engine/reference/commandline/cli",children:"docker official documentation"})," for other Docker operations."]}),"\n",(0,r.jsx)(n.h3,{id:"24-m1-supports",children:"2.4. M1 Supports"}),"\n",(0,r.jsx)(n.p,{children:"Running amd64 containers on M1-chip machines may cause unknown errors. TuGraph provides arm64 images for M1 machines. Contains compile and runtime images."}),"\n",(0,r.jsxs)(n.p,{children:["In ",(0,r.jsx)(n.code,{children:"tugraph-runtime-centos7:3.6.0"})," and ",(0,r.jsx)(n.code,{children:"tugraph-compile-centos7:1.2.7"})," and later, ",(0,r.jsx)(n.code,{children:"tugraph-runtime-centos7"})," and ",(0,r.jsx)(n.code,{children:"tugraph-compile-centos7"})," provide images of two architectures: linux/amd64 and linux/arm64/v8. You can obtain the arm64 architecture image through docker pull on the M1 machine."]}),"\n",(0,r.jsx)(n.h3,{id:"25-running-service",children:"2.5. Running service"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Pull the docker images"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"docker pull tugraph/tugraph-runtime-centos7:${VERSION}\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Start docker"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:" docker run -d -p 7070:7070 -p 7687:7687 -p 9090:9090 -v /root/tugraph/data:/var/lib/lgraph/data -v /root/tugraph/log:/var/log/lgraph_log \\\n --name tugraph_demo ${REPOSITORY}:${VERSION}\n\n# ${REPOSITORY} is the image address,${VERSION}is the version number.\n# 7070 is default http port\uff0cfor tugraph-db-browser accessing..\n# 7687 is bolt port, for neo4j client accessing.\n# 9090 is default RPC port\uff0cfor RPC client accessing.\n\n# The default data directory is /var/lib/lgraph/data and the default log directory is /var/log/lgraph_log,\n# which is configured in the tugraph configuration file at /usr/local/etc/lgraph.json inside the docker.\n# This command mounts the data directory and log directory to /root/tugraph/ on the host for persistence,\n# which you can modify according to your actual situation.\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"3-best-practice-in-using-and-developing-docker-images-for-tugraph-db",children:"3. Best Practice in Using and Developing Docker Images for TuGraph-DB"}),"\n",(0,r.jsx)(n.p,{children:"Please carefully read the points below and follow them if you are new to contribute to TuGraph."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"To get rid of too much docker layer, please add your dependency to the Docker with the style writing ENV and RUN in a\nsingle line."}),"\n",(0,r.jsx)(n.li,{children:"For the packages/resources you need to build the dependency, use the original ones instead of tweaking them without\ntracking by VCS. And then contact TuGraph team to upload it to OSS to accelerate the building process, as the urls you\nsee in the Dockerfiles."}),"\n",(0,r.jsx)(n.li,{children:"To make the development more efficient, you would better start from adding dependencies to base TuGraph Compile Images\nand then reproduce the process in the Dockerfile after confirming the enviroment works."}),"\n",(0,r.jsx)(n.li,{children:"CI uses the docker images. Please check the dependency problems if your CI fails."}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>s});var r=i(6540);const a={},o=r.createContext(a);function t(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a98e52e2.7fe9ec6e.js b/assets/js/a98e52e2.2f2398d1.js similarity index 99% rename from assets/js/a98e52e2.7fe9ec6e.js rename to assets/js/a98e52e2.2f2398d1.js index 17700d6c47..e1064ca4e8 100644 --- a/assets/js/a98e52e2.7fe9ec6e.js +++ b/assets/js/a98e52e2.2f2398d1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4564],{678:(e,A,t)=>{t.r(A),t.d(A,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>c});var n=t(4848),s=t(8453);const i={},a="TuGraph Browser",r={id:"user-guide/tugraph-browser",title:"TuGraph Browser",description:"This document focuses on the use of TuGraph Browser.",source:"@site/../docs/en-US/source/4.user-guide/1.tugraph-browser.md",sourceDirName:"4.user-guide",slug:"/user-guide/tugraph-browser",permalink:"/tugraph-db/en/user-guide/tugraph-browser",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Demo:Round The World",permalink:"/tugraph-db/en/quick-start/demo/round-the-world"},next:{title:"TuGraph Browser(old version)",permalink:"/tugraph-db/en/user-guide/tugraph-browser-legacy"}},d={},c=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.User Guide",id:"2user-guide",level:2},{value:"2.1.Accessing",id:"21accessing",level:3},{value:"2.2.Logging in",id:"22logging-in",level:3},{value:"2.3.Quick Start",id:"23quick-start",level:3},{value:"2.3.1.Creating a Graph Project",id:"231creating-a-graph-project",level:4},{value:"2.3.2.Starting a Graph Project",id:"232starting-a-graph-project",level:4},{value:"2.4.Graph Project",id:"24graph-project",level:3},{value:"2.4.1.Graph Project Management",id:"241graph-project-management",level:4},{value:"2.4.1.1.Creating a Graph Project",id:"2411creating-a-graph-project",level:5},{value:"2.4.1.2.Editing a Graph Project",id:"2412editing-a-graph-project",level:5},{value:"2.4.1.3.Deleting a Graph Project",id:"2413deleting-a-graph-project",level:5},{value:"2.4.1.4.Vertex-Edge Statistics",id:"2414vertex-edge-statistics",level:5},{value:"2.4.1.5.Procedure",id:"2415procedure",level:5},{value:"2.4.2.Graph Building",id:"242graph-building",level:4},{value:"2.4.2.1.Model Definition",id:"2421model-definition",level:5},{value:"a.Browse Graph Models",id:"abrowse-graph-models",level:6},{value:"b.Add Vertex",id:"badd-vertex",level:6},{value:"c.Add Edges",id:"cadd-edges",level:6},{value:"d.Import Model",id:"dimport-model",level:6},{value:"e.Export Model",id:"eexport-model",level:6},{value:"2.4.2.2.Data Import",id:"2422data-import",level:5},{value:"a.Data Preparation",id:"adata-preparation",level:6},{value:"b.Upload Files",id:"bupload-files",level:6},{value:"c.Data Mapping",id:"cdata-mapping",level:6},{value:"2.4.3.Graph Query",id:"243graph-query",level:4},{value:"2.4.3.1.Switch Graph Project",id:"2431switch-graph-project",level:5},{value:"2.4.3.2.Statement Query",id:"2432statement-query",level:5},{value:"a.Statement Query Window",id:"astatement-query-window",level:6},{value:"b.Bookmark List",id:"bbookmark-list",level:6},{value:"c.View Graph Model",id:"cview-graph-model",level:6},{value:"2.4.3.3.Path Query",id:"2433path-query",level:5},{value:"2.4.3.4.Vertex Query",id:"2434vertex-query",level:5},{value:"2.4.3.5.Execution Result Tab",id:"2435execution-result-tab",level:5},{value:"a.Text",id:"atext",level:6},{value:"b.Vertex-Edge View",id:"bvertex-edge-view",level:6},{value:"c.Data Insertion",id:"cdata-insertion",level:6},{value:"d.Download Execution Result",id:"ddownload-execution-result",level:6},{value:"e.Full-Screen Display",id:"efull-screen-display",level:6},{value:"2.4.4.Graph Analysis",id:"244graph-analysis",level:4},{value:"2.4.4.1.Query by Statement",id:"2441query-by-statement",level:5},{value:"2.4.4.2.Query by Configuration",id:"2442query-by-configuration",level:5},{value:"2.4.4.3.Canvas Analysis",id:"2443canvas-analysis",level:5},{value:"a.Expand Query",id:"aexpand-query",level:6},{value:"b.Collapse/Expand Vertexs",id:"bcollapseexpand-vertexs",level:6},{value:"c.Delete Vertex",id:"cdelete-vertex",level:6},{value:"d.Clear Canvas",id:"dclear-canvas",level:6},{value:"e.Vertex/Edge Retrieval",id:"evertexedge-retrieval",level:6},{value:"f.Canvas Legend",id:"fcanvas-legend",level:6},{value:"g.Zoom/Center",id:"gzoomcenter",level:6},{value:"2.4.4.4.Attribute Filter",id:"2444attribute-filter",level:5},{value:"2.4.4.5.Statistical Filter",id:"2445statistical-filter",level:5},{value:"2.4.4.6.Layout Style",id:"2446layout-style",level:5},{value:"2.4.4.7.Appearance Style",id:"2447appearance-style",level:5},{value:"2.4.4.8.View Switch",id:"2448view-switch",level:5},{value:"2.4.4.9.Label/Card Layout Switch",id:"2449labelcard-layout-switch",level:5},{value:"2.5.Console",id:"25console",level:3},{value:"2.5.1.Account Management",id:"251account-management",level:4},{value:"2.5.1.1.Account Management",id:"2511account-management",level:5},{value:"a.Add Account",id:"aadd-account",level:5},{value:"b.Edit Account",id:"bedit-account",level:5},{value:"c.Disable Account",id:"cdisable-account",level:5},{value:"d.Delete Account",id:"ddelete-account",level:5},{value:"2.5.1.2.Role Management",id:"2512role-management",level:4},{value:"a.Add Role",id:"aadd-role",level:5},{value:"b.Edit Role",id:"bedit-role",level:5},{value:"c.Disable Role",id:"cdisable-role",level:5},{value:"d.Delete Role",id:"ddelete-role",level:5},{value:"2.5.2.Database Information",id:"252database-information",level:4},{value:"2.5.2.1.Basic Information",id:"2521basic-information",level:5},{value:"2.5.2.2.Database Configuration Information",id:"2522database-configuration-information",level:5}];function l(e){const A={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(A.header,{children:(0,n.jsx)(A.h1,{id:"tugraph-browser",children:"TuGraph Browser"})}),"\n",(0,n.jsxs)(A.blockquote,{children:["\n",(0,n.jsx)(A.p,{children:"This document focuses on the use of TuGraph Browser."}),"\n"]}),"\n",(0,n.jsx)(A.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,n.jsx)(A.p,{children:"TuGraph Browser (hereinafter referred to as Browser) is a powerful product visualization development tool that presents graph data in an intuitive visual way, allowing users to easily manage, maintain, and view the database running status. This tool not only supports graph data management and visualization but also supports system account management, providing users with a comprehensive operation and management experience, enabling users to manage and utilize graph databases more efficiently."}),"\n",(0,n.jsx)(A.h2,{id:"2user-guide",children:"2.User Guide"}),"\n",(0,n.jsx)(A.h3,{id:"21accessing",children:"2.1.Accessing"}),"\n",(0,n.jsx)(A.p,{children:"After the user completes the installation of the graph database, they can access the Browser through a browser. Users only need to enter the IP:Port of the server where TuGraph is located in the browser address bar. The default port used is 7070."}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"For example:127.0.0.1:7070."}),"\n",(0,n.jsx)(A.li,{children:"Recommend using Chrome."}),"\n"]}),"\n",(0,n.jsx)(A.h3,{id:"22logging-in",children:"2.2.Logging in"}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"login",src:t(5e3).A+"",width:"2856",height:"1492"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"After successfully accessing the Browser, the login page appears first (as shown above), where users need to fill in their account and password to log in."}),"\n",(0,n.jsx)(A.li,{children:"The database address format: bolt://ip:bolt_port."}),"\n",(0,n.jsx)(A.li,{children:"Default account: admin."}),"\n",(0,n.jsx)(A.li,{children:"Default password: 73@TuGraph."}),"\n",(0,n.jsx)(A.li,{children:"After the user's first login, they will be redirected to the password modification page. Once the password is successfully modified, they can only use the new password to log in."}),"\n"]}),"\n",(0,n.jsx)(A.h3,{id:"23quick-start",children:"2.3.Quick Start"}),"\n",(0,n.jsx)(A.p,{children:"For first-time users of TuGraph, you can quickly build a graph project with the built-in demo data and get started with graph data projects quickly."}),"\n",(0,n.jsx)(A.h4,{id:"231creating-a-graph-project",children:"2.3.1.Creating a Graph Project"}),"\n",(0,n.jsxs)(A.p,{children:["In the ",(0,n.jsx)(A.code,{children:"Graph Project"})," homepage tab, click ",(0,n.jsx)(A.code,{children:"Create New Graph Project"})," to create a new graph project."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"quickstart-creategraph",src:t(7991).A+"",width:"1290",height:"184"})}),"\n",(0,n.jsxs)(A.p,{children:["Select a built-in demo data, and click the ",(0,n.jsx)(A.code,{children:"Next"})," button."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"quickstart-selectdemo",src:t(5666).A+"",width:"1136",height:"908"})}),"\n",(0,n.jsx)(A.p,{children:"In the Fill in Configurations interface, enter the graph project information. Since the demo data is relatively small in size, set the Maximum Storage Space to 1 GB. After entering the graph project information, click the Create button, and the system will automatically create the graph model of the demo data and import the graph data."}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"quickstart-configure",src:t(4595).A+"",width:"1135",height:"807"})}),"\n",(0,n.jsx)(A.h4,{id:"232starting-a-graph-project",children:"2.3.2.Starting a Graph Project"}),"\n",(0,n.jsxs)(A.p,{children:["After creating a graph project with demo data, you can find the corresponding graph project in the ",(0,n.jsx)(A.code,{children:"Graph Project"})," tab, and then click ",(0,n.jsx)(A.code,{children:"Graph Query"})," to query graph data."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"quickstart-graphtab",src:t(3462).A+"",width:"800",height:"326"})}),"\n",(0,n.jsx)(A.p,{children:"Execute the default query statement to browse the graph data in the demo."}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"quickstart-result",src:t(6836).A+"",width:"2555",height:"1291"})}),"\n",(0,n.jsxs)(A.p,{children:["For more quick start documents, please visit the",(0,n.jsx)(A.a,{href:"/tugraph-db/en/quick-start/preparation",children:"Quick Start Documents"})]}),"\n",(0,n.jsx)(A.h3,{id:"24graph-project",children:"2.4.Graph Project"}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.code,{children:"Graph Project"})," provides visualized graph project management and graph data development functions, providing users with a series of convenient graph data visualization operations, including graph project creation, modification, deletion, and other management operations, as well as graph data queries, vertex-edge statistics, and other operations. In addition, it also supports graph model management, making it more convenient for users to manage and maintain graph data."]}),"\n",(0,n.jsx)(A.h4,{id:"241graph-project-management",children:"2.4.1.Graph Project Management"}),"\n",(0,n.jsxs)(A.p,{children:["On the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page, you can see the graph projects in the current graph database."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-homepage",src:t(5377).A+"",width:"2846",height:"1462"})}),"\n",(0,n.jsx)(A.h5,{id:"2411creating-a-graph-project",children:"2.4.1.1.Creating a Graph Project"}),"\n",(0,n.jsxs)(A.p,{children:["On the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page, click the ",(0,n.jsx)(A.code,{children:"Create New Graph Project"})," button to create a new graph project."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-creategraph",src:t(2926).A+"",width:"2502",height:"362"})}),"\n",(0,n.jsxs)(A.p,{children:["Creating a new graph project requires completing the creation of the graph project through two pages: ",(0,n.jsx)(A.code,{children:"Select Template"})," and ",(0,n.jsx)(A.code,{children:"Fill in Configurations"}),"."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:[(0,n.jsx)(A.strong,{children:"Select Template"}),": The product provides two types of templates: empty templates and demo templates.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Empty templates: A brand new graph project where users need to create their own graph model and import graph data, generally used for formal project development."}),"\n",(0,n.jsx)(A.li,{children:"Demo templates: Built-in demo data in the product. After the graph project is created successfully, the system will automatically create a demo graph model and import demo graph data, usually used for trial and learning."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-selecttemplate",src:t(8479).A+"",width:"1142",height:"915"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:[(0,n.jsx)(A.strong,{children:"Fill in Configurations"}),": Users need to fill in basic information about the graph project and click the ",(0,n.jsx)(A.code,{children:"Create"})," button to create the graph project.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Graph Name: The name of the new graph project, which is also the unique primary key of the graph project. Supports Chinese characters, letters, numbers, and underscores, but does not support spaces or other special characters."}),"\n",(0,n.jsx)(A.li,{children:"Graph Description: The description of the new graph project can be used to describe the background and objectives of the project in detail."}),"\n",(0,n.jsx)(A.li,{children:"Advanced Configuration - Maximum Storage Space: Set the maximum storage space that the graph project can occupy. It does not actually occupy physical storage space in advance. After the actual data volume reaches the maximum storage space threshold, no more data can be written."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-configure",src:t(9709).A+"",width:"1136",height:"818"})}),"\n",(0,n.jsxs)(A.p,{children:["After creation, the graph project can be viewed in the graph project tab on the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page."]}),"\n",(0,n.jsx)(A.h5,{id:"2412editing-a-graph-project",children:"2.4.1.2.Editing a Graph Project"}),"\n",(0,n.jsxs)(A.p,{children:["On the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page, click the ",(0,n.jsx)(A.code,{children:"Edit button"})," (pencil icon) in the graph project tab to edit the basic information of the corresponding graph project."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-editgraph-button",src:t(1204).A+"",width:"808",height:"330"})}),"\n",(0,n.jsx)(A.p,{children:"graphmanagement-editgraph-button"}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-editgraph",src:t(8249).A+"",width:"691",height:"577"})}),"\n",(0,n.jsx)(A.h5,{id:"2413deleting-a-graph-project",children:"2.4.1.3.Deleting a Graph Project"}),"\n",(0,n.jsxs)(A.p,{children:["On the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page, click the ",(0,n.jsx)(A.code,{children:"Delete"})," button (trash can icon) in the graph project tab to delete the corresponding graph project."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-deletegraph-button",src:t(1204).A+"",width:"808",height:"330"})}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.em,{children:"Note: Graph projects cannot be restored after deletion."})}),"\n",(0,n.jsx)(A.h5,{id:"2414vertex-edge-statistics",children:"2.4.1.4.Vertex-Edge Statistics"}),"\n",(0,n.jsxs)(A.p,{children:["On the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page, click the ",(0,n.jsx)(A.code,{children:"Vertex-Edge Statistics"})," button (line graph icon or refresh icon) in the graph project tab to count the number of vertexs and edges in the corresponding graph project."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-statistics-button",src:t(1599).A+"",width:"802",height:"326"})}),"\n",(0,n.jsxs)(A.p,{children:["The statistical results will be displayed on the graph project tab. Graph projects that have not been vertex-edge statistics will display ",(0,n.jsx)(A.code,{children:"No vertex-edge data"}),", and graph projects that have already been vertex-edge statistics need to click the ",(0,n.jsx)(A.code,{children:"Refresh"})," button to count again."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-statistics",src:t(7740).A+"",width:"798",height:"330"})}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-statistics-refresh-button",src:t(1133).A+"",width:"814",height:"402"})}),"\n",(0,n.jsx)(A.h5,{id:"2415procedure",children:"2.4.1.5.Procedure"}),"\n",(0,n.jsxs)(A.p,{children:["In the ",(0,n.jsx)(A.code,{children:"Graph Project"})," interface, click the ",(0,n.jsx)(A.code,{children:"Procedure"})," button (the icon on the far right of the tab) to navigate to the page for operating stored procedures."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-procedure-button",src:t(7877).A+"",width:"806",height:"332"})}),"\n",(0,n.jsxs)(A.p,{children:["On the ",(0,n.jsx)(A.code,{children:"Procedure"}),' page, you can create a new stored procedure. When creating a new one, you need to fill in the "Stored Procedure Name," "Stored Procedure Type," and "Stored Procedure Description," and then select the "Version" and whether to modify the database during execution.']}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-procedure",src:t(1178).A+"",width:"2834",height:"1472"})}),"\n",(0,n.jsxs)(A.p,{children:["For more operations related to stored procedures, please refer to ",(0,n.jsx)(A.a,{href:"/tugraph-db/en/olap&procedure/procedure/",children:"Procedure"})]}),"\n",(0,n.jsx)(A.h4,{id:"242graph-building",children:"2.4.2.Graph Building"}),"\n",(0,n.jsxs)(A.p,{children:["The ",(0,n.jsx)(A.code,{children:"Graph Building"})," function in Browser is mainly used for graph project model definition and data import. On the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page, click the ",(0,n.jsx)(A.code,{children:"Graph Building"})," button in the graph project tab."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-button",src:t(1270).A+"",width:"802",height:"326"})}),"\n",(0,n.jsx)(A.h5,{id:"2421model-definition",children:"2.4.2.1.Model Definition"}),"\n",(0,n.jsx)(A.p,{children:"Browser provides a visualization way to create and maintain graph models."}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Graph models can also be created and maintained through the ",(0,n.jsx)(A.code,{children:"Cypher"})," tool and the ",(0,n.jsx)(A.code,{children:"lgraph_import"})," tool. For details, please refer to the ",(0,n.jsx)(A.a,{href:"/tugraph-db/en/query/cypher",children:"Cypher API Document"})," and ",(0,n.jsx)(A.a,{href:"/tugraph-db/en/utility-tools/data-import",children:"Data Import Document"}),"."]}),"\n"]}),"\n",(0,n.jsx)(A.h6,{id:"abrowse-graph-models",children:"a.Browse Graph Models"}),"\n",(0,n.jsxs)(A.p,{children:["On the ",(0,n.jsx)(A.code,{children:"Model Definition"})," page, you can view detailed graph model settings, support list and canvas view of the graph model, support list display of vertex type properties and indexes, edge type properties and start/end vertex types."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild",src:t(7411).A+"",width:"1527",height:"1120"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Supports list view of vertex types and edge types.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["\n",(0,n.jsx)(A.p,{children:"Supports the display of the number of vertexs or edges in the corresponding vertex type or edge type in the vertex type or edge type tab."}),"\n"]}),"\n",(0,n.jsxs)(A.li,{children:["\n",(0,n.jsxs)(A.p,{children:["Supports keyword search for vertex type or edge type names. Enter the keyword in the ",(0,n.jsx)(A.code,{children:"search box"})," to display the corresponding vertexs or edges."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-list-search",src:t(7993).A+"",width:"292",height:"182"})}),"\n"]}),"\n",(0,n.jsxs)(A.li,{children:["\n",(0,n.jsxs)(A.p,{children:["Supports copying vertex type or edge type names. Click the ",(0,n.jsx)(A.code,{children:"Copy"})," button to copy the name of the vertex or edge to the clipboard."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-list-copy",src:t(3514).A+"",width:"289",height:"196"})}),"\n"]}),"\n",(0,n.jsxs)(A.li,{children:["\n",(0,n.jsxs)(A.p,{children:["Supports deleting vertex types or edge types. Click the ",(0,n.jsx)(A.code,{children:"Delete"})," button to delete the corresponding vertex or edge."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-list-delete",src:t(2240).A+"",width:"280",height:"187"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.li,{children:"Supports canvas view of vertex types and edge types."}),"\n",(0,n.jsxs)(A.li,{children:["Clicking the corresponding vertex type or edge type in the list or canvas can display the model details.\n",(0,n.jsx)(A.img,{alt:"graphbuild-select",src:t(8766).A+"",width:"1653",height:"956"})]}),"\n"]}),"\n",(0,n.jsx)(A.h6,{id:"badd-vertex",children:"b.Add Vertex"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Add Vertex"})," button on the ",(0,n.jsx)(A.code,{children:"Model Definition"})," page to add a vertex type in the right sliding window."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-addvertex-button",src:t(446).A+"",width:"2852",height:"1484"})}),"\n",(0,n.jsxs)(A.p,{children:["The user needs to enter the Vertex type name, properties, and indexes, and click the ",(0,n.jsx)(A.code,{children:"Complete"})," button to complete the creation of the Vertex type."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Vertex Type Name: The name of the Vertex, which is also the unique identifier of the Vertex."}),"\n",(0,n.jsxs)(A.li,{children:["Properties: The attributes of the Vertex, and one attribute needs to be used as the primary key.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Data Type: The data type of the attribute field, supports types such as INT, STRING, DOUBLE, DATE, DATETIME, BLOB, BOOL."}),"\n",(0,n.jsx)(A.li,{children:"Optional: Whether the attribute can be null."}),"\n",(0,n.jsx)(A.li,{children:"Delete: Attributes can be deleted arbitrarily when creating Vertexs."}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(A.li,{children:["Indexes: The indexing attributes of the Vertex, you need to create attributes first and then set the attribute as an index.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Attribute: The attribute that needs to be indexed."}),"\n",(0,n.jsx)(A.li,{children:"Unique:Set the attribute field as a unique value."}),"\n",(0,n.jsxs)(A.li,{children:["Primary Key: Whether the corresponding attribute is a primary key. The Unique option must be ",(0,n.jsx)(A.code,{children:"Yes"})," after selecting ",(0,n.jsx)(A.code,{children:"Yes"}),"."]}),"\n",(0,n.jsx)(A.li,{children:"Delete: Indexes can be deleted arbitrarily during Vertex creation."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-addvertex",src:t(5131).A+"",width:"1634",height:"1131"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Edit Vertex: You can add Vertex properties, modify the data type of existing properties, and add or delete indexes. You need to click the ",(0,n.jsx)(A.code,{children:"Save"})," button for each newly added or modified attribute to take effect.\n",(0,n.jsx)(A.em,{children:"Note: Once the primary key field attribute is created, it cannot be modified."})]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-editvertex",src:t(7572).A+"",width:"576",height:"944"})}),"\n",(0,n.jsx)(A.h6,{id:"cadd-edges",children:"c.Add Edges"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Add Edge"})," button on the ",(0,n.jsx)(A.code,{children:"Model Definition"})," page to add an edge type in the right sliding window."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-addedge-button",src:t(8341).A+"",width:"1636",height:"1126"})}),"\n",(0,n.jsxs)(A.p,{children:["The user needs to enter the edge type name, properties, select the start vertex type and end vertex type, and click the ",(0,n.jsx)(A.code,{children:"Complete"})," button to complete the creation of the edge type."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Edge Type Name: The name of the edge, which is also the unique identifier of the edge."}),"\n",(0,n.jsxs)(A.li,{children:["Properties: The attributes of the edge, which may not exist on the edge.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Data Type: The data type of the attribute field, supports types such as INT, STRING, DOUBLE, DATE, DATETIME, BLOB, BOOL."}),"\n",(0,n.jsx)(A.li,{children:"Optional: Whether the attribute can be null."}),"\n",(0,n.jsx)(A.li,{children:"Delete: Attributes can be deleted arbitrarily when creating edges."}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(A.li,{children:["Selecting start vertex type and end vertex type: Set the start vertex type and end vertex type of the edge, and support multiple start vertex types and end vertex types.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Start vertex: Select the vertex type of the start vertex."}),"\n",(0,n.jsx)(A.li,{children:"End vertex: Select the vertex type of the end vertex."}),"\n",(0,n.jsx)(A.li,{children:"At least one vertex type needs to be created in advance to set the start vertex type and end vertex of the edge."}),"\n",(0,n.jsx)(A.li,{children:"If not selected, it means that the start vertex and end vertex can be any vertex type, and the corresponding edge is not displayed on the canvas, and you need to view the edge type in the left list."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-addedge",src:t(6314).A+"",width:"586",height:"693"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Edit Edge: You can add edge properties and modify the data type of existing properties. You need to click the ",(0,n.jsx)(A.code,{children:"Save"})," button for each newly added or modified attribute to take effect."]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-addedge",src:t(6314).A+"",width:"586",height:"693"})}),"\n",(0,n.jsx)(A.h6,{id:"dimport-model",children:"d.Import Model"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Import Model"})," button on the ",(0,n.jsx)(A.code,{children:"Model Definition"})," page to upload a model file and quickly create a model."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-importmodel-button",src:t(2349).A+"",width:"474",height:"47"})}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Upload File"})," button on the ",(0,n.jsx)(A.code,{children:"Import Model"})," page to upload the model file. After the upload is successful, click ",(0,n.jsx)(A.code,{children:"OK"})," to import the graph model."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Overwrite the current canvas model: If this option is selected, the existing graph model will be cleared before importing the graph model in the model file; if not selected, the vertex types and edge types in the model file will be imported, but the existing vertex types and edge types will not be modified."}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-importmodel",src:t(5522).A+"",width:"948",height:"514"})}),"\n",(0,n.jsx)(A.h6,{id:"eexport-model",children:"e.Export Model"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Export Model"})," button on the ",(0,n.jsx)(A.code,{children:"Model Definition"})," page to export the graph model in the current graph project to a JSON file."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-exportmodel-button",src:t(3056).A+"",width:"456",height:"53"})}),"\n",(0,n.jsx)(A.p,{children:"The model file is in JSON format and is not recommended to be manually modified."}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-exportmodel",src:t(6605).A+"",width:"1408",height:"144"})}),"\n",(0,n.jsx)(A.h5,{id:"2422data-import",children:"2.4.2.2.Data Import"}),"\n",(0,n.jsxs)(A.p,{children:["After completing the ",(0,n.jsx)(A.code,{children:"Model Definition"}),", click the ",(0,n.jsx)(A.code,{children:"Next"})," button to enter the data import page."]}),"\n",(0,n.jsx)(A.h6,{id:"adata-preparation",children:"a.Data Preparation"}),"\n",(0,n.jsx)(A.p,{children:"Data needs to be prepared in advance before importing data. The current browser supports the uploading of CSV files, and the data file suffix needs to be ensured to be CSV."}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"The header is not mandatory."}),"\n",(0,n.jsx)(A.li,{children:"Text qualifiers are supported, and the text qualifier is double quotes. Data Import - CSV"}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-import-csv",src:t(3034).A+"",width:"258",height:"256"})}),"\n",(0,n.jsx)(A.h6,{id:"bupload-files",children:"b.Upload Files"}),"\n",(0,n.jsxs)(A.p,{children:["Upload the required data files on the ",(0,n.jsx)(A.code,{children:"Data Import"})," page and import the data into the graph project."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-import",src:t(857).A+"",width:"586",height:"378"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Separator: The column separator of the data file."}),"\n",(0,n.jsxs)(A.li,{children:["File upload: Supports uploading multiple files.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Supports selecting multiple upload files in the pop-up window."}),"\n",(0,n.jsx)(A.li,{children:"Supports dragging and dropping files to upload on the page."}),"\n",(0,n.jsx)(A.li,{children:"Supports uploading vertex files and edge files at the same time."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.h6,{id:"cdata-mapping",children:"c.Data Mapping"}),"\n",(0,n.jsxs)(A.p,{children:["After the file is successfully uploaded, you need to set the ",(0,n.jsx)(A.code,{children:"Data Corresponding Table"})," on the ",(0,n.jsx)(A.code,{children:"Data Import"})," page to establish a mapping relationship between the data columns in the data file and the target vertexs/edges and corresponding attributes."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Data Corresponding Table: Displays uploaded data problems.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"File Name: The name of the uploaded data file."}),"\n",(0,n.jsx)(A.li,{children:"File Size: The size of the uploaded data file."}),"\n",(0,n.jsx)(A.li,{children:"Read Result: The result of uploading the data file, success means uploaded successfully."}),"\n",(0,n.jsx)(A.li,{children:"Delete: Delete on the page, the local file will not be deleted."}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(A.li,{children:["Data File Mapping: Each uploaded data file needs to configure a mapping relationship.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Label: Select the corresponding vertex or edge type for the file, and you can only select one type of vertex or one type of edge."}),"\n",(0,n.jsx)(A.li,{children:"Starting from the Nth row: Start reading data from the Nth row. The system defaults to start reading data from the 0th row. To skip the header, you can enter 1."}),"\n",(0,n.jsx)(A.li,{children:"Attribute Mapping: Select the attribute field corresponding to the data column from the drop-down list."}),"\n",(0,n.jsx)(A.li,{children:"Data Preview: The system will pre-read the first 5 rows of the data file."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-import-datamapping",src:t(2184).A+"",width:"573",height:"1268"})}),"\n",(0,n.jsxs)(A.p,{children:["After the file is successfully uploaded, you can click the ",(0,n.jsx)(A.code,{children:"Continue Import"})," button to continue importing other data or click the ",(0,n.jsx)(A.code,{children:"Go to Graph Query"})," button to query the imported data on the ",(0,n.jsx)(A.code,{children:"Graph Query"})," page."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-import-success",src:t(8247).A+"",width:"278",height:"239"})}),"\n",(0,n.jsx)(A.h4,{id:"243graph-query",children:"2.4.3.Graph Query"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Graph Query"})," button in the ",(0,n.jsx)(A.code,{children:"graph project tab"})," on the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page to query and access graph data in the graph project. The product provides multiple modes for querying graph data, such as Statement Query, Path Query, and Vertex Query, and supports switching between graph projects and query result display."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-button",src:t(6838).A+"",width:"1686",height:"730"})}),"\n",(0,n.jsx)(A.h5,{id:"2431switch-graph-project",children:"2.4.3.1.Switch Graph Project"}),"\n",(0,n.jsxs)(A.p,{children:["The ",(0,n.jsx)(A.code,{children:"Graph Query"})," function can only access one graph project data. Users can select and switch to other graph data in the ",(0,n.jsx)(A.code,{children:"Switch Graph Project drop-down list"}),"."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-selectgraph",src:t(2471).A+"",width:"221",height:"321"})}),"\n",(0,n.jsx)(A.h5,{id:"2432statement-query",children:"2.4.3.2.Statement Query"}),"\n",(0,n.jsx)(A.p,{children:"The Browser provides a visual way to develop and debug graph query statements. Users can enter graph query statements, execute and return results, and support collecting statements and viewing graph models."}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-view",src:t(1349).A+"",width:"2868",height:"1482"})}),"\n",(0,n.jsx)(A.h6,{id:"astatement-query-window",children:"a.Statement Query Window"}),"\n",(0,n.jsxs)(A.p,{children:["Users enter graph query statements in the ",(0,n.jsx)(A.code,{children:"Statement Query Window"}),", click the ",(0,n.jsx)(A.code,{children:"Execute"})," button to run the corresponding statement, and display the result in the ",(0,n.jsx)(A.code,{children:"Execution Result tab"}),"."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Switch Query Language: Provides switching between different graph query language modes.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:(0,n.jsx)(A.em,{children:"Currently only supports Cypher syntax."})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-selectgql",src:t(6567).A+"",width:"144",height:"128"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Statement Query Window: Provides syntax prompts for the current query language."}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-gqltips",src:t(522).A+"",width:"1118",height:"376"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Execute: Click the ",(0,n.jsx)(A.code,{children:"Execute"})," button to send the entered query statement to the background for execution."]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-execute-button",src:t(9464).A+"",width:"91",height:"40"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Bookmark: Click the ",(0,n.jsx)(A.code,{children:"Bookmark"})," button to save the content of the current statement query window as a template for future use."]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-bookmark-button",src:t(885).A+"",width:"60",height:"24"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Download: Click the ",(0,n.jsx)(A.code,{children:"Download"})," button to save the content of the current statement query window as a text file and download it to the local computer for future use."]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-download-button",src:t(3453).A+"",width:"60",height:"24"})}),"\n",(0,n.jsxs)(A.p,{children:["For detailed Cypher usage guidelines, please refer to the document: ",(0,n.jsx)(A.a,{href:"/tugraph-db/en/query/cypher",children:"Cypher API"})]}),"\n",(0,n.jsx)(A.h6,{id:"bbookmark-list",children:"b.Bookmark List"}),"\n",(0,n.jsx)(A.p,{children:"Displays the collected query statements in a list, and clicking on a bookmark in the list allows using the statement. Supports keyword search, name modification, and deletion."}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-bookmark",src:t(1658).A+"",width:"267",height:"196"})}),"\n",(0,n.jsx)(A.h6,{id:"cview-graph-model",children:"c.View Graph Model"}),"\n",(0,n.jsx)(A.p,{children:"The Browser provides a graph model query for the current graph project, which allows users to query vertex types and edge types conveniently. It supports both list display and canvas graph display, and can be hidden."}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"query-schema-list",src:t(7566).A+"",width:"342",height:"409"}),"\n",(0,n.jsx)(A.img,{alt:"query-schema-graph",src:t(3532).A+"",width:"345",height:"411"})]}),"\n",(0,n.jsx)(A.h5,{id:"2433path-query",children:"2.4.3.3.Path Query"}),"\n",(0,n.jsxs)(A.p,{children:["The Browser provides ",(0,n.jsx)(A.code,{children:"Path Query templates"}),". Users can search whether corresponding paths exist in the graph data of the graph project by selecting paths."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"pathquery-result",src:t(5684).A+"",width:"1412",height:"866"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Path: Select the path to search in the path selection drop-down list.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Select a Path: Based on the definition of the graph model, the system will automatically match the corresponding first-degree relationship path. Clicking the path drop-down box again will automatically match the next-degree relationship path based on the endvertex vertex type of the path.\n",(0,n.jsx)(A.img,{alt:"pathquery-select",src:t(9143).A+"",width:"1412",height:"384"})]}),"\n",(0,n.jsxs)(A.li,{children:["Execute: Click the ",(0,n.jsx)(A.code,{children:"Execute"})," button to return the matched paths in the graph project."]}),"\n",(0,n.jsxs)(A.li,{children:["Advanced Configuration: Set the number of paths to scan. The default is 100 paths.\n",(0,n.jsx)(A.img,{alt:"pathquery-configuration",src:t(5801).A+"",width:"976",height:"229"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.em,{children:"Note: The edges in the graph model need to set the starting vertex and endvertex. If no edge in the graph project has set the starting vertex and endvertex, the drop-down list will have no results."})}),"\n",(0,n.jsx)(A.h5,{id:"2434vertex-query",children:"2.4.3.4.Vertex Query"}),"\n",(0,n.jsxs)(A.p,{children:["The Browser provides ",(0,n.jsx)(A.code,{children:"Vertex Query templates"}),". Users can query vertex data in the graph project by selecting vertex attributes."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"vertexquery",src:t(3353).A+"",width:"2844",height:"1490"})}),"\n",(0,n.jsx)(A.h5,{id:"2435execution-result-tab",children:"2.4.3.5.Execution Result Tab"}),"\n",(0,n.jsx)(A.p,{children:"The Browser provides multiple ways to display graph query results, such as JSON view, JSON text, vertex-edge list, and vertex-edge view. It supports result download, data insertion, and full-screen display."}),"\n",(0,n.jsx)(A.h6,{id:"atext",children:"a.Text"}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-result-jsontxt",src:t(6074).A+"",width:"2868",height:"1502"})}),"\n",(0,n.jsx)(A.h6,{id:"bvertex-edge-view",children:"b.Vertex-Edge View"}),"\n",(0,n.jsx)(A.p,{children:"The Browser provides canvas view to display query results."}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-result-graph",src:t(7362).A+"",width:"2850",height:"1496"})}),"\n",(0,n.jsx)(A.h6,{id:"cdata-insertion",children:"c.Data Insertion"}),"\n",(0,n.jsxs)(A.p,{children:["The Browser provides a visual way to insert vertex or edge data in the corresponding graph project. Click the ",(0,n.jsx)(A.code,{children:"Insert Data"})," button, select the Vertex Type or Edge Type on the Insert Data tab, enter the attribute values, and click ",(0,n.jsx)(A.code,{children:"OK"})," to complete the data insertion."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-result-insert-button",src:t(9290).A+"",width:"108",height:"114"})}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-result-insert",src:t(7231).A+"",width:"514",height:"931"})}),"\n",(0,n.jsx)(A.h6,{id:"ddownload-execution-result",children:"d.Download Execution Result"}),"\n",(0,n.jsxs)(A.p,{children:["The Browser provides a function to export graph query results as text files. Click the ",(0,n.jsx)(A.code,{children:"Download Execution Result"})," button, and the system will automatically save the result as a text file and download it to the local computer."]}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"query-result-download",src:t(9420).A+"",width:"124",height:"117"}),"\n",(0,n.jsx)(A.img,{alt:"query-result-downloadtxt",src:t(4534).A+"",width:"546",height:"77"})]}),"\n",(0,n.jsx)(A.h6,{id:"efull-screen-display",children:"e.Full-Screen Display"}),"\n",(0,n.jsxs)(A.p,{children:["The Browser provides full-screen display for graph query results. Click the ",(0,n.jsx)(A.code,{children:"Full-Screen"})," Display button to display the results in full screen, and click the ",(0,n.jsx)(A.code,{children:"Exit Full Screen"})," button to exit full-screen display."]}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"query-result-fullscreen-button",src:t(6490).A+"",width:"96",height:"107"}),"\n",(0,n.jsx)(A.img,{alt:"query-result-fullscreen",src:t(5359).A+"",width:"2844",height:"1502"}),"\n",(0,n.jsx)(A.img,{alt:"query-result-fullscreen-close",src:t(6488).A+"",width:"58",height:"41"})]}),"\n",(0,n.jsx)(A.h4,{id:"244graph-analysis",children:"2.4.4.Graph Analysis"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Graph Analysis"})," button in the ",(0,n.jsx)(A.code,{children:"Graph Project"})," tab in the ",(0,n.jsx)(A.code,{children:"Graph Project"})," interface to display and analyze graph data on the canvas. The product provides ",(0,n.jsx)(A.code,{children:"Query by Statement"})," and ",(0,n.jsx)(A.code,{children:"Query by Configuration"})," to query and load data from the graph project to the canvas. It supports filtering, layout adjustment, and canvas operations on the canvas data."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-button",src:t(2576).A+"",width:"808",height:"324"})}),"\n",(0,n.jsx)(A.p,{children:"As shown in the figure below, the graph analysis function mainly includes: 1. Operation bar: the main operation functions of graph analysis, including view switching, query filtering, layout style, and canvas operations; 2. Left sidebar: query, filter, and appearance operation area; 3. Canvas area: the area for displaying graph data, displaying vertex and edge data, supporting vertex expansion query, collapsing vertexs, fixing vertexs, deleting vertexs, and providing canvas graph data statistics; 4. Right sidebar: when a vertex or edge data is selected, the corresponding attribute information will be displayed; 5. Switch graph project: switch to different graph projects for analysis."}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-operation-area",src:t(3355).A+"",width:"2866",height:"1498"})}),"\n",(0,n.jsx)(A.h5,{id:"2441query-by-statement",children:"2.4.4.1.Query by Statement"}),"\n",(0,n.jsxs)(A.p,{children:["In the ",(0,n.jsx)(A.code,{children:"Query by Statement"})," function, users can enter query statements to query graph data and load the data to the canvas area for display."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Syntax Description: TuGraph's query language and syntax documentation."}),"\n",(0,n.jsx)(A.li,{children:"Clear Canvas Data: If this button is not selected, the results of each query will be appended to the canvas area; if this button is selected, the canvas will be cleared before each query."}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-queryfilter-query",src:t(5615).A+"",width:"690",height:"1246"})}),"\n",(0,n.jsx)(A.h5,{id:"2442query-by-configuration",children:"2.4.4.2.Query by Configuration"}),"\n",(0,n.jsxs)(A.p,{children:["In the ",(0,n.jsx)(A.code,{children:"Query by Configuration"})," function, users can select vertex types and enter attribute conditions to query graph data and load the data to the canvas area for display."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Clear Canvas Data: If this button is not selected, the results of each query will be appended to the canvas area; if this button is selected, the canvas will be cleared before each query."}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-queryfilter-configurequery",src:t(243).A+"",width:"2878",height:"1226"})}),"\n",(0,n.jsx)(A.h5,{id:"2443canvas-analysis",children:"2.4.4.3.Canvas Analysis"}),"\n",(0,n.jsxs)(A.p,{children:["In the ",(0,n.jsx)(A.code,{children:"Canvas Analysis"})," function, users can perform operations and analysis on the vertex or edge data on the canvas, including: expanding queries by selecting vertexs, collapsing/expanding vertexs, fixing vertexs, clearing the canvas, lassoing, vertex/edge retrieval, and canvas legend. The most basic operation on the canvas is dragging vertex data. By selecting a vertex with the left mouse button and moving the mouse, the position of the vertex data can be changed."]}),"\n",(0,n.jsx)(A.h6,{id:"aexpand-query",children:"a.Expand Query"}),"\n",(0,n.jsxs)(A.p,{children:["Right-click on a vertex data in the ",(0,n.jsx)(A.code,{children:"Canvas"})," area, a pop-up operation window will appear, move the mouse to ",(0,n.jsx)(A.code,{children:"Expand Query"}),", and a secondary window will pop up. Click on the corresponding expansion degree to perform the query."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"First-degree Query: Bidirectional expansion of first-degree relationships."}),"\n",(0,n.jsx)(A.li,{children:"Second-degree Query: Bidirectional expansion of second-degree relationships."}),"\n",(0,n.jsx)(A.li,{children:"Third-degree Query: Bidirectional expansion of third-degree relationships."}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-expand-before",src:t(8199).A+"",width:"920",height:"698"})}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-expand-after",src:t(4426).A+"",width:"330",height:"338"})}),"\n",(0,n.jsx)(A.h6,{id:"bcollapseexpand-vertexs",children:"b.Collapse/Expand Vertexs"}),"\n",(0,n.jsxs)(A.p,{children:["Right-click on a vertex data in the ",(0,n.jsx)(A.code,{children:"Canvas"})," area, a pop-up operation window will appear, click on ",(0,n.jsx)(A.code,{children:"Collapse Vertexs"})," to hide the first-degree relationship Vertexs of the selected Vertexs; right-click on the collapsed Vertex data again to perform Expand Vertexs operation to show the hidden first-degree relationship Vertexs."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-collapse",src:t(6938).A+"",width:"880",height:"736"})}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-expand",src:t(8999).A+"",width:"854",height:"682"})}),"\n",(0,n.jsx)(A.h6,{id:"cdelete-vertex",children:"c.Delete Vertex"}),"\n",(0,n.jsxs)(A.p,{children:["Right-click on a vertex in the ",(0,n.jsx)(A.code,{children:"Canvas"})," area to open the operation window. Click on ",(0,n.jsx)(A.code,{children:"Delete Vertex"})," to remove the selected vertex from the canvas."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-delete",src:t(8014).A+"",width:"754",height:"604"})}),"\n",(0,n.jsx)(A.h6,{id:"dclear-canvas",children:"d.Clear Canvas"}),"\n",(0,n.jsxs)(A.p,{children:["Click on the ",(0,n.jsx)(A.code,{children:"Clear Canvas"})," button in the ",(0,n.jsx)(A.code,{children:"Toolbar"})," area to clear all data on the canvas."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"\u56fe\u5206\u6790-\u753b\u5e03\u5206\u6790-\u6e05\u7a7a\u753b\u5e03",src:t(5080).A+"",width:"1496",height:"122"})}),"\n",(0,n.jsx)(A.h6,{id:"evertexedge-retrieval",children:"e.Vertex/Edge Retrieval"}),"\n",(0,n.jsxs)(A.p,{children:["Select a vertex or edge in the ",(0,n.jsx)(A.code,{children:"Vertex/Edge Retrieval"})," window and enter a keyword to perform a fuzzy search for attribute data on the canvas. After the search, you can locate the data position."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-retrieval",src:t(171).A+"",width:"1832",height:"1230"})}),"\n",(0,n.jsx)(A.h6,{id:"fcanvas-legend",children:"f.Canvas Legend"}),"\n",(0,n.jsxs)(A.p,{children:["In the legend area of the ",(0,n.jsx)(A.code,{children:"Canvas"}),' area, the vertex types in the canvas will be displayed. Click on a vertex type to select the corresponding vertex data. Click on the "More" button to display the statistics, which can be displayed in a list or chart format to show the number of vertexs or edges.']}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-legend-list",src:t(6283).A+"",width:"1870",height:"1106"}),"\n",(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-legend-chart",src:t(6171).A+"",width:"1948",height:"1116"})]}),"\n",(0,n.jsx)(A.h6,{id:"gzoomcenter",children:"g.Zoom/Center"}),"\n",(0,n.jsxs)(A.p,{children:["You can zoom in and out using the mouse wheel and the zoom buttons.\n",(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-zoom",src:t(7038).A+"",width:"2092",height:"1112"}),"\n",(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-center",src:t(8628).A+"",width:"2132",height:"1242"})]}),"\n",(0,n.jsx)(A.h5,{id:"2444attribute-filter",children:"2.4.4.4.Attribute Filter"}),"\n",(0,n.jsxs)(A.p,{children:["Click on the ",(0,n.jsx)(A.code,{children:"Filter"})," button in the ",(0,n.jsx)(A.code,{children:"Toolbar"})," area, and click on ",(0,n.jsx)(A.code,{children:"Attribute Filter"})," in the ",(0,n.jsx)(A.code,{children:"Sidebar"})," to perform filter and filtering. Users can select the vertex or edge types to be filtered, and set the corresponding attribute values. After retrieving the filtered group conditions, the corresponding vertex or edge data will be highlighted on the canvas."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Please select the vertex/edge type: Select the vertex type or edge type to be searched."}),"\n",(0,n.jsx)(A.li,{children:"Attribute condition: Set the attribute conditions to be searched. Multiple groups can be set to take the union of the filtering results."}),"\n",(0,n.jsx)(A.li,{children:"Add filter group: Multiple filter conditions can be set to take the union of the filtering results."}),"\n",(0,n.jsx)(A.li,{children:"Reset: Clear the filter conditions."}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-queryfilter-attributefilter",src:t(7869).A+"",width:"2852",height:"1336"})}),"\n",(0,n.jsx)(A.h5,{id:"2445statistical-filter",children:"2.4.4.5.Statistical Filter"}),"\n",(0,n.jsx)(A.p,{children:"Click on the Filter button in the Toolbar area, and click on Statistical Filter in the Sidebar to perform statistical filtering of canvas data. Users can select the vertex or edge types to be counted, and set the corresponding attribute values. The system will automatically group and count based on the selected vertex/edge types and attributes. The results can be displayed in chart and list formats. Clicking on the values in the chart or list area will highlight the corresponding data on the canvas."}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"graphanalysis-queryfilter-statisticalfilter",src:t(9288).A+"",width:"2864",height:"1234"}),"\n",(0,n.jsx)(A.img,{alt:"graphanalysis-queryfilter-statisticalfilter-chartswitch",src:t(8371).A+"",width:"2860",height:"1386"})]}),"\n",(0,n.jsx)(A.h5,{id:"2446layout-style",children:"2.4.4.6.Layout Style"}),"\n",(0,n.jsxs)(A.p,{children:["Click on the ",(0,n.jsx)(A.code,{children:"Layout"})," button in the ",(0,n.jsx)(A.code,{children:"Toolbar"})," area, and select the corresponding layout method to rearrange the data on the canvas. It supports force-directed layout, concentric circle layout, circular layout, radial layout, Dagre layout, and grid layout. Each layout method has different layout parameters. After adjusting the parameters, the data on the canvas will be rearranged."]}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"graphanalysis-style-layout-button",src:t(2213).A+"",width:"1832",height:"1326"}),"\n",(0,n.jsx)(A.img,{alt:"graphanalysis-style-layout-parameters",src:t(661).A+"",width:"2040",height:"1248"})]}),"\n",(0,n.jsxs)(A.p,{children:["For detailed layout parameters, please refer to",(0,n.jsx)(A.a,{href:"https://g6.antv.antgroup.com/api/graph-layout/guide",children:"AntV-G6"}),"."]}),"\n",(0,n.jsx)(A.h5,{id:"2447appearance-style",children:"2.4.4.7.Appearance Style"}),"\n",(0,n.jsxs)(A.p,{children:["Click on the ",(0,n.jsx)(A.code,{children:"Appearance"})," button in the ",(0,n.jsx)(A.code,{children:"Toolbar"})," area, and click on ",(0,n.jsx)(A.code,{children:"Vertex Style"})," or ",(0,n.jsx)(A.code,{children:"Edge Style"})," in the ",(0,n.jsx)(A.code,{children:"Sidebar"})," to configure the appearance style."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Vertex Style\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Apply to vertex type: Set the display style for the corresponding vertex type. Multiple vertex types can be configured simultaneously."}),"\n",(0,n.jsx)(A.li,{children:"Size: The display size for the corresponding vertex type."}),"\n",(0,n.jsx)(A.li,{children:"Color: The display color for the corresponding vertex type."}),"\n",(0,n.jsx)(A.li,{children:"Icon: The icon style for the corresponding vertex type."}),"\n",(0,n.jsx)(A.li,{children:"Display Text: The text content displayed for the corresponding vertex type, defaulting to id."}),"\n",(0,n.jsx)(A.li,{children:"Advanced Configuration: Mark the corresponding vertex data based on the set conditions."}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(A.li,{children:["Edge Style\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Apply to Edge Type: Set the display style for the corresponding edge type, supports configuring the appearance of multiple edge types simultaneously."}),"\n",(0,n.jsx)(A.li,{children:"Color: The display color for the corresponding edge type."}),"\n",(0,n.jsx)(A.li,{children:"Width: The display width for the corresponding edge type."}),"\n",(0,n.jsx)(A.li,{children:"Display Text: The text content displayed for the corresponding edge type, not displayed by default."}),"\n",(0,n.jsx)(A.li,{children:"Advanced Configuration: Display the corresponding edge data based on the set conditions."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-style-appearance",src:t(7354).A+"",width:"1209",height:"1180"})}),"\n",(0,n.jsx)(A.h5,{id:"2448view-switch",children:"2.4.4.8.View Switch"}),"\n",(0,n.jsxs)(A.p,{children:["In graph analysis, 2D graph view, list view, and JSON view are supported.\n",(0,n.jsx)(A.img,{alt:"\u56fe\u5206\u6790-\u89c6\u56fe-2D",src:t(2416).A+"",width:"1826",height:"1322"}),"\n",(0,n.jsx)(A.img,{alt:"\u56fe\u5206\u6790-\u89c6\u56fe-list",src:t(7688).A+"",width:"2046",height:"1374"}),"\n",(0,n.jsx)(A.img,{alt:"\u56fe\u5206\u6790-\u89c6\u56fe-json",src:t(5084).A+"",width:"1918",height:"1330"})]}),"\n",(0,n.jsx)(A.h5,{id:"2449labelcard-layout-switch",children:"2.4.4.9.Label/Card Layout Switch"}),"\n",(0,n.jsxs)(A.p,{children:["Graph analysis supports label layout and card layout.\n",(0,n.jsx)(A.img,{alt:"\u56fe\u5206\u6790-\u6807\u7b7e",src:t(4122).A+"",width:"1453",height:"837"}),"\n",(0,n.jsx)(A.img,{alt:"\u56fe\u5206\u6790-\u5361\u7247",src:t(2118).A+"",width:"1496",height:"1250"})]}),"\n",(0,n.jsx)(A.h3,{id:"25console",children:"2.5.Console"}),"\n",(0,n.jsxs)(A.p,{children:["The ",(0,n.jsx)(A.code,{children:"Console"})," provides a visualized account management and database information viewing function. It provides users with comprehensive account and role management functions, including adding, deleting, modifying, and disabling accounts and roles. In addition, it also provides users with convenient database information viewing function, allowing users to easily view the basic information and configuration information of the graph database. Basic information mainly includes version number, running time, CPP compilation version number, etc., while database configuration information includes port number, system function parameter configuration, etc."]}),"\n",(0,n.jsx)(A.h4,{id:"251account-management",children:"2.5.1.Account Management"}),"\n",(0,n.jsx)(A.h5,{id:"2511account-management",children:"2.5.1.1.Account Management"}),"\n",(0,n.jsx)(A.h5,{id:"aadd-account",children:"a.Add Account"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Add"})," button in the ",(0,n.jsx)(A.code,{children:"Account Management"})," interface to create a new account. Users need to enter the account name, account description, account password, and related roles."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Account Name: supports Chinese, letters, numbers, and underscores, but does not support spaces or other special characters."}),"\n",(0,n.jsx)(A.li,{children:"Related Roles: When creating a new account, you must select a role. After the account is added successfully, the system will automatically generate a role with the same name as the account name."}),"\n"]}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"account-add-button",src:t(8315).A+"",width:"1175",height:"399"}),"\n",(0,n.jsx)(A.img,{alt:"account-add",src:t(4064).A+"",width:"699",height:"618"})]}),"\n",(0,n.jsx)(A.h5,{id:"bedit-account",children:"b.Edit Account"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Edit"})," button in the ",(0,n.jsx)(A.code,{children:"Account Management"})," interface to edit the account description, account password, and related roles."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"account-edit",src:t(2289).A+"",width:"696",height:"623"})}),"\n",(0,n.jsx)(A.h5,{id:"cdisable-account",children:"c.Disable Account"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Disable"})," button in the ",(0,n.jsx)(A.code,{children:"Account Management"})," interface to prevent the corresponding account from logging in and accessing. Click the ",(0,n.jsx)(A.code,{children:"Enable"})," button to enable the corresponding account login and access permissions."]}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"account-disable",src:t(7269).A+"",width:"1548",height:"80"}),"\n",(0,n.jsx)(A.img,{alt:"account-enable",src:t(544).A+"",width:"1545",height:"77"})]}),"\n",(0,n.jsx)(A.h5,{id:"ddelete-account",children:"d.Delete Account"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Delete"})," button in the ",(0,n.jsx)(A.code,{children:"Account Management"})," interface to delete the corresponding account."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"account-delete",src:t(9020).A+"",width:"1550",height:"74"})}),"\n",(0,n.jsx)(A.h4,{id:"2512role-management",children:"2.5.1.2.Role Management"}),"\n",(0,n.jsx)(A.h5,{id:"aadd-role",children:"a.Add Role"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Add"})," button in the ",(0,n.jsx)(A.code,{children:"Role Management"})," interface to create a new role. Users need to enter the role name, role description, and graph permissions."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"role-add-button",src:t(9956).A+"",width:"1188",height:"406"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Role Name: supports Chinese, letters, numbers, and underscores, but does not support spaces or other special characters."}),"\n",(0,n.jsxs)(A.li,{children:["Graph Permissions: The browser supports four types of graph permission configurations: All, Read/Write, Read-Only, and None.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"All: corresponds to the read and write permissions of the graph, including editing the graph model permissions (schema)."}),"\n",(0,n.jsx)(A.li,{children:"Read/Write: corresponds to the write permission of the graph, but does not include the permission to edit the graph model (schema)."}),"\n",(0,n.jsx)(A.li,{children:"Read-Only: corresponds to the read permission of the graph."}),"\n",(0,n.jsx)(A.li,{children:"None: cannot access or operate the corresponding graph."}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.li,{children:"Role Conflict: When two roles have different graph permissions for the same graph, and both roles are authorized to the same account, the graph permission of the account for the graph is the union of the graph permissions of the two roles."}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"role-add",src:t(873).A+"",width:"693",height:"802"})}),"\n",(0,n.jsx)(A.h5,{id:"bedit-role",children:"b.Edit Role"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Edit"})," button in the ",(0,n.jsx)(A.code,{children:"Role Management"})," interface to edit an existing role. Users can edit the role description and graph permissions."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"role-edit",src:t(222).A+"",width:"689",height:"802"})}),"\n",(0,n.jsx)(A.h5,{id:"cdisable-role",children:"c.Disable Role"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Disable"})," button in the ",(0,n.jsx)(A.code,{children:"Role Management"})," interface to disable the corresponding role. Click the ",(0,n.jsx)(A.code,{children:"Enable"})," button to enable the corresponding role. After the role is disabled, the corresponding graph permissions of the role become invalid."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Disabled Role: After the role is disabled, the corresponding graph permissions become invalid.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"When a user has two roles with operating permissions on the same graph, if one of the roles is disabled, the permission of the other role is still valid."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"role-disable",src:t(1892).A+"",width:"1555",height:"85"}),"\n",(0,n.jsx)(A.img,{alt:"role-enable",src:t(1295).A+"",width:"1552",height:"88"})]}),"\n",(0,n.jsx)(A.h5,{id:"ddelete-role",children:"d.Delete Role"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Delete"})," button in the ",(0,n.jsx)(A.code,{children:"Role Management"})," interface to delete the corresponding role."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"role-delete",src:t(3075).A+"",width:"1548",height:"82"})}),"\n",(0,n.jsx)(A.h4,{id:"252database-information",children:"2.5.2.Database Information"}),"\n",(0,n.jsx)(A.h5,{id:"2521basic-information",children:"2.5.2.1.Basic Information"}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.code,{children:"Basic Information"})," obtains the current running status of the system and displays key information."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"db_basic",src:t(8298).A+"",width:"2406",height:"530"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,n.jsxs)(A.table,{children:[(0,n.jsx)(A.thead,{children:(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.th,{children:"Parameter"}),(0,n.jsx)(A.th,{children:"Meaning"})]})}),(0,n.jsxs)(A.tbody,{children:[(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"TuGraph Version Number"}),(0,n.jsx)(A.td,{children:"The current version number of TuGraph, x.x.x"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"Running Time"}),(0,n.jsx)(A.td,{children:"The time from when TuGraph service starts to now"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"Server Code Version"}),(0,n.jsx)(A.td,{children:"The current commit of the tugraph-db repository"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"Front-end Code Version"}),(0,n.jsx)(A.td,{children:"The current commit of the tugraph-web repository"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"CPP Compiler Version"}),(0,n.jsx)(A.td,{children:"The CPP version number when compiling TuGraph"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"Python Version Number"}),(0,n.jsx)(A.td,{children:"The Python version number when compiling TuGraph"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"CPP Compiler ID"}),(0,n.jsx)(A.td,{children:"The CPP type when compiling TuGraph"})]})]})]}),"\n",(0,n.jsx)(A.p,{children:"The current running status of the system can also be obtained through commands."}),"\n",(0,n.jsx)(A.pre,{children:(0,n.jsx)(A.code,{className:"language-cypher",children:"CALL dbms.system.info()\n"})}),"\n",(0,n.jsx)(A.h5,{id:"2522database-configuration-information",children:"2.5.2.2.Database Configuration Information"}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.code,{children:"Database Configuration Information"})," obtains the current configuration parameters of the system and displays key information. To adjust the configuration parameters or understand the detailed configuration parameters, please refer to ",(0,n.jsx)(A.a,{href:"/tugraph-db/en/installation&running/tugraph-running",children:"Database Running-Service Configuration"}),"."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"db_configuration",src:t(6610).A+"",width:"2406",height:"944"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,n.jsxs)(A.table,{children:[(0,n.jsx)(A.thead,{children:(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.th,{children:"Parameter"}),(0,n.jsx)(A.th,{children:"Meaning"})]})}),(0,n.jsxs)(A.tbody,{children:[(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"bind_host"}),(0,n.jsx)(A.td,{children:"The host set when the system starts, usually 0.0.0.0"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"browser.credential_timeout"}),(0,n.jsx)(A.td,{children:"Browser cache expiration time for usernames and passwords"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"browser.retain_connection_credentials"}),(0,n.jsx)(A.td,{children:"whether the browser caches usernames and passwords"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"disable_auth"}),(0,n.jsx)(A.td,{children:"Whether to disable the regular update of token authentication. If set to true, the token can be used permanently"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"durable"}),(0,n.jsx)(A.td,{children:"Whether to enable persistent storage of the underlying layer. If set to false, the data is updated asynchronously to the disk"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"enable_audit_log"}),(0,n.jsx)(A.td,{children:"Whether to enable audit log"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"enable_backup_log"}),(0,n.jsx)(A.td,{children:"Whether to enable real-time incremental backup"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"enable_fulltext_index"}),(0,n.jsx)(A.td,{children:"Whether to enable full-text indexing"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"enable_ha"}),(0,n.jsx)(A.td,{children:"Whether to enable ha"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"enable_ip_check"}),(0,n.jsx)(A.td,{children:"Whether to enable IP whitelist"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"enable_rpc"}),(0,n.jsx)(A.td,{children:"Whether to enable the RPC port"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"enable_ssl"}),(0,n.jsx)(A.td,{children:"Whether to enable SSL encrypted transmission"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"optimistic_txn"}),(0,n.jsx)(A.td,{children:"Whether to enable optimistic multi-threaded write transactions"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"port"}),(0,n.jsx)(A.td,{children:"The REST access port of the current system"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"rpc_port"}),(0,n.jsx)(A.td,{children:"The port used by the RPC and HA services"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"subprocess_max_idle_seconds"}),(0,n.jsx)(A.td,{children:"The maximum idle time of the subprocess, a thread pool parameter"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"thread_limit"}),(0,n.jsx)(A.td,{children:"The maximum number of threads used by the server at the same time"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"verbose"}),(0,n.jsx)(A.td,{children:"The level of detail of the log output information. It can be set to 0, 1, or 2, with larger values indicating more detailed output information"})]})]})]})]})}function h(e={}){const{wrapper:A}={...(0,s.R)(),...e.components};return A?(0,n.jsx)(A,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8315:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/account-add-button-683250813410981afa36089239b2bb3b.png"},4064:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/account-add-be840e6001b8e71242a6856550e25c5a.png"},9020:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},7269:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},2289:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/account-edit-1950aa50b4b758c617286b1bc6564d9c.png"},544:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},8298:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/db_basic-dc1066458d3d42de4aced1c7b8144673.png"},6610:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/db_configuration-a88b7309b68405887b1a288ba889fa1c.png"},2576:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-button-855a294366b4ee1119025db0f065257a.png"},8628:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-center-135a2a82ee9cc2fe800925109d392fc2.png"},5080:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-clear-7f6caa6d9ef38c8abb3575c5b548a464.png"},6938:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-collapse-c21a138871b822da899d95ad0c1baa65.png"},8014:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-delete-be5cdd2ce769f082834a26e0cdb0aed9.png"},4426:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-expand-after-a910929725d5cdfb42f61a0f59c069ec.png"},8199:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-expand-before-58f5b97437ee1a585f2c27d5e00c771e.png"},8999:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-expand-1ddcc096d3711c46421094dae76b5729.png"},6171:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-legend-chart-1eaf61d2a88497f793e73302af33d1bf.png"},6283:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-legend-list-aadc8ef90347771d32531cbcb3d4a0e9.png"},171:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-retrieval-627cf4590f0ae8471b910266591dd68d.png"},7038:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-zoom-7a196209fc075eac58133db0b8ab00c6.png"},2118:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-card-4db4fd6f24ffc6083a05ecbf0ce0c276.png"},3355:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-operation-area-02c651380d565f7614eefea76b6a0e42.png"},7869:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-queryfilter-attributefilter-299748df1e431a7cb8a79e6402bd0bb0.png"},243:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-queryfilter-configurequery-a64b68a8f008e19d792a6c48f153d460.png"},5615:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-queryfilter-query-30010e88b7815589917266b31fb94e6e.png"},8371:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-queryfilter-statisticalfilter-chartswitch-732f211f09d7a70e01c7b220b2f4daf2.png"},9288:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-queryfilter-statisticalfilter-1efba6f11b16b0e9a8908f71e33e7730.png"},7354:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-style-appearance-330e9eccab92995ad9d00e4a450d5dce.png"},2213:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-style-layout-button-e3d4d8fe31188f4efc97181306e92c2c.png"},661:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-style-layout-parameters-868f9ae4cabfc6e7129946b003dbe0b1.png"},4122:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-tag-591f29b0662d2cc8a639eec19fbb343c.png"},2416:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-view-2D-47bd08ad54434bc4cc0f611a5d7f4159.png"},5084:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-view-json-bbb80ca39f95c215289d611eef5bad28.png"},7688:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-view-list-1f8c26fd94eff4ce66e4fbc7058c0740.png"},8341:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-addedge-button-e43520dabc74086da68727e0b46f6566.png"},6314:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-addedge-d67971b25c2b65660ca03870725aed1c.png"},446:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-addvertex-button-f7f92dd1692cf3dfe76976d5b2a7df10.png"},5131:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-addvertex-b36fb3cb480a229f2ae132b4c0f6d5fa.png"},1270:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-button-286535ad0da868e4de57d8bbe00d1133.png"},7572:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-editvertex-68735f4833c4cc6a681f8016169be69f.png"},3056:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcgAAAA1CAYAAADF2nuZAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAscSURBVHhe7ZzNjxTXFcX9n5m/B1YsDQRPsGSxSJQoUhACEiuJlOUYhAwRm5GyACsbZraOZ+FsmIWzYQSMHTOVPu+9233r1n318ap6qrvn/KSj6frufrfuPe9WN3xSEUIIIaQBDZIQQghxoEESQgghDjRIQgghxIEGSQghhDjQIAkhhBAHGiQhhBDiQIMkhBBCHGiQhBBCiAMNkhBCCHGgQRJCCCEONEhCCCHEgQZJCCEeBwdV9fnn1K4K8e2ABkkIIR4oop8sSiS1m0J8O1jsRQghpEEyyI+fflr9fONG9dNnn1Fbqv/dvLnsHM+vXKFBEkLIKJJB/nLrVvX27Vtqy3V2dlaLKw2SEEJKSYUU3aNXcKnt0unpaS2uNEgymB9//G96RcglJxVSPKLzCi61fTo/P99ug3z16l/VN9/8o/rd7/8Y9Ne//T2sI+sDpoixvnrtehBe0yjnA/f/r25/USQcSyZiAoP805//Ut289esi7e8/cc9JlUvHdasMEgUZCS5FWr+W5e+++3fam0yJmCMmI5CMPU1yHmT88XeI5BgyERMYJIwOcbHm1yU5xjsnVS4d160xSHSIktx2BowijXXYDo2bIR9VD67drZ6fpMVCXj+6Xj04TAtTcPhVdfXOi+pNWrxIML52XCUe6+1G5o3Fm2d3qzvPMhefMR5ADG8opcdtBCcvqjvXvqpep0UB8V3F6aR6fmd87iH2Vx8dpaUWJjLIEqMrPW5tevVwURMeVi+9bUbff/1ldfX+t2b9t9W9a19Wj4/T8vHTaq/n+dr08v71au/rY3ebJx3XrTBIdIUoxuhi2kAhxz4oAMWd5MlJ9RrJsbheTLKYcFhuky2kazFI57pLrbFYy/jrx9himtDaHrfOHYtQkDMGPbNBIhYl9/gogwzj4Y95U+0TG8SklwFpig0SEy37/urC/vo822CQBwf/rA4Pj9xtXQoG5YyDq72n1ffmeJhOw+BcgzyuHu81DarYIMM68/5qwvHxmvdexWN23iDl8Z4uwniN7gWFwq7HvqNnycGQmsmYXW/IFuWM0dmi3mDGgowxxXhqI8RjVrxvrMdfLK+NGWMRCqU37jPGowvkRK6zH2+QfTr6rs7/pHpzEk2r877XaIPsbdbq/jAGWzfW7TFIfGf5ww//cbf1VTAox/gagumt2SB7m7W+Xu191Q3RLu+0QcqjPN29yDoREt57/LeO7yORRPnEaZuppsR0CqtNVJeZCzLGVz6LmKJ09GKWeqJyEVxMLFbFPlzPPZ9WHwOZBsQEY69zA4gJeve/bCtiMoNM9D5fwhicUI9ZyyPWHTBIGCPuM+w/xiQ3ySBXGvCIlQYZ8YovlpHk0kHagiBdZG4W3YaXNLHwdahWaGOSLs+jE7NPUcY+3jUyqh27RjDWMEVId4zrmpBsRCwyuAU0U8DXgTxVEel4SMevc0KQ9UWEz6fGuVUwPjP2DtkOXePmQ87omgYZrtE43mjxHp6r82xyB4lHq3jPQ46x6t21QTCiYFYr8yo1yHCcPf/yPN0G6R5vdf/p5TFIKQSCFGM9a0YRwDptiLaI9+OkenOYikAjaWPixaSJ3Yk7Sw1MYJBdRSPRt6Cvk/UY5IbEIgP2m9MgMd64x2GG+CvGJ8J2CK/15FK2FxE+35AOsquTTHFsjd+KaHSr8e02PhMLE28ba728CQYp6z3JZ8TjVntcHw3uIE0nWWqQet3q+LRci52RuVa9A613jHZ55w1SJ7Q86tPF2DPNccSiq5PHJmec1eaK4eUySC8m0zFTLMI5U3I2YmHOKbS+j+mQJyTaILEs5gfJe7dmKNvL6DI8Q9d4iOE+a8ahiZjp6nzhPsgd15isNGPWljubYJC/+e0faqaoJfHFPva4XjKG1yVriL06OaWaQckPbYzB5Uys+TgWnWbeEK122iCl+MosWIoDkhyGiO1SEPRMeVJSsbSz3HyCxmRc7n9JDFKPP7p3FG5oUuPchFhIYbfDPiBuY5ExF2FZkByB7NiPM8g4Pvq6XWrrDMO5wniZGHlgzO/cXYz76rxxolS/Xl3GTGuG2Z47m2CQOeGXq/h8xeYYFE2mOWY5Zb4L1OrZQcLw9vbkES/2j/s0r6lkzblm7pfYIJHgGCBdAKRj1JLuEX+HP1rNI0koyWsTJxaMeuI1HvuF5E6Fs29RVp+tS3MbpMQDsUJxlgmLlo5fKbPFwtnHNcILNEiMs0wQ7dhKR+lNTMYaZDc9u8wwyVBx6Rg7jPmDZzgG8YWh3q0ePFrEP3dMOH+6F8Lr/u9J7tnle2vjgg1S/0jH2z6pBnaZvkFawZgfVo+lK0Q3ufewute3g+x1jYXCfhJL9b1mD+m4brxBohAg4ZHUukPRBUKvhzliUPS6wUhC4dGPSSx3ZhkMTe1nE1Inf6bgdnYtGRrHzgDGWgqvjL9MWFCksb44JhsWC2vSGvf9zAByQsbfInEaRpxkxGJTIGdMmpOM5iPQJYgh9g2xXE2AJBZ52clSk9H5M4NB7u8/Kf73j3XjGK7QpZkf7NTP3TQv/X1n6B4XRlh/bDqsg/TV3kUOkY7rxhskkC4SiZ0rsigIKM5SjPG6uJMMRVYn16oLiUXwRUrmIzepwz46+YcW5S0ERVnG3hbgUZOWuWOh9glFfXFtP1YtBX4NICdyJtgGYmPjMy09OsgQU2cfY4BLFvuHCUlue6DjuuFYU3Q7tIkdpBZMEr9o9bZNIhie10GOMMiX9+P2ukEa5a4rGmzyO9xBCijA+LBIbts1AinCViVFORRCNevVRTYW5SO1LhbsVWF0CuXAoqyX6+/Fnjsu90rkCwBFWx7v6XEX4yxh7lgs98HfxblrY22LrjnXOik1utLjNCEm2c/az6hqY6zQ8W2gDDLsp8c+q5yhRhrxHsqMBll63Erxe8js93NrMMjaumCQPbpHUWsXeYk7SAFFV4otpBMd2yAxSu/7l35Y04lFV5alKMdkTYUgFM/0Wq9PLI8BqdBaLZPUHm+WGwXEKfJzIt0+hImMGCZeD2fmWKTr93lUd9GI0Q0VPh/+loP/BSeNoxnbSJtBxvgtx98ljbm3T4inH4s4kVp0mgNzYZMMcqgQS/z1ztlLx8cL00oG5RnhhRjkal1U+oXqotMc8sMaGmQCJiiPU1F8LaMe5wFTVO1sOSYiktfpTnRyh/MsXgepguEY2ipJ8+dcrmsUfe+YeYFJSjGGEJMi5oyFHLM4PpqB6R5nRh5pl6hsstKCnWh4JpXGs999mmJnzxPOYQwyXbueH/XrhPtE3ttQhfurhQkMcn//ScP8+qr030HmZP/5hmtSwSDr+3Wqh0HGa6+MN+xTM+IB3aajvoar47p1BtlFsTEmGh1aICVsGuhsoXQK7iAyx9ffU72LCuC4rkTeQmaNBQptbUxT99NLm9dxzkoyraETjGhsaiyXBqnugcx9L5OatcdiAoPcdbV2kMps/e5PmWLrI9bppOO6cwZJCCEXBg1y53R+fk6DJISQ0aRC+vONG26xpbZL7969o0ESQsgkpEL6y61bbsGltktnZ2e1uNIgCSGklFRIz2/frt6/f+8WXWo79OHDh+rjx4+1uNIgCSGkFFVIUVzRgZyenroFmNpM4bEq4rY0R0CDJISQkWQKafgei2w8iJMbKxokIYSMZEAhJVsEDZIQQkaSCun5lSvxNbUTCvGkQRJCyAhQQFFIqd0UDZIQQgo5OFh2HdQOCvHtgAZJCCGEONAgCSGEEAcaJCGEEOJAgySEEEIcaJCEEEKIAw2SEEIIcaBBEkIIIQ40SEIIIaRBVf0fbZJo0k8omdAAAAAASUVORK5CYII="},6605:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-exportmodel-a64ae5c9d99160d12eee76950b25541e.png"},3034:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-import-csv-c7ce18e6226804ce059b39ec4e9e8d64.png"},2184:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-import-datamapping-549be862085a921489324ce1197308a6.png"},8247:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},857:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-import-3540ce84c6831833796008344dfd4fdc.png"},2349:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},5522:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-importmodel-87a1ba2b08d64920445486c4caedca40.png"},3514:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-list-copy-f5d6fc9da40ba43cdcd95427d70570ed.png"},2240:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},7993:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},8766:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-select-c420f68b574e9f355d1d18d2da0fd9b3.png"},7411:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-ab4c8508939419e073bde6be4ab2f4ec.png"},9709:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-configure-9d77facae2ee79b94521a4ef2cd44576.png"},2926:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-creategraph-422152d6fe55f2d86de3b80372f7ed27.png"},1204:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-editgraph-button-3e899eb3940627bcd27f497d7bc49162.png"},8249:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-editgraph-bd4363c6715cd640bad159382e20456a.png"},5377:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-homepage-9c8ae8efdc08a7e9e32be01d9723d790.png"},7877:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-procedure-button-aaa2d9a9c3350d04ac011d8febe051be.png"},1178:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-procedure-83887e7d82291ff35c0642aed64df2fd.png"},8479:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-selecttemplate-d91aeb2d17bf756312bd2e0f2777072c.png"},1599:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-statistics-button-35d9187ca5035bc23d4d1f7c683ad950.png"},1133:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-statistics-refresh-button-a21fc107f5c66852187f1fe4d7cd5fd9.png"},7740:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-statistics-7ec245055270f838d9737aeddab56b0f.png"},5e3:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/login-56e8acdb4881eb493358a8901eba2354.png"},5801:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},5684:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/pathquery-result-3c4cd19162f517a2e47133ce81f72ad2.png"},9143:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/pathquery-select-65741dbc0e473ccd094f692dd1342f80.png"},885:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAYCAYAAACmwZ5SAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHtSURBVFhH7ZVBboMwEEV7Gu6Rg3ADlHXuEeFbsIEDdJ0Vl4iURQ8x9bf5dBzGLqSVKlG+NAo2E8dv/th5k3+mA3jvOoD3rgOYul6vUtd1El3Xye12W8wjd6s+hkaqduRI+nMljsNvNLYq99FLc+79CuuUBSYIAAmJMeJyuczzLMxWJcDFTY/iqkqqrTEXM1URGEAUIAmMoOD6amAFpoHhmLlpH82wLIPpMD6x3uiysNDfA2OuaqR/xJQgbFo77scBHPNGUaywCgUVgQHJOJ1OM6x+h+fXgftwdrHB5Pw+u6SAcyBh7YKzVBYYzmlHEfrc6kDuKi2AnTg/HvV59kLLJmDKWcxbR8ANBMYF+NQxSlngnH4XeIIMbe389QThkspseHJ4bPne586tPz2r37BUBAYI2lYLgGhhwm5uae2M5SrcTDac3tK2wyhWBO71hWboJWAEhZy1wHGj0Z3EYUgVY7FhvEPuwmEILQzg+F8e1mS+IRMYELik8OP4RBDqJ8BaeWCjneF6AhwLkzgcvj99l/mGTOD7/R6CMHimAAvX8Q7Bm3qrNDABgrMEV22NXIIiZ3mG0fZ+bkgLY2lzS7MIOrTjaxWB/S3t4czNEbx9n1qWcF8F0sE19LGxVASm03tSEXiPOoD3rgN43xL5BE26iMM2oTYfAAAAAElFTkSuQmCC"},1658:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},6838:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-button-d5dbaa0a86444fbfd07b59765a4646bf.png"},3453:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAYCAYAAACmwZ5SAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAF3SURBVFhH7ZbBjYMwEEVTjfugEDqwcqYPBF1wgSo40QRSDhTh5Q/GDDCYGCFtQniRJYMGJc/fY/IwP8YtfHVu4atzC+9RFIWp69pehdKZ8qmMUmFDV519fqCrtFFZY696XqXRKjdN/8mFek6wcJIkNM6EBJ5lvxwemlxcDKW0KV8QhbAtzfr7fEEY3yPMWCVMyU7CPr5E+FgrSCl/kLDu+1D+kTNcv3KwINja9tJDkHDbtiQbxzHNz4KESWJMcv3jhxqWHhu6aui53K4Cenjr4AoSTtPUfQnmZ7Ha0uMBtUib6nBPSBmSJEzPbvezVxgp8iQxR7oYHNw//qoShIkhbZcUSc6THYbdDRDNylnSEl7hKIrovcuRtjJqUHsUWdiD1MfjguycAcHCEv8jPKWMROnda+fAbf8Fu8IY4zbeGmPdUd4RphomOfWpPegWve16eoFXGH2Jw+mdcX4Pe3Biiz4H7h+ZfHB5ha/ILXx1buGr82PCxvwBeQoaIMYc5FgAAAAASUVORK5CYII="},9464:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFsAAAAoCAYAAACRgIb2AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAPlSURBVGhD7ZoxTxRBFMf9EHCY0MsXUD8CCSGIdiQ2VnZaYGuQ3saIUWIiFRdILGxsCNh4sRessCE5LO6qQ26PjcfePt9/dueYnZ1l5zgY4jkv+QV2dmYIv3n7ZjbZG+TDWXjZDsPLdhhetsMolF3/TbT4mejmK48tU2+IHn5M3JnCKBud774jmlyMaeK+x5qFWDibWjELN8rG6kw+M0zmsQLC4VAPo2ysDFbJNJHHAnYHh3oYZaP+GCfxWAOHeuRkx3HS0TSBxx44hEs1fGZfEVaZjfCyh8fLdsi1yX65EdO3H8nc9SbR5hcSbaa+5YRUmW5RRW2716KxmbbSp5jK7AGNz53SxHybxqcPaMyE5Vzn4Vz2g+exkAsgF9fg6etEPtpxbRpbTEQ/KaKq2rYTEQURLattJuaatF4nOtrj39f4Z/r/5iKg8rlKcCobEhFFGXz7cZLxiMGEX0w2Mnppl//eJYi0walsmc3yukgo+qCv6V6WU6rM4DFv0z51aR2P+yyXE/zc6hK1Q1pSS8FseDYWGX3I/xhEo+So964IZ7IhEGVCbZNlAxmttuMa94qeAJUay8rEL+IsL4jDqD9ueS8tHajTW6finlik8xhyQZzJNm2AUqie8cC0OMWkZYQzVGx0aBNlpNcvD8sslg57yhjAG+tqKOp0jet14SLJ4IXMjh8MZ7IhFJug2gaZKCUyk9UsR7t9KUnLyHbM2crXyEKUkUwm454iW5w8MI4l78i5ND5EdGSzyVriVLZeo3XZaiZjYRBq/zyJ6H4pQebN984ytH5Clfmkb1Y2j3v/p3/yGDnZEFlURhCmMoLSo7aZgOjamnIaWWOxLLPWxqwxfV1NztBC9m5aYvrjYqryJjlyspGpelmAbFPGy3v6AhSjHf3mTrg8sNCd5NyMjTCp2VxWtJedkZSNUgGxqkC9hkvQx65eSxTZfKRb+p4/OwvZ9S5VtvnkESD7k/aRlA3kpndexuIewpTtJvBikpyze1TlTe8FRHOgRGT6slAKQlrn++LIl7bnZKuv7DipKAszLE5lA5nhUjqkApnNwFY0qPKmKAKZnL5u50SnyI1UvY/xGdnaK7u6MMPiXDaAcJQQbIBS8GA1+t/kWmT/r3jZDvGyHeJlO8TLdoi17DtvezTxyDyJxw5r2Qubkf/8bAjw+dnCRpTaPIucbHxYst84oVsrySCf4QOQflgJd51Ox+4jnTAMWXhHZDhKCh4JTzlTLPnJpy4FQSAc6nHj+PiYdFqtFjWbTWo0Gp4LAHdwqHs1ZjYiiiKxOngcsFKecuAKzuDOFIWyZeh1x0dxlLkqle3jsoLoL0TwmrSKrdVsAAAAAElFTkSuQmCC"},522:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-gqltips-f6456645ec5de1c6156593a5943e3445.png"},9420:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},4534:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},6490:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},6488:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},5359:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-result-fullscreen-80bd40b9f2fde8e179dea8715da6b154.png"},7362:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-result-graph-210a81aa1c33957cee2ca78986d2467f.png"},9290:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},7231:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-result-insert-cf8a6f5e1e90288c556ff64e24867136.png"},6074:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-result-txt-1a0942ba6f27638a9063892078f138c4.png"},3532:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-schema-graph-5da210a3624e2ba4c19ae24b6b5073ec.png"},7566:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},6567:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAACACAYAAADkkOAjAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABEBSURBVHhe7Z37bxxXFYD7tyDBT0iAUH8AJKgQbQQqRUChgFoVKCCkAkI8S6loaUsRVC2ltFDKo0qpWqCFAgVKoXEgLqSx0yTePG0nztOb2HEcJ46fcXLZb9ZnfXxzZnZmZ2Ztb+6RPnl353nP+ebeO7ubzRXz8/MuEGiVIFAgF1fMzc05C2vlQMAnViCNtWEgAFeMjIw6n9HRkzX4O+ouXrwYESKEFVdMT0+7JC5cuBAkChEbTQU6f/5CTaK6QEGiEH6kEmhhIUgUwo6mAs3NnW9IJAIFiUJINBVoZoa7sIW29kILwc/MsVI5SyEQt2sLtV5ooVSBzs45Nzzp3L4x53aOOtc3EsgCOSN35JBctiuaCjQ9PV8bxrRArlCJart2w2edq6hk7Bq9uCw5gebonJFLckpuy47MAhXZC9HAQ2eWEnDk9Hk3PjnrpqZnjPMIJEHOyB05FJnIbdkSNRVoamrOzc4ykS5eIK4SGrr/1AU3NjlnHj+QHXJJTsktOS4zUgs0P3++0Ik04zRdLVdLkKd4yCm5JcdlzolSCDRfikBM9rhC6HKt4wbyQ26jXqiW67JixQTijoHGMW5bxw3kh9ySY3JdVjQV6Nw5GcKKey+I9yy47aSLDRPm8iC35Jhcl/E+EQ6siEAEVwZYxwwUh+S5rAgCdThBoEAugkCBXASBArkIAsUw2LvRbdyo6B0018vGoOvd+IrbedxatjYJAl0CRb5UmMHeXjeonrfGygl08OBBNz4+bi4DlrGOtSyJIJBiaqrqKt1drrtSrT2eKoEB19PV7SpVa1m57NmzJ+pJrWWwefPmaB0eW7mJ47IUyE9eg2rFdXf1uAFrWURdsJ7BS1+LpBvscV3dFVflb1dXHZ431l0UaJDjLC73j6e3XSbb4rEri9su229zTp06tUwSDa+xzH9dY+UROl4gKxmxiADWskWqlW7X1TOw9JqWToqvlg/06OcIpItfl6KxPNpeCbXsfBbXzSiOBolefPFFV60u9bA85jWW6XXT0nECybY7TtSxGh1LCoH8YWiZUNb2y3o1YwhT2yDb8uETaWT9xR5oWe+XnaGhoWgoE2F4rIXKiuQ57wUfF20TSLYRWhKo6RBWZ6nQusA1TAGRJo1Aiz1MY/haoi5NMQKBDFmwbds2c520aIE0RUXpAumT1rQkUNoiSdERTgtTQA8Uf+ziBJL5UNKkOi1xAgl5oxSB9AnG0ZpANSho7ar378QGenTPVO95uv2CLm679Fq96Ev7Shaovn1cD1icQIBErc57NM0EElqNwgXSJ5VEywJFUOjlw4gvVDT38Yu9KEOFibNsqyfczQSqUd+v2r6xrFiBiiKtQELWKEwgfRJpaEWgc+fOpWa4b5Pr2tK//PWBLa5rU58b1q+tMay8JJFVIMgShQikD56WJIGsxGViuM9t6trk+oa91ztAoCSsXLYikJAmcgukD5gFLZCVjNYYdn2b6kPLlgFjeYcL5JNXIGgWuQTKA43afvzCJY0OFAs5ziMQJEXLAunfDcoC2wENK0OgycnJNY3VpjxIniXvVk3SEBctCdTKycg2MF/bT9+JC65yYsFNnks3hFnJvtyx8qQht+SYXJNzXQOrRs2wIrNAdYmynYQ+cWHPaP3KGDvDMbyG15Jz9uzZQAYsocgtOSbXVg2sWjXDj0wC8c+bswikT9bn6Jm6QIdOzUWNDdIUh8hEbskxubZqIFi1S0JHaoHqPzSVXiB9ghYTMzWBhs+7vuq8O3F6ykxEEmfOnLmssHKQBDkltzuqC1GurRporBomIZFKIH4jKK1A+qTiWFigNzvvDo+fd9tqEvWPzMVKZCUTJiYmLiusHICVM3JJTsktOSbX5NyqhcaqZzOaCjQ5OZtaIH0ycdAYYarWs+0/VZeIq2Xo5IwbGZ90E2fOmkkMJFDLGbkjh+SSnJJbcqxzbtVE49c0iVQ9UFqB9ElY6EZoaGDUEx2bd1uPzUVsPzbbeNyM3qOzHY3VZgudM3JJTn15NFaNBF3XZiQKxDuZaQTSB7ewGiDIr+HzcyRM+nZWScBSYiSRPUdmAgpfMHJG7sghuZS8WjkXrFoJWpIkYgWSz1LyCmSdOEgDfWZnZ93UDMecaYp13lmQNpaJddysWG33IWfkzsopWDUAq2aCFiWO3ALpA/pYJ8z/r2A1kMaDTop1XhpdqE7GartG50zyaOXYqgdYtRN8YXxyCZSEdaKWPLzOiYQoNsgpufXzTQ10TQSrhoIWxscUSNvfikBym67x5ZErhZMIUU6QW6tHsiRKus3Xwvi0LFDcAdPKI11uiHJDD226BkVJdIlAWp6sAvGaL1CSPBwvRLlBjtNKVIpA1Sr/d9gpNzY27sbHT7vTpydq8Pf0JW9m8Rr/hlvgS+FjY2PLkP+HbGRkJKJa64QC5SF5lrz79aBGumZWXQXrnfCWeiDpabShaXof3fMAH/hZjQ4UBzmWfEv+dU2sXsivrdC0B/LlsQSqS2QLpE8kjTx8amw1OlAc8sm85D2tRLq2mlIEkudaHi2QP++p77f+9Q2r0YHiIMfkWmocJ5CWyK+vJpdA/FZ0WoH0CWp5QHqfIFD5iEBZeiG/vppYgSx5oJlA8ljLowXyex8aAjSMSZjV6EBxkGNyLXnXAum7MqlbVolKF0jLw/60QMz4rUYHioMca4GogZaobQLNznKAZIHkJEQga+5DI+hSuS0MApWP3JbLMEYNtEDSC+natU0gjdX7aIHYl1wFIhDvO1iNDhQHOdYCiUS+QFoiLRAkSVSIQBzQF4gTE4Fk/yIPXWoQqD2IQOTc6oWkTr5AWqK2CCQH1wKJ5bIvEYiJXRCoPYhA5FwLBFKfFRFIHyCLQFwJNIaxmbfSrUanYWh82v10/dPuwx+/0b3u9W9wb37rle6r377TDZ7M/+bkfQ896j5286fdvhNrf47GRxXkWt+NST3iBIJCBZqeRoj0AnFCIpDsmxMvSqBdx066W279UiTNXT980P256xX327/+0937wMOufyT/WwOdJBA59gUSibRAoGuo6wurQiCZ/9AYutZWBDp6biGS5v0f+oj7784Bc528dJpA5FoESpoH6RpmEkgL45NGIH1giBOIBuQV6NW9Q+6aa69zjz/9rLmcoe0LX7vNffOue93hM3PRa/zlObxS6Y+2/8Uzz0VD4NvfeZW7+n3Xuif/+NdITtYXgf60odt99Mab3Rvf9BZ3+z3fj/bN8uHpi+6F/2yOljF88vdfW7ZHy+T8HvjZL90Xv/6tFRfRFwiKEEgkKlUg9l20QC9tfi0qGn+t5YBc9FCv7T8aPaeo773ug+6Ff/+vUeAP3vAJt/4PL0TP7/zBA+7Kt73D/f2Vnmh9BEKaL992h/vf7v3ukSeeip7//sUN0fK/dW9x73rPNe6xp37nKkdGoqHzAx/5mNt24Fhj/2X2kFloVSCQ+kKhAiFPnEAygfYF0sOX3IGVJRDiUMBnXngper7+ub+4T33+1mh+JAX+0c9/HfUkLEeC6z9xk/vBTx6LniMQ67CuXs7rhyZm3VfvuGtZD7d9aNhdd/0N7jfP/21p/48/ES1baUQguROjBtSCmkh9pF7+RHpVCLS0n+UCyZfNrEYn0d23L7r6RQ4LhqK7738oKjLSfOX27zSEkQIjlazPEMNQgyA8lyFMhh69XB4jsQ/7tPa/kpBjcm0JBKtOIDmZJIG4K6BRJ0+eNBudhMxxbrzlc27HoePmOrChpy/qNZ79R1c0XMlwIgX+2ZPPNNaVHkt6jSSBpAe67bvfc7uHx6JlwsHTM6tOIHLs38rHCQS6llog6AiBYENvJSrSVVevc/c/+ng0t+E2/o77fti4jR8YPRvd6jO06OFGCowwz7+8yfX0H3Lfuvs+9+51721IliQQz5lw0wsyEectBfbBhFwPkUGgRSqVvW7Xrr1uz559bu/efW7fvv4a/N3n+vv7I+Q58DP9wq5du9zOnTsjKpWK6+vrc9u3b49+vn/r1q2ut7fXbHQamLBSeO6iGD6QiWHrwKmpxjpMplmmhzspML3NN+68J5oc00P989VtjTlRM4EYIpEICeXYDz72q9ADWbQq0O7du5sK1NNTv+spA2TgLumGmz7pdh4dbby+2gpcNlog5kFtF6ivj55kbQnE8MXcB1F+/Mv1jZ4FLjeB+JcYlkD6Vj6XQL4wPmUJ9PIjn3Hr1l1jNjoPDCPcdTG0IQ/P9fIg0KUC5Xk3ulCB9u5lveYCPXfnOvfZR152Lz18i9noQHF0pEAyhAWByqdMgSAI1OEEgQK5CAIFcpFVIP1xxqoTaMeOHUGgNtORAm149LPRLXwZt/GB5SAQH6h2ZA9U5jvRgTodL1CIciMIFCJXrLhAIyP80hj/DJlfpOIrkfWvZciJ8JdPeYET5ESBb8ExeePk+UCPhpw4cSLi+PHj7tixY+7IkSOLzQxRVgSBQuSKIFCIXBEECpErfIGoUxAoROoIAoXIFUGgELkiCBQiVwSBQuSKIJARhw4divYjQWP5qsjGjRsjeMxrOthGlgPvoJMAP3iNZXpd/vkRudCRZn/+ea5EBIGM0IXhHBGGvxKclzynkfKRC48l2N4Xg8e85hed57SNyLK/IFCN1S4Qx7SufgnWi1vOMvZFsJz1RJS4SLs/YjUKJHULAi0WhnP0eyAJGpgkBdvwoS/JaiYikWV/RBCoxlqYA3Fcax5CEigo7bBCL2d/uvewIsv+iCBQjbUgkASvIZIsy1JwttECkRyElEkyy7PsjwgC1VhLAhE0nCGNc6GBRQxhcrws+yOCQDXWmkCEXs5fnluhl5GwuN7F31+caP6x9HYrFUEgI3RhOCZI0HDpgQgaScF1YQm2998vYhuGK70/Qh9P9udLZO0vCFRjtQvEOfL+i8xVLAEIttHrxPUi1v6sdf39WetZ67RbKPJOHTpCIP7zVxFoeHi4ZYFWY5BMBEISvydayQgChcgVWQUSeYJAIaIIAoXIFUGgELmiTIFS/cBUFoG0REkCAQIdPXp0sZkhygpyTx2oSzOB9AQ6tUDswJdGk1cgsASqVqtBoDYEuacWlkDUHqT38QXS8rQs0OgoPwoeLxAEgVZvMAKIQNRH6kZtV7VAIALRCEsg3kwMUW5ogXTdqO2aE0hLFARqT/gCSc2obRAoRNPoGIH8eVAQqD1hCaTvwNIK5Muz4gLxXhAShSg3kIdarCqBOIk4gUAEEokQCEQgEIE4uRDlBEUWgfRFL7XV8oCWp60C8ThJIJHImgexTpCo+KDA9DRp5z++QFqepgIlSZRGINACZR3G5LtBfH9maGjI7d+/3w0MDETwFQnQP6PHNweFAwcOXDaQH+Hw4cMR5A3IIbkkr+SYfBc1fFkCIU/bBYrrhUQiEkJyDh482BDJZ3BwMEIEkwR2MrzhKpAnH/LHxUg+yavIE9f7ADXXn4GVKtD4OMNSeoFABPIl8gXSEpEgEiYiASJZV6PAZ2pWUjsB2pYEOZMckk/d82h5fIGk5iIPaHl8gXx5ChHIh5NMI1AziUiciOTLRM/kw5XnI/taa1htsfClAaYHvjxJvU+SQFqetgkEWiA9jPkS6bmQlojkkEi5AnXXLTL56O07DcmPjwgjyIWJOORayyMCxc19IOvw1RaBIE4gkCuHhOikyVWGSLq7Fql8sUTGTkRLokUBySeIOHHygNTTEkjLU5pAExMMUcsFwmp5DJywFihNLwS+REki+ci+OhFfFB9LHPLuy1NW71O4QKAFAi0QDZbG+xKBL5EgcwQLnVAN+19LWG0AchaHSOPLo+vhy6PvvEDLk12gi+7/C5fftTuWImgAAAAASUVORK5CYII="},2471:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},1349:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-view-7858448691b2d7c071f369241ddd8452.png"},4595:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/quickstart-configure-9c721fc928ba3c57bb940677c505d11a.png"},7991:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/quickstart-creategraph-89fe62a333531733bded84b027814085.png"},3462:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/quickstart-graphtab-fd626c045a446d6bb14ecbc799f31bb9.png"},6836:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/quickstart-result-655453a1a1525c3c07821d771d2a3590.png"},5666:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/quickstart-selectdemo-167c546ad18ab13e66f9c650c5ca91e4.png"},9956:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/role-add-button-8a67f028fbac72bb45acd3d6ebde3bb0.png"},873:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/role-add-df88eaac42ad0351ebff1c01d45b2597.png"},3075:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},1892:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},222:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/role-edit-42d82c9c13ee49128966a8f77d6da59e.png"},1295:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABhAAAABYCAYAAAAUTb0jAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAA09SURBVHhe7d2xbuTGAQbgPIQLI70eIkCQh8gTuD44j2LAONUG4tbAQWWQwl2AK5TC6VMZwtXX5mCLWXLI3ZnhcMhdSbsrzfcDHyQtuVxqqT0N51/q/tCJiIiIiIiIiIiIiIhkUSCIiIiIiIiIiIiIiMgsCgQREREREREREREREZlFgSAiIiIiIiIiIiIiIrMoEEREREREREREREREZBYFgoiIiIiIiIiIiIiIzFItED5//gwAAAAAALxRtVQLhC9fvgAAAAAAAG9ULQoEAAAAAABoVC0KBAAAAAAAaFQtCgQAAAAAAGhULQoEAAAAAABoVC0KBAAAAAAAaFQtCgQAAAAAAGhULQoEAAAAAABoVC0KBAAAAAAAaFQtCgQAAAAAAGhULQoEAAAAAABoVC0KBAAAAAAAaFQtCgQAAAAAAGhULQoEAAAAAABoVC0KBAAAAAAAaFQtCgQAAAAAAGhULQoEAAAAAABoVC0KBAAAAAAAaFQtCgQAAAAAAGhULQoEAAAAAABoVC0KBAAAAAAAaFQtCgQAAAAAAGhULQoEAAAAAABoVC0KBAAAAAAAaFQtCgQAAAAAAGhULQoEAAAAAABoVC0KBAAAAAAAaFQtCgQAAICm3Xe3Nzfdu7tPhWWxT93dtzfdzfv7wjLohZ+l2/vSMgDgWtWiQAAAAGiaAoHnsrVA2Pozx/kde2wcS67bxw9d9/UPj91DYdmXh8fum++77qeHwjJoTC0KBAAAgKa9XIFw//6FCodf77p3N++6u18Ly7ggBcLrp0DgLfm9++77rvvul9KynYfd8h8qBcPeb91Pu/W++fm3wrLzePh5t58ffi8ue5VOKW9+eey+rh1PnqSWN1kgfLp71918e9d9KiwDLmXryQQAAOe1dQJQgcAaY37gegyT7lE5MFyN8P026SR1KCKSye5xMrvmOQuHh93j9RPu27YZCo/SPq05fnI+PDeHbTx2H3e3D899dPtsv5MCId9GL2yn+DirhQ+nqKXpAmEYzCoa4Ey2nkx4BwsAwHkpEHguCgTgWoQJ53hCfCgQVt/FP79fKAuyCe3SbXunX7GQT7xvF+/L8uPnpcpB4fveJNxvKAKGUiAqEMbnun/ew75E+1UoEKbHLu3j4U9RhXVPeW6pq0WBoECAM1EgAABs9t+/d//755+6Lx++Ch93XxfXi93fdje7cVSsNPYazoOSdcrjr+G8Klrv3d399gKhsC83N7fd/X6d8JjlZUH++OHcbSwx4tt3Whw7/uPhx+5v//5L99d//XHQf97fVlo3VXgOk2O6dmzm9z88/4cxf3r88rLHmP9cfvzPb92ffwzvlO4/9l+X1jtIj03+78X8mDqWXKd4AnuakP7pyAJh+YqFx+7jC12BsDzBXzErM15zgTDf90N5EL6e7nv8vlJTiz9hBJzJ4WSivBwAgEFfFnz4aq5aIvSTuulEb5jAjSdux4nf5FwpjNH6CcF4AjBMGsbbiyaNn3oFwnD1QP3xwr5nj/8+2u/Gr0Doi4KpOMjVS4TxeOc/A9MxWj02489BfEx397ndr7/15ymsZ9L5ZfVlQWlSs14irByb2c+IY8kVKkxO9xPSy4XA3GFyemFi/SWvQGi5QIi20d833k5iLHCUCM+nFgUCcCZhYKlAAACom648yA23F9Zflo2/hqsC4kncUT4huDg5H7b31AJhuG12vpZOQpbul1jcxzbEVx7k+mWl+/TKz/3a8vjYrI3pF35Gxp+xw/3S483LmK48yPW3l9YPasemUCA5llyj2dUBYUJ6KBCOuAJh+HqanO8/Hjuxf4LWC4TZ/Xbrp8dyrvR9crxaLlYgpJcz9tKB7DBwiZbPBiizS2IP9z8UCOPgZbJp4Aoti95ZVnzdZK+p2Qno/P6HgWS4b/9aTl//+YmfASgA0LhCebBXWj82TtSWxmPLk/Lp+Gv5DVmlycO6+WMexoTxevm2p/Hi4piw8QKhVBzESvdZH2dvOTbTeH/puV/aRv7Ya/vCcyhNtE1K6wfLxybM0+TngI4l1yxMTE8TzNsKhNT+PnGBME5+l15buWMnt4cJ9MJ21s0LhPJ6dZctEMLyvEjIHyvdx/F7PfK4MlfLRQqE8EsnHXDcv59+CY0DknjAOpYF+0HI8PXS/ePJyegX2ziQjn+pKRAgFgZ+6Wtid9t0wrf0Gtq/zgonlLv7uJwZAOA4p12BMI214vOkeFxVGKtl953GX8vnSbVtlA3bysaHecGRiNeN3zSW70/jBcJJVyCMz/18cn90xLEJY/ggHbeHnyUFwnV41isQ8nmZPceS6xUm4w8T66EMeBwmoUuvjViY8I4mrPMrEJIJ8FxponubYZ+bvQIhfFwuA05/XllXy/kLhMLk/5bl8SB2+R0xQSgQ6tsofQ0tW3s9lJfHg8Xw+eIJybh8dsI5O5ExAAUAGnfC/4GwPlYb1ylO/qfrXeYKhJpxHDl7g1i7BcJp/wfC2nN/wrGZSp79MV7aRrj9MMbPv+YlPN//gRBu2/LvB1yPMNkcT6LHBcJ+wnucTD9MeEeT3PHE/DUXCDPnKRCGbe3us9nucb+rFgi7z4fn/PmfV9bVcvYCYdMkZeGXUigFxgHjbJBSWLfwGMk2dtb2BdqxNugLy+cnAvFJ5Pj54onc0jbyxzYABQDoy4LpSoThY/U/UF44txnPm6ZxVX4+tLTe0pu69u9QXzgPK5mf3x1fQgzywqDxAqHXFwXxlQj95/X/QHntuT/t2KTn38b816YvC6YrEfqP9fKgNz82w+u49G/HwLHkOg1lQTZRHt4Jv71AWJwg7+8zToAXl4/eeoEQhPvtn88nXYHQfx7W6e87HMPd7aue/HzRq+XMBcLGAcvul09Z/o6Twu07CgQ40vh6Wny3UfJ6K4he02FwGaSDSCcTAAAvJZzrxBPqYUyVjsnG25JzoNJ603lZfJ4VnasdMcFcLC3ywmIU/1na+PPefDvGjCeZxvXJMdw9l9PXq8cmWneQn+OH42LM/5plx2b8mVg8V3QsuUphQjqZZP7wOE5eH3EFQrzNc16BEE28J99DTTKJ/poLhJfYR7ao5TJXIFQGnGvL56aB7GGwrECAYy0N9CdrywvGgaaTCQCA84jfyBHOe0rjqnDb+nr5m7v68618sniL+PGiAqDwBpX48dPvpRfddxTO7+b3ZU3+M5CN0avHZn7f9OchLDfmf82iY1N9I9k0B+NY8lpMk8/hY3ESPnKpAmEoDeICYfy8Zj7hvu17LDmtQBj/zFNWIEzP4ZMKhH69/fcWrdffvuG5Ybtazl4gFN+BEllbXpYOUhQIcKy1k8FTThbz12L6Oj3IB5wGoAAAAJexdN625Nj14UL2f1s/TELv3zE/Tk4f3jFffvd+ejXAY/dxnAA/3DZ3/GR8+tgnFwjjvpUef142TNJJ/M2Gx5oXCIfS4PgCIf6+4+3MCoTd54dlPFUt5/9PlPfvZElLguSSyN0vn9nE/v1tVBDcpn/rcninsysQ4ElczgwAANC24bww/nNoK45dH85pLA32honzrQXC78PHfRnw4QxXIGTbPLlAqPxHxM9eIMRXZgz73xcI4TmMC4HZRH/yvYbH3h+n6fbh+xjLiUG2j+M2jt5nimq5QIEQzC5JLU08xsujif5QBMTL019WCgQ4VZi8j19fyYS/y5kBABgUxn4RYzl4nY6dJzGvwlWaioP95HuYeA6T2OHzYYK6n4BeLBCyCe94oryXTfanTpuMzyf3TysQwv6XS4LnLxCSfdwXCNFzPK6zpUBIHrtYDszXG76fpGTgVLVcrEAAAAAA4MLiN4ptKQOOXR8uLJ1kjia3TywQhknz3TY22VAABGG/4sc96nGmUmAsT5aKgOctEKb7jKVFvx+77zd/jFMKhH4bS/fJ97Hf/nH7TUktCgQAAAAA4A1K/5xOUiAU1psm5GfL8ysQqk6YjC9sfygQjrwC4VCErK87lQ17m7+/UfE5OTzfw2ON246Lgvnj1Z+vpEg5dh/ZrBYFAgAAAAAANKoWBQIAAAAAADSqFgUCAAAAAAA0qhYFAgAAAAAANKoWBQIAAAAAADSqFgUCAAAAAAA0qhYFAgAAAAAANKoWBQIAAAAAADSqFgUCAAAAAAA0qhYFAgAAAAAANKoWBQIAAAAAADSqFgUCAAAAAAA0qhYFAgAAAAAANKoWBQIAAAAAADSqFgUCAAAAAAA0qhYFAgAAAAAANKoWBQIAAAAAADSqFgUCAAAAAAA0qhYFAgAAAAAANKoWBQIAAAAAADSqFgUCAAAAAAA0qhYFAgAAAAAANKoWBQIAAAAAADSqFgUCAAAAAAA0qhYFAgAAAAAANKoWBQIAAAAAADSqFgUCAAAAAAA0qhYFAgAAAAAANKqWaoHw+fNnAAAAAADgjaqlWiCIiIiIiIiIiIiIiEibUSCIiIiIiIiIiIiIiMgsCgQREREREREREREREZlFgSAiIiIiIiIiIiIiIrMoEEREREREREREREREZBYFgoiIiIiIiIiIiIiIZOm6/wOL5Ehq6uISPwAAAABJRU5ErkJggg=="},3353:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/vertexquery-2fb20c2bc90ac608c65ca49cd5c3d706.png"},8453:(e,A,t)=>{t.d(A,{R:()=>a,x:()=>r});var n=t(6540);const s={},i=n.createContext(s);function a(e){const A=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(A):{...A,...e}}),[A,e])}function r(e){let A;return A=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(i.Provider,{value:A},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4564],{678:(e,A,t)=>{t.r(A),t.d(A,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>c});var n=t(4848),s=t(8453);const i={},a="TuGraph Browser",r={id:"user-guide/tugraph-browser",title:"TuGraph Browser",description:"This document focuses on the use of TuGraph Browser.",source:"@site/../docs/en-US/source/4.user-guide/1.tugraph-browser.md",sourceDirName:"4.user-guide",slug:"/user-guide/tugraph-browser",permalink:"/tugraph-db/en/user-guide/tugraph-browser",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Demo:Round The World",permalink:"/tugraph-db/en/quick-start/demo/round-the-world"},next:{title:"TuGraph Browser(old version)",permalink:"/tugraph-db/en/user-guide/tugraph-browser-legacy"}},d={},c=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.User Guide",id:"2user-guide",level:2},{value:"2.1.Accessing",id:"21accessing",level:3},{value:"2.2.Logging in",id:"22logging-in",level:3},{value:"2.3.Quick Start",id:"23quick-start",level:3},{value:"2.3.1.Creating a Graph Project",id:"231creating-a-graph-project",level:4},{value:"2.3.2.Starting a Graph Project",id:"232starting-a-graph-project",level:4},{value:"2.4.Graph Project",id:"24graph-project",level:3},{value:"2.4.1.Graph Project Management",id:"241graph-project-management",level:4},{value:"2.4.1.1.Creating a Graph Project",id:"2411creating-a-graph-project",level:5},{value:"2.4.1.2.Editing a Graph Project",id:"2412editing-a-graph-project",level:5},{value:"2.4.1.3.Deleting a Graph Project",id:"2413deleting-a-graph-project",level:5},{value:"2.4.1.4.Vertex-Edge Statistics",id:"2414vertex-edge-statistics",level:5},{value:"2.4.1.5.Procedure",id:"2415procedure",level:5},{value:"2.4.2.Graph Building",id:"242graph-building",level:4},{value:"2.4.2.1.Model Definition",id:"2421model-definition",level:5},{value:"a.Browse Graph Models",id:"abrowse-graph-models",level:6},{value:"b.Add Vertex",id:"badd-vertex",level:6},{value:"c.Add Edges",id:"cadd-edges",level:6},{value:"d.Import Model",id:"dimport-model",level:6},{value:"e.Export Model",id:"eexport-model",level:6},{value:"2.4.2.2.Data Import",id:"2422data-import",level:5},{value:"a.Data Preparation",id:"adata-preparation",level:6},{value:"b.Upload Files",id:"bupload-files",level:6},{value:"c.Data Mapping",id:"cdata-mapping",level:6},{value:"2.4.3.Graph Query",id:"243graph-query",level:4},{value:"2.4.3.1.Switch Graph Project",id:"2431switch-graph-project",level:5},{value:"2.4.3.2.Statement Query",id:"2432statement-query",level:5},{value:"a.Statement Query Window",id:"astatement-query-window",level:6},{value:"b.Bookmark List",id:"bbookmark-list",level:6},{value:"c.View Graph Model",id:"cview-graph-model",level:6},{value:"2.4.3.3.Path Query",id:"2433path-query",level:5},{value:"2.4.3.4.Vertex Query",id:"2434vertex-query",level:5},{value:"2.4.3.5.Execution Result Tab",id:"2435execution-result-tab",level:5},{value:"a.Text",id:"atext",level:6},{value:"b.Vertex-Edge View",id:"bvertex-edge-view",level:6},{value:"c.Data Insertion",id:"cdata-insertion",level:6},{value:"d.Download Execution Result",id:"ddownload-execution-result",level:6},{value:"e.Full-Screen Display",id:"efull-screen-display",level:6},{value:"2.4.4.Graph Analysis",id:"244graph-analysis",level:4},{value:"2.4.4.1.Query by Statement",id:"2441query-by-statement",level:5},{value:"2.4.4.2.Query by Configuration",id:"2442query-by-configuration",level:5},{value:"2.4.4.3.Canvas Analysis",id:"2443canvas-analysis",level:5},{value:"a.Expand Query",id:"aexpand-query",level:6},{value:"b.Collapse/Expand Vertexs",id:"bcollapseexpand-vertexs",level:6},{value:"c.Delete Vertex",id:"cdelete-vertex",level:6},{value:"d.Clear Canvas",id:"dclear-canvas",level:6},{value:"e.Vertex/Edge Retrieval",id:"evertexedge-retrieval",level:6},{value:"f.Canvas Legend",id:"fcanvas-legend",level:6},{value:"g.Zoom/Center",id:"gzoomcenter",level:6},{value:"2.4.4.4.Attribute Filter",id:"2444attribute-filter",level:5},{value:"2.4.4.5.Statistical Filter",id:"2445statistical-filter",level:5},{value:"2.4.4.6.Layout Style",id:"2446layout-style",level:5},{value:"2.4.4.7.Appearance Style",id:"2447appearance-style",level:5},{value:"2.4.4.8.View Switch",id:"2448view-switch",level:5},{value:"2.4.4.9.Label/Card Layout Switch",id:"2449labelcard-layout-switch",level:5},{value:"2.5.Console",id:"25console",level:3},{value:"2.5.1.Account Management",id:"251account-management",level:4},{value:"2.5.1.1.Account Management",id:"2511account-management",level:5},{value:"a.Add Account",id:"aadd-account",level:5},{value:"b.Edit Account",id:"bedit-account",level:5},{value:"c.Disable Account",id:"cdisable-account",level:5},{value:"d.Delete Account",id:"ddelete-account",level:5},{value:"2.5.1.2.Role Management",id:"2512role-management",level:4},{value:"a.Add Role",id:"aadd-role",level:5},{value:"b.Edit Role",id:"bedit-role",level:5},{value:"c.Disable Role",id:"cdisable-role",level:5},{value:"d.Delete Role",id:"ddelete-role",level:5},{value:"2.5.2.Database Information",id:"252database-information",level:4},{value:"2.5.2.1.Basic Information",id:"2521basic-information",level:5},{value:"2.5.2.2.Database Configuration Information",id:"2522database-configuration-information",level:5}];function l(e){const A={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",header:"header",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(A.header,{children:(0,n.jsx)(A.h1,{id:"tugraph-browser",children:"TuGraph Browser"})}),"\n",(0,n.jsxs)(A.blockquote,{children:["\n",(0,n.jsx)(A.p,{children:"This document focuses on the use of TuGraph Browser."}),"\n"]}),"\n",(0,n.jsx)(A.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,n.jsx)(A.p,{children:"TuGraph Browser (hereinafter referred to as Browser) is a powerful product visualization development tool that presents graph data in an intuitive visual way, allowing users to easily manage, maintain, and view the database running status. This tool not only supports graph data management and visualization but also supports system account management, providing users with a comprehensive operation and management experience, enabling users to manage and utilize graph databases more efficiently."}),"\n",(0,n.jsx)(A.h2,{id:"2user-guide",children:"2.User Guide"}),"\n",(0,n.jsx)(A.h3,{id:"21accessing",children:"2.1.Accessing"}),"\n",(0,n.jsx)(A.p,{children:"After the user completes the installation of the graph database, they can access the Browser through a browser. Users only need to enter the IP:Port of the server where TuGraph is located in the browser address bar. The default port used is 7070."}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"For example:127.0.0.1:7070."}),"\n",(0,n.jsx)(A.li,{children:"Recommend using Chrome."}),"\n"]}),"\n",(0,n.jsx)(A.h3,{id:"22logging-in",children:"2.2.Logging in"}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"login",src:t(5e3).A+"",width:"2856",height:"1492"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"After successfully accessing the Browser, the login page appears first (as shown above), where users need to fill in their account and password to log in."}),"\n",(0,n.jsx)(A.li,{children:"The database address format: bolt://ip:bolt_port."}),"\n",(0,n.jsx)(A.li,{children:"Default account: admin."}),"\n",(0,n.jsx)(A.li,{children:"Default password: 73@TuGraph."}),"\n",(0,n.jsx)(A.li,{children:"After the user's first login, they will be redirected to the password modification page. Once the password is successfully modified, they can only use the new password to log in."}),"\n"]}),"\n",(0,n.jsx)(A.h3,{id:"23quick-start",children:"2.3.Quick Start"}),"\n",(0,n.jsx)(A.p,{children:"For first-time users of TuGraph, you can quickly build a graph project with the built-in demo data and get started with graph data projects quickly."}),"\n",(0,n.jsx)(A.h4,{id:"231creating-a-graph-project",children:"2.3.1.Creating a Graph Project"}),"\n",(0,n.jsxs)(A.p,{children:["In the ",(0,n.jsx)(A.code,{children:"Graph Project"})," homepage tab, click ",(0,n.jsx)(A.code,{children:"Create New Graph Project"})," to create a new graph project."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"quickstart-creategraph",src:t(7991).A+"",width:"1290",height:"184"})}),"\n",(0,n.jsxs)(A.p,{children:["Select a built-in demo data, and click the ",(0,n.jsx)(A.code,{children:"Next"})," button."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"quickstart-selectdemo",src:t(5666).A+"",width:"1136",height:"908"})}),"\n",(0,n.jsx)(A.p,{children:"In the Fill in Configurations interface, enter the graph project information. Since the demo data is relatively small in size, set the Maximum Storage Space to 1 GB. After entering the graph project information, click the Create button, and the system will automatically create the graph model of the demo data and import the graph data."}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"quickstart-configure",src:t(4595).A+"",width:"1135",height:"807"})}),"\n",(0,n.jsx)(A.h4,{id:"232starting-a-graph-project",children:"2.3.2.Starting a Graph Project"}),"\n",(0,n.jsxs)(A.p,{children:["After creating a graph project with demo data, you can find the corresponding graph project in the ",(0,n.jsx)(A.code,{children:"Graph Project"})," tab, and then click ",(0,n.jsx)(A.code,{children:"Graph Query"})," to query graph data."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"quickstart-graphtab",src:t(3462).A+"",width:"800",height:"326"})}),"\n",(0,n.jsx)(A.p,{children:"Execute the default query statement to browse the graph data in the demo."}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"quickstart-result",src:t(6836).A+"",width:"2555",height:"1291"})}),"\n",(0,n.jsxs)(A.p,{children:["For more quick start documents, please visit the",(0,n.jsx)(A.a,{href:"/tugraph-db/en/quick-start/preparation",children:"Quick Start Documents"})]}),"\n",(0,n.jsx)(A.h3,{id:"24graph-project",children:"2.4.Graph Project"}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.code,{children:"Graph Project"})," provides visualized graph project management and graph data development functions, providing users with a series of convenient graph data visualization operations, including graph project creation, modification, deletion, and other management operations, as well as graph data queries, vertex-edge statistics, and other operations. In addition, it also supports graph model management, making it more convenient for users to manage and maintain graph data."]}),"\n",(0,n.jsx)(A.h4,{id:"241graph-project-management",children:"2.4.1.Graph Project Management"}),"\n",(0,n.jsxs)(A.p,{children:["On the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page, you can see the graph projects in the current graph database."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-homepage",src:t(5377).A+"",width:"2846",height:"1462"})}),"\n",(0,n.jsx)(A.h5,{id:"2411creating-a-graph-project",children:"2.4.1.1.Creating a Graph Project"}),"\n",(0,n.jsxs)(A.p,{children:["On the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page, click the ",(0,n.jsx)(A.code,{children:"Create New Graph Project"})," button to create a new graph project."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-creategraph",src:t(2926).A+"",width:"2502",height:"362"})}),"\n",(0,n.jsxs)(A.p,{children:["Creating a new graph project requires completing the creation of the graph project through two pages: ",(0,n.jsx)(A.code,{children:"Select Template"})," and ",(0,n.jsx)(A.code,{children:"Fill in Configurations"}),"."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:[(0,n.jsx)(A.strong,{children:"Select Template"}),": The product provides two types of templates: empty templates and demo templates.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Empty templates: A brand new graph project where users need to create their own graph model and import graph data, generally used for formal project development."}),"\n",(0,n.jsx)(A.li,{children:"Demo templates: Built-in demo data in the product. After the graph project is created successfully, the system will automatically create a demo graph model and import demo graph data, usually used for trial and learning."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-selecttemplate",src:t(8479).A+"",width:"1142",height:"915"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:[(0,n.jsx)(A.strong,{children:"Fill in Configurations"}),": Users need to fill in basic information about the graph project and click the ",(0,n.jsx)(A.code,{children:"Create"})," button to create the graph project.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Graph Name: The name of the new graph project, which is also the unique primary key of the graph project. Supports Chinese characters, letters, numbers, and underscores, but does not support spaces or other special characters."}),"\n",(0,n.jsx)(A.li,{children:"Graph Description: The description of the new graph project can be used to describe the background and objectives of the project in detail."}),"\n",(0,n.jsx)(A.li,{children:"Advanced Configuration - Maximum Storage Space: Set the maximum storage space that the graph project can occupy. It does not actually occupy physical storage space in advance. After the actual data volume reaches the maximum storage space threshold, no more data can be written."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-configure",src:t(9709).A+"",width:"1136",height:"818"})}),"\n",(0,n.jsxs)(A.p,{children:["After creation, the graph project can be viewed in the graph project tab on the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page."]}),"\n",(0,n.jsx)(A.h5,{id:"2412editing-a-graph-project",children:"2.4.1.2.Editing a Graph Project"}),"\n",(0,n.jsxs)(A.p,{children:["On the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page, click the ",(0,n.jsx)(A.code,{children:"Edit button"})," (pencil icon) in the graph project tab to edit the basic information of the corresponding graph project."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-editgraph-button",src:t(1204).A+"",width:"808",height:"330"})}),"\n",(0,n.jsx)(A.p,{children:"graphmanagement-editgraph-button"}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-editgraph",src:t(8249).A+"",width:"691",height:"577"})}),"\n",(0,n.jsx)(A.h5,{id:"2413deleting-a-graph-project",children:"2.4.1.3.Deleting a Graph Project"}),"\n",(0,n.jsxs)(A.p,{children:["On the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page, click the ",(0,n.jsx)(A.code,{children:"Delete"})," button (trash can icon) in the graph project tab to delete the corresponding graph project."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-deletegraph-button",src:t(1204).A+"",width:"808",height:"330"})}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.em,{children:"Note: Graph projects cannot be restored after deletion."})}),"\n",(0,n.jsx)(A.h5,{id:"2414vertex-edge-statistics",children:"2.4.1.4.Vertex-Edge Statistics"}),"\n",(0,n.jsxs)(A.p,{children:["On the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page, click the ",(0,n.jsx)(A.code,{children:"Vertex-Edge Statistics"})," button (line graph icon or refresh icon) in the graph project tab to count the number of vertexs and edges in the corresponding graph project."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-statistics-button",src:t(1599).A+"",width:"802",height:"326"})}),"\n",(0,n.jsxs)(A.p,{children:["The statistical results will be displayed on the graph project tab. Graph projects that have not been vertex-edge statistics will display ",(0,n.jsx)(A.code,{children:"No vertex-edge data"}),", and graph projects that have already been vertex-edge statistics need to click the ",(0,n.jsx)(A.code,{children:"Refresh"})," button to count again."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-statistics",src:t(7740).A+"",width:"798",height:"330"})}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-statistics-refresh-button",src:t(1133).A+"",width:"814",height:"402"})}),"\n",(0,n.jsx)(A.h5,{id:"2415procedure",children:"2.4.1.5.Procedure"}),"\n",(0,n.jsxs)(A.p,{children:["In the ",(0,n.jsx)(A.code,{children:"Graph Project"})," interface, click the ",(0,n.jsx)(A.code,{children:"Procedure"})," button (the icon on the far right of the tab) to navigate to the page for operating stored procedures."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-procedure-button",src:t(7877).A+"",width:"806",height:"332"})}),"\n",(0,n.jsxs)(A.p,{children:["On the ",(0,n.jsx)(A.code,{children:"Procedure"}),' page, you can create a new stored procedure. When creating a new one, you need to fill in the "Stored Procedure Name," "Stored Procedure Type," and "Stored Procedure Description," and then select the "Version" and whether to modify the database during execution.']}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphmanagement-procedure",src:t(1178).A+"",width:"2834",height:"1472"})}),"\n",(0,n.jsxs)(A.p,{children:["For more operations related to stored procedures, please refer to ",(0,n.jsx)(A.a,{href:"/tugraph-db/en/olap&procedure/procedure/",children:"Procedure"})]}),"\n",(0,n.jsx)(A.h4,{id:"242graph-building",children:"2.4.2.Graph Building"}),"\n",(0,n.jsxs)(A.p,{children:["The ",(0,n.jsx)(A.code,{children:"Graph Building"})," function in Browser is mainly used for graph project model definition and data import. On the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page, click the ",(0,n.jsx)(A.code,{children:"Graph Building"})," button in the graph project tab."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-button",src:t(1270).A+"",width:"802",height:"326"})}),"\n",(0,n.jsx)(A.h5,{id:"2421model-definition",children:"2.4.2.1.Model Definition"}),"\n",(0,n.jsx)(A.p,{children:"Browser provides a visualization way to create and maintain graph models."}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Graph models can also be created and maintained through the ",(0,n.jsx)(A.code,{children:"Cypher"})," tool and the ",(0,n.jsx)(A.code,{children:"lgraph_import"})," tool. For details, please refer to the ",(0,n.jsx)(A.a,{href:"/tugraph-db/en/query/cypher",children:"Cypher API Document"})," and ",(0,n.jsx)(A.a,{href:"/tugraph-db/en/utility-tools/data-import",children:"Data Import Document"}),"."]}),"\n"]}),"\n",(0,n.jsx)(A.h6,{id:"abrowse-graph-models",children:"a.Browse Graph Models"}),"\n",(0,n.jsxs)(A.p,{children:["On the ",(0,n.jsx)(A.code,{children:"Model Definition"})," page, you can view detailed graph model settings, support list and canvas view of the graph model, support list display of vertex type properties and indexes, edge type properties and start/end vertex types."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild",src:t(7411).A+"",width:"1527",height:"1120"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Supports list view of vertex types and edge types.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["\n",(0,n.jsx)(A.p,{children:"Supports the display of the number of vertexs or edges in the corresponding vertex type or edge type in the vertex type or edge type tab."}),"\n"]}),"\n",(0,n.jsxs)(A.li,{children:["\n",(0,n.jsxs)(A.p,{children:["Supports keyword search for vertex type or edge type names. Enter the keyword in the ",(0,n.jsx)(A.code,{children:"search box"})," to display the corresponding vertexs or edges."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-list-search",src:t(7993).A+"",width:"292",height:"182"})}),"\n"]}),"\n",(0,n.jsxs)(A.li,{children:["\n",(0,n.jsxs)(A.p,{children:["Supports copying vertex type or edge type names. Click the ",(0,n.jsx)(A.code,{children:"Copy"})," button to copy the name of the vertex or edge to the clipboard."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-list-copy",src:t(3514).A+"",width:"289",height:"196"})}),"\n"]}),"\n",(0,n.jsxs)(A.li,{children:["\n",(0,n.jsxs)(A.p,{children:["Supports deleting vertex types or edge types. Click the ",(0,n.jsx)(A.code,{children:"Delete"})," button to delete the corresponding vertex or edge."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-list-delete",src:t(2240).A+"",width:"280",height:"187"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.li,{children:"Supports canvas view of vertex types and edge types."}),"\n",(0,n.jsxs)(A.li,{children:["Clicking the corresponding vertex type or edge type in the list or canvas can display the model details.\n",(0,n.jsx)(A.img,{alt:"graphbuild-select",src:t(8766).A+"",width:"1653",height:"956"})]}),"\n"]}),"\n",(0,n.jsx)(A.h6,{id:"badd-vertex",children:"b.Add Vertex"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Add Vertex"})," button on the ",(0,n.jsx)(A.code,{children:"Model Definition"})," page to add a vertex type in the right sliding window."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-addvertex-button",src:t(446).A+"",width:"2852",height:"1484"})}),"\n",(0,n.jsxs)(A.p,{children:["The user needs to enter the Vertex type name, properties, and indexes, and click the ",(0,n.jsx)(A.code,{children:"Complete"})," button to complete the creation of the Vertex type."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Vertex Type Name: The name of the Vertex, which is also the unique identifier of the Vertex."}),"\n",(0,n.jsxs)(A.li,{children:["Properties: The attributes of the Vertex, and one attribute needs to be used as the primary key.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Data Type: The data type of the attribute field, supports types such as INT, STRING, DOUBLE, DATE, DATETIME, BLOB, BOOL."}),"\n",(0,n.jsx)(A.li,{children:"Optional: Whether the attribute can be null."}),"\n",(0,n.jsx)(A.li,{children:"Delete: Attributes can be deleted arbitrarily when creating Vertexs."}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(A.li,{children:["Indexes: The indexing attributes of the Vertex, you need to create attributes first and then set the attribute as an index.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Attribute: The attribute that needs to be indexed."}),"\n",(0,n.jsx)(A.li,{children:"Unique:Set the attribute field as a unique value."}),"\n",(0,n.jsxs)(A.li,{children:["Primary Key: Whether the corresponding attribute is a primary key. The Unique option must be ",(0,n.jsx)(A.code,{children:"Yes"})," after selecting ",(0,n.jsx)(A.code,{children:"Yes"}),"."]}),"\n",(0,n.jsx)(A.li,{children:"Delete: Indexes can be deleted arbitrarily during Vertex creation."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-addvertex",src:t(5131).A+"",width:"1634",height:"1131"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Edit Vertex: You can add Vertex properties, modify the data type of existing properties, and add or delete indexes. You need to click the ",(0,n.jsx)(A.code,{children:"Save"})," button for each newly added or modified attribute to take effect.\n",(0,n.jsx)(A.em,{children:"Note: Once the primary key field attribute is created, it cannot be modified."})]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-editvertex",src:t(7572).A+"",width:"576",height:"944"})}),"\n",(0,n.jsx)(A.h6,{id:"cadd-edges",children:"c.Add Edges"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Add Edge"})," button on the ",(0,n.jsx)(A.code,{children:"Model Definition"})," page to add an edge type in the right sliding window."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-addedge-button",src:t(8341).A+"",width:"1636",height:"1126"})}),"\n",(0,n.jsxs)(A.p,{children:["The user needs to enter the edge type name, properties, select the start vertex type and end vertex type, and click the ",(0,n.jsx)(A.code,{children:"Complete"})," button to complete the creation of the edge type."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Edge Type Name: The name of the edge, which is also the unique identifier of the edge."}),"\n",(0,n.jsxs)(A.li,{children:["Properties: The attributes of the edge, which may not exist on the edge.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Data Type: The data type of the attribute field, supports types such as INT, STRING, DOUBLE, DATE, DATETIME, BLOB, BOOL."}),"\n",(0,n.jsx)(A.li,{children:"Optional: Whether the attribute can be null."}),"\n",(0,n.jsx)(A.li,{children:"Delete: Attributes can be deleted arbitrarily when creating edges."}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(A.li,{children:["Selecting start vertex type and end vertex type: Set the start vertex type and end vertex type of the edge, and support multiple start vertex types and end vertex types.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Start vertex: Select the vertex type of the start vertex."}),"\n",(0,n.jsx)(A.li,{children:"End vertex: Select the vertex type of the end vertex."}),"\n",(0,n.jsx)(A.li,{children:"At least one vertex type needs to be created in advance to set the start vertex type and end vertex of the edge."}),"\n",(0,n.jsx)(A.li,{children:"If not selected, it means that the start vertex and end vertex can be any vertex type, and the corresponding edge is not displayed on the canvas, and you need to view the edge type in the left list."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-addedge",src:t(6314).A+"",width:"586",height:"693"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Edit Edge: You can add edge properties and modify the data type of existing properties. You need to click the ",(0,n.jsx)(A.code,{children:"Save"})," button for each newly added or modified attribute to take effect."]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-addedge",src:t(6314).A+"",width:"586",height:"693"})}),"\n",(0,n.jsx)(A.h6,{id:"dimport-model",children:"d.Import Model"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Import Model"})," button on the ",(0,n.jsx)(A.code,{children:"Model Definition"})," page to upload a model file and quickly create a model."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-importmodel-button",src:t(2349).A+"",width:"474",height:"47"})}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Upload File"})," button on the ",(0,n.jsx)(A.code,{children:"Import Model"})," page to upload the model file. After the upload is successful, click ",(0,n.jsx)(A.code,{children:"OK"})," to import the graph model."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Overwrite the current canvas model: If this option is selected, the existing graph model will be cleared before importing the graph model in the model file; if not selected, the vertex types and edge types in the model file will be imported, but the existing vertex types and edge types will not be modified."}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-importmodel",src:t(5522).A+"",width:"948",height:"514"})}),"\n",(0,n.jsx)(A.h6,{id:"eexport-model",children:"e.Export Model"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Export Model"})," button on the ",(0,n.jsx)(A.code,{children:"Model Definition"})," page to export the graph model in the current graph project to a JSON file."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-exportmodel-button",src:t(3056).A+"",width:"456",height:"53"})}),"\n",(0,n.jsx)(A.p,{children:"The model file is in JSON format and is not recommended to be manually modified."}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-exportmodel",src:t(6605).A+"",width:"1408",height:"144"})}),"\n",(0,n.jsx)(A.h5,{id:"2422data-import",children:"2.4.2.2.Data Import"}),"\n",(0,n.jsxs)(A.p,{children:["After completing the ",(0,n.jsx)(A.code,{children:"Model Definition"}),", click the ",(0,n.jsx)(A.code,{children:"Next"})," button to enter the data import page."]}),"\n",(0,n.jsx)(A.h6,{id:"adata-preparation",children:"a.Data Preparation"}),"\n",(0,n.jsx)(A.p,{children:"Data needs to be prepared in advance before importing data. The current browser supports the uploading of CSV files, and the data file suffix needs to be ensured to be CSV."}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"The header is not mandatory."}),"\n",(0,n.jsx)(A.li,{children:"Text qualifiers are supported, and the text qualifier is double quotes. Data Import - CSV"}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-import-csv",src:t(3034).A+"",width:"258",height:"256"})}),"\n",(0,n.jsx)(A.h6,{id:"bupload-files",children:"b.Upload Files"}),"\n",(0,n.jsxs)(A.p,{children:["Upload the required data files on the ",(0,n.jsx)(A.code,{children:"Data Import"})," page and import the data into the graph project."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-import",src:t(857).A+"",width:"586",height:"378"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Separator: The column separator of the data file."}),"\n",(0,n.jsxs)(A.li,{children:["File upload: Supports uploading multiple files.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Supports selecting multiple upload files in the pop-up window."}),"\n",(0,n.jsx)(A.li,{children:"Supports dragging and dropping files to upload on the page."}),"\n",(0,n.jsx)(A.li,{children:"Supports uploading vertex files and edge files at the same time."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.h6,{id:"cdata-mapping",children:"c.Data Mapping"}),"\n",(0,n.jsxs)(A.p,{children:["After the file is successfully uploaded, you need to set the ",(0,n.jsx)(A.code,{children:"Data Corresponding Table"})," on the ",(0,n.jsx)(A.code,{children:"Data Import"})," page to establish a mapping relationship between the data columns in the data file and the target vertexs/edges and corresponding attributes."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Data Corresponding Table: Displays uploaded data problems.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"File Name: The name of the uploaded data file."}),"\n",(0,n.jsx)(A.li,{children:"File Size: The size of the uploaded data file."}),"\n",(0,n.jsx)(A.li,{children:"Read Result: The result of uploading the data file, success means uploaded successfully."}),"\n",(0,n.jsx)(A.li,{children:"Delete: Delete on the page, the local file will not be deleted."}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(A.li,{children:["Data File Mapping: Each uploaded data file needs to configure a mapping relationship.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Label: Select the corresponding vertex or edge type for the file, and you can only select one type of vertex or one type of edge."}),"\n",(0,n.jsx)(A.li,{children:"Starting from the Nth row: Start reading data from the Nth row. The system defaults to start reading data from the 0th row. To skip the header, you can enter 1."}),"\n",(0,n.jsx)(A.li,{children:"Attribute Mapping: Select the attribute field corresponding to the data column from the drop-down list."}),"\n",(0,n.jsx)(A.li,{children:"Data Preview: The system will pre-read the first 5 rows of the data file."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-import-datamapping",src:t(2184).A+"",width:"573",height:"1268"})}),"\n",(0,n.jsxs)(A.p,{children:["After the file is successfully uploaded, you can click the ",(0,n.jsx)(A.code,{children:"Continue Import"})," button to continue importing other data or click the ",(0,n.jsx)(A.code,{children:"Go to Graph Query"})," button to query the imported data on the ",(0,n.jsx)(A.code,{children:"Graph Query"})," page."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphbuild-import-success",src:t(8247).A+"",width:"278",height:"239"})}),"\n",(0,n.jsx)(A.h4,{id:"243graph-query",children:"2.4.3.Graph Query"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Graph Query"})," button in the ",(0,n.jsx)(A.code,{children:"graph project tab"})," on the ",(0,n.jsx)(A.code,{children:"Graph Project"})," page to query and access graph data in the graph project. The product provides multiple modes for querying graph data, such as Statement Query, Path Query, and Vertex Query, and supports switching between graph projects and query result display."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-button",src:t(6838).A+"",width:"1686",height:"730"})}),"\n",(0,n.jsx)(A.h5,{id:"2431switch-graph-project",children:"2.4.3.1.Switch Graph Project"}),"\n",(0,n.jsxs)(A.p,{children:["The ",(0,n.jsx)(A.code,{children:"Graph Query"})," function can only access one graph project data. Users can select and switch to other graph data in the ",(0,n.jsx)(A.code,{children:"Switch Graph Project drop-down list"}),"."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-selectgraph",src:t(2471).A+"",width:"221",height:"321"})}),"\n",(0,n.jsx)(A.h5,{id:"2432statement-query",children:"2.4.3.2.Statement Query"}),"\n",(0,n.jsx)(A.p,{children:"The Browser provides a visual way to develop and debug graph query statements. Users can enter graph query statements, execute and return results, and support collecting statements and viewing graph models."}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-view",src:t(1349).A+"",width:"2868",height:"1482"})}),"\n",(0,n.jsx)(A.h6,{id:"astatement-query-window",children:"a.Statement Query Window"}),"\n",(0,n.jsxs)(A.p,{children:["Users enter graph query statements in the ",(0,n.jsx)(A.code,{children:"Statement Query Window"}),", click the ",(0,n.jsx)(A.code,{children:"Execute"})," button to run the corresponding statement, and display the result in the ",(0,n.jsx)(A.code,{children:"Execution Result tab"}),"."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Switch Query Language: Provides switching between different graph query language modes.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:(0,n.jsx)(A.em,{children:"Currently only supports Cypher syntax."})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-selectgql",src:t(6567).A+"",width:"144",height:"128"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Statement Query Window: Provides syntax prompts for the current query language."}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-gqltips",src:t(522).A+"",width:"1118",height:"376"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Execute: Click the ",(0,n.jsx)(A.code,{children:"Execute"})," button to send the entered query statement to the background for execution."]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-execute-button",src:t(9464).A+"",width:"91",height:"40"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Bookmark: Click the ",(0,n.jsx)(A.code,{children:"Bookmark"})," button to save the content of the current statement query window as a template for future use."]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-bookmark-button",src:t(885).A+"",width:"60",height:"24"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Download: Click the ",(0,n.jsx)(A.code,{children:"Download"})," button to save the content of the current statement query window as a text file and download it to the local computer for future use."]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-download-button",src:t(3453).A+"",width:"60",height:"24"})}),"\n",(0,n.jsxs)(A.p,{children:["For detailed Cypher usage guidelines, please refer to the document: ",(0,n.jsx)(A.a,{href:"/tugraph-db/en/query/cypher",children:"Cypher API"})]}),"\n",(0,n.jsx)(A.h6,{id:"bbookmark-list",children:"b.Bookmark List"}),"\n",(0,n.jsx)(A.p,{children:"Displays the collected query statements in a list, and clicking on a bookmark in the list allows using the statement. Supports keyword search, name modification, and deletion."}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-bookmark",src:t(1658).A+"",width:"267",height:"196"})}),"\n",(0,n.jsx)(A.h6,{id:"cview-graph-model",children:"c.View Graph Model"}),"\n",(0,n.jsx)(A.p,{children:"The Browser provides a graph model query for the current graph project, which allows users to query vertex types and edge types conveniently. It supports both list display and canvas graph display, and can be hidden."}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"query-schema-list",src:t(7566).A+"",width:"342",height:"409"}),"\n",(0,n.jsx)(A.img,{alt:"query-schema-graph",src:t(3532).A+"",width:"345",height:"411"})]}),"\n",(0,n.jsx)(A.h5,{id:"2433path-query",children:"2.4.3.3.Path Query"}),"\n",(0,n.jsxs)(A.p,{children:["The Browser provides ",(0,n.jsx)(A.code,{children:"Path Query templates"}),". Users can search whether corresponding paths exist in the graph data of the graph project by selecting paths."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"pathquery-result",src:t(5684).A+"",width:"1412",height:"866"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Path: Select the path to search in the path selection drop-down list.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Select a Path: Based on the definition of the graph model, the system will automatically match the corresponding first-degree relationship path. Clicking the path drop-down box again will automatically match the next-degree relationship path based on the endvertex vertex type of the path.\n",(0,n.jsx)(A.img,{alt:"pathquery-select",src:t(9143).A+"",width:"1412",height:"384"})]}),"\n",(0,n.jsxs)(A.li,{children:["Execute: Click the ",(0,n.jsx)(A.code,{children:"Execute"})," button to return the matched paths in the graph project."]}),"\n",(0,n.jsxs)(A.li,{children:["Advanced Configuration: Set the number of paths to scan. The default is 100 paths.\n",(0,n.jsx)(A.img,{alt:"pathquery-configuration",src:t(5801).A+"",width:"976",height:"229"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.em,{children:"Note: The edges in the graph model need to set the starting vertex and endvertex. If no edge in the graph project has set the starting vertex and endvertex, the drop-down list will have no results."})}),"\n",(0,n.jsx)(A.h5,{id:"2434vertex-query",children:"2.4.3.4.Vertex Query"}),"\n",(0,n.jsxs)(A.p,{children:["The Browser provides ",(0,n.jsx)(A.code,{children:"Vertex Query templates"}),". Users can query vertex data in the graph project by selecting vertex attributes."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"vertexquery",src:t(3353).A+"",width:"2844",height:"1490"})}),"\n",(0,n.jsx)(A.h5,{id:"2435execution-result-tab",children:"2.4.3.5.Execution Result Tab"}),"\n",(0,n.jsx)(A.p,{children:"The Browser provides multiple ways to display graph query results, such as JSON view, JSON text, vertex-edge list, and vertex-edge view. It supports result download, data insertion, and full-screen display."}),"\n",(0,n.jsx)(A.h6,{id:"atext",children:"a.Text"}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-result-jsontxt",src:t(6074).A+"",width:"2868",height:"1502"})}),"\n",(0,n.jsx)(A.h6,{id:"bvertex-edge-view",children:"b.Vertex-Edge View"}),"\n",(0,n.jsx)(A.p,{children:"The Browser provides canvas view to display query results."}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-result-graph",src:t(7362).A+"",width:"2850",height:"1496"})}),"\n",(0,n.jsx)(A.h6,{id:"cdata-insertion",children:"c.Data Insertion"}),"\n",(0,n.jsxs)(A.p,{children:["The Browser provides a visual way to insert vertex or edge data in the corresponding graph project. Click the ",(0,n.jsx)(A.code,{children:"Insert Data"})," button, select the Vertex Type or Edge Type on the Insert Data tab, enter the attribute values, and click ",(0,n.jsx)(A.code,{children:"OK"})," to complete the data insertion."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-result-insert-button",src:t(9290).A+"",width:"108",height:"114"})}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"query-result-insert",src:t(7231).A+"",width:"514",height:"931"})}),"\n",(0,n.jsx)(A.h6,{id:"ddownload-execution-result",children:"d.Download Execution Result"}),"\n",(0,n.jsxs)(A.p,{children:["The Browser provides a function to export graph query results as text files. Click the ",(0,n.jsx)(A.code,{children:"Download Execution Result"})," button, and the system will automatically save the result as a text file and download it to the local computer."]}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"query-result-download",src:t(9420).A+"",width:"124",height:"117"}),"\n",(0,n.jsx)(A.img,{alt:"query-result-downloadtxt",src:t(4534).A+"",width:"546",height:"77"})]}),"\n",(0,n.jsx)(A.h6,{id:"efull-screen-display",children:"e.Full-Screen Display"}),"\n",(0,n.jsxs)(A.p,{children:["The Browser provides full-screen display for graph query results. Click the ",(0,n.jsx)(A.code,{children:"Full-Screen"})," Display button to display the results in full screen, and click the ",(0,n.jsx)(A.code,{children:"Exit Full Screen"})," button to exit full-screen display."]}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"query-result-fullscreen-button",src:t(6490).A+"",width:"96",height:"107"}),"\n",(0,n.jsx)(A.img,{alt:"query-result-fullscreen",src:t(5359).A+"",width:"2844",height:"1502"}),"\n",(0,n.jsx)(A.img,{alt:"query-result-fullscreen-close",src:t(6488).A+"",width:"58",height:"41"})]}),"\n",(0,n.jsx)(A.h4,{id:"244graph-analysis",children:"2.4.4.Graph Analysis"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Graph Analysis"})," button in the ",(0,n.jsx)(A.code,{children:"Graph Project"})," tab in the ",(0,n.jsx)(A.code,{children:"Graph Project"})," interface to display and analyze graph data on the canvas. The product provides ",(0,n.jsx)(A.code,{children:"Query by Statement"})," and ",(0,n.jsx)(A.code,{children:"Query by Configuration"})," to query and load data from the graph project to the canvas. It supports filtering, layout adjustment, and canvas operations on the canvas data."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-button",src:t(2576).A+"",width:"808",height:"324"})}),"\n",(0,n.jsx)(A.p,{children:"As shown in the figure below, the graph analysis function mainly includes: 1. Operation bar: the main operation functions of graph analysis, including view switching, query filtering, layout style, and canvas operations; 2. Left sidebar: query, filter, and appearance operation area; 3. Canvas area: the area for displaying graph data, displaying vertex and edge data, supporting vertex expansion query, collapsing vertexs, fixing vertexs, deleting vertexs, and providing canvas graph data statistics; 4. Right sidebar: when a vertex or edge data is selected, the corresponding attribute information will be displayed; 5. Switch graph project: switch to different graph projects for analysis."}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-operation-area",src:t(3355).A+"",width:"2866",height:"1498"})}),"\n",(0,n.jsx)(A.h5,{id:"2441query-by-statement",children:"2.4.4.1.Query by Statement"}),"\n",(0,n.jsxs)(A.p,{children:["In the ",(0,n.jsx)(A.code,{children:"Query by Statement"})," function, users can enter query statements to query graph data and load the data to the canvas area for display."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Syntax Description: TuGraph's query language and syntax documentation."}),"\n",(0,n.jsx)(A.li,{children:"Clear Canvas Data: If this button is not selected, the results of each query will be appended to the canvas area; if this button is selected, the canvas will be cleared before each query."}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-queryfilter-query",src:t(5615).A+"",width:"690",height:"1246"})}),"\n",(0,n.jsx)(A.h5,{id:"2442query-by-configuration",children:"2.4.4.2.Query by Configuration"}),"\n",(0,n.jsxs)(A.p,{children:["In the ",(0,n.jsx)(A.code,{children:"Query by Configuration"})," function, users can select vertex types and enter attribute conditions to query graph data and load the data to the canvas area for display."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Clear Canvas Data: If this button is not selected, the results of each query will be appended to the canvas area; if this button is selected, the canvas will be cleared before each query."}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-queryfilter-configurequery",src:t(243).A+"",width:"2878",height:"1226"})}),"\n",(0,n.jsx)(A.h5,{id:"2443canvas-analysis",children:"2.4.4.3.Canvas Analysis"}),"\n",(0,n.jsxs)(A.p,{children:["In the ",(0,n.jsx)(A.code,{children:"Canvas Analysis"})," function, users can perform operations and analysis on the vertex or edge data on the canvas, including: expanding queries by selecting vertexs, collapsing/expanding vertexs, fixing vertexs, clearing the canvas, lassoing, vertex/edge retrieval, and canvas legend. The most basic operation on the canvas is dragging vertex data. By selecting a vertex with the left mouse button and moving the mouse, the position of the vertex data can be changed."]}),"\n",(0,n.jsx)(A.h6,{id:"aexpand-query",children:"a.Expand Query"}),"\n",(0,n.jsxs)(A.p,{children:["Right-click on a vertex data in the ",(0,n.jsx)(A.code,{children:"Canvas"})," area, a pop-up operation window will appear, move the mouse to ",(0,n.jsx)(A.code,{children:"Expand Query"}),", and a secondary window will pop up. Click on the corresponding expansion degree to perform the query."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"First-degree Query: Bidirectional expansion of first-degree relationships."}),"\n",(0,n.jsx)(A.li,{children:"Second-degree Query: Bidirectional expansion of second-degree relationships."}),"\n",(0,n.jsx)(A.li,{children:"Third-degree Query: Bidirectional expansion of third-degree relationships."}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-expand-before",src:t(8199).A+"",width:"920",height:"698"})}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-expand-after",src:t(4426).A+"",width:"330",height:"338"})}),"\n",(0,n.jsx)(A.h6,{id:"bcollapseexpand-vertexs",children:"b.Collapse/Expand Vertexs"}),"\n",(0,n.jsxs)(A.p,{children:["Right-click on a vertex data in the ",(0,n.jsx)(A.code,{children:"Canvas"})," area, a pop-up operation window will appear, click on ",(0,n.jsx)(A.code,{children:"Collapse Vertexs"})," to hide the first-degree relationship Vertexs of the selected Vertexs; right-click on the collapsed Vertex data again to perform Expand Vertexs operation to show the hidden first-degree relationship Vertexs."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-collapse",src:t(6938).A+"",width:"880",height:"736"})}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-expand",src:t(8999).A+"",width:"854",height:"682"})}),"\n",(0,n.jsx)(A.h6,{id:"cdelete-vertex",children:"c.Delete Vertex"}),"\n",(0,n.jsxs)(A.p,{children:["Right-click on a vertex in the ",(0,n.jsx)(A.code,{children:"Canvas"})," area to open the operation window. Click on ",(0,n.jsx)(A.code,{children:"Delete Vertex"})," to remove the selected vertex from the canvas."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-delete",src:t(8014).A+"",width:"754",height:"604"})}),"\n",(0,n.jsx)(A.h6,{id:"dclear-canvas",children:"d.Clear Canvas"}),"\n",(0,n.jsxs)(A.p,{children:["Click on the ",(0,n.jsx)(A.code,{children:"Clear Canvas"})," button in the ",(0,n.jsx)(A.code,{children:"Toolbar"})," area to clear all data on the canvas."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"\u56fe\u5206\u6790-\u753b\u5e03\u5206\u6790-\u6e05\u7a7a\u753b\u5e03",src:t(5080).A+"",width:"1496",height:"122"})}),"\n",(0,n.jsx)(A.h6,{id:"evertexedge-retrieval",children:"e.Vertex/Edge Retrieval"}),"\n",(0,n.jsxs)(A.p,{children:["Select a vertex or edge in the ",(0,n.jsx)(A.code,{children:"Vertex/Edge Retrieval"})," window and enter a keyword to perform a fuzzy search for attribute data on the canvas. After the search, you can locate the data position."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-retrieval",src:t(171).A+"",width:"1832",height:"1230"})}),"\n",(0,n.jsx)(A.h6,{id:"fcanvas-legend",children:"f.Canvas Legend"}),"\n",(0,n.jsxs)(A.p,{children:["In the legend area of the ",(0,n.jsx)(A.code,{children:"Canvas"}),' area, the vertex types in the canvas will be displayed. Click on a vertex type to select the corresponding vertex data. Click on the "More" button to display the statistics, which can be displayed in a list or chart format to show the number of vertexs or edges.']}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-legend-list",src:t(6283).A+"",width:"1870",height:"1106"}),"\n",(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-legend-chart",src:t(6171).A+"",width:"1948",height:"1116"})]}),"\n",(0,n.jsx)(A.h6,{id:"gzoomcenter",children:"g.Zoom/Center"}),"\n",(0,n.jsxs)(A.p,{children:["You can zoom in and out using the mouse wheel and the zoom buttons.\n",(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-zoom",src:t(7038).A+"",width:"2092",height:"1112"}),"\n",(0,n.jsx)(A.img,{alt:"graphanalysis-canvas-center",src:t(8628).A+"",width:"2132",height:"1242"})]}),"\n",(0,n.jsx)(A.h5,{id:"2444attribute-filter",children:"2.4.4.4.Attribute Filter"}),"\n",(0,n.jsxs)(A.p,{children:["Click on the ",(0,n.jsx)(A.code,{children:"Filter"})," button in the ",(0,n.jsx)(A.code,{children:"Toolbar"})," area, and click on ",(0,n.jsx)(A.code,{children:"Attribute Filter"})," in the ",(0,n.jsx)(A.code,{children:"Sidebar"})," to perform filter and filtering. Users can select the vertex or edge types to be filtered, and set the corresponding attribute values. After retrieving the filtered group conditions, the corresponding vertex or edge data will be highlighted on the canvas."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Please select the vertex/edge type: Select the vertex type or edge type to be searched."}),"\n",(0,n.jsx)(A.li,{children:"Attribute condition: Set the attribute conditions to be searched. Multiple groups can be set to take the union of the filtering results."}),"\n",(0,n.jsx)(A.li,{children:"Add filter group: Multiple filter conditions can be set to take the union of the filtering results."}),"\n",(0,n.jsx)(A.li,{children:"Reset: Clear the filter conditions."}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-queryfilter-attributefilter",src:t(7869).A+"",width:"2852",height:"1336"})}),"\n",(0,n.jsx)(A.h5,{id:"2445statistical-filter",children:"2.4.4.5.Statistical Filter"}),"\n",(0,n.jsx)(A.p,{children:"Click on the Filter button in the Toolbar area, and click on Statistical Filter in the Sidebar to perform statistical filtering of canvas data. Users can select the vertex or edge types to be counted, and set the corresponding attribute values. The system will automatically group and count based on the selected vertex/edge types and attributes. The results can be displayed in chart and list formats. Clicking on the values in the chart or list area will highlight the corresponding data on the canvas."}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"graphanalysis-queryfilter-statisticalfilter",src:t(9288).A+"",width:"2864",height:"1234"}),"\n",(0,n.jsx)(A.img,{alt:"graphanalysis-queryfilter-statisticalfilter-chartswitch",src:t(8371).A+"",width:"2860",height:"1386"})]}),"\n",(0,n.jsx)(A.h5,{id:"2446layout-style",children:"2.4.4.6.Layout Style"}),"\n",(0,n.jsxs)(A.p,{children:["Click on the ",(0,n.jsx)(A.code,{children:"Layout"})," button in the ",(0,n.jsx)(A.code,{children:"Toolbar"})," area, and select the corresponding layout method to rearrange the data on the canvas. It supports force-directed layout, concentric circle layout, circular layout, radial layout, Dagre layout, and grid layout. Each layout method has different layout parameters. After adjusting the parameters, the data on the canvas will be rearranged."]}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"graphanalysis-style-layout-button",src:t(2213).A+"",width:"1832",height:"1326"}),"\n",(0,n.jsx)(A.img,{alt:"graphanalysis-style-layout-parameters",src:t(661).A+"",width:"2040",height:"1248"})]}),"\n",(0,n.jsxs)(A.p,{children:["For detailed layout parameters, please refer to",(0,n.jsx)(A.a,{href:"https://g6.antv.antgroup.com/api/graph-layout/guide",children:"AntV-G6"}),"."]}),"\n",(0,n.jsx)(A.h5,{id:"2447appearance-style",children:"2.4.4.7.Appearance Style"}),"\n",(0,n.jsxs)(A.p,{children:["Click on the ",(0,n.jsx)(A.code,{children:"Appearance"})," button in the ",(0,n.jsx)(A.code,{children:"Toolbar"})," area, and click on ",(0,n.jsx)(A.code,{children:"Vertex Style"})," or ",(0,n.jsx)(A.code,{children:"Edge Style"})," in the ",(0,n.jsx)(A.code,{children:"Sidebar"})," to configure the appearance style."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Vertex Style\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Apply to vertex type: Set the display style for the corresponding vertex type. Multiple vertex types can be configured simultaneously."}),"\n",(0,n.jsx)(A.li,{children:"Size: The display size for the corresponding vertex type."}),"\n",(0,n.jsx)(A.li,{children:"Color: The display color for the corresponding vertex type."}),"\n",(0,n.jsx)(A.li,{children:"Icon: The icon style for the corresponding vertex type."}),"\n",(0,n.jsx)(A.li,{children:"Display Text: The text content displayed for the corresponding vertex type, defaulting to id."}),"\n",(0,n.jsx)(A.li,{children:"Advanced Configuration: Mark the corresponding vertex data based on the set conditions."}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(A.li,{children:["Edge Style\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Apply to Edge Type: Set the display style for the corresponding edge type, supports configuring the appearance of multiple edge types simultaneously."}),"\n",(0,n.jsx)(A.li,{children:"Color: The display color for the corresponding edge type."}),"\n",(0,n.jsx)(A.li,{children:"Width: The display width for the corresponding edge type."}),"\n",(0,n.jsx)(A.li,{children:"Display Text: The text content displayed for the corresponding edge type, not displayed by default."}),"\n",(0,n.jsx)(A.li,{children:"Advanced Configuration: Display the corresponding edge data based on the set conditions."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"graphanalysis-style-appearance",src:t(7354).A+"",width:"1209",height:"1180"})}),"\n",(0,n.jsx)(A.h5,{id:"2448view-switch",children:"2.4.4.8.View Switch"}),"\n",(0,n.jsxs)(A.p,{children:["In graph analysis, 2D graph view, list view, and JSON view are supported.\n",(0,n.jsx)(A.img,{alt:"\u56fe\u5206\u6790-\u89c6\u56fe-2D",src:t(2416).A+"",width:"1826",height:"1322"}),"\n",(0,n.jsx)(A.img,{alt:"\u56fe\u5206\u6790-\u89c6\u56fe-list",src:t(7688).A+"",width:"2046",height:"1374"}),"\n",(0,n.jsx)(A.img,{alt:"\u56fe\u5206\u6790-\u89c6\u56fe-json",src:t(5084).A+"",width:"1918",height:"1330"})]}),"\n",(0,n.jsx)(A.h5,{id:"2449labelcard-layout-switch",children:"2.4.4.9.Label/Card Layout Switch"}),"\n",(0,n.jsxs)(A.p,{children:["Graph analysis supports label layout and card layout.\n",(0,n.jsx)(A.img,{alt:"\u56fe\u5206\u6790-\u6807\u7b7e",src:t(4122).A+"",width:"1453",height:"837"}),"\n",(0,n.jsx)(A.img,{alt:"\u56fe\u5206\u6790-\u5361\u7247",src:t(2118).A+"",width:"1496",height:"1250"})]}),"\n",(0,n.jsx)(A.h3,{id:"25console",children:"2.5.Console"}),"\n",(0,n.jsxs)(A.p,{children:["The ",(0,n.jsx)(A.code,{children:"Console"})," provides a visualized account management and database information viewing function. It provides users with comprehensive account and role management functions, including adding, deleting, modifying, and disabling accounts and roles. In addition, it also provides users with convenient database information viewing function, allowing users to easily view the basic information and configuration information of the graph database. Basic information mainly includes version number, running time, CPP compilation version number, etc., while database configuration information includes port number, system function parameter configuration, etc."]}),"\n",(0,n.jsx)(A.h4,{id:"251account-management",children:"2.5.1.Account Management"}),"\n",(0,n.jsx)(A.h5,{id:"2511account-management",children:"2.5.1.1.Account Management"}),"\n",(0,n.jsx)(A.h5,{id:"aadd-account",children:"a.Add Account"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Add"})," button in the ",(0,n.jsx)(A.code,{children:"Account Management"})," interface to create a new account. Users need to enter the account name, account description, account password, and related roles."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Account Name: supports Chinese, letters, numbers, and underscores, but does not support spaces or other special characters."}),"\n",(0,n.jsx)(A.li,{children:"Related Roles: When creating a new account, you must select a role. After the account is added successfully, the system will automatically generate a role with the same name as the account name."}),"\n"]}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"account-add-button",src:t(8315).A+"",width:"1175",height:"399"}),"\n",(0,n.jsx)(A.img,{alt:"account-add",src:t(4064).A+"",width:"699",height:"618"})]}),"\n",(0,n.jsx)(A.h5,{id:"bedit-account",children:"b.Edit Account"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Edit"})," button in the ",(0,n.jsx)(A.code,{children:"Account Management"})," interface to edit the account description, account password, and related roles."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"account-edit",src:t(2289).A+"",width:"696",height:"623"})}),"\n",(0,n.jsx)(A.h5,{id:"cdisable-account",children:"c.Disable Account"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Disable"})," button in the ",(0,n.jsx)(A.code,{children:"Account Management"})," interface to prevent the corresponding account from logging in and accessing. Click the ",(0,n.jsx)(A.code,{children:"Enable"})," button to enable the corresponding account login and access permissions."]}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"account-disable",src:t(7269).A+"",width:"1548",height:"80"}),"\n",(0,n.jsx)(A.img,{alt:"account-enable",src:t(544).A+"",width:"1545",height:"77"})]}),"\n",(0,n.jsx)(A.h5,{id:"ddelete-account",children:"d.Delete Account"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Delete"})," button in the ",(0,n.jsx)(A.code,{children:"Account Management"})," interface to delete the corresponding account."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"account-delete",src:t(9020).A+"",width:"1550",height:"74"})}),"\n",(0,n.jsx)(A.h4,{id:"2512role-management",children:"2.5.1.2.Role Management"}),"\n",(0,n.jsx)(A.h5,{id:"aadd-role",children:"a.Add Role"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Add"})," button in the ",(0,n.jsx)(A.code,{children:"Role Management"})," interface to create a new role. Users need to enter the role name, role description, and graph permissions."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"role-add-button",src:t(9956).A+"",width:"1188",height:"406"})}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"Role Name: supports Chinese, letters, numbers, and underscores, but does not support spaces or other special characters."}),"\n",(0,n.jsxs)(A.li,{children:["Graph Permissions: The browser supports four types of graph permission configurations: All, Read/Write, Read-Only, and None.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"All: corresponds to the read and write permissions of the graph, including editing the graph model permissions (schema)."}),"\n",(0,n.jsx)(A.li,{children:"Read/Write: corresponds to the write permission of the graph, but does not include the permission to edit the graph model (schema)."}),"\n",(0,n.jsx)(A.li,{children:"Read-Only: corresponds to the read permission of the graph."}),"\n",(0,n.jsx)(A.li,{children:"None: cannot access or operate the corresponding graph."}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(A.li,{children:"Role Conflict: When two roles have different graph permissions for the same graph, and both roles are authorized to the same account, the graph permission of the account for the graph is the union of the graph permissions of the two roles."}),"\n"]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"role-add",src:t(873).A+"",width:"693",height:"802"})}),"\n",(0,n.jsx)(A.h5,{id:"bedit-role",children:"b.Edit Role"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Edit"})," button in the ",(0,n.jsx)(A.code,{children:"Role Management"})," interface to edit an existing role. Users can edit the role description and graph permissions."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"role-edit",src:t(222).A+"",width:"689",height:"802"})}),"\n",(0,n.jsx)(A.h5,{id:"cdisable-role",children:"c.Disable Role"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Disable"})," button in the ",(0,n.jsx)(A.code,{children:"Role Management"})," interface to disable the corresponding role. Click the ",(0,n.jsx)(A.code,{children:"Enable"})," button to enable the corresponding role. After the role is disabled, the corresponding graph permissions of the role become invalid."]}),"\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsxs)(A.li,{children:["Disabled Role: After the role is disabled, the corresponding graph permissions become invalid.\n",(0,n.jsxs)(A.ul,{children:["\n",(0,n.jsx)(A.li,{children:"When a user has two roles with operating permissions on the same graph, if one of the roles is disabled, the permission of the other role is still valid."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.img,{alt:"role-disable",src:t(1892).A+"",width:"1555",height:"85"}),"\n",(0,n.jsx)(A.img,{alt:"role-enable",src:t(1295).A+"",width:"1552",height:"88"})]}),"\n",(0,n.jsx)(A.h5,{id:"ddelete-role",children:"d.Delete Role"}),"\n",(0,n.jsxs)(A.p,{children:["Click the ",(0,n.jsx)(A.code,{children:"Delete"})," button in the ",(0,n.jsx)(A.code,{children:"Role Management"})," interface to delete the corresponding role."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"role-delete",src:t(3075).A+"",width:"1548",height:"82"})}),"\n",(0,n.jsx)(A.h4,{id:"252database-information",children:"2.5.2.Database Information"}),"\n",(0,n.jsx)(A.h5,{id:"2521basic-information",children:"2.5.2.1.Basic Information"}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.code,{children:"Basic Information"})," obtains the current running status of the system and displays key information."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"db_basic",src:t(8298).A+"",width:"2406",height:"530"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,n.jsxs)(A.table,{children:[(0,n.jsx)(A.thead,{children:(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.th,{children:"Parameter"}),(0,n.jsx)(A.th,{children:"Meaning"})]})}),(0,n.jsxs)(A.tbody,{children:[(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"TuGraph Version Number"}),(0,n.jsx)(A.td,{children:"The current version number of TuGraph, x.x.x"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"Running Time"}),(0,n.jsx)(A.td,{children:"The time from when TuGraph service starts to now"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"Server Code Version"}),(0,n.jsx)(A.td,{children:"The current commit of the tugraph-db repository"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"Front-end Code Version"}),(0,n.jsx)(A.td,{children:"The current commit of the tugraph-web repository"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"CPP Compiler Version"}),(0,n.jsx)(A.td,{children:"The CPP version number when compiling TuGraph"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"Python Version Number"}),(0,n.jsx)(A.td,{children:"The Python version number when compiling TuGraph"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"CPP Compiler ID"}),(0,n.jsx)(A.td,{children:"The CPP type when compiling TuGraph"})]})]})]}),"\n",(0,n.jsx)(A.p,{children:"The current running status of the system can also be obtained through commands."}),"\n",(0,n.jsx)(A.pre,{children:(0,n.jsx)(A.code,{className:"language-cypher",children:"CALL dbms.system.info()\n"})}),"\n",(0,n.jsx)(A.h5,{id:"2522database-configuration-information",children:"2.5.2.2.Database Configuration Information"}),"\n",(0,n.jsxs)(A.p,{children:[(0,n.jsx)(A.code,{children:"Database Configuration Information"})," obtains the current configuration parameters of the system and displays key information. To adjust the configuration parameters or understand the detailed configuration parameters, please refer to ",(0,n.jsx)(A.a,{href:"/tugraph-db/en/installation&running/tugraph-running",children:"Database Running-Service Configuration"}),"."]}),"\n",(0,n.jsx)(A.p,{children:(0,n.jsx)(A.img,{alt:"db_configuration",src:t(6610).A+"",width:"2406",height:"944"})}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,n.jsxs)(A.table,{children:[(0,n.jsx)(A.thead,{children:(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.th,{children:"Parameter"}),(0,n.jsx)(A.th,{children:"Meaning"})]})}),(0,n.jsxs)(A.tbody,{children:[(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"bind_host"}),(0,n.jsx)(A.td,{children:"The host set when the system starts, usually 0.0.0.0"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"browser.credential_timeout"}),(0,n.jsx)(A.td,{children:"Browser cache expiration time for usernames and passwords"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"browser.retain_connection_credentials"}),(0,n.jsx)(A.td,{children:"whether the browser caches usernames and passwords"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"disable_auth"}),(0,n.jsx)(A.td,{children:"Whether to disable the regular update of token authentication. If set to true, the token can be used permanently"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"durable"}),(0,n.jsx)(A.td,{children:"Whether to enable persistent storage of the underlying layer. If set to false, the data is updated asynchronously to the disk"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"enable_audit_log"}),(0,n.jsx)(A.td,{children:"Whether to enable audit log"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"enable_backup_log"}),(0,n.jsx)(A.td,{children:"Whether to enable real-time incremental backup"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"enable_fulltext_index"}),(0,n.jsx)(A.td,{children:"Whether to enable full-text indexing"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"enable_ha"}),(0,n.jsx)(A.td,{children:"Whether to enable ha"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"enable_ip_check"}),(0,n.jsx)(A.td,{children:"Whether to enable IP whitelist"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"enable_rpc"}),(0,n.jsx)(A.td,{children:"Whether to enable the RPC port"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"enable_ssl"}),(0,n.jsx)(A.td,{children:"Whether to enable SSL encrypted transmission"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"optimistic_txn"}),(0,n.jsx)(A.td,{children:"Whether to enable optimistic multi-threaded write transactions"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"port"}),(0,n.jsx)(A.td,{children:"The REST access port of the current system"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"rpc_port"}),(0,n.jsx)(A.td,{children:"The port used by the RPC and HA services"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"subprocess_max_idle_seconds"}),(0,n.jsx)(A.td,{children:"The maximum idle time of the subprocess, a thread pool parameter"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"thread_limit"}),(0,n.jsx)(A.td,{children:"The maximum number of threads used by the server at the same time"})]}),(0,n.jsxs)(A.tr,{children:[(0,n.jsx)(A.td,{children:"verbose"}),(0,n.jsx)(A.td,{children:"The level of detail of the log output information. It can be set to 0, 1, or 2, with larger values indicating more detailed output information"})]})]})]})]})}function h(e={}){const{wrapper:A}={...(0,s.R)(),...e.components};return A?(0,n.jsx)(A,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8315:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/account-add-button-683250813410981afa36089239b2bb3b.png"},4064:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/account-add-be840e6001b8e71242a6856550e25c5a.png"},9020:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},7269:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},2289:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/account-edit-1950aa50b4b758c617286b1bc6564d9c.png"},544:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},8298:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/db_basic-dc1066458d3d42de4aced1c7b8144673.png"},6610:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/db_configuration-a88b7309b68405887b1a288ba889fa1c.png"},2576:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-button-855a294366b4ee1119025db0f065257a.png"},8628:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-center-135a2a82ee9cc2fe800925109d392fc2.png"},5080:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-clear-7f6caa6d9ef38c8abb3575c5b548a464.png"},6938:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-collapse-c21a138871b822da899d95ad0c1baa65.png"},8014:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-delete-be5cdd2ce769f082834a26e0cdb0aed9.png"},4426:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-expand-after-a910929725d5cdfb42f61a0f59c069ec.png"},8199:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-expand-before-58f5b97437ee1a585f2c27d5e00c771e.png"},8999:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-expand-1ddcc096d3711c46421094dae76b5729.png"},6171:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-legend-chart-1eaf61d2a88497f793e73302af33d1bf.png"},6283:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-legend-list-aadc8ef90347771d32531cbcb3d4a0e9.png"},171:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-retrieval-627cf4590f0ae8471b910266591dd68d.png"},7038:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-canvas-zoom-7a196209fc075eac58133db0b8ab00c6.png"},2118:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-card-4db4fd6f24ffc6083a05ecbf0ce0c276.png"},3355:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-operation-area-02c651380d565f7614eefea76b6a0e42.png"},7869:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-queryfilter-attributefilter-299748df1e431a7cb8a79e6402bd0bb0.png"},243:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-queryfilter-configurequery-a64b68a8f008e19d792a6c48f153d460.png"},5615:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-queryfilter-query-30010e88b7815589917266b31fb94e6e.png"},8371:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-queryfilter-statisticalfilter-chartswitch-732f211f09d7a70e01c7b220b2f4daf2.png"},9288:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-queryfilter-statisticalfilter-1efba6f11b16b0e9a8908f71e33e7730.png"},7354:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-style-appearance-330e9eccab92995ad9d00e4a450d5dce.png"},2213:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-style-layout-button-e3d4d8fe31188f4efc97181306e92c2c.png"},661:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-style-layout-parameters-868f9ae4cabfc6e7129946b003dbe0b1.png"},4122:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-tag-591f29b0662d2cc8a639eec19fbb343c.png"},2416:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-view-2D-47bd08ad54434bc4cc0f611a5d7f4159.png"},5084:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-view-json-bbb80ca39f95c215289d611eef5bad28.png"},7688:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphanalysis-view-list-1f8c26fd94eff4ce66e4fbc7058c0740.png"},8341:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-addedge-button-e43520dabc74086da68727e0b46f6566.png"},6314:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-addedge-d67971b25c2b65660ca03870725aed1c.png"},446:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-addvertex-button-f7f92dd1692cf3dfe76976d5b2a7df10.png"},5131:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-addvertex-b36fb3cb480a229f2ae132b4c0f6d5fa.png"},1270:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-button-286535ad0da868e4de57d8bbe00d1133.png"},7572:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-editvertex-68735f4833c4cc6a681f8016169be69f.png"},3056:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},6605:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-exportmodel-a64ae5c9d99160d12eee76950b25541e.png"},3034:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-import-csv-c7ce18e6226804ce059b39ec4e9e8d64.png"},2184:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-import-datamapping-549be862085a921489324ce1197308a6.png"},8247:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},857:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-import-3540ce84c6831833796008344dfd4fdc.png"},2349:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},5522:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-importmodel-87a1ba2b08d64920445486c4caedca40.png"},3514:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-list-copy-f5d6fc9da40ba43cdcd95427d70570ed.png"},2240:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},7993:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},8766:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-select-c420f68b574e9f355d1d18d2da0fd9b3.png"},7411:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphbuild-ab4c8508939419e073bde6be4ab2f4ec.png"},9709:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-configure-9d77facae2ee79b94521a4ef2cd44576.png"},2926:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-creategraph-422152d6fe55f2d86de3b80372f7ed27.png"},1204:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-editgraph-button-3e899eb3940627bcd27f497d7bc49162.png"},8249:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-editgraph-bd4363c6715cd640bad159382e20456a.png"},5377:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-homepage-9c8ae8efdc08a7e9e32be01d9723d790.png"},7877:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-procedure-button-aaa2d9a9c3350d04ac011d8febe051be.png"},1178:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-procedure-83887e7d82291ff35c0642aed64df2fd.png"},8479:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-selecttemplate-d91aeb2d17bf756312bd2e0f2777072c.png"},1599:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-statistics-button-35d9187ca5035bc23d4d1f7c683ad950.png"},1133:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-statistics-refresh-button-a21fc107f5c66852187f1fe4d7cd5fd9.png"},7740:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/graphmanagement-statistics-7ec245055270f838d9737aeddab56b0f.png"},5e3:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/login-56e8acdb4881eb493358a8901eba2354.png"},5801:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},5684:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/pathquery-result-3c4cd19162f517a2e47133ce81f72ad2.png"},9143:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/pathquery-select-65741dbc0e473ccd094f692dd1342f80.png"},885:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAYCAYAAACmwZ5SAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHtSURBVFhH7ZVBboMwEEV7Gu6Rg3ADlHXuEeFbsIEDdJ0Vl4iURQ8x9bf5dBzGLqSVKlG+NAo2E8dv/th5k3+mA3jvOoD3rgOYul6vUtd1El3Xye12W8wjd6s+hkaqduRI+nMljsNvNLYq99FLc+79CuuUBSYIAAmJMeJyuczzLMxWJcDFTY/iqkqqrTEXM1URGEAUIAmMoOD6amAFpoHhmLlpH82wLIPpMD6x3uiysNDfA2OuaqR/xJQgbFo77scBHPNGUaywCgUVgQHJOJ1OM6x+h+fXgftwdrHB5Pw+u6SAcyBh7YKzVBYYzmlHEfrc6kDuKi2AnTg/HvV59kLLJmDKWcxbR8ANBMYF+NQxSlngnH4XeIIMbe389QThkspseHJ4bPne586tPz2r37BUBAYI2lYLgGhhwm5uae2M5SrcTDac3tK2wyhWBO71hWboJWAEhZy1wHGj0Z3EYUgVY7FhvEPuwmEILQzg+F8e1mS+IRMYELik8OP4RBDqJ8BaeWCjneF6AhwLkzgcvj99l/mGTOD7/R6CMHimAAvX8Q7Bm3qrNDABgrMEV22NXIIiZ3mG0fZ+bkgLY2lzS7MIOrTjaxWB/S3t4czNEbx9n1qWcF8F0sE19LGxVASm03tSEXiPOoD3rgN43xL5BE26iMM2oTYfAAAAAElFTkSuQmCC"},1658:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},6838:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-button-d5dbaa0a86444fbfd07b59765a4646bf.png"},3453:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAYCAYAAACmwZ5SAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAF3SURBVFhH7ZbBjYMwEEVTjfugEDqwcqYPBF1wgSo40QRSDhTh5Q/GDDCYGCFtQniRJYMGJc/fY/IwP8YtfHVu4atzC+9RFIWp69pehdKZ8qmMUmFDV519fqCrtFFZY696XqXRKjdN/8mFek6wcJIkNM6EBJ5lvxwemlxcDKW0KV8QhbAtzfr7fEEY3yPMWCVMyU7CPr5E+FgrSCl/kLDu+1D+kTNcv3KwINja9tJDkHDbtiQbxzHNz4KESWJMcv3jhxqWHhu6aui53K4Cenjr4AoSTtPUfQnmZ7Ha0uMBtUib6nBPSBmSJEzPbvezVxgp8iQxR7oYHNw//qoShIkhbZcUSc6THYbdDRDNylnSEl7hKIrovcuRtjJqUHsUWdiD1MfjguycAcHCEv8jPKWMROnda+fAbf8Fu8IY4zbeGmPdUd4RphomOfWpPegWve16eoFXGH2Jw+mdcX4Pe3Biiz4H7h+ZfHB5ha/ILXx1buGr82PCxvwBeQoaIMYc5FgAAAAASUVORK5CYII="},9464:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFsAAAAoCAYAAACRgIb2AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAPlSURBVGhD7ZoxTxRBFMf9EHCY0MsXUD8CCSGIdiQ2VnZaYGuQ3saIUWIiFRdILGxsCNh4sRessCE5LO6qQ26PjcfePt9/dueYnZ1l5zgY4jkv+QV2dmYIv3n7ZjbZG+TDWXjZDsPLdhhetsMolF3/TbT4mejmK48tU2+IHn5M3JnCKBud774jmlyMaeK+x5qFWDibWjELN8rG6kw+M0zmsQLC4VAPo2ysDFbJNJHHAnYHh3oYZaP+GCfxWAOHeuRkx3HS0TSBxx44hEs1fGZfEVaZjfCyh8fLdsi1yX65EdO3H8nc9SbR5hcSbaa+5YRUmW5RRW2716KxmbbSp5jK7AGNz53SxHybxqcPaMyE5Vzn4Vz2g+exkAsgF9fg6etEPtpxbRpbTEQ/KaKq2rYTEQURLattJuaatF4nOtrj39f4Z/r/5iKg8rlKcCobEhFFGXz7cZLxiMGEX0w2Mnppl//eJYi0walsmc3yukgo+qCv6V6WU6rM4DFv0z51aR2P+yyXE/zc6hK1Q1pSS8FseDYWGX3I/xhEo+So964IZ7IhEGVCbZNlAxmttuMa94qeAJUay8rEL+IsL4jDqD9ueS8tHajTW6finlik8xhyQZzJNm2AUqie8cC0OMWkZYQzVGx0aBNlpNcvD8sslg57yhjAG+tqKOp0jet14SLJ4IXMjh8MZ7IhFJug2gaZKCUyk9UsR7t9KUnLyHbM2crXyEKUkUwm454iW5w8MI4l78i5ND5EdGSzyVriVLZeo3XZaiZjYRBq/zyJ6H4pQebN984ytH5Clfmkb1Y2j3v/p3/yGDnZEFlURhCmMoLSo7aZgOjamnIaWWOxLLPWxqwxfV1NztBC9m5aYvrjYqryJjlyspGpelmAbFPGy3v6AhSjHf3mTrg8sNCd5NyMjTCp2VxWtJedkZSNUgGxqkC9hkvQx65eSxTZfKRb+p4/OwvZ9S5VtvnkESD7k/aRlA3kpndexuIewpTtJvBikpyze1TlTe8FRHOgRGT6slAKQlrn++LIl7bnZKuv7DipKAszLE5lA5nhUjqkApnNwFY0qPKmKAKZnL5u50SnyI1UvY/xGdnaK7u6MMPiXDaAcJQQbIBS8GA1+t/kWmT/r3jZDvGyHeJlO8TLdoi17DtvezTxyDyJxw5r2Qubkf/8bAjw+dnCRpTaPIucbHxYst84oVsrySCf4QOQflgJd51Ox+4jnTAMWXhHZDhKCh4JTzlTLPnJpy4FQSAc6nHj+PiYdFqtFjWbTWo0Gp4LAHdwqHs1ZjYiiiKxOngcsFKecuAKzuDOFIWyZeh1x0dxlLkqle3jsoLoL0TwmrSKrdVsAAAAAElFTkSuQmCC"},522:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-gqltips-f6456645ec5de1c6156593a5943e3445.png"},9420:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},4534:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},6490:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},6488:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},5359:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-result-fullscreen-80bd40b9f2fde8e179dea8715da6b154.png"},7362:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-result-graph-210a81aa1c33957cee2ca78986d2467f.png"},9290:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},7231:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-result-insert-cf8a6f5e1e90288c556ff64e24867136.png"},6074:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-result-txt-1a0942ba6f27638a9063892078f138c4.png"},3532:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-schema-graph-5da210a3624e2ba4c19ae24b6b5073ec.png"},7566:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},6567:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},2471:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},1349:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/query-view-7858448691b2d7c071f369241ddd8452.png"},4595:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/quickstart-configure-9c721fc928ba3c57bb940677c505d11a.png"},7991:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/quickstart-creategraph-89fe62a333531733bded84b027814085.png"},3462:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/quickstart-graphtab-fd626c045a446d6bb14ecbc799f31bb9.png"},6836:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/quickstart-result-655453a1a1525c3c07821d771d2a3590.png"},5666:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/quickstart-selectdemo-167c546ad18ab13e66f9c650c5ca91e4.png"},9956:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/role-add-button-8a67f028fbac72bb45acd3d6ebde3bb0.png"},873:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/role-add-df88eaac42ad0351ebff1c01d45b2597.png"},3075:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},1892:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABhMAAABVCAYAAABD5BX+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAA4mSURBVHhe7d3BjtvGHQfgPEQORe/7EAWK+h36BDkb6SPkEQIE8TlAczVg+FgUQW4Fctge0ntPgeGzr3VssyJnKA3JP4eUvLvkrr4f8MG7IiVRouQdzk/c/aIRERERERERERERERGpRJkgIiIiIiIiIiIiIiLVKBNERERERERERERERKQaZYKIiIiIiIiIiIiIiFSzukx49+4dAAAAAADwRNWyukx4//49AAAAAADwRNWiTAAAAAAAAHIbEEeZAAAAAAAA5DYgjjIBAAAAAADIbUAcZQIAAAAAAJDbgDjKBAAAAAAAILcBcZQJAAAAAABAbgPiKBMAAAAAAIDcBsRRJgAAAAAAALkNiKNMAAAAAAAAchsQR5kAAAAAAADkNiCOMgEAAAAAAMhtQBxlAgAAAAAAkNuAOMoEAAAAAAAgtwFxlAkAAAAAAEBuA+IoEwAAAAAAgNwGxFEmAAAAAAAAuQ2Io0wAAAAAAAByGxBHmQAAAAAAAOQ2II4yAQAAAAAAyG1AHGUCAAAAAACQ24A4ygQAAAAAgI38/tNPzcdvvtm9djuj7edpqUWZAAAAAACwkXaivvnii91rtzPafp6WWg6vhHWJbhgAAAAAgMv1ZcLHZ8+OZwHsymG7lAnXoxZlAgAAAADARtpJ+j1P1u99+7hbtSgTAAAAAAA2okxgT2pRJgAAAAAAbESZwJ7UokwAAAAgu21e3Nw0z1+/DZaV3javv75pbr6/DZZBK72WXtxGywAoKRPYk1qUCQAAAGTKBO7K2jJh7WuOh3fuvrEv2bdfXjXNH3741LwJlr1/86n56rumefkmWPYAlAnsSS3KBAAAALL7KxNuv7+n8uG3183zm+fN69+CZWxImfD4KRN4Sj42337XNN/+Gi07eHNY/kOlbDj60Lw8rPfVzx+CZZerTtb/+qn5w3efml/Gl2dvfl6z3Z/nXsuES4qc7jmp7E8+Sy1Pvkx4+/p5c/P16+ZtsAzYytoDCwAAHtbayUBlAkuM+YH9GE+4d2cpfLfOcMI6lRKDie88sV2zVD7cX5mQyo9om5aUj3tdmZCem9NtpG3utq+4fPJcDMqE8W20xo+9WOeeS5RrVYsyIesGtkoHeCBrDyx8sgUA4GEpE7grygRgL9Lkczk53pUJrz4W60Sm1wsn9quT/evOZBhP1tfLjsN9LRUYx8c2f//zJcT0cZ9TJnSlQFcQFGVC3p72caVtKbYrKBP6+4628fTrqtK6S88t56tFmZApE+AhKRMAAFb779+b//3zT837V1+mfw/fh+uVbl80N4dxVCkae3XHQYN14vFXd1xVrPf89e36MiHYlpubF83tcZ10n/GyZHz/6dgtFxrl5QfXOHb8x5sfm7/9+y/NX//1x077dXtZtO5Q8BwO9unSvple//T8n8b8w/03Ln6M+R/Kj//50Pz5xzQB2f7bfh+tdzLcN+P/L6b71L5kn8rJ7H5y+uWZZcL85P6Kif2Dc8uEk7QNs2VFcd+D0uPoMZcJ020/FQnp+/668WPnUrUoE4ANnA4s4uUAAHTa4uDVl1PVQqGd4B1O+qbJ3HISN08CD46V0hitnRwsJwPTBGJ5e8UE8ueemdCdVVC/v7Tto/v/vtjuKz8zoS0N+hJhrF4o5P09fg30+2hx3+TXQblPD9d5cVx/7esprWcC+n61xUE5sdmrFwoL+2byGrEv2aFgorqdnJ4vB6ZOE9XTSfbOPZyZ0Om3/eeirCgLkHy/L4uCZDqp/ojLhOI22uuWtzOQC5XpY+dStSgTgA2kQaYyAQCgrj8jYay7PFh/3mj81Z0tUE7oZuPJwdmJ+nR7n1smdJdNjteGE5LR9QZmt/E6lGckjLXLouu04ud+aXm5b5bG9DOvkfwaO11vuL+5H/0ZCWPt5dH6SW3fBGWSfckeTc4aSJPTXZlwxpkJ3fd9adD+G07CX248Wd9NnB/uu5tg7++3Xbf9+rDdaXkxWZ+3Z/LJ/UdcJkyud1h/uC+nosfJ+WrZRZkwPOWxNRzUdoOYYvlksDI5bfZ0/VOZkAcyvVWDWLhmxSfOwvfN6D01ORidXv80qEzXbd/Lw/f/+CDQYBQAuHJBkXAUrV/Kk7bReGx+gn44/pr/cFY0kVg3vc/TmLBcb3zb/Xhxdkx45WVCVCKUoussj7PX7Jt+vD/33M/dxvi+l7aFuxBNuvWi9ZP5fZPmacbHgPYle5YmqfvJ5nVlwtDxOmWZkCfCo/fWWG2iezBZX5YHrYXvJ6VAt7yfnE+T9uNtWWPbMiEtH5cK4/sqt/H4WM/cr0zVsnmZkH4ADQcft9/3P5Dy4KQcvObi4Dgg6b6fu345UVn8kMuD6vIHnDIBSmkQOHxPHC7rD/7m3kPH91lwcHm4jlOeAQDOc9mZCf1YqzxOKsdVwVhtdN1+/DV/nFS7jVh3W6Px4bjsGCjXLT9ANt6eKy8TLjozIT/304n+7Ix9k8bwyXDcnl5LyoR9uNMzE8bzMkf2JfvVTUgXE/CpGPjUTUhH741SmvwuJq/LMqE1mAwfiya9p9ZN1l+imLQfLZuUEEfTbX74MiH9O18MrHteuUwt25YJQRGwZnk5oJ3/pEySyoT6bUTfwzVbej/Ey8uBY/p69uAkL58cfE4OagxGAYArd8HfTFgeq+V1wiJguN42ZybU5HHk5MNi11smXPY3E5ae+wv2TV/4HPfx3G2ky09j/PH33Ie7+5sJ6bI1/3/AfqSJ53JCvSwTjpPfeWL9NPldTHiXZwM8VJmQbzd679YMt+NhyoRU1pzhcL/fVsuEw9eDMyzGlAn3qZZNy4RVE5bBD6hUEOTB42TAEqwb3MfgNg6WtgWux9IAMC2fHhSUB5T569mDurnbGN+3wSgAQFsc9GcodP9W//jyzLFNPm7qx1Xj46G59eY+4HX85PrMcVhkenx3fiHRGZcHV14mtNrSoDxDof26/seXl577y/bN8PjbmH9v2uKgP0Oh/bdeJLSm+6Z7H0f/d3TsS/apKw5Gk+bpE/Lry4TZyfL2Oism/S8qE+7EYz0zof06rdNet9uHh8sXhY+Hc9WyYZmwcvBy+EEUG38SJbj8QJkAZ8rvp9lPIQ3eb4HiPZ0GmslwQOnAAgDgvqRjnXJyPY2phmOyfNngGCharz8uK4+zimO1MyabwwJjXF5k5a+uLb9uTW/HmPEi/bh+sA8Pz2X//eK+KdbtjI/x034x5n/MRvsmvyZmjxXtS3YpTU4PJpxffcoT2WecmVDepl9zNOOuy4TztpG7U8v2ZyZUBp9Ly6f6Qe1p4KxMgHPNDfp7S8sDedDpwAIA4GGUH+pIxz3RuCpdtrze+INe7fHWeOJ4jfL+ijIg+LBKef/Dx9Iqrpul47vpdVkyfg2MxujVfTO97vD1kJYb8z9mxb6pfqisn4OxL3ks+ono9O+gaAg8fJmwbrvq+r8PcfltXVYm5PsdlQn9c/hZZUK73vF5L9ZrL89lBXejlk3LhPCTKYWl5bHhgEWZAOdaOjC85MBx/F4cvk9PxoNPg1EAAIBtzB23zTl3fdjI8Xfxpwnp4yfp80T16ZP08af6h79y51PzS54MP102dV6ZEK9zMpxwr8rbFq17zqf+V21fd1/TMuFUIJxfJnTP9eSshtF6+frj/cTlatn2DzAfP+EyLAwGp00efhBNJvlvXxRlwYvh78bsPgHtzAT4LE55BgAAuG7dcWH5K9MWnLs+PKRcIBx1k+hry4SP3b/HYuDVw/6ao257+kn6TnmbaRvjUuCg8keM77xMKM/YOJYJafvKcmAy6R+UCcf91F/ePY655+Ag38bS88w6tWxcJiST01ajSchyeTHpn0qBcvnwB5cyAS6VJvLL99dg8t8pzwAAdIKxX8FYDh6nc+dJzKuwS32JcPw1OGkSOk1op6+Xy4TR5Hc5ad66rzKh3/buvj40b463H9xmv+5gwr1eNNx1mVCeRXAqE4rnOK+zpkwYPLawKJiuNy1duFQtuygTAAAAANhY+aGxNcXAuevDxoYTzsVE94VlQjeBfriNVY6FxtRwsj5t11wJEE+uZ7lU6JaVX4/XO7jbMqG/Ti4wDl+3j3d8H5eUCe1tzF1n/Nja2597vKxXizIBAAAAAHjihr9yZ1AmBOv1JcBkeVEmDC4PTSfHI8uT9cNtWnP/p1Kksry/neOZDfHtL25f+Jycnu/uvvJtl6XB9P7qz9egvFnxHHCZWpQJAAAAAAAbWS4TtrX37eNu1aJMAAAAAADYiDKBPalFmQAAAAAAsBFlAntSizIBAAAAAGAjygT2pBZlAgAAAADARpQJ7EktygQAAAAAgI0oE9iTWpQJAAAAAAAbUSawJ7UoEwAAAAAANqJMYE9qUSYAAAAAAGxEmcCe1KJMAAAAAADYyHGy/tmz7uvdOWyXMuF61KJMAAAAAADYSDtJ307W750y4TrUcnglrEt0wwAAAAAAXO73n346nQWwY+12RtvP01KLMgEAAAAAAMhtQBxlAgAAAAAAkNuAOMoEAAAAAAAgtwFxlAkAAAAAAEBuA+IoEwAAAAAAgNwGxFEmAAAAAAAAuQ2Io0wAAAAAAAByGxBHmQAAAAAAAOQ2II4yAQAAAAAAyG1AHGUCAAAAAACQ24A4ygQAAAAAACC3AXGUCQAAAAAAQG4D4igTAAAAAACA3AbEUSYAAAAAAAC5DYijTAAAAAAAAHIbEEeZAAAAAAAA5DYgzuoy4d27dwAAAAAAwBNVy+oyQURERERERERERERErjPKBBERERERERERERERqUaZICIiIiIiIiIiIiIi1SgTRERERERERERERESkGmWCiIiIiIiIiIiIiIhU0jT/B/G1f6T9Rk01AAAAAElFTkSuQmCC"},222:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/role-edit-42d82c9c13ee49128966a8f77d6da59e.png"},1295:(e,A,t)=>{t.d(A,{A:()=>n});const n="data:image/png;base64,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"},3353:(e,A,t)=>{t.d(A,{A:()=>n});const n=t.p+"assets/images/vertexquery-2fb20c2bc90ac608c65ca49cd5c3d706.png"},8453:(e,A,t)=>{t.d(A,{R:()=>a,x:()=>r});var n=t(6540);const s={},i=n.createContext(s);function a(e){const A=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(A):{...A,...e}}),[A,e])}function r(e){let A;return A=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(i.Provider,{value:A},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b45c3470.9dd61fda.js b/assets/js/b45c3470.f3914aeb.js similarity index 99% rename from assets/js/b45c3470.9dd61fda.js rename to assets/js/b45c3470.f3914aeb.js index d60e75b555..63dc9a35c0 100644 --- a/assets/js/b45c3470.9dd61fda.js +++ b/assets/js/b45c3470.f3914aeb.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4329],{6746:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var a=n(4848),r=n(8453);const i={},o="Data Migration",s={id:"best-practices/data_migration",title:"Data Migration",description:"1 Introduction",source:"@site/../docs/en-US/source/13.best-practices/3.data_migration.md",sourceDirName:"13.best-practices",slug:"/best-practices/data_migration",permalink:"/tugraph-db/en/best-practices/data_migration",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Using TuGraph Graph Learning Module for Node Classification",permalink:"/tugraph-db/en/best-practices/learn_practices"},next:{title:"Environment and version selection",permalink:"/tugraph-db/en/best-practices/selection"}},d={},c=[{value:"1 Introduction",id:"1-introduction",level:2},{value:"2. Compatible Migration",id:"2-compatible-migration",level:2},{value:"2.1. Backup data",id:"21-backup-data",level:3},{value:"2.2. Start a new service",id:"22-start-a-new-service",level:3},{value:"2.3. Stop the original service",id:"23-stop-the-original-service",level:3},{value:"3. Upgrade migration",id:"3-upgrade-migration",level:2},{value:"3.1. Export data",id:"31-export-data",level:3},{value:"3.2. Import data",id:"32-import-data",level:3},{value:"3.3. Start a new service",id:"33-start-a-new-service",level:3},{value:"3.4. Stop the original service",id:"34-stop-the-original-service",level:3},{value:"4. Online Migration",id:"4-online-migration",level:2},{value:"4.1. Copy data",id:"41-copy-data",level:3},{value:"4.2. Starting a new node",id:"42-starting-a-new-node",level:3},{value:"4.3. Stop the original node",id:"43-stop-the-original-node",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"data-migration",children:"Data Migration"})}),"\n",(0,a.jsx)(t.h2,{id:"1-introduction",children:"1 Introduction"}),"\n",(0,a.jsx)(t.p,{children:"Data migration refers to the process of moving data from one system, storage medium, or application to another system, storage medium, or application. When TuGraph needs to be upgraded or the system hardware environment changes,\nThe data in the original TuGraph service needs to be migrated. Based on the system hardware environment and software version, this paper divides data migration into three schemes:"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:"Compatible migration: When the system environment before and after the migration is consistent and the TuGraph software is compatible, you can directly use the backup and recovery method to migrate data;"}),"\n",(0,a.jsx)(t.li,{children:"Upgrade and migration: When the system environment before and after the migration is inconsistent or the TuGraph software is not compatible, it is necessary to migrate the data by first exporting the data and then re-importing;"}),"\n",(0,a.jsx)(t.li,{children:"Online migration: When data migration is performed on a high-availability cluster and the network environment of the cluster is good, the original cluster can be smoothly switched to the new cluster by adding or deleting nodes.\nThe following article will introduce these three schemes in detail."}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"2-compatible-migration",children:"2. Compatible Migration"}),"\n",(0,a.jsxs)(t.p,{children:["Compatible migration means that when the system environment remains unchanged and the TuGraph software version is compatible, the data and stored procedures of the original service can be used in the new service, so it can be directly migrated.\nUsers can first use the ",(0,a.jsx)(t.code,{children:"lgraph_backup"})," tool to back up the data, then transfer the data to a new machine and restart the service. The specific migration steps are as follows:"]}),"\n",(0,a.jsx)(t.h3,{id:"21-backup-data",children:"2.1. Backup data"}),"\n",(0,a.jsxs)(t.p,{children:["Backup data using ",(0,a.jsx)(t.code,{children:"lgraph_backup"})," tool"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_backup -s db -d db.bck\n"})}),"\n",(0,a.jsxs)(t.p,{children:["You can also directly use the ",(0,a.jsx)(t.code,{children:"cp"})," command in this step, but the ",(0,a.jsx)(t.code,{children:"cp"})," command will copy some redundant metadata, and the raft metadata will also be copied in the HA mode, causing the cluster to fail to restart after migration.\nTherefore, it is recommended to use the ",(0,a.jsx)(t.code,{children:"lgraph_backup"})," tool instead of the ",(0,a.jsx)(t.code,{children:"cp"})," command during data migration."]}),"\n",(0,a.jsx)(t.h3,{id:"22-start-a-new-service",children:"2.2. Start a new service"}),"\n",(0,a.jsx)(t.p,{children:"Use the following command to start the new service, and the stored procedure will be automatically loaded into the new service"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_server -c /usr/local/etc/lgraph.json --directory db.bck -d start\n"})}),"\n",(0,a.jsx)(t.h3,{id:"23-stop-the-original-service",children:"2.3. Stop the original service"}),"\n",(0,a.jsx)(t.p,{children:"Use the following command to stop the original service"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_server -c /usr/local/etc/lgraph.json --directory db.bck -d stop\n"})}),"\n",(0,a.jsx)(t.h2,{id:"3-upgrade-migration",children:"3. Upgrade migration"}),"\n",(0,a.jsxs)(t.p,{children:["When the user wants to migrate the original service to a differentiated environment (such as migrating from centos7 to ubuntu18.04), or when the version of TuGraph changes greatly and is incompatible (such as 3.4.0 and 3.6.0),\nUsers can first use the ",(0,a.jsx)(t.code,{children:"lgraph_export"})," tool to export the data into a file, transfer it to a new machine, and then use the ",(0,a.jsx)(t.code,{children:"lgraph_import"})," tool to re-import and restart the cluster.\nThis can ensure that it can be used in the new environment, but the efficiency is low, and the stored procedure needs to be reloaded. The specific migration steps are as follows:"]}),"\n",(0,a.jsx)(t.h3,{id:"31-export-data",children:"3.1. Export data"}),"\n",(0,a.jsxs)(t.p,{children:["Use the ",(0,a.jsx)(t.code,{children:"lgraph_export"})," tool to export the data and transfer the data to the new machine"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_export -d db -e db.export\n"})}),"\n",(0,a.jsx)(t.h3,{id:"32-import-data",children:"3.2. Import data"}),"\n",(0,a.jsxs)(t.p,{children:["Use the ",(0,a.jsx)(t.code,{children:"lgraph_import"})," tool to import data and manually load the stored procedure (see ",(0,a.jsx)(t.a,{href:"/tugraph-db/en/client-tools/cpp-client",children:"client operation steps"})," for details)"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_import -c db.export/import.config -d db\n"})}),"\n",(0,a.jsx)(t.h3,{id:"33-start-a-new-service",children:"3.3. Start a new service"}),"\n",(0,a.jsx)(t.p,{children:"Start the new service with the following command"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_server -c /usr/local/etc/lgraph.json --directory db.export -d start\n"})}),"\n",(0,a.jsx)(t.h3,{id:"34-stop-the-original-service",children:"3.4. Stop the original service"}),"\n",(0,a.jsx)(t.p,{children:"Use the following command to stop the original service"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_server -c /usr/local/etc/lgraph.json --directory db.export -d stop\n"})}),"\n",(0,a.jsx)(t.h2,{id:"4-online-migration",children:"4. Online Migration"}),"\n",(0,a.jsx)(t.p,{children:"When performing data migration on the server cluster deployed by the high-availability version of TuGraph, if the network bandwidth is sufficient, you can directly migrate the service online by adding or deleting nodes. The specific migration steps are as follows:"}),"\n",(0,a.jsx)(t.h3,{id:"41-copy-data",children:"4.1. Copy data"}),"\n",(0,a.jsx)(t.p,{children:"Use the following commands to copy the data on the leader node and transfer it to the machine nodes of the new cluster. Since the leader node has the most complete raft log, copying the leader's data can minimize\nThe time for the log to catch up."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" cp -r db db.cp\n"})}),"\n",(0,a.jsx)(t.h3,{id:"42-starting-a-new-node",children:"4.2. Starting a new node"}),"\n",(0,a.jsx)(t.p,{children:"Use the following command to join the new node to the cluster. After joining the cluster, the incremental data will be automatically synchronized to the new node"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_server -c /usr/local/etc/lgraph_ha.json --directory db.cp --ha_conf 192.168.0.1:9090,192.168.0.2:9090,192.168.0.3:9090 -d start\n"})}),"\n",(0,a.jsx)(t.h3,{id:"43-stop-the-original-node",children:"4.3. Stop the original node"}),"\n",(0,a.jsx)(t.p,{children:"Stop the original node service, and send subsequent application requests directly to the new cluster"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_server -c /usr/local/etc/lgraph_ha.json --directory db.cp --ha_conf 192.168.0.1:9090,192.168.0.2:9090,192.168.0.3:9090 -d stop\n"})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>s});var a=n(6540);const r={},i=a.createContext(r);function o(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4329],{6746:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var a=n(4848),r=n(8453);const i={},o="Data Migration",s={id:"best-practices/data_migration",title:"Data Migration",description:"1 Introduction",source:"@site/../docs/en-US/source/13.best-practices/3.data_migration.md",sourceDirName:"13.best-practices",slug:"/best-practices/data_migration",permalink:"/tugraph-db/en/best-practices/data_migration",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Using TuGraph Graph Learning Module for Node Classification",permalink:"/tugraph-db/en/best-practices/learn_practices"},next:{title:"Environment and version selection",permalink:"/tugraph-db/en/best-practices/selection"}},d={},c=[{value:"1 Introduction",id:"1-introduction",level:2},{value:"2. Compatible Migration",id:"2-compatible-migration",level:2},{value:"2.1. Backup data",id:"21-backup-data",level:3},{value:"2.2. Start a new service",id:"22-start-a-new-service",level:3},{value:"2.3. Stop the original service",id:"23-stop-the-original-service",level:3},{value:"3. Upgrade migration",id:"3-upgrade-migration",level:2},{value:"3.1. Export data",id:"31-export-data",level:3},{value:"3.2. Import data",id:"32-import-data",level:3},{value:"3.3. Start a new service",id:"33-start-a-new-service",level:3},{value:"3.4. Stop the original service",id:"34-stop-the-original-service",level:3},{value:"4. Online Migration",id:"4-online-migration",level:2},{value:"4.1. Copy data",id:"41-copy-data",level:3},{value:"4.2. Starting a new node",id:"42-starting-a-new-node",level:3},{value:"4.3. Stop the original node",id:"43-stop-the-original-node",level:3}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"data-migration",children:"Data Migration"})}),"\n",(0,a.jsx)(t.h2,{id:"1-introduction",children:"1 Introduction"}),"\n",(0,a.jsx)(t.p,{children:"Data migration refers to the process of moving data from one system, storage medium, or application to another system, storage medium, or application. When TuGraph needs to be upgraded or the system hardware environment changes,\nThe data in the original TuGraph service needs to be migrated. Based on the system hardware environment and software version, this paper divides data migration into three schemes:"}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsx)(t.li,{children:"Compatible migration: When the system environment before and after the migration is consistent and the TuGraph software is compatible, you can directly use the backup and recovery method to migrate data;"}),"\n",(0,a.jsx)(t.li,{children:"Upgrade and migration: When the system environment before and after the migration is inconsistent or the TuGraph software is not compatible, it is necessary to migrate the data by first exporting the data and then re-importing;"}),"\n",(0,a.jsx)(t.li,{children:"Online migration: When data migration is performed on a high-availability cluster and the network environment of the cluster is good, the original cluster can be smoothly switched to the new cluster by adding or deleting nodes.\nThe following article will introduce these three schemes in detail."}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"2-compatible-migration",children:"2. Compatible Migration"}),"\n",(0,a.jsxs)(t.p,{children:["Compatible migration means that when the system environment remains unchanged and the TuGraph software version is compatible, the data and stored procedures of the original service can be used in the new service, so it can be directly migrated.\nUsers can first use the ",(0,a.jsx)(t.code,{children:"lgraph_backup"})," tool to back up the data, then transfer the data to a new machine and restart the service. The specific migration steps are as follows:"]}),"\n",(0,a.jsx)(t.h3,{id:"21-backup-data",children:"2.1. Backup data"}),"\n",(0,a.jsxs)(t.p,{children:["Backup data using ",(0,a.jsx)(t.code,{children:"lgraph_backup"})," tool"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_backup -s db -d db.bck\n"})}),"\n",(0,a.jsxs)(t.p,{children:["You can also directly use the ",(0,a.jsx)(t.code,{children:"cp"})," command in this step, but the ",(0,a.jsx)(t.code,{children:"cp"})," command will copy some redundant metadata, and the raft metadata will also be copied in the HA mode, causing the cluster to fail to restart after migration.\nTherefore, it is recommended to use the ",(0,a.jsx)(t.code,{children:"lgraph_backup"})," tool instead of the ",(0,a.jsx)(t.code,{children:"cp"})," command during data migration."]}),"\n",(0,a.jsx)(t.h3,{id:"22-start-a-new-service",children:"2.2. Start a new service"}),"\n",(0,a.jsx)(t.p,{children:"Use the following command to start the new service, and the stored procedure will be automatically loaded into the new service"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_server -c /usr/local/etc/lgraph.json --directory db.bck -d start\n"})}),"\n",(0,a.jsx)(t.h3,{id:"23-stop-the-original-service",children:"2.3. Stop the original service"}),"\n",(0,a.jsx)(t.p,{children:"Use the following command to stop the original service"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_server -c /usr/local/etc/lgraph.json --directory db.bck -d stop\n"})}),"\n",(0,a.jsx)(t.h2,{id:"3-upgrade-migration",children:"3. Upgrade migration"}),"\n",(0,a.jsxs)(t.p,{children:["When the user wants to migrate the original service to a differentiated environment (such as migrating from centos7 to ubuntu18.04), or when the version of TuGraph changes greatly and is incompatible (such as 3.4.0 and 3.6.0),\nUsers can first use the ",(0,a.jsx)(t.code,{children:"lgraph_export"})," tool to export the data into a file, transfer it to a new machine, and then use the ",(0,a.jsx)(t.code,{children:"lgraph_import"})," tool to re-import and restart the cluster.\nThis can ensure that it can be used in the new environment, but the efficiency is low, and the stored procedure needs to be reloaded. The specific migration steps are as follows:"]}),"\n",(0,a.jsx)(t.h3,{id:"31-export-data",children:"3.1. Export data"}),"\n",(0,a.jsxs)(t.p,{children:["Use the ",(0,a.jsx)(t.code,{children:"lgraph_export"})," tool to export the data and transfer the data to the new machine"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_export -d db -e db.export\n"})}),"\n",(0,a.jsx)(t.h3,{id:"32-import-data",children:"3.2. Import data"}),"\n",(0,a.jsxs)(t.p,{children:["Use the ",(0,a.jsx)(t.code,{children:"lgraph_import"})," tool to import data and manually load the stored procedure (see ",(0,a.jsx)(t.a,{href:"/tugraph-db/en/client-tools/cpp-client",children:"client operation steps"})," for details)"]}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_import -c db.export/import.config -d db\n"})}),"\n",(0,a.jsx)(t.h3,{id:"33-start-a-new-service",children:"3.3. Start a new service"}),"\n",(0,a.jsx)(t.p,{children:"Start the new service with the following command"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_server -c /usr/local/etc/lgraph.json --directory db.export -d start\n"})}),"\n",(0,a.jsx)(t.h3,{id:"34-stop-the-original-service",children:"3.4. Stop the original service"}),"\n",(0,a.jsx)(t.p,{children:"Use the following command to stop the original service"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_server -c /usr/local/etc/lgraph.json --directory db.export -d stop\n"})}),"\n",(0,a.jsx)(t.h2,{id:"4-online-migration",children:"4. Online Migration"}),"\n",(0,a.jsx)(t.p,{children:"When performing data migration on the server cluster deployed by the high-availability version of TuGraph, if the network bandwidth is sufficient, you can directly migrate the service online by adding or deleting nodes. The specific migration steps are as follows:"}),"\n",(0,a.jsx)(t.h3,{id:"41-copy-data",children:"4.1. Copy data"}),"\n",(0,a.jsx)(t.p,{children:"Use the following commands to copy the data on the leader node and transfer it to the machine nodes of the new cluster. Since the leader node has the most complete raft log, copying the leader's data can minimize\nThe time for the log to catch up."}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" cp -r db db.cp\n"})}),"\n",(0,a.jsx)(t.h3,{id:"42-starting-a-new-node",children:"4.2. Starting a new node"}),"\n",(0,a.jsx)(t.p,{children:"Use the following command to join the new node to the cluster. After joining the cluster, the incremental data will be automatically synchronized to the new node"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_server -c /usr/local/etc/lgraph_ha.json --directory db.cp --ha_conf 192.168.0.1:9090,192.168.0.2:9090,192.168.0.3:9090 -d start\n"})}),"\n",(0,a.jsx)(t.h3,{id:"43-stop-the-original-node",children:"4.3. Stop the original node"}),"\n",(0,a.jsx)(t.p,{children:"Stop the original node service, and send subsequent application requests directly to the new cluster"}),"\n",(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-bash",children:" lgraph_server -c /usr/local/etc/lgraph_ha.json --directory db.cp --ha_conf 192.168.0.1:9090,192.168.0.2:9090,192.168.0.3:9090 -d stop\n"})})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(l,{...e})}):l(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>s});var a=n(6540);const r={},i=a.createContext(r);function o(e){const t=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b7950652.c6524e5a.js b/assets/js/b7950652.4d363fda.js similarity index 99% rename from assets/js/b7950652.c6524e5a.js rename to assets/js/b7950652.4d363fda.js index 06b3461fa2..8b51d0cf7b 100644 --- a/assets/js/b7950652.c6524e5a.js +++ b/assets/js/b7950652.4d363fda.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[9639],{6687:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var i=t(4848),o=t(8453);const r={},s="Individual Contributor License Agreement",a={id:"contributor-manual/individual-cla",title:"Individual Contributor License Agreement",description:"AntGroupOpenSourceIndividualCLAEnglishChinese2021",source:"@site/../docs/en-US/source/12.contributor-manual/3.individual-cla.md",sourceDirName:"12.contributor-manual",slug:"/contributor-manual/individual-cla",permalink:"/tugraph-db/en/contributor-manual/individual-cla",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph community roles",permalink:"/tugraph-db/en/contributor-manual/community-roles"},next:{title:"Corporate Contributor License Agreement",permalink:"/tugraph-db/en/contributor-manual/corporate-cla"}},l={},c=[];function d(e){const n={h1:"h1",header:"header",li:"li",ol:"ol",p:"p",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"individual-contributor-license-agreement",children:"Individual Contributor License Agreement"})}),"\n",(0,i.jsx)(n.p,{children:"Ant_Group_Open_Source_Individual_CLA_English_Chinese_2021"}),"\n",(0,i.jsx)(n.p,{children:"Ant Group"}),"\n",(0,i.jsx)(n.p,{children:"Individual Contributor License Agreement"}),"\n",(0,i.jsx)(n.p,{children:"\u8682\u8681\u96c6\u56e2"}),"\n",(0,i.jsx)(n.p,{children:"\u4e2a\u4eba\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae"}),"\n",(0,i.jsx)(n.p,{children:'Thank you for your interest in contributing documentation and related software code to a project hosted or managed by Ant Group, or any of its affiliates. In order to clarify the intellectual property license granted with Contributions from any person or entity, Ant Group must have a Contributor License Agreement ("CLA") on file that has been signed by each Contributor, indicating agreement to the license terms below. This version of the Contributor License Agreement allows an individual to submit Contributions to the applicable project. If you are making a submission on behalf of a legal entity, then you should sign the separation Corporate Contributor License Agreement.'}),"\n",(0,i.jsx)(n.p,{children:"\u611f\u8c22\u60a8\u5bf9\u5411\u8682\u8681\u96c6\u56e2\u6216\u5176\u4efb\u4f55\u5173\u8054\u65b9\u4e3b\u529e\u6216\u7ba1\u7406\u7684\u9879\u76ee\u8d21\u732e\u6587\u6863\u548c\u76f8\u5173\u8f6f\u4ef6\u4ee3\u7801\u7684\u5174\u8da3\u3002\u4e3a\u5398\u6e05\u5c31\u4e2a\u4eba\u6216\u5b9e\u4f53\u8d21\u732e\u5185\u5bb9\u800c\u6388\u4e88\u7684\u77e5\u8bc6\u4ea7\u6743\u8bb8\u53ef\uff0c\u8682\u8681\u96c6\u56e2\u5fc5\u987b\u5bf9\u6bcf\u4f4d\u8d21\u732e\u8005\u7b7e\u7f72\u7684\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae\uff08\u201cCLA\u201d\uff09\u8fdb\u884c\u5f52\u6863\uff0c\u4ee5\u8bc1\u660e\u5c31\u4ee5\u4e0b\u8bb8\u53ef\u6761\u4ef6\u8fbe\u6210\u7684\u4e00\u81f4\u3002\u6b64\u7248\u672c\u7684\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae\u5141\u8bb8\u4e2a\u4eba\u5411\u76f8\u5e94\u9879\u76ee\u63d0\u4ea4\u8d21\u732e\u5185\u5bb9\u3002\u5982\u679c\u60a8\u662f\u4ee5\u516c\u53f8\u540d\u4e49\u8fdb\u884c\u63d0\u4ea4\uff0c\u60a8\u5e94\u5f53\u53e6\u884c\u7b7e\u7f72\u4e00\u4efd\u516c\u53f8\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae\u3002"}),"\n",(0,i.jsx)(n.p,{children:"You accept and agree to the following terms and conditions for Your present and future Contributions submitted to Ant Group. Except for the license granted herein to Ant Group and recipients of documentation and software distributed by Ant Group, You reserve all right, title, and interest in and to Your Contributions."}),"\n",(0,i.jsx)(n.p,{children:"\u5c31\u60a8\u76ee\u524d\u548c\u5c06\u6765\u5411\u8682\u8681\u96c6\u56e2\u63d0\u4ea4\u7684\u8d21\u732e\u5185\u5bb9\uff0c\u60a8\u63a5\u53d7\u5e76\u540c\u610f\u4ee5\u4e0b\u6761\u6b3e\u548c\u6761\u4ef6\u3002\u9664\u4e86\u6839\u636e\u672c\u534f\u8bae\u5411\u8682\u8681\u96c6\u56e2\u548c\u8682\u8681\u96c6\u56e2\u53d1\u5e03\u6587\u6863\u548c\u8f6f\u4ef6\u7684\u63a5\u6536\u65b9\u6388\u4e88\u7684\u8bb8\u53ef\uff0c\u60a8\u5bf9\u4e8e\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u4fdd\u7559\u6240\u6709\u6743\u5229\u3001\u6240\u6709\u6743\u548c\u5229\u76ca\u3002"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Definitions."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u5b9a\u4e49\u3002"}),"\n",(0,i.jsx)(n.p,{children:'"You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with Ant Group. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.'}),"\n",(0,i.jsx)(n.p,{children:"\u201c\u60a8\u201d\uff08\u6216\u201c\u60a8\u7684\u201d\uff09\u7cfb\u6307\u4e0e\u8682\u8681\u96c6\u56e2\u7b7e\u7f72\u672c\u534f\u8bae\u7684\u8457\u4f5c\u6743\u4eba\u6216\u7ecf\u8457\u4f5c\u6743\u4eba\u6388\u6743\u7684\u6cd5\u5f8b\u5b9e\u4f53\u3002\u5bf9\u4e8e\u6cd5\u5f8b\u5b9e\u4f53\u800c\u8a00\uff0c\u63d0\u4ea4\u8d21\u732e\u5185\u5bb9\u7684\u5b9e\u4f53\u4ee5\u53ca\u5176\u4ed6\u4efb\u4f55\u63a7\u5236\u8be5\u5b9e\u4f53\u3001\u53d7\u5176\u63a7\u5236\u6216\u4e0e\u5176\u53d7\u5230\u540c\u4e00\u4e3b\u4f53\u63a7\u5236\u7684\u5b9e\u4f53\u88ab\u89c6\u4e3a\u5355\u4e2a\u8d21\u732e\u8005\u3002\u4e3a\u672c\u5b9a\u4e49\u4e4b\u76ee\u7684\uff0c\u201c\u63a7\u5236\u201d \u7cfb\u6307\uff08i\uff09\u901a\u8fc7\u5408\u540c\u6216\u5176\u4ed6\u65b9\u5f0f\uff0c\u76f4\u63a5\u6216\u95f4\u63a5\u5bf9\u8be5\u5b9e\u4f53\u8fdb\u884c\u6307\u5bfc\u548c\u7ba1\u7406\u7684\u6743\u529b\uff0c\uff08ii\uff09\u6301\u6709\u8be5\u5b9e\u4f53\u767e\u5206\u4e4b\u4e94\u5341\uff0850%\uff09\u6216\u66f4\u591a\u7684\u5df2\u53d1\u884c\u80a1\u4efd\uff0c\u6216\uff08iii\uff09\u95f4\u63a5\u6301\u6709\u8be5\u5b9e\u4f53\u6743\u76ca\u3002"}),"\n",(0,i.jsx)(n.p,{children:'"Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to Ant Group for inclusion in, or documentation of, any of the products or projects owned or managed by Ant Group (the "Work"), including without limitation any Work described in Schedule A. For the purposes of this definition, "submitted" means any form of electronic or written communication sent to Ant Group or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, Ant Group for the purpose of discussing and improving the Work.'}),"\n",(0,i.jsx)(n.p,{children:"\u201c\u8d21\u732e\u5185\u5bb9\u201d\u7cfb\u6307\u7531\u60a8\u6709\u610f\u5730\u5411\u8682\u8681\u96c6\u56e2\u63d0\u4ea4\uff0c\u4ee5\u4fbf\u88ab\u5305\u542b\u6216\u8bb0\u8f7d\u5728\u4efb\u4f55\u8682\u8681\u96c6\u56e2\u62e5\u6709\u6216\u7ba1\u7406\u7684\u4ea7\u54c1\u6216\u9879\u76ee\uff08\u201c\u4f5c\u54c1\u201d\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u4efb\u4f55\u5728\u9644\u5f55A\u4e2d\u5217\u4e3e\u7684\u4f5c\u54c1\uff09\u4e2d\u7684\u4efb\u4f55\u539f\u521b\u4f5c\u54c1\uff0c\u5305\u62ec\u5bf9\u65e2\u5b58\u4f5c\u54c1\u7684\u4efb\u4f55\u4fee\u6539\u548c\u589e\u52a0\u3002\u4e3a\u672c\u5b9a\u4e49\u4e4b\u76ee\u7684\uff0c\u201c\u63d0\u4ea4\u201d\u7cfb\u6307\u5411\u8682\u8681\u96c6\u56e2\u6216\u5176\u4ee3\u8868\u8fdb\u884c\u7684\u4efb\u4f55\u5f62\u5f0f\u7684\u7535\u5b50\u6216\u4e66\u9762\u4ea4\u6d41\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u4e3a\u8ba8\u8bba\u548c\u6539\u5584\u4f5c\u54c1\u4e3a\u76ee\u7684\uff0c\u901a\u8fc7\u8682\u8681\u96c6\u56e2\u7ba1\u7406\u7684\uff08\u6216\u4ee5\u8682\u8681\u96c6\u56e2\u540d\u4e49\u7ba1\u7406\u7684\uff09\u7535\u5b50\u90ae\u4ef6\u5217\u8868\u3001\u6e90\u4ee3\u7801\u63a7\u5236\u7cfb\u7edf\u548c\u95ee\u9898\u8ddf\u8e2a\u7cfb\u7edf\u8fdb\u884c\u7684\u4ea4\u6d41\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to Ant Group and to recipients of documentation and software distributed by Ant Group a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u8457\u4f5c\u6743\u8bb8\u53ef\u7684\u6388\u4e88\u3002\u53d7\u9650\u4e8e\u672c\u534f\u8bae\u7684\u6761\u6b3e\u548c\u6761\u4ef6\uff0c\u60a8\u5728\u6b64\u6388\u4e88\u8682\u8681\u96c6\u56e2\u4ee5\u53ca\u8682\u8681\u96c6\u56e2\u53d1\u5e03\u6587\u6863\u548c\u8f6f\u4ef6\u7684\u63a5\u6536\u65b9\u6c38\u4e45\u6027\u7684\u3001\u5168\u7403\u8303\u56f4\u5185\u7684\u3001\u975e\u6392\u4ed6\u7684\u3001\u5b8c\u5168\u65e0\u987b\u8bb8\u53ef\u8d39\u7684\u3001\u5b8c\u5168\u65e0\u987b\u7248\u6743\u8d39\u7684\u548c\u4e0d\u53ef\u64a4\u9500\u7684\u8457\u4f5c\u6743\u8bb8\u53ef\uff0c\u4ee5\u590d\u5236\u3001\u884d\u751f\u3001\u516c\u5f00\u5c55\u793a\u3001\u516c\u5f00\u6267\u884c\u3001\u8f6c\u6388\u6743\u548c\u53d1\u5e03\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u548c\u8be5\u7b49\u884d\u751f\u4f5c\u54c1\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to Ant Group and to recipients of documentation and software distributed by Ant Group a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u4e13\u5229\u8bb8\u53ef\u7684\u6388\u4e88\u3002 \u53d7\u9650\u4e8e\u672c\u534f\u8bae\u7684\u6761\u6b3e\u548c\u6761\u4ef6\uff0c\u60a8\u5728\u6b64\u6388\u4e88\u8682\u8681\u96c6\u56e2\u4ee5\u53ca\u8682\u8681\u96c6\u56e2\u53d1\u5e03\u6587\u6863\u548c\u8f6f\u4ef6\u7684\u63a5\u6536\u65b9\u6c38\u4e45\u6027\u7684\u3001\u5168\u7403\u8303\u56f4\u5185\u7684\u3001\u975e\u6392\u4ed6\u7684\u3001\u5b8c\u5168\u65e0\u987b\u8bb8\u53ef\u8d39\u7684\u3001\u5b8c\u5168\u65e0\u987b\u7248\u6743\u8d39\u7684\u548c\u4e0d\u53ef\u64a4\u9500\uff08\u672c\u8282\u89c4\u5b9a\u7684\u60c5\u5f62\u9664\u5916\uff09\u7684\u4e13\u5229\u8bb8\u53ef\uff0c\u4ee5\u5f00\u53d1\u3001\u5229\u7528\u3001\u8981\u7ea6\u51fa\u552e\u3001\u51fa\u552e\u3001\u5bfc\u5165\u6216\u4ee5\u5176\u4ed6\u65b9\u5f0f\u8f6c\u8ba9\u4f5c\u54c1\uff0c\u4f46\u8be5\u8bb8\u53ef\u4ec5\u9002\u7528\u4e8e\u60a8\u6709\u6743\u8bb8\u53ef\u7684\uff0c\u4e14\u5fc5\u7136\u4f1a\u88ab\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u4fb5\u6743\uff08\u8d21\u732e\u5185\u5bb9\u5355\u72ec\u6784\u6210\u4fb5\u6743\u3001\u6216\u4e0e\u8d21\u732e\u5185\u5bb9\u7684\u76f8\u5173\u4f5c\u54c1\u4e00\u540c\u6784\u6210\u4fb5\u6743\uff09\u7684\u4e13\u5229\u7533\u8bf7\u8303\u56f4\u3002\u5982\u679c\u4efb\u4f55\u5b9e\u4f53\u9488\u5bf9\u60a8\u6216\u5176\u4ed6\u5b9e\u4f53\u63d0\u8d77\u4e13\u5229\u8bc9\u8bbc\uff08\u5305\u62ec\u8bc9\u8bbc\u4e2d\u7684\u4ea4\u53c9\u8bf7\u6c42\u6216\u53cd\u8bc9\uff09\uff0c\u4e3b\u5f20\u60a8\u7684\u8d21\u732e\u5185\u5bb9\uff08\u6216\u60a8\u53c2\u4e0e\u8d21\u732e\u7684\u4f5c\u54c1\uff09\u9020\u6210\u4e86\u76f4\u63a5\u6027\u6216\u8f85\u52a9\u6027\u7684\u4e13\u5229\u4fb5\u6743\uff0c\u5219\u4efb\u4f55\u6839\u636e\u672c\u534f\u8bae\u9488\u5bf9\u8be5\u8d21\u732e\u5185\u5bb9\u6216\u4f5c\u54c1\u6388\u4e88\u8be5\u5b9e\u4f53\u7684\u4e13\u5229\u8bb8\u53ef\u5e94\u5f53\u5728\u8d77\u8bc9\u4e4b\u65e5\u7ec8\u6b62\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"You represent that you are legally entitled to grant the above license."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u60a8\u4fdd\u8bc1\u60a8\u4f9d\u6cd5\u6709\u6743\u6388\u4e88\u4e0a\u8ff0\u8bb8\u53ef\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u60a8\u4fdd\u8bc1\u60a8\u6240\u6709\u7684\u8d21\u732e\u5185\u5bb9\u5747\u4e3a\u60a8\u7684\u539f\u521b\u4f5c\u54c1\uff08\u5173\u4e8e\u4e3a\u4ed6\u4eba\u63d0\u4ea4\u4f5c\u54c1\u7684\u89c4\u5b9a\uff0c\u53ef\u53c2\u89c1\u7b2c7\u8282\uff09\u3002\u60a8\u4fdd\u8bc1\u60a8\u63d0\u4ea4\u7684\u8d21\u732e\u5185\u5bb9\u5305\u62ec\u4efb\u4f55\u7b2c\u4e09\u65b9\u8bb8\u53ef\u6216\u5176\u4ed6\u9650\u5236\uff08\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u76f8\u5173\u4e13\u5229\u6216\u5546\u6807\uff09\u7684\u5168\u90e8\u7ec6\u8282\uff0c\u53ea\u8981\u8be5\u7b49\u8bb8\u53ef\u6216\u5176\u4ed6\u9650\u5236\u4e3a\u60a8\u4e2a\u4eba\u6240\u77e5\u6089\u4e14\u4e0e\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u7684\u4efb\u4f55\u90e8\u5206\u76f8\u5173\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.'}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u5728\u60a8\u81ea\u613f\u63d0\u4f9b\u652f\u6301\u7684\u8303\u56f4\u4e4b\u5916\uff0c\u60a8\u65e0\u9700\u5bf9\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u63d0\u4f9b\u652f\u6301\u3002\u60a8\u53ef\u4ee5\u63d0\u4f9b\u514d\u8d39\u652f\u6301\u6216\u6536\u8d39\u652f\u6301\uff0c\u4e5f\u53ef\u4ee5\u5b8c\u5168\u4e0d\u63d0\u4f9b\u652f\u6301\u3002\u9664\u975e\u9002\u7528\u6cd5\u5f8b\u53e6\u6709\u89c4\u5b9a\u6216\u53e6\u6709\u4e66\u9762\u7ea6\u5b9a\uff0c\u60a8\u201c\u6309\u7167\u73b0\u72b6\u201d\u63d0\u4f9b\u60a8\u7684\u8d21\u732e\u5185\u5bb9\uff0c\u800c\u4e0d\u5bf9\u5176\u63d0\u4f9b\u4efb\u4f55\u7c7b\u578b\u7684\u4fdd\u8bc1\u6216\u6761\u4ef6\uff0c\u65e0\u8bba\u660e\u793a\u8fd8\u662f\u9ed8\u793a\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u4e3a\u4efb\u4f55\u7279\u5b9a\u76ee\u7684\u5bf9\u6240\u6709\u6743\u3001\u65e0\u4fb5\u6743\u3001\u9002\u9500\u6027\u6216\u9002\u5f53\u6027\u7684\u4fdd\u8bc1\u6216\u6761\u4ef6\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Should You wish to submit work that is not Your original creation, You may submit it to Ant Group separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]".'}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u5982\u679c\u60a8\u5e0c\u671b\u63d0\u4ea4\u5e76\u975e\u60a8\u539f\u521b\u7684\u4f5c\u54c1\uff0c\u60a8\u53ef\u4ee5\u5728\u4efb\u4f55\u8d21\u732e\u5185\u5bb9\u4e4b\u5916\u5355\u72ec\u5411\u8682\u8681\u96c6\u56e2\u63d0\u4ea4\uff0c\u6807\u6ce8\u5173\u4e8e\u5176\u6765\u6e90\u548c\u60a8\u4e2a\u4eba\u6240\u77e5\u6089\u7684\u4efb\u4f55\u8bb8\u53ef\u6216\u5176\u4ed6\u9650\u5236\uff08\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u76f8\u5173\u4e13\u5229\u3001\u5546\u6807\u548c\u8bb8\u53ef\u534f\u8bae\uff09\u7684\u5b8c\u6574\u4fe1\u606f\uff0c\u5e76\u4ee5\u663e\u8457\u65b9\u5f0f\u6807\u660e\u8be5\u4f5c\u54c1\u5c5e\u4e8e\u201c\u4ee5\u7b2c\u4e09\u65b9\u540d\u4e49\u63d0\u4ea4\uff1a\u3010\u586b\u5199\u59d3\u540d\u3011\u201d\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"You agree to notify Ant Group of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u60a8\u540c\u610f\u5728\u60a8\u83b7\u6089\u4efb\u4f55\u53ef\u80fd\u5bfc\u81f4\u4e0a\u8ff0\u4fdd\u8bc1\u5728\u4efb\u4f55\u65b9\u9762\u4e0d\u51c6\u786e\u7684\u4e8b\u5b9e\u6216\u60c5\u51b5\u4e4b\u65f6\u901a\u77e5\u8682\u8681\u96c6\u56e2\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"This Agreement will be governed by and construed in accordance with the laws of the People's Republic of China excluding that body of laws known as conflict of laws. The parties expressly agree that the United Nations Convention on Contracts for the International Sale of Goods will not apply. Any legal action or proceeding arising under this Agreement will be brought exclusively in the courts located in Hangzhou, China, and the parties hereby irrevocably consent to the personal jurisdiction and venue therein."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u672c\u534f\u8bae\u53d7\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd\u6cd5\u5f8b\u7ba1\u8f96\uff0c\u5e76\u4f9d\u636e\u5176\u8fdb\u884c\u89e3\u91ca\uff0c\u4f46\u51b2\u7a81\u6cd5\u89c4\u5219\u9664\u5916\u3002\u534f\u8bae\u5404\u65b9\u660e\u786e\u540c\u610f\u6392\u9664\u300a\u8054\u5408\u56fd\u56fd\u9645\u8d27\u7269\u9500\u552e\u5408\u540c\u516c\u7ea6\u300b\u7684\u9002\u7528\u3002\u4efb\u4f55\u7531\u672c\u534f\u8bae\u4ea7\u751f\u7684\u6cd5\u5f8b\u8bc9\u8bbc\u6216\u7a0b\u5e8f\u5747\u5e94\u6392\u4ed6\u6027\u5730\u63d0\u4ea4\u81f3\u4e2d\u56fd\u676d\u5dde\u7684\u6cd5\u9662\u8fdb\u884c\u5ba1\u7406\uff0c\u4e14\u5404\u65b9\u5728\u6b64\u4e0d\u53ef\u64a4\u9500\u5730\u540c\u610f\u8be5\u7b49\u5173\u4e8e\u5c5e\u4eba\u7ba1\u8f96\u548c\u6cd5\u9662\u5730\u7684\u5b89\u6392\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"For your reading convenience, this Agreement is written in parallel English and Chinese sections. To the extent there is a conflict between the English and Chinese sections, the English sections shall govern."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u4e3a\u4e86\u60a8\u7684\u9605\u8bfb\u65b9\u4fbf\uff0c\u672c\u534f\u8bae\u540c\u65f6\u63d0\u4f9b\u4e86\u82f1\u6587\u548c\u4e2d\u6587\u6bb5\u843d\u3002\u5982\u679c\u82f1\u6587\u548c\u4e2d\u6587\u6bb5\u843d\u6709\u77db\u76fe\uff0c\u5219\u4ee5\u82f1\u6587\u6bb5\u843d\u4e3a\u51c6\u3002"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Please sign\u8bf7\u7b7e\u7f72: __________________________________ Date\u65e5\u671f: ____________"}),"\n",(0,i.jsx)(n.p,{children:"Full name\u5168\u540d: _____________________________________________________"}),"\n",(0,i.jsx)(n.p,{children:"Mailing Address\u4fe1\u4ef6\u5730\u5740: ________________________________________________"}),"\n",(0,i.jsx)(n.p,{children:"Telephone\u7535\u8bdd: _____________________________________________________"}),"\n",(0,i.jsx)(n.p,{children:"E-Mail\u7535\u5b50\u90ae\u7bb1: ______________________________________________________"}),"\n",(0,i.jsx)(n.p,{children:"Schedule A\u9644\u5f55A:"}),"\n",(0,i.jsx)(n.p,{children:"Description of Initial Contribution:"}),"\n",(0,i.jsx)(n.p,{children:"\u63cf\u8ff0\u521d\u59cb\u8d21\u732e\u5185\u5bb9\uff1a"})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var i=t(6540);const o={},r=i.createContext(o);function s(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[9639],{6687:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var i=t(4848),o=t(8453);const r={},s="Individual Contributor License Agreement",a={id:"contributor-manual/individual-cla",title:"Individual Contributor License Agreement",description:"AntGroupOpenSourceIndividualCLAEnglishChinese2021",source:"@site/../docs/en-US/source/12.contributor-manual/3.individual-cla.md",sourceDirName:"12.contributor-manual",slug:"/contributor-manual/individual-cla",permalink:"/tugraph-db/en/contributor-manual/individual-cla",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph community roles",permalink:"/tugraph-db/en/contributor-manual/community-roles"},next:{title:"Corporate Contributor License Agreement",permalink:"/tugraph-db/en/contributor-manual/corporate-cla"}},l={},c=[];function d(e){const n={h1:"h1",header:"header",li:"li",ol:"ol",p:"p",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"individual-contributor-license-agreement",children:"Individual Contributor License Agreement"})}),"\n",(0,i.jsx)(n.p,{children:"Ant_Group_Open_Source_Individual_CLA_English_Chinese_2021"}),"\n",(0,i.jsx)(n.p,{children:"Ant Group"}),"\n",(0,i.jsx)(n.p,{children:"Individual Contributor License Agreement"}),"\n",(0,i.jsx)(n.p,{children:"\u8682\u8681\u96c6\u56e2"}),"\n",(0,i.jsx)(n.p,{children:"\u4e2a\u4eba\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae"}),"\n",(0,i.jsx)(n.p,{children:'Thank you for your interest in contributing documentation and related software code to a project hosted or managed by Ant Group, or any of its affiliates. In order to clarify the intellectual property license granted with Contributions from any person or entity, Ant Group must have a Contributor License Agreement ("CLA") on file that has been signed by each Contributor, indicating agreement to the license terms below. This version of the Contributor License Agreement allows an individual to submit Contributions to the applicable project. If you are making a submission on behalf of a legal entity, then you should sign the separation Corporate Contributor License Agreement.'}),"\n",(0,i.jsx)(n.p,{children:"\u611f\u8c22\u60a8\u5bf9\u5411\u8682\u8681\u96c6\u56e2\u6216\u5176\u4efb\u4f55\u5173\u8054\u65b9\u4e3b\u529e\u6216\u7ba1\u7406\u7684\u9879\u76ee\u8d21\u732e\u6587\u6863\u548c\u76f8\u5173\u8f6f\u4ef6\u4ee3\u7801\u7684\u5174\u8da3\u3002\u4e3a\u5398\u6e05\u5c31\u4e2a\u4eba\u6216\u5b9e\u4f53\u8d21\u732e\u5185\u5bb9\u800c\u6388\u4e88\u7684\u77e5\u8bc6\u4ea7\u6743\u8bb8\u53ef\uff0c\u8682\u8681\u96c6\u56e2\u5fc5\u987b\u5bf9\u6bcf\u4f4d\u8d21\u732e\u8005\u7b7e\u7f72\u7684\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae\uff08\u201cCLA\u201d\uff09\u8fdb\u884c\u5f52\u6863\uff0c\u4ee5\u8bc1\u660e\u5c31\u4ee5\u4e0b\u8bb8\u53ef\u6761\u4ef6\u8fbe\u6210\u7684\u4e00\u81f4\u3002\u6b64\u7248\u672c\u7684\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae\u5141\u8bb8\u4e2a\u4eba\u5411\u76f8\u5e94\u9879\u76ee\u63d0\u4ea4\u8d21\u732e\u5185\u5bb9\u3002\u5982\u679c\u60a8\u662f\u4ee5\u516c\u53f8\u540d\u4e49\u8fdb\u884c\u63d0\u4ea4\uff0c\u60a8\u5e94\u5f53\u53e6\u884c\u7b7e\u7f72\u4e00\u4efd\u516c\u53f8\u8d21\u732e\u8005\u8bb8\u53ef\u534f\u8bae\u3002"}),"\n",(0,i.jsx)(n.p,{children:"You accept and agree to the following terms and conditions for Your present and future Contributions submitted to Ant Group. Except for the license granted herein to Ant Group and recipients of documentation and software distributed by Ant Group, You reserve all right, title, and interest in and to Your Contributions."}),"\n",(0,i.jsx)(n.p,{children:"\u5c31\u60a8\u76ee\u524d\u548c\u5c06\u6765\u5411\u8682\u8681\u96c6\u56e2\u63d0\u4ea4\u7684\u8d21\u732e\u5185\u5bb9\uff0c\u60a8\u63a5\u53d7\u5e76\u540c\u610f\u4ee5\u4e0b\u6761\u6b3e\u548c\u6761\u4ef6\u3002\u9664\u4e86\u6839\u636e\u672c\u534f\u8bae\u5411\u8682\u8681\u96c6\u56e2\u548c\u8682\u8681\u96c6\u56e2\u53d1\u5e03\u6587\u6863\u548c\u8f6f\u4ef6\u7684\u63a5\u6536\u65b9\u6388\u4e88\u7684\u8bb8\u53ef\uff0c\u60a8\u5bf9\u4e8e\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u4fdd\u7559\u6240\u6709\u6743\u5229\u3001\u6240\u6709\u6743\u548c\u5229\u76ca\u3002"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Definitions."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u5b9a\u4e49\u3002"}),"\n",(0,i.jsx)(n.p,{children:'"You" (or "Your") shall mean the copyright owner or legal entity authorized by the copyright owner that is making this Agreement with Ant Group. For legal entities, the entity making a Contribution and all other entities that control, are controlled by, or are under common control with that entity are considered to be a single Contributor. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.'}),"\n",(0,i.jsx)(n.p,{children:"\u201c\u60a8\u201d\uff08\u6216\u201c\u60a8\u7684\u201d\uff09\u7cfb\u6307\u4e0e\u8682\u8681\u96c6\u56e2\u7b7e\u7f72\u672c\u534f\u8bae\u7684\u8457\u4f5c\u6743\u4eba\u6216\u7ecf\u8457\u4f5c\u6743\u4eba\u6388\u6743\u7684\u6cd5\u5f8b\u5b9e\u4f53\u3002\u5bf9\u4e8e\u6cd5\u5f8b\u5b9e\u4f53\u800c\u8a00\uff0c\u63d0\u4ea4\u8d21\u732e\u5185\u5bb9\u7684\u5b9e\u4f53\u4ee5\u53ca\u5176\u4ed6\u4efb\u4f55\u63a7\u5236\u8be5\u5b9e\u4f53\u3001\u53d7\u5176\u63a7\u5236\u6216\u4e0e\u5176\u53d7\u5230\u540c\u4e00\u4e3b\u4f53\u63a7\u5236\u7684\u5b9e\u4f53\u88ab\u89c6\u4e3a\u5355\u4e2a\u8d21\u732e\u8005\u3002\u4e3a\u672c\u5b9a\u4e49\u4e4b\u76ee\u7684\uff0c\u201c\u63a7\u5236\u201d \u7cfb\u6307\uff08i\uff09\u901a\u8fc7\u5408\u540c\u6216\u5176\u4ed6\u65b9\u5f0f\uff0c\u76f4\u63a5\u6216\u95f4\u63a5\u5bf9\u8be5\u5b9e\u4f53\u8fdb\u884c\u6307\u5bfc\u548c\u7ba1\u7406\u7684\u6743\u529b\uff0c\uff08ii\uff09\u6301\u6709\u8be5\u5b9e\u4f53\u767e\u5206\u4e4b\u4e94\u5341\uff0850%\uff09\u6216\u66f4\u591a\u7684\u5df2\u53d1\u884c\u80a1\u4efd\uff0c\u6216\uff08iii\uff09\u95f4\u63a5\u6301\u6709\u8be5\u5b9e\u4f53\u6743\u76ca\u3002"}),"\n",(0,i.jsx)(n.p,{children:'"Contribution" shall mean any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by You to Ant Group for inclusion in, or documentation of, any of the products or projects owned or managed by Ant Group (the "Work"), including without limitation any Work described in Schedule A. For the purposes of this definition, "submitted" means any form of electronic or written communication sent to Ant Group or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, Ant Group for the purpose of discussing and improving the Work.'}),"\n",(0,i.jsx)(n.p,{children:"\u201c\u8d21\u732e\u5185\u5bb9\u201d\u7cfb\u6307\u7531\u60a8\u6709\u610f\u5730\u5411\u8682\u8681\u96c6\u56e2\u63d0\u4ea4\uff0c\u4ee5\u4fbf\u88ab\u5305\u542b\u6216\u8bb0\u8f7d\u5728\u4efb\u4f55\u8682\u8681\u96c6\u56e2\u62e5\u6709\u6216\u7ba1\u7406\u7684\u4ea7\u54c1\u6216\u9879\u76ee\uff08\u201c\u4f5c\u54c1\u201d\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u4efb\u4f55\u5728\u9644\u5f55A\u4e2d\u5217\u4e3e\u7684\u4f5c\u54c1\uff09\u4e2d\u7684\u4efb\u4f55\u539f\u521b\u4f5c\u54c1\uff0c\u5305\u62ec\u5bf9\u65e2\u5b58\u4f5c\u54c1\u7684\u4efb\u4f55\u4fee\u6539\u548c\u589e\u52a0\u3002\u4e3a\u672c\u5b9a\u4e49\u4e4b\u76ee\u7684\uff0c\u201c\u63d0\u4ea4\u201d\u7cfb\u6307\u5411\u8682\u8681\u96c6\u56e2\u6216\u5176\u4ee3\u8868\u8fdb\u884c\u7684\u4efb\u4f55\u5f62\u5f0f\u7684\u7535\u5b50\u6216\u4e66\u9762\u4ea4\u6d41\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u4e3a\u8ba8\u8bba\u548c\u6539\u5584\u4f5c\u54c1\u4e3a\u76ee\u7684\uff0c\u901a\u8fc7\u8682\u8681\u96c6\u56e2\u7ba1\u7406\u7684\uff08\u6216\u4ee5\u8682\u8681\u96c6\u56e2\u540d\u4e49\u7ba1\u7406\u7684\uff09\u7535\u5b50\u90ae\u4ef6\u5217\u8868\u3001\u6e90\u4ee3\u7801\u63a7\u5236\u7cfb\u7edf\u548c\u95ee\u9898\u8ddf\u8e2a\u7cfb\u7edf\u8fdb\u884c\u7684\u4ea4\u6d41\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Grant of Copyright License. Subject to the terms and conditions of this Agreement, You hereby grant to Ant Group and to recipients of documentation and software distributed by Ant Group a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Your Contributions and such derivative works."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u8457\u4f5c\u6743\u8bb8\u53ef\u7684\u6388\u4e88\u3002\u53d7\u9650\u4e8e\u672c\u534f\u8bae\u7684\u6761\u6b3e\u548c\u6761\u4ef6\uff0c\u60a8\u5728\u6b64\u6388\u4e88\u8682\u8681\u96c6\u56e2\u4ee5\u53ca\u8682\u8681\u96c6\u56e2\u53d1\u5e03\u6587\u6863\u548c\u8f6f\u4ef6\u7684\u63a5\u6536\u65b9\u6c38\u4e45\u6027\u7684\u3001\u5168\u7403\u8303\u56f4\u5185\u7684\u3001\u975e\u6392\u4ed6\u7684\u3001\u5b8c\u5168\u65e0\u987b\u8bb8\u53ef\u8d39\u7684\u3001\u5b8c\u5168\u65e0\u987b\u7248\u6743\u8d39\u7684\u548c\u4e0d\u53ef\u64a4\u9500\u7684\u8457\u4f5c\u6743\u8bb8\u53ef\uff0c\u4ee5\u590d\u5236\u3001\u884d\u751f\u3001\u516c\u5f00\u5c55\u793a\u3001\u516c\u5f00\u6267\u884c\u3001\u8f6c\u6388\u6743\u548c\u53d1\u5e03\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u548c\u8be5\u7b49\u884d\u751f\u4f5c\u54c1\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Grant of Patent License. Subject to the terms and conditions of this Agreement, You hereby grant to Ant Group and to recipients of documentation and software distributed by Ant Group a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by You that are necessarily infringed by Your Contribution(s) alone or by combination of Your Contribution(s) with the Work to which such Contribution(s) was submitted. If any entity institutes patent litigation against You or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that your Contribution, or the Work to which you have contributed, constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for that Contribution or Work shall terminate as of the date such litigation is filed."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u4e13\u5229\u8bb8\u53ef\u7684\u6388\u4e88\u3002 \u53d7\u9650\u4e8e\u672c\u534f\u8bae\u7684\u6761\u6b3e\u548c\u6761\u4ef6\uff0c\u60a8\u5728\u6b64\u6388\u4e88\u8682\u8681\u96c6\u56e2\u4ee5\u53ca\u8682\u8681\u96c6\u56e2\u53d1\u5e03\u6587\u6863\u548c\u8f6f\u4ef6\u7684\u63a5\u6536\u65b9\u6c38\u4e45\u6027\u7684\u3001\u5168\u7403\u8303\u56f4\u5185\u7684\u3001\u975e\u6392\u4ed6\u7684\u3001\u5b8c\u5168\u65e0\u987b\u8bb8\u53ef\u8d39\u7684\u3001\u5b8c\u5168\u65e0\u987b\u7248\u6743\u8d39\u7684\u548c\u4e0d\u53ef\u64a4\u9500\uff08\u672c\u8282\u89c4\u5b9a\u7684\u60c5\u5f62\u9664\u5916\uff09\u7684\u4e13\u5229\u8bb8\u53ef\uff0c\u4ee5\u5f00\u53d1\u3001\u5229\u7528\u3001\u8981\u7ea6\u51fa\u552e\u3001\u51fa\u552e\u3001\u5bfc\u5165\u6216\u4ee5\u5176\u4ed6\u65b9\u5f0f\u8f6c\u8ba9\u4f5c\u54c1\uff0c\u4f46\u8be5\u8bb8\u53ef\u4ec5\u9002\u7528\u4e8e\u60a8\u6709\u6743\u8bb8\u53ef\u7684\uff0c\u4e14\u5fc5\u7136\u4f1a\u88ab\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u4fb5\u6743\uff08\u8d21\u732e\u5185\u5bb9\u5355\u72ec\u6784\u6210\u4fb5\u6743\u3001\u6216\u4e0e\u8d21\u732e\u5185\u5bb9\u7684\u76f8\u5173\u4f5c\u54c1\u4e00\u540c\u6784\u6210\u4fb5\u6743\uff09\u7684\u4e13\u5229\u7533\u8bf7\u8303\u56f4\u3002\u5982\u679c\u4efb\u4f55\u5b9e\u4f53\u9488\u5bf9\u60a8\u6216\u5176\u4ed6\u5b9e\u4f53\u63d0\u8d77\u4e13\u5229\u8bc9\u8bbc\uff08\u5305\u62ec\u8bc9\u8bbc\u4e2d\u7684\u4ea4\u53c9\u8bf7\u6c42\u6216\u53cd\u8bc9\uff09\uff0c\u4e3b\u5f20\u60a8\u7684\u8d21\u732e\u5185\u5bb9\uff08\u6216\u60a8\u53c2\u4e0e\u8d21\u732e\u7684\u4f5c\u54c1\uff09\u9020\u6210\u4e86\u76f4\u63a5\u6027\u6216\u8f85\u52a9\u6027\u7684\u4e13\u5229\u4fb5\u6743\uff0c\u5219\u4efb\u4f55\u6839\u636e\u672c\u534f\u8bae\u9488\u5bf9\u8be5\u8d21\u732e\u5185\u5bb9\u6216\u4f5c\u54c1\u6388\u4e88\u8be5\u5b9e\u4f53\u7684\u4e13\u5229\u8bb8\u53ef\u5e94\u5f53\u5728\u8d77\u8bc9\u4e4b\u65e5\u7ec8\u6b62\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"You represent that you are legally entitled to grant the above license."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u60a8\u4fdd\u8bc1\u60a8\u4f9d\u6cd5\u6709\u6743\u6388\u4e88\u4e0a\u8ff0\u8bb8\u53ef\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"You represent that each of Your Contributions is Your original creation (see section 7 for submissions on behalf of others). You represent that Your Contribution submissions include complete details of any third-party license or other restriction (including, but not limited to, related patents and trademarks) of which you are personally aware and which are associated with any part of Your Contributions."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u60a8\u4fdd\u8bc1\u60a8\u6240\u6709\u7684\u8d21\u732e\u5185\u5bb9\u5747\u4e3a\u60a8\u7684\u539f\u521b\u4f5c\u54c1\uff08\u5173\u4e8e\u4e3a\u4ed6\u4eba\u63d0\u4ea4\u4f5c\u54c1\u7684\u89c4\u5b9a\uff0c\u53ef\u53c2\u89c1\u7b2c7\u8282\uff09\u3002\u60a8\u4fdd\u8bc1\u60a8\u63d0\u4ea4\u7684\u8d21\u732e\u5185\u5bb9\u5305\u62ec\u4efb\u4f55\u7b2c\u4e09\u65b9\u8bb8\u53ef\u6216\u5176\u4ed6\u9650\u5236\uff08\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u76f8\u5173\u4e13\u5229\u6216\u5546\u6807\uff09\u7684\u5168\u90e8\u7ec6\u8282\uff0c\u53ea\u8981\u8be5\u7b49\u8bb8\u53ef\u6216\u5176\u4ed6\u9650\u5236\u4e3a\u60a8\u4e2a\u4eba\u6240\u77e5\u6089\u4e14\u4e0e\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u7684\u4efb\u4f55\u90e8\u5206\u76f8\u5173\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'You are not expected to provide support for Your Contributions, except to the extent You desire to provide support. You may provide support for free, for a fee, or not at all. Unless required by applicable law or agreed to in writing, You provide Your Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON- INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.'}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u5728\u60a8\u81ea\u613f\u63d0\u4f9b\u652f\u6301\u7684\u8303\u56f4\u4e4b\u5916\uff0c\u60a8\u65e0\u9700\u5bf9\u60a8\u7684\u8d21\u732e\u5185\u5bb9\u63d0\u4f9b\u652f\u6301\u3002\u60a8\u53ef\u4ee5\u63d0\u4f9b\u514d\u8d39\u652f\u6301\u6216\u6536\u8d39\u652f\u6301\uff0c\u4e5f\u53ef\u4ee5\u5b8c\u5168\u4e0d\u63d0\u4f9b\u652f\u6301\u3002\u9664\u975e\u9002\u7528\u6cd5\u5f8b\u53e6\u6709\u89c4\u5b9a\u6216\u53e6\u6709\u4e66\u9762\u7ea6\u5b9a\uff0c\u60a8\u201c\u6309\u7167\u73b0\u72b6\u201d\u63d0\u4f9b\u60a8\u7684\u8d21\u732e\u5185\u5bb9\uff0c\u800c\u4e0d\u5bf9\u5176\u63d0\u4f9b\u4efb\u4f55\u7c7b\u578b\u7684\u4fdd\u8bc1\u6216\u6761\u4ef6\uff0c\u65e0\u8bba\u660e\u793a\u8fd8\u662f\u9ed8\u793a\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u4e3a\u4efb\u4f55\u7279\u5b9a\u76ee\u7684\u5bf9\u6240\u6709\u6743\u3001\u65e0\u4fb5\u6743\u3001\u9002\u9500\u6027\u6216\u9002\u5f53\u6027\u7684\u4fdd\u8bc1\u6216\u6761\u4ef6\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:'Should You wish to submit work that is not Your original creation, You may submit it to Ant Group separately from any Contribution, identifying the complete details of its source and of any license or other restriction (including, but not limited to, related patents, trademarks, and license agreements) of which you are personally aware, and conspicuously marking the work as "Submitted on behalf of a third-party: [named here]".'}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u5982\u679c\u60a8\u5e0c\u671b\u63d0\u4ea4\u5e76\u975e\u60a8\u539f\u521b\u7684\u4f5c\u54c1\uff0c\u60a8\u53ef\u4ee5\u5728\u4efb\u4f55\u8d21\u732e\u5185\u5bb9\u4e4b\u5916\u5355\u72ec\u5411\u8682\u8681\u96c6\u56e2\u63d0\u4ea4\uff0c\u6807\u6ce8\u5173\u4e8e\u5176\u6765\u6e90\u548c\u60a8\u4e2a\u4eba\u6240\u77e5\u6089\u7684\u4efb\u4f55\u8bb8\u53ef\u6216\u5176\u4ed6\u9650\u5236\uff08\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\u76f8\u5173\u4e13\u5229\u3001\u5546\u6807\u548c\u8bb8\u53ef\u534f\u8bae\uff09\u7684\u5b8c\u6574\u4fe1\u606f\uff0c\u5e76\u4ee5\u663e\u8457\u65b9\u5f0f\u6807\u660e\u8be5\u4f5c\u54c1\u5c5e\u4e8e\u201c\u4ee5\u7b2c\u4e09\u65b9\u540d\u4e49\u63d0\u4ea4\uff1a\u3010\u586b\u5199\u59d3\u540d\u3011\u201d\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"You agree to notify Ant Group of any facts or circumstances of which you become aware that would make these representations inaccurate in any respect."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u60a8\u540c\u610f\u5728\u60a8\u83b7\u6089\u4efb\u4f55\u53ef\u80fd\u5bfc\u81f4\u4e0a\u8ff0\u4fdd\u8bc1\u5728\u4efb\u4f55\u65b9\u9762\u4e0d\u51c6\u786e\u7684\u4e8b\u5b9e\u6216\u60c5\u51b5\u4e4b\u65f6\u901a\u77e5\u8682\u8681\u96c6\u56e2\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"This Agreement will be governed by and construed in accordance with the laws of the People's Republic of China excluding that body of laws known as conflict of laws. The parties expressly agree that the United Nations Convention on Contracts for the International Sale of Goods will not apply. Any legal action or proceeding arising under this Agreement will be brought exclusively in the courts located in Hangzhou, China, and the parties hereby irrevocably consent to the personal jurisdiction and venue therein."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u672c\u534f\u8bae\u53d7\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd\u6cd5\u5f8b\u7ba1\u8f96\uff0c\u5e76\u4f9d\u636e\u5176\u8fdb\u884c\u89e3\u91ca\uff0c\u4f46\u51b2\u7a81\u6cd5\u89c4\u5219\u9664\u5916\u3002\u534f\u8bae\u5404\u65b9\u660e\u786e\u540c\u610f\u6392\u9664\u300a\u8054\u5408\u56fd\u56fd\u9645\u8d27\u7269\u9500\u552e\u5408\u540c\u516c\u7ea6\u300b\u7684\u9002\u7528\u3002\u4efb\u4f55\u7531\u672c\u534f\u8bae\u4ea7\u751f\u7684\u6cd5\u5f8b\u8bc9\u8bbc\u6216\u7a0b\u5e8f\u5747\u5e94\u6392\u4ed6\u6027\u5730\u63d0\u4ea4\u81f3\u4e2d\u56fd\u676d\u5dde\u7684\u6cd5\u9662\u8fdb\u884c\u5ba1\u7406\uff0c\u4e14\u5404\u65b9\u5728\u6b64\u4e0d\u53ef\u64a4\u9500\u5730\u540c\u610f\u8be5\u7b49\u5173\u4e8e\u5c5e\u4eba\u7ba1\u8f96\u548c\u6cd5\u9662\u5730\u7684\u5b89\u6392\u3002"}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"For your reading convenience, this Agreement is written in parallel English and Chinese sections. To the extent there is a conflict between the English and Chinese sections, the English sections shall govern."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"\u4e3a\u4e86\u60a8\u7684\u9605\u8bfb\u65b9\u4fbf\uff0c\u672c\u534f\u8bae\u540c\u65f6\u63d0\u4f9b\u4e86\u82f1\u6587\u548c\u4e2d\u6587\u6bb5\u843d\u3002\u5982\u679c\u82f1\u6587\u548c\u4e2d\u6587\u6bb5\u843d\u6709\u77db\u76fe\uff0c\u5219\u4ee5\u82f1\u6587\u6bb5\u843d\u4e3a\u51c6\u3002"}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Please sign\u8bf7\u7b7e\u7f72: __________________________________ Date\u65e5\u671f: ____________"}),"\n",(0,i.jsx)(n.p,{children:"Full name\u5168\u540d: _____________________________________________________"}),"\n",(0,i.jsx)(n.p,{children:"Mailing Address\u4fe1\u4ef6\u5730\u5740: ________________________________________________"}),"\n",(0,i.jsx)(n.p,{children:"Telephone\u7535\u8bdd: _____________________________________________________"}),"\n",(0,i.jsx)(n.p,{children:"E-Mail\u7535\u5b50\u90ae\u7bb1: ______________________________________________________"}),"\n",(0,i.jsx)(n.p,{children:"Schedule A\u9644\u5f55A:"}),"\n",(0,i.jsx)(n.p,{children:"Description of Initial Contribution:"}),"\n",(0,i.jsx)(n.p,{children:"\u63cf\u8ff0\u521d\u59cb\u8d21\u732e\u5185\u5bb9\uff1a"})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var i=t(6540);const o={},r=i.createContext(o);function s(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b7cec5eb.dd1959ad.js b/assets/js/b7cec5eb.c1096ee8.js similarity index 98% rename from assets/js/b7cec5eb.dd1959ad.js rename to assets/js/b7cec5eb.c1096ee8.js index a1c85704df..e22ab9a14e 100644 --- a/assets/js/b7cec5eb.dd1959ad.js +++ b/assets/js/b7cec5eb.c1096ee8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5411],{9387:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var t=r(4848),n=r(8453);const o={},a="Forgot Admin Password",i={id:"permission/reset_admin_password",title:"Forgot Admin Password",description:"TuGraph provides a password reset feature. If you forget the password for the admin account, you can reset it by following these steps.",source:"@site/../docs/en-US/source/10.permission/3.reset_admin_password.md",sourceDirName:"10.permission",slug:"/permission/reset_admin_password",permalink:"/tugraph-db/en/permission/reset_admin_password",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Token Usage Guide",permalink:"/tugraph-db/en/permission/token"},next:{title:"Monitoring",permalink:"/tugraph-db/en/permission/monitoring"}},d={},c=[{value:"1. Reset Password",id:"1-reset-password",level:2},{value:"2.Restart the Service",id:"2restart-the-service",level:2}];function l(e){const s={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"forgot-admin-password",children:"Forgot Admin Password"})}),"\n",(0,t.jsxs)(s.blockquote,{children:["\n",(0,t.jsx)(s.p,{children:"TuGraph provides a password reset feature. If you forget the password for the admin account, you can reset it by following these steps."}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"1-reset-password",children:"1. Reset Password"}),"\n",(0,t.jsx)(s.p,{children:"Firstly, the TuGraph server needs to be stopped. If it is deployed within a container, you will need to enter the container and execute the following command:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"lgraph_server -c /usr/local/etc/lgraph.json -d stop\n"})}),"\n",(0,t.jsx)(s.p,{children:"When starting the TuGraph server again, add the following parameter:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"--reset_admin_password 1\n"})}),"\n",(0,t.jsx)(s.p,{children:"Here is an example:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:'lgraph_server -c /usr/local/etc/lgraph.json --reset_admin_password 1 --log_dir ""\n'})}),"\n",(0,t.jsx)(s.p,{children:'This operation will reset the password for the admin account to the default password: 73@TuGraph when starting the TuGraph server.\nIf the password reset is successful, you will receive the message "Reset admin password successfully" and the current server process will be closed.'}),"\n",(0,t.jsx)(s.h2,{id:"2restart-the-service",children:"2.Restart the Service"}),"\n",(0,t.jsx)(s.p,{children:"You need to restart the server in normal mode and then use the default account and password to log in. After logging in, you can reset the password to continue using TuGraph.\nThe command to restart the TuGraph service is as follows:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"lgraph_server -c /usr/local/etc/lgraph.json -d start\n"})})]})}function h(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,s,r)=>{r.d(s,{R:()=>a,x:()=>i});var t=r(6540);const n={},o=t.createContext(n);function a(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5411],{9387:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var t=r(4848),n=r(8453);const o={},a="Forgot Admin Password",i={id:"permission/reset_admin_password",title:"Forgot Admin Password",description:"TuGraph provides a password reset feature. If you forget the password for the admin account, you can reset it by following these steps.",source:"@site/../docs/en-US/source/10.permission/3.reset_admin_password.md",sourceDirName:"10.permission",slug:"/permission/reset_admin_password",permalink:"/tugraph-db/en/permission/reset_admin_password",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Token Usage Guide",permalink:"/tugraph-db/en/permission/token"},next:{title:"Monitoring",permalink:"/tugraph-db/en/permission/monitoring"}},d={},c=[{value:"1. Reset Password",id:"1-reset-password",level:2},{value:"2.Restart the Service",id:"2restart-the-service",level:2}];function l(e){const s={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"forgot-admin-password",children:"Forgot Admin Password"})}),"\n",(0,t.jsxs)(s.blockquote,{children:["\n",(0,t.jsx)(s.p,{children:"TuGraph provides a password reset feature. If you forget the password for the admin account, you can reset it by following these steps."}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"1-reset-password",children:"1. Reset Password"}),"\n",(0,t.jsx)(s.p,{children:"Firstly, the TuGraph server needs to be stopped. If it is deployed within a container, you will need to enter the container and execute the following command:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"lgraph_server -c /usr/local/etc/lgraph.json -d stop\n"})}),"\n",(0,t.jsx)(s.p,{children:"When starting the TuGraph server again, add the following parameter:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"--reset_admin_password 1\n"})}),"\n",(0,t.jsx)(s.p,{children:"Here is an example:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:'lgraph_server -c /usr/local/etc/lgraph.json --reset_admin_password 1 --log_dir ""\n'})}),"\n",(0,t.jsx)(s.p,{children:'This operation will reset the password for the admin account to the default password: 73@TuGraph when starting the TuGraph server.\nIf the password reset is successful, you will receive the message "Reset admin password successfully" and the current server process will be closed.'}),"\n",(0,t.jsx)(s.h2,{id:"2restart-the-service",children:"2.Restart the Service"}),"\n",(0,t.jsx)(s.p,{children:"You need to restart the server in normal mode and then use the default account and password to log in. After logging in, you can reset the password to continue using TuGraph.\nThe command to restart the TuGraph service is as follows:"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"lgraph_server -c /usr/local/etc/lgraph.json -d start\n"})})]})}function h(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},8453:(e,s,r)=>{r.d(s,{R:()=>a,x:()=>i});var t=r(6540);const n={},o=t.createContext(n);function a(e){const s=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),t.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b7dd3f88.849d69fb.js b/assets/js/b7dd3f88.3a55716a.js similarity index 99% rename from assets/js/b7dd3f88.849d69fb.js rename to assets/js/b7dd3f88.3a55716a.js index 4858c085f3..64ac3d101b 100644 --- a/assets/js/b7dd3f88.849d69fb.js +++ b/assets/js/b7dd3f88.3a55716a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3945],{9792:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var r=t(4848),a=t(8453);const i={},o="Bootstrap program",s={id:"olap&procedure/olap/tutorial",title:"Bootstrap program",description:"This document is a bootstrap program designed for TuGraph users. Before reading the detailed documents, users should read this document first to have a general understanding of TuGraph's graph computing operation process, and it will be more convenient to read the detailed documents later. The bootstrap program is a simple instance of a bfs (breadth-first search) program based on Tugraph, and we will focus on how it is used.",source:"@site/../docs/en-US/source/9.olap&procedure/2.olap/1.tutorial.md",sourceDirName:"9.olap&procedure/2.olap",slug:"/olap&procedure/olap/tutorial",permalink:"/tugraph-db/en/olap&procedure/olap/tutorial",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Rust Stored Procedures",permalink:"/tugraph-db/en/olap&procedure/procedure/Rust-procedure"},next:{title:"OlapBase API",permalink:"/tugraph-db/en/olap&procedure/olap/olap-base-api"}},d={},l=[{value:"1.Introduction to TuGraph-Graph Analysis Engine",id:"1introduction-to-tugraph-graph-analysis-engine",level:2},{value:"2.Procedure compile and run",id:"2procedure-compile-and-run",level:2},{value:"2.1.C++",id:"21c",level:3},{value:"2.2.Python",id:"22python",level:3},{value:"3.Embed compile and run",id:"3embed-compile-and-run",level:2},{value:"3.1.C++",id:"31c",level:3},{value:"3.2.Python",id:"32python",level:3},{value:"4.Standalone compile and run",id:"4standalone-compile-and-run",level:2},{value:"4.1.C++",id:"41c",level:3},{value:"4.2.Python",id:"42python",level:3}];function h(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"bootstrap-program",children:"Bootstrap program"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"This document is a bootstrap program designed for TuGraph users. Before reading the detailed documents, users should read this document first to have a general understanding of TuGraph's graph computing operation process, and it will be more convenient to read the detailed documents later. The bootstrap program is a simple instance of a bfs (breadth-first search) program based on Tugraph, and we will focus on how it is used."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"1introduction-to-tugraph-graph-analysis-engine",children:"1.Introduction to TuGraph-Graph Analysis Engine"}),"\n",(0,r.jsx)(n.p,{children:"TuGraph's graph analysis engine is mainly used for full graph/full data analysis tasks. With the help of TuGraph's C++ / Python graph analysis engine API, users can quickly derive a complex subgraph from different data sources, and then run iterative graph algorithms such as PageRank, LPA, WCC on the subgraph, and finally make corresponding countermeasures according to the running results."}),"\n",(0,r.jsx)(n.p,{children:"In TuGraph, the process of both exporting and computing can be accelerated by in-memory parallel processing, resulting in near-real-time processing and analysis. Compared to traditional methods, this approach can avoid the overhead of data export and disk drop, and can achieve ideal performance by using a compact graph data structure."}),"\n",(0,r.jsx)(n.p,{children:"TuGraph has 6 built-in algorithms in the community version and 25 built-in algorithms in the commercial version. Users hardly need to implement the specific graph calculation process themselves. For details, please refer to algorithms.md."}),"\n",(0,r.jsx)(n.p,{children:"According to different data sources and implementations, it can be divided into Procedure, Embed and Standalone, which all inherit from OlapBase API. OlapBase API interface documentation can be found in OlAPBase-APi.md."}),"\n",(0,r.jsx)(n.p,{children:"The data source of Procedure and Embed is the db data preloaded in the graph database, which can be compiled to generate the.so file used by TuGraph-Web loading and the embed file used by the background terminal respectively. The input graph data are loaded in the form of db. The interface document can refer to olapondb-api.md."}),"\n",(0,r.jsx)(n.p,{children:"Standalone is used to compile and generate a standalone file. Different from the former, the input graph data of the file is loaded in the form of txt, binary, and ODPS files, and the interface document can refer to olapondisk-api.md."}),"\n",(0,r.jsx)(n.h2,{id:"2procedure-compile-and-run",children:"2.Procedure compile and run"}),"\n",(0,r.jsx)(n.p,{children:"This mode is mainly used for visual loading and running on the TuGraph-web interface. The usage method is as follows:"}),"\n",(0,r.jsx)(n.h3,{id:"21c",children:"2.1.C++"}),"\n",(0,r.jsx)(n.p,{children:"Run bash make_so.sh bfs in the TuGraph/procedures directory to the BFs.so file in the TuGraph/procedures directory, upload the file as a plug-in to Tugraph-web, input parameters and then execute."}),"\n",(0,r.jsx)(n.h3,{id:"22python",children:"2.2.Python"}),"\n",(0,r.jsx)(n.p,{children:"Upload the python file as a plugin to TuGraph-web, and execute it after inputting parameters."}),"\n",(0,r.jsxs)(n.p,{children:["Example:\nCompile the.so algorithm file at TuGraph/procedures\n",(0,r.jsx)(n.code,{children:"bash make_so.sh bfs"})]}),"\n",(0,r.jsx)(n.p,{children:"After loading the bfs.so (or TuGraph/procedures/algo_cython/bfs.py) file as a plug-in to TuGraph-web, enter the following json parameters:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "root": "10",\n "label": "user",\n "field": "id"\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"The following result"}),"\n",(0,r.jsx)(n.p,{children:'result:"{"core_cost":0.013641119003295898,\n"found_vertices":3829,\n"num_edges":88234,\n"num_vertices":4039,\n"output_cost":8.821487426757813e-06,\n"prepare_cost":0.03479194641113281,\n"total_cost":0.04844188690185547}"'}),"\n",(0,r.jsx)(n.p,{children:"The output \uff1a"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"num_edges: the number of edges in the graph"}),"\n",(0,r.jsx)(n.li,{children:"num_vertices: the number of nodes in the graph"}),"\n",(0,r.jsx)(n.li,{children:"prepare_cost: Represents the time required for the preprocessing phase. The preprocessing phase works: loading parameters, graph data loading, index initialization."}),"\n",(0,r.jsx)(n.li,{children:"core_cost: Represents the time required for the algorithm to run."}),"\n",(0,r.jsx)(n.li,{children:"found_vertices: Number of vertices found."}),"\n",(0,r.jsx)(n.li,{children:"output_cost: the time it takes for the algorithm result to be written back to db.\u3002"}),"\n",(0,r.jsx)(n.li,{children:"total_cost: The overall running time of the algorithm is executed."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"make_so.sh This file is used to compile the graph algorithm files involved in TuGraph-OLAP into a.so file available for TuGraph-web."}),"\n",(0,r.jsx)(n.h2,{id:"3embed-compile-and-run",children:"3.Embed compile and run"}),"\n",(0,r.jsx)(n.p,{children:"This way is mainly used for TuGraph in the background program on the preloaded db graph data algorithm analysis. Its use method is as follows:"}),"\n",(0,r.jsx)(n.p,{children:"To complete the embed_main.cpp file in TuGraph/procedures directory, add the data name, input parameters, data path and other information, as shown in the following example:"}),"\n",(0,r.jsx)(n.h3,{id:"31c",children:"3.1.C++"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-C++",children:'#include \n#include "lgraph/lgraph.h"\n#include "lgraph/olap_base.h"\nusing namespace std;\n\nextern "C" bool Process(lgraph_api::GraphDB &db, const std::string &request, std::string &response);\n\nint main(int argc, char **argv) {\n // db_path Specifies the path for saving the preloaded graph data\n std::string db_path = "../fb_db/";\n if (argc > 1)\n db_path = argv[1];\n lgraph_api::Galaxy g(db_path);\n g.SetCurrentUser("admin", "73@TuGraph");\n // Specifies the name of the graph\n lgraph_api::GraphDB db = g.OpenGraph("fb_db");\n std::string resp;\n // Enter the algorithm parameters in json format\n bool r = Process(db, "{\\"root_id\\":\\"0\\", \\"label\\":\\"node\\",\\"field\\":\\"id\\"}", resp);\n cout << r << endl;\n cout << resp << endl;\n return 0;\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Run bash make_so.sh bfs in TuGraph/procedures to bfs_procedure in TuGraph/procedures/algo_cpp.\n",(0,r.jsx)(n.code,{children:"bash make_embed.sh bfs"})]}),"\n",(0,r.jsxs)(n.p,{children:["Do this in the TuGraph/procedures folder\n",(0,r.jsx)(n.code,{children:"./algo_cpp/bfs_procedure"}),"\nThe result is returned."]}),"\n",(0,r.jsx)(n.p,{children:'Input: {"root_id":"0", "label":"node","field":"id"}\nfound_vertices = 3829\n{"core_cost":0.025603055953979492,\n"found_vertices":3829,\n"num_edges":88234,\n"num_vertices":4039,\n"output_cost":9.059906005859375e-06,\n"prepare_cost":0.056738853454589844,\n"total_cost":0.0823509693145752}'}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"Input"})," indicates the input parameters.The other parameters are described as above."]}),"\n",(0,r.jsx)(n.h3,{id:"32python",children:"3.2.Python"}),"\n",(0,r.jsxs)(n.p,{children:["To compile bfs.so, run ",(0,r.jsx)(n.code,{children:"bash make_so_cython.sh bfs"})," in TuGraph/procedures or ",(0,r.jsx)(n.code,{children:"python3 setup.py build_ext -i"})," in TuGraph/procedures/algo_cython."]}),"\n",(0,r.jsx)(n.p,{children:"After obtaining bfs.so, it can be imported and used in Python, as shown in TuGraph/procedures/run_embed.py:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:'# TuGraph/procedures/run_embed.py\nfrom lgraph_db_python import *\n\nimport bfs as python_plugin\n\nif __name__ == "__main__":\n galaxy = PyGalaxy("../build/output/lgraph_db")\n galaxy.SetCurrentUser("admin", "73@TuGraph")\n db = galaxy.OpenGraph("default", False)\n res = python_plugin.Process(db, "{\\"root_id\\":\\"0\\", \\"label\\":\\"node\\",\\"field\\":\\"id\\"}".encode(\'utf-8\'))\n print(res)\n del db\n del galaxy\n\n# shell\npython3 run_embed.py\n'})}),"\n",(0,r.jsx)(n.p,{children:"The output is the same as C++"}),"\n",(0,r.jsx)(n.h2,{id:"4standalone-compile-and-run",children:"4.Standalone compile and run"}),"\n",(0,r.jsx)(n.p,{children:"This file is mainly used to load the graph data directly at the terminal and run the printout results. Here's how to use it:"}),"\n",(0,r.jsxs)(n.p,{children:["In TuGraph/build directory ",(0,r.jsx)(n.code,{children:"make bfs_standalone"})," (need to include boost/sort/sort.hpp in the g++ default include path) can get bfs_standalone file, the file is generated with TuGraph/build/output/algo folder."]}),"\n",(0,r.jsxs)(n.p,{children:["Run: Go to the TuGraph/build directory and do",(0,r.jsx)(n.code,{children:"./output/algo/bfs_standalone -- type [type] -- input_dir [input_dir] --id_mapping [id_mapping] -- vertices [vertices] --root (root) - output_dir [output_dir]"})]}),"\n",(0,r.jsx)(n.p,{children:"Ready to run."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"[type]"})," : indicates the type source of the input graph file, including text file, BINARY_FILE binary file, and ODPS source."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"[input_dir]"})," : indicates the path of the input graph file folder, which may contain one or more input files. TuGraph will read all the files under [input_dir] when reading the input file. It is required that [input_dir] can only contain the input file and cannot contain other files. Parameters cannot be omitted."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"[id_mapping]"}),"\uff1aWhen reading the side table, whether to do id mapping for the input data to make it conform to the form of algorithm operation. 1 is required for id mapping, 0 is not required. This process will take some time. The parameter can be omitted, and the default value is 0."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"[vertices]"})," : represents the number of vertices in the graph. 0 indicates the number of vertices that the user wants the system to automatically recognize. When is non-zero, it indicates the number of vertices that the user wants to customize. The number of user-defined vertices must be greater than the maximum vertex ID. This parameter can be omitted. The default value is 0."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"[root]"})," : indicates the starting vertex id for bfs. The argument cannot be omitted."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"[output_dir]"})," : indicates the path of the folder where the output data is saved. The output content is saved to this file, and the parameter cannot be omitted."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example"}),"\n",(0,r.jsx)(n.h3,{id:"41c",children:"4.1.C++"}),"\n",(0,r.jsx)(n.p,{children:"Compile the standalone algorithm program at TuGraph/build"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"make bfs_standalone\n"})}),"\n",(0,r.jsx)(n.p,{children:"Run the text source file in TuGraph/build/output"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:" ./output/algo/bfs_standalone --type text --input_dir ../test/integration/data/algo/fb_unweighted --root 0\n"})}),"\n",(0,r.jsx)(n.p,{children:"Result\uff1a"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"prepare_cost = 0.10(s)\ncore_cost = 0.02(s)\nfound_vertices = 3829\noutput_cost = 0.00(s)\ntotal_cost = 0.11(s)\nDONE.\n"})}),"\n",(0,r.jsx)(n.p,{children:"Result Parameter description is the same as above."}),"\n",(0,r.jsxs)(n.p,{children:["If you do not know the required parameters of a new algorithm, run the",(0,r.jsx)(n.code,{children:"./output/algo/bfs_standalone -h"})," to view the parameters."]}),"\n",(0,r.jsx)(n.h3,{id:"42python",children:"4.2.Python"}),"\n",(0,r.jsxs)(n.p,{children:["The bfs extension compilation process of the Python language is the same as that of the embed mode. It is called through the ",(0,r.jsx)(n.code,{children:"Standalone"})," interface at runtime. The example is as follows:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:'# TuGraph/procedures/run_standalone.py\nimport bfs as python_plugin\n\nif __name__ == "__main__":\n python_plugin.Standalone(\n input_dir="../test/integration/data/algo/fb_unweighted",\n root=0)\n\n# shell\npython3 run_standalone.py\n'})}),"\n",(0,r.jsx)(n.p,{children:"At this point, the process of bfs operation on the figure above by TuGraph is complete."})]})}function p(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>s});var r=t(6540);const a={},i=r.createContext(a);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3945],{9792:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var r=t(4848),a=t(8453);const i={},o="Bootstrap program",s={id:"olap&procedure/olap/tutorial",title:"Bootstrap program",description:"This document is a bootstrap program designed for TuGraph users. Before reading the detailed documents, users should read this document first to have a general understanding of TuGraph's graph computing operation process, and it will be more convenient to read the detailed documents later. The bootstrap program is a simple instance of a bfs (breadth-first search) program based on Tugraph, and we will focus on how it is used.",source:"@site/../docs/en-US/source/9.olap&procedure/2.olap/1.tutorial.md",sourceDirName:"9.olap&procedure/2.olap",slug:"/olap&procedure/olap/tutorial",permalink:"/tugraph-db/en/olap&procedure/olap/tutorial",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Rust Stored Procedures",permalink:"/tugraph-db/en/olap&procedure/procedure/Rust-procedure"},next:{title:"OlapBase API",permalink:"/tugraph-db/en/olap&procedure/olap/olap-base-api"}},d={},l=[{value:"1.Introduction to TuGraph-Graph Analysis Engine",id:"1introduction-to-tugraph-graph-analysis-engine",level:2},{value:"2.Procedure compile and run",id:"2procedure-compile-and-run",level:2},{value:"2.1.C++",id:"21c",level:3},{value:"2.2.Python",id:"22python",level:3},{value:"3.Embed compile and run",id:"3embed-compile-and-run",level:2},{value:"3.1.C++",id:"31c",level:3},{value:"3.2.Python",id:"32python",level:3},{value:"4.Standalone compile and run",id:"4standalone-compile-and-run",level:2},{value:"4.1.C++",id:"41c",level:3},{value:"4.2.Python",id:"42python",level:3}];function h(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"bootstrap-program",children:"Bootstrap program"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"This document is a bootstrap program designed for TuGraph users. Before reading the detailed documents, users should read this document first to have a general understanding of TuGraph's graph computing operation process, and it will be more convenient to read the detailed documents later. The bootstrap program is a simple instance of a bfs (breadth-first search) program based on Tugraph, and we will focus on how it is used."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"1introduction-to-tugraph-graph-analysis-engine",children:"1.Introduction to TuGraph-Graph Analysis Engine"}),"\n",(0,r.jsx)(n.p,{children:"TuGraph's graph analysis engine is mainly used for full graph/full data analysis tasks. With the help of TuGraph's C++ / Python graph analysis engine API, users can quickly derive a complex subgraph from different data sources, and then run iterative graph algorithms such as PageRank, LPA, WCC on the subgraph, and finally make corresponding countermeasures according to the running results."}),"\n",(0,r.jsx)(n.p,{children:"In TuGraph, the process of both exporting and computing can be accelerated by in-memory parallel processing, resulting in near-real-time processing and analysis. Compared to traditional methods, this approach can avoid the overhead of data export and disk drop, and can achieve ideal performance by using a compact graph data structure."}),"\n",(0,r.jsx)(n.p,{children:"TuGraph has 6 built-in algorithms in the community version and 25 built-in algorithms in the commercial version. Users hardly need to implement the specific graph calculation process themselves. For details, please refer to algorithms.md."}),"\n",(0,r.jsx)(n.p,{children:"According to different data sources and implementations, it can be divided into Procedure, Embed and Standalone, which all inherit from OlapBase API. OlapBase API interface documentation can be found in OlAPBase-APi.md."}),"\n",(0,r.jsx)(n.p,{children:"The data source of Procedure and Embed is the db data preloaded in the graph database, which can be compiled to generate the.so file used by TuGraph-Web loading and the embed file used by the background terminal respectively. The input graph data are loaded in the form of db. The interface document can refer to olapondb-api.md."}),"\n",(0,r.jsx)(n.p,{children:"Standalone is used to compile and generate a standalone file. Different from the former, the input graph data of the file is loaded in the form of txt, binary, and ODPS files, and the interface document can refer to olapondisk-api.md."}),"\n",(0,r.jsx)(n.h2,{id:"2procedure-compile-and-run",children:"2.Procedure compile and run"}),"\n",(0,r.jsx)(n.p,{children:"This mode is mainly used for visual loading and running on the TuGraph-web interface. The usage method is as follows:"}),"\n",(0,r.jsx)(n.h3,{id:"21c",children:"2.1.C++"}),"\n",(0,r.jsx)(n.p,{children:"Run bash make_so.sh bfs in the TuGraph/procedures directory to the BFs.so file in the TuGraph/procedures directory, upload the file as a plug-in to Tugraph-web, input parameters and then execute."}),"\n",(0,r.jsx)(n.h3,{id:"22python",children:"2.2.Python"}),"\n",(0,r.jsx)(n.p,{children:"Upload the python file as a plugin to TuGraph-web, and execute it after inputting parameters."}),"\n",(0,r.jsxs)(n.p,{children:["Example:\nCompile the.so algorithm file at TuGraph/procedures\n",(0,r.jsx)(n.code,{children:"bash make_so.sh bfs"})]}),"\n",(0,r.jsx)(n.p,{children:"After loading the bfs.so (or TuGraph/procedures/algo_cython/bfs.py) file as a plug-in to TuGraph-web, enter the following json parameters:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-json",children:'{\n "root": "10",\n "label": "user",\n "field": "id"\n}\n'})}),"\n",(0,r.jsx)(n.p,{children:"The following result"}),"\n",(0,r.jsx)(n.p,{children:'result:"{"core_cost":0.013641119003295898,\n"found_vertices":3829,\n"num_edges":88234,\n"num_vertices":4039,\n"output_cost":8.821487426757813e-06,\n"prepare_cost":0.03479194641113281,\n"total_cost":0.04844188690185547}"'}),"\n",(0,r.jsx)(n.p,{children:"The output \uff1a"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"num_edges: the number of edges in the graph"}),"\n",(0,r.jsx)(n.li,{children:"num_vertices: the number of nodes in the graph"}),"\n",(0,r.jsx)(n.li,{children:"prepare_cost: Represents the time required for the preprocessing phase. The preprocessing phase works: loading parameters, graph data loading, index initialization."}),"\n",(0,r.jsx)(n.li,{children:"core_cost: Represents the time required for the algorithm to run."}),"\n",(0,r.jsx)(n.li,{children:"found_vertices: Number of vertices found."}),"\n",(0,r.jsx)(n.li,{children:"output_cost: the time it takes for the algorithm result to be written back to db.\u3002"}),"\n",(0,r.jsx)(n.li,{children:"total_cost: The overall running time of the algorithm is executed."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"make_so.sh This file is used to compile the graph algorithm files involved in TuGraph-OLAP into a.so file available for TuGraph-web."}),"\n",(0,r.jsx)(n.h2,{id:"3embed-compile-and-run",children:"3.Embed compile and run"}),"\n",(0,r.jsx)(n.p,{children:"This way is mainly used for TuGraph in the background program on the preloaded db graph data algorithm analysis. Its use method is as follows:"}),"\n",(0,r.jsx)(n.p,{children:"To complete the embed_main.cpp file in TuGraph/procedures directory, add the data name, input parameters, data path and other information, as shown in the following example:"}),"\n",(0,r.jsx)(n.h3,{id:"31c",children:"3.1.C++"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-C++",children:'#include \n#include "lgraph/lgraph.h"\n#include "lgraph/olap_base.h"\nusing namespace std;\n\nextern "C" bool Process(lgraph_api::GraphDB &db, const std::string &request, std::string &response);\n\nint main(int argc, char **argv) {\n // db_path Specifies the path for saving the preloaded graph data\n std::string db_path = "../fb_db/";\n if (argc > 1)\n db_path = argv[1];\n lgraph_api::Galaxy g(db_path);\n g.SetCurrentUser("admin", "73@TuGraph");\n // Specifies the name of the graph\n lgraph_api::GraphDB db = g.OpenGraph("fb_db");\n std::string resp;\n // Enter the algorithm parameters in json format\n bool r = Process(db, "{\\"root_id\\":\\"0\\", \\"label\\":\\"node\\",\\"field\\":\\"id\\"}", resp);\n cout << r << endl;\n cout << resp << endl;\n return 0;\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Run bash make_so.sh bfs in TuGraph/procedures to bfs_procedure in TuGraph/procedures/algo_cpp.\n",(0,r.jsx)(n.code,{children:"bash make_embed.sh bfs"})]}),"\n",(0,r.jsxs)(n.p,{children:["Do this in the TuGraph/procedures folder\n",(0,r.jsx)(n.code,{children:"./algo_cpp/bfs_procedure"}),"\nThe result is returned."]}),"\n",(0,r.jsx)(n.p,{children:'Input: {"root_id":"0", "label":"node","field":"id"}\nfound_vertices = 3829\n{"core_cost":0.025603055953979492,\n"found_vertices":3829,\n"num_edges":88234,\n"num_vertices":4039,\n"output_cost":9.059906005859375e-06,\n"prepare_cost":0.056738853454589844,\n"total_cost":0.0823509693145752}'}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"Input"})," indicates the input parameters.The other parameters are described as above."]}),"\n",(0,r.jsx)(n.h3,{id:"32python",children:"3.2.Python"}),"\n",(0,r.jsxs)(n.p,{children:["To compile bfs.so, run ",(0,r.jsx)(n.code,{children:"bash make_so_cython.sh bfs"})," in TuGraph/procedures or ",(0,r.jsx)(n.code,{children:"python3 setup.py build_ext -i"})," in TuGraph/procedures/algo_cython."]}),"\n",(0,r.jsx)(n.p,{children:"After obtaining bfs.so, it can be imported and used in Python, as shown in TuGraph/procedures/run_embed.py:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:'# TuGraph/procedures/run_embed.py\nfrom lgraph_db_python import *\n\nimport bfs as python_plugin\n\nif __name__ == "__main__":\n galaxy = PyGalaxy("../build/output/lgraph_db")\n galaxy.SetCurrentUser("admin", "73@TuGraph")\n db = galaxy.OpenGraph("default", False)\n res = python_plugin.Process(db, "{\\"root_id\\":\\"0\\", \\"label\\":\\"node\\",\\"field\\":\\"id\\"}".encode(\'utf-8\'))\n print(res)\n del db\n del galaxy\n\n# shell\npython3 run_embed.py\n'})}),"\n",(0,r.jsx)(n.p,{children:"The output is the same as C++"}),"\n",(0,r.jsx)(n.h2,{id:"4standalone-compile-and-run",children:"4.Standalone compile and run"}),"\n",(0,r.jsx)(n.p,{children:"This file is mainly used to load the graph data directly at the terminal and run the printout results. Here's how to use it:"}),"\n",(0,r.jsxs)(n.p,{children:["In TuGraph/build directory ",(0,r.jsx)(n.code,{children:"make bfs_standalone"})," (need to include boost/sort/sort.hpp in the g++ default include path) can get bfs_standalone file, the file is generated with TuGraph/build/output/algo folder."]}),"\n",(0,r.jsxs)(n.p,{children:["Run: Go to the TuGraph/build directory and do",(0,r.jsx)(n.code,{children:"./output/algo/bfs_standalone -- type [type] -- input_dir [input_dir] --id_mapping [id_mapping] -- vertices [vertices] --root (root) - output_dir [output_dir]"})]}),"\n",(0,r.jsx)(n.p,{children:"Ready to run."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"[type]"})," : indicates the type source of the input graph file, including text file, BINARY_FILE binary file, and ODPS source."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"[input_dir]"})," : indicates the path of the input graph file folder, which may contain one or more input files. TuGraph will read all the files under [input_dir] when reading the input file. It is required that [input_dir] can only contain the input file and cannot contain other files. Parameters cannot be omitted."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"[id_mapping]"}),"\uff1aWhen reading the side table, whether to do id mapping for the input data to make it conform to the form of algorithm operation. 1 is required for id mapping, 0 is not required. This process will take some time. The parameter can be omitted, and the default value is 0."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"[vertices]"})," : represents the number of vertices in the graph. 0 indicates the number of vertices that the user wants the system to automatically recognize. When is non-zero, it indicates the number of vertices that the user wants to customize. The number of user-defined vertices must be greater than the maximum vertex ID. This parameter can be omitted. The default value is 0."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"[root]"})," : indicates the starting vertex id for bfs. The argument cannot be omitted."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.code,{children:"[output_dir]"})," : indicates the path of the folder where the output data is saved. The output content is saved to this file, and the parameter cannot be omitted."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Example"}),"\n",(0,r.jsx)(n.h3,{id:"41c",children:"4.1.C++"}),"\n",(0,r.jsx)(n.p,{children:"Compile the standalone algorithm program at TuGraph/build"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"make bfs_standalone\n"})}),"\n",(0,r.jsx)(n.p,{children:"Run the text source file in TuGraph/build/output"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:" ./output/algo/bfs_standalone --type text --input_dir ../test/integration/data/algo/fb_unweighted --root 0\n"})}),"\n",(0,r.jsx)(n.p,{children:"Result\uff1a"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"prepare_cost = 0.10(s)\ncore_cost = 0.02(s)\nfound_vertices = 3829\noutput_cost = 0.00(s)\ntotal_cost = 0.11(s)\nDONE.\n"})}),"\n",(0,r.jsx)(n.p,{children:"Result Parameter description is the same as above."}),"\n",(0,r.jsxs)(n.p,{children:["If you do not know the required parameters of a new algorithm, run the",(0,r.jsx)(n.code,{children:"./output/algo/bfs_standalone -h"})," to view the parameters."]}),"\n",(0,r.jsx)(n.h3,{id:"42python",children:"4.2.Python"}),"\n",(0,r.jsxs)(n.p,{children:["The bfs extension compilation process of the Python language is the same as that of the embed mode. It is called through the ",(0,r.jsx)(n.code,{children:"Standalone"})," interface at runtime. The example is as follows:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:'# TuGraph/procedures/run_standalone.py\nimport bfs as python_plugin\n\nif __name__ == "__main__":\n python_plugin.Standalone(\n input_dir="../test/integration/data/algo/fb_unweighted",\n root=0)\n\n# shell\npython3 run_standalone.py\n'})}),"\n",(0,r.jsx)(n.p,{children:"At this point, the process of bfs operation on the figure above by TuGraph is complete."})]})}function p(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>s});var r=t(6540);const a={},i=r.createContext(a);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ba766c72.1e881a97.js b/assets/js/ba766c72.144ae3a4.js similarity index 99% rename from assets/js/ba766c72.1e881a97.js rename to assets/js/ba766c72.144ae3a4.js index e1601fcfd2..46e7c5d2ad 100644 --- a/assets/js/ba766c72.1e881a97.js +++ b/assets/js/ba766c72.144ae3a4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4481],{1089:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>d,toc:()=>c});var n=r(4848),s=r(8453);const a={},i="Integration Testing",d={id:"quality/integration-testing",title:"Integration Testing",description:"This document mainly introduces how to use the TuGraph integration testing framework.",source:"@site/../docs/en-US/source/11.quality/2.integration-testing.md",sourceDirName:"11.quality",slug:"/quality/integration-testing",permalink:"/tugraph-db/en/quality/integration-testing",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Unit Testing",permalink:"/tugraph-db/en/quality/unit-testing"},next:{title:"TuGraph Contribution Guide",permalink:"/tugraph-db/en/contributor-manual/contributing"}},o={},c=[{value:"1.The Significance of TuGraph Integration Testing",id:"1the-significance-of-tugraph-integration-testing",level:2},{value:"2.TuGraph Integration Testing Framework",id:"2tugraph-integration-testing-framework",level:2},{value:"2.1.Component Description",id:"21component-description",level:3},{value:"2.2.Component Usage",id:"22component-usage",level:3},{value:"2.2.1.server",id:"221server",level:4},{value:"2.2.1.1.Startup Parameters",id:"2211startup-parameters",level:5},{value:"2.2.1.2.Startup Command",id:"2212startup-command",level:5},{value:"2.2.2.client",id:"222client",level:4},{value:"2.2.2.1.Startup Parameters",id:"2221startup-parameters",level:5},{value:"2.2.2.2.Startup Command",id:"2222startup-command",level:5},{value:"2.2.3.importor",id:"223importor",level:4},{value:"2.2.3.1.Startup Parameters",id:"2231startup-parameters",level:5},{value:"2.2.3.2.Startup Command",id:"2232startup-command",level:5},{value:"2.2.4.exportor",id:"224exportor",level:4},{value:"2.2.4.1.Startup Parameters",id:"2241startup-parameters",level:5},{value:"2.2.4.2.Startup Command",id:"2242startup-command",level:5},{value:"2.2.5.backup_binlog",id:"225backup_binlog",level:4},{value:"2.2.5.1.Startup Parameters",id:"2251startup-parameters",level:5},{value:"2.2.5.2.Startup Command",id:"2252startup-command",level:5},{value:"2.2.6.backup_copy_dir",id:"226backup_copy_dir",level:4},{value:"2.2.6.1.Startup Parameters",id:"2261startup-parameters",level:5},{value:"2.2.6.2.Startup Command",id:"2262startup-command",level:5},{value:"2.2.7.build_so",id:"227build_so",level:4},{value:"2.2.7.1.Startup Parameters",id:"2271startup-parameters",level:5},{value:"2.2.7.2.Startup Command",id:"2272startup-command",level:5},{value:"2.2.8.copy_snapshot",id:"228copy_snapshot",level:4},{value:"2.2.8.1.Startup Parameters",id:"2281startup-parameters",level:5},{value:"2.2.8.2.Startup Command",id:"2282startup-command",level:5},{value:"2.2.9.copy_dir",id:"229copy_dir",level:4},{value:"2.2.9.1.Startup Parameters",id:"2291startup-parameters",level:5},{value:"2.2.9.2.Startup Command",id:"2292startup-command",level:5},{value:"2.2.10.exec",id:"2210exec",level:4},{value:"2.2.10.1.Startup Parameters",id:"22101startup-parameters",level:5},{value:"2.2.10.2.Startup Command",id:"22102startup-command",level:5},{value:"2.2.11.algo",id:"2211algo",level:4},{value:"2.2.11.1.Startup Parameters",id:"22111startup-parameters",level:5},{value:"2.2.11.2.Startup Command",id:"22112startup-command",level:5},{value:"2.2.12.bash",id:"2212bash",level:4},{value:"2.2.12.1.Startup Parameters",id:"22121startup-parameters",level:5},{value:"2.2.12.2.Startup Command",id:"22122startup-command",level:5},{value:"2.2.13.rest",id:"2213rest",level:4},{value:"2.2.13.1.Startup Parameters",id:"22131startup-parameters",level:5},{value:"2.2.13.2.Startup Command",id:"22132startup-command",level:5},{value:"2.3.Test Cases",id:"23test-cases",level:3},{value:"2.3.1.rest",id:"231rest",level:4},{value:"2.3.2.client",id:"232client",level:4},{value:"2.3.3.exportor/importor",id:"233exportorimportor",level:4},{value:"2.3.4.Other Tests",id:"234other-tests",level:4}];function l(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"integration-testing",children:"Integration Testing"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"This document mainly introduces how to use the TuGraph integration testing framework."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"1the-significance-of-tugraph-integration-testing",children:"1.The Significance of TuGraph Integration Testing"}),"\n",(0,n.jsx)(t.p,{children:"In unit tests and function tests, some test cases directly use Galaxy or Statemachine to perform tests, which is not a complete process. In the complete CS architecture, user requests are sent to the server through the client, and network communication is essential. To avoid bugs caused by incomplete unit testing, TuGraph uses an integration testing framework to perform end-to-end testing."}),"\n",(0,n.jsx)(t.h2,{id:"2tugraph-integration-testing-framework",children:"2.TuGraph Integration Testing Framework"}),"\n",(0,n.jsx)(t.p,{children:"TuGraph uses the Pytest framework as its integration testing framework. Pytest is currently the most widely used CS-side integration testing framework. It is known for its flexibility, ease of use, and the ability to support parameterization. Based on the functionality provided by Pytest, TuGraph abstracts different tools and controls the processing logic of each tool through parameters to facilitate efficient testing code development."}),"\n",(0,n.jsxs)(t.p,{children:["For more information on Pytest, please refer to the official website: ",(0,n.jsx)(t.a,{href:"https://docs.pytest.org/en/7.2.x/getting-started.html",children:"https://docs.pytest.org/en/7.2.x/getting-started.html"})]}),"\n",(0,n.jsx)(t.h3,{id:"21component-description",children:"2.1.Component Description"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Component Name"}),(0,n.jsx)(t.th,{children:"Component Function"}),(0,n.jsx)(t.th,{children:"Implementation Method"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"server"}),(0,n.jsx)(t.td,{children:"TuGraph standalone service"}),(0,n.jsx)(t.td,{children:"Start a child process and launch the service"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"client"}),(0,n.jsx)(t.td,{children:"TuGraph Rpc Client"}),(0,n.jsx)(t.td,{children:"Open TuGraph Python Rpc Client in the current process and send requests"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"importor"}),(0,n.jsx)(t.td,{children:"TuGraph Importor"}),(0,n.jsx)(t.td,{children:"Start a child process to process import requests"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"exportor"}),(0,n.jsx)(t.td,{children:"TuGraph Exportor"}),(0,n.jsx)(t.td,{children:"Start a child process to process export requests"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"backup_binlog"}),(0,n.jsx)(t.td,{children:"TuGraph Backup Binlog"}),(0,n.jsx)(t.td,{children:"Start a child process to process binlog backup requests"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"backup_copy_dir"}),(0,n.jsx)(t.td,{children:"TuGraph Backup"}),(0,n.jsx)(t.td,{children:"Start a child process to process full db backup requests"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"build_so"}),(0,n.jsx)(t.td,{children:"Component for compiling C++ dynamic libraries"}),(0,n.jsx)(t.td,{children:"Start a child process to handle GCC compilation logic"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"copy_snapshot"}),(0,n.jsx)(t.td,{children:"TuGraph Copy Snapshot"}),(0,n.jsx)(t.td,{children:"Handle backup snapshot requests in the current process"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"copydir"}),(0,n.jsx)(t.td,{children:"Folder copy"}),(0,n.jsx)(t.td,{children:"Handle folder copy requests in the current process"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"exec"}),(0,n.jsx)(t.td,{children:"Execute C++/Java executable files"}),(0,n.jsx)(t.td,{children:"Start a child process to launch the C++ executable file"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"algo"}),(0,n.jsx)(t.td,{children:"Execute algorithm"}),(0,n.jsx)(t.td,{children:"Start a child process to run the algorithm"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"bash"}),(0,n.jsx)(t.td,{children:"Execute bash commands"}),(0,n.jsx)(t.td,{children:"Start a child process to execute bash commands"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"rest"}),(0,n.jsx)(t.td,{children:"TuGraph Python Rest Client"}),(0,n.jsx)(t.td,{children:"Open TuGraph Python Rest Client in the current process and send requests"})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"22component-usage",children:"2.2.Component Usage"}),"\n",(0,n.jsx)(t.h4,{id:"221server",children:"2.2.1.server"}),"\n",(0,n.jsx)(t.h5,{id:"2211startup-parameters",children:"2.2.1.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n",(0,n.jsx)(t.li,{children:"cleanup_dir is the directory that needs to be cleaned up after execution, which can be multiple, passed in as a Python list"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'SERVEROPT = {"cmd":"./lgraph_server -c lgraph_standalone.json --directory ./testdb --license _FMA_IGNORE_LICENSE_CHECK_SALTED_ --port 7072 --rpc_port 9092",\n "cleanup_dir":["./testdb"]}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2212startup-command",children:"2.2.1.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control different processing logic through startup parameters. The server will be started before the function starts executing, and the server will be stopped and the directories specified in cleanup_dir will be cleaned up after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("server", [SERVEROPT], indirect=True)\ndef test_server(self, server):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"222client",children:"2.2.2.client"}),"\n",(0,n.jsx)(t.h5,{id:"2221startup-parameters",children:"2.2.2.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"host is the IP and port of the TuGraph Server"}),"\n",(0,n.jsx)(t.li,{children:"user is the username of the TuGraph Server"}),"\n",(0,n.jsx)(t.li,{children:"password is the password corresponding to the user in the TuGraph Server"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'CLIENTOPT = {"host":"127.0.0.1:9092", "user":"admin", "password":"73@TuGraph"}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2222startup-command",children:"2.2.2.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control different processing logic through startup parameters. The client will be started before the function starts executing, and the client will be stopped after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:"@pytest.mark.parametrize(\"server\", [SERVEROPT], indirect=True)\n@pytest.mark.parametrize(\"client\", [CLIENTOPT], indirect=True)\ndef test_client(self, server, client):\n ret = client.callCypher(\"CALL db.createEdgeLabel('followed', '[]', 'address', string, false, 'date', int32, false)\", \"default\")\n assert ret[0]\n ret = client.callCypher(\"CALL db.createEdgeLabel('followed', '[]', 'address', string, false, 'date', int32, false)\", \"default\")\n assert ret[0] == False\n"})}),"\n",(0,n.jsx)(t.h4,{id:"223importor",children:"2.2.3.importor"}),"\n",(0,n.jsx)(t.h5,{id:"2231startup-parameters",children:"2.2.3.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n",(0,n.jsx)(t.li,{children:"cleanup_dir is the directory that needs to be cleaned up after execution, which can be multiple, passed in as a Python list"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'IMPORTOPT = {"cmd":"./lgraph_import --config_file ./data/yago/yago.conf --dir ./testdb --user admin --password 73@TuGraph --graph default --overwrite 1",\n "cleanup_dir":["./testdb", "./.import_tmp"]}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2232startup-command",children:"2.2.3.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the import of different data through startup parameters. The data will be imported to the specified directory before the function starts executing, and the directories specified in cleanup_dir will be cleaned up after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("importor", [IMPORTOPT], indirect=True)\ndef test_importor(self, importor):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"224exportor",children:"2.2.4.exportor"}),"\n",(0,n.jsx)(t.h5,{id:"2241startup-parameters",children:"2.2.4.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n",(0,n.jsx)(t.li,{children:"cleanup_dir is the directory that needs to be cleaned up after execution, which can be multiple, passed in as a Python list"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'EXPORT_DEF_OPT = {"cmd":"./lgraph_export -d ./testdb -e ./export/default -g default -u admin -p 73@TuGraph",\n "cleanup_dir":["./export"]}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2242startup-command",children:"2.2.4.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the export of different data through startup parameters. The data will be exported to the specified directory before the function starts executing, and the directories specified in cleanup_dir will be cleaned up after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("exportor", [EXPORT_DEF_OPT], indirect=True)\ndef test_exportor(self, exportor):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"225backup_binlog",children:"2.2.5.backup_binlog"}),"\n",(0,n.jsx)(t.h5,{id:"2251startup-parameters",children:"2.2.5.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"\u91c7\u7528python\u5b57\u5178\u4f20\u5165\nUse a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n",(0,n.jsx)(t.li,{children:"cleanup_dir is the directory that needs to be cleaned up after execution, which can be multiple, passed in as a Python list"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'BINLOGOPT = {"cmd" : "./lgraph_binlog -a restore --host 127.0.0.1 --port 9093 -u admin -p 73@TuGraph -f ./testdb/binlog/*",\n "cleanup_dir":[]}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2252startup-command",children:"2.2.5.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the backup of different binlogs through startup parameters. The binlogs will be copied to the specified directory before the function starts executing, and the directories specified in cleanup_dir will be cleaned up after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("backup_binlog", [BINLOGOPT], indirect=True)\ndef test_backup_binlog(self, backup_binlog):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"226backup_copy_dir",children:"2.2.6.backup_copy_dir"}),"\n",(0,n.jsx)(t.h5,{id:"2261startup-parameters",children:"2.2.6.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n",(0,n.jsx)(t.li,{children:"cleanup_dir is the directory that needs to be cleaned up after execution, which can be multiple, passed in as a Python list"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'BACKUPOPT = {"cmd" : "./lgraph_backup --src ./testdb -dst ./testdb1",\n "cleanup_dir":[]}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2262startup-command",children:"2.2.6.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the backup of different databases through startup parameters. The database will be copied to the specified directory before the function starts executing, and the directories specified in cleanup_dir will be cleaned up after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("backup_copy_dir", [BACKUPOPT], indirect=True)\ndef test_backup_copy_dir(self, backup_copy_dir):\n\tpass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"227build_so",children:"2.2.7.build_so"}),"\n",(0,n.jsx)(t.h5,{id:"2271startup-parameters",children:"2.2.7.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command, passed in as a Python list, and multiple so can be compiled at once"}),"\n",(0,n.jsx)(t.li,{children:"so_name is the dynamic library that needs to be cleaned up after execution, which can be multiple, passed in as a Python list"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'BUILDOPT = {"cmd":["g++ -fno-gnu-unique -fPIC -g --std=c++17 -I ../../include -I ../../deps/install/include -rdynamic -O3 -fopenmp -DNDEBUG -o ./scan_graph.so ../../test/test_procedures/scan_graph.cpp ./liblgraph.so -shared",\n "g++ -fno-gnu-unique -fPIC -g --std=c++17 -I ../../include -I ../../deps/install/include -rdynamic -O3 -fopenmp -DNDEBUG -o ./sortstr.so ../../test/test_procedures/sortstr.cpp ./liblgraph.so -shared"],\n "so_name":["./scan_graph.so", "./sortstr.so"]}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2272startup-command",children:"2.2.7.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the compilation of different dynamic libraries through startup parameters. The dynamic libraries will be generated to the specified directory before the function starts executing, and the dynamic libraries specified in the so_name list will be cleaned up after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("build_so", [BUILDOPT], indirect=True)\ndef test_build_so(self, build_so):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"228copy_snapshot",children:"2.2.8.copy_snapshot"}),"\n",(0,n.jsx)(t.h5,{id:"2281startup-parameters",children:"2.2.8.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"src is the original database"}),"\n",(0,n.jsx)(t.li,{children:"dst is the snapshot copied after the backup"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'COPYSNAPOPT = {"src" : "./testdb", "dst" : "./testdb1"}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2282startup-command",children:"2.2.8.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the copying of different snapshots through startup parameters. The snapshot in src will be copied to the directory specified in dst before the function starts executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("copy_snapshot", [COPYSNAPOPT], indirect=True)\ndef test_copy_snapshot(self, copy_snapshot):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"229copy_dir",children:"2.2.9.copy_dir"}),"\n",(0,n.jsx)(t.h5,{id:"2291startup-parameters",children:"2.2.9.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"src is the original directory"}),"\n",(0,n.jsx)(t.li,{children:"dst is the directory copied after the backup"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'COPYSNAPOPT = {"src" : "./testdb", "dst" : "./testdb1"}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2292startup-command",children:"2.2.9.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the copying of different directories through startup parameters. The directory in src will be copied to the directory specified in dst before the function starts executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("copy_dir", [COPYDIR], indirect=True)\ndef test_copy_dir(self, copy_dir):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"2210exec",children:"2.2.10.exec"}),"\n",(0,n.jsx)(t.h5,{id:"22101startup-parameters",children:"2.2.10.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'EXECOPT = {\n "cmd" : "test_rpc_client/cpp/CppClientTest/build/clienttest"\n }\n'})}),"\n",(0,n.jsx)(t.h5,{id:"22102startup-command",children:"2.2.10.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the execution of different logic through startup parameters. A child process will be started to execute the command passed in through the cmd parameter before the function starts executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("exec", [EXECOPT], indirect=True)\ndef test_exec(self, exec):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"2211algo",children:"2.2.11.algo"}),"\n",(0,n.jsx)(t.h5,{id:"22111startup-parameters",children:"2.2.11.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n",(0,n.jsx)(t.li,{children:"result is the expected execution result of the algorithm. After execution is completed, the actual result will be compared with the expected result. If they are different, the test will fail."}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'BFSEMBEDOPT = {\n "cmd" : "algo/bfs_embed ./testdb",\n "result" : ["found_vertices = 3829"]\n }\n'})}),"\n",(0,n.jsx)(t.h5,{id:"22112startup-command",children:"2.2.11.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the execution of different algorithm logic through startup parameters. A child process will be started to execute the algorithm passed in through the cmd parameter before the function starts executing. The function body will wait for the algorithm to complete and compare the result with the expected result."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("algo", [BFSEMBEDOPT], indirect=True)\ndef test_exec_bfs_embed(self, algo):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"2212bash",children:"2.2.12.bash"}),"\n",(0,n.jsx)(t.h5,{id:"22121startup-parameters",children:"2.2.12.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'BASHOPT = {\n "cmd" : "sh ./test_rpc_client/cpp/CppClientTest/compile.sh"\n }\n'})}),"\n",(0,n.jsx)(t.h5,{id:"22122startup-command",children:"2.2.12.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the execution of different bash commands through startup parameters. A child process will be started to execute the bash command passed in through the cmd parameter before the function starts executing. The function body will wait for the command to complete."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("bash", [BASHOPT], indirect=True)\ndef test_bash(self, bash):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"2213rest",children:"2.2.13.rest"}),"\n",(0,n.jsx)(t.h5,{id:"22131startup-parameters",children:"2.2.13.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"port is the port of the TuGraph Server"}),"\n",(0,n.jsx)(t.li,{children:"user is the username of the TuGraph Server"}),"\n",(0,n.jsx)(t.li,{children:"password is the password corresponding to user in TuGraph Server"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'RESTTOPT = {"port":"7073", "user":"admin", "password":"73@TuGraph"}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"22132startup-command",children:"2.2.13.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and link to different TuGraph Rest Servers through startup parameters. The client will be started before the function starts executing and stopped after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("rest", [RESTTOPT], indirect=True)\ndef test_get_info(self, server, rest):\n\tpass\n'})}),"\n",(0,n.jsx)(t.h3,{id:"23test-cases",children:"2.3.Test Cases"}),"\n",(0,n.jsx)(t.h4,{id:"231rest",children:"2.3.1.rest"}),"\n",(0,n.jsx)(t.p,{children:"In the sample code, before the test_get_info function is executed, the server is started, and a rest client is started after the server is started. After entering the test_get_info function, some information about the server is obtained, and assert is used to determine whether cpu information is obtained."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'SERVEROPT = {"cmd":"./lgraph_server -c lgraph_standalone.json --directory ./testdb --license _FMA_IGNORE_LICENSE_CHECK_SALTED_ --port 7073 --rpc_port 9093",\n "cleanup_dir":["./testdb"]}\nRESTTOPT = {"port":"7073", "user":"admin", "password":"73@TuGraph"}\n@pytest.mark.parametrize("server", [SERVEROPT], indirect=True)\n@pytest.mark.parametrize("rest", [RESTTOPT], indirect=True)\ndef test_get_info(self, server, rest):\n res = rest.get_server_info()\n log.info("res : %s", res)\n assert(\'cpu\' in res)\n'})}),"\n",(0,n.jsx)(t.h4,{id:"232client",children:"2.3.2.client"}),"\n",(0,n.jsx)(t.p,{children:"In the sample code, before the test_flushdb function is executed, the offline data import logic is executed and the server is started. After creating a connection through the client, the function enters the test_flushdb function. The number of points is queried to determine whether the import is successful. After the import is successful, the flushDB operation is executed. assert is used again to determine whether the db can be emptied normally."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'SERVEROPT = {"cmd":"./lgraph_server -c lgraph_standalone.json --directory ./testdb --license _FMA_IGNORE_LICENSE_CHECK_SALTED_ --port 7072 --rpc_port 9092",\n "cleanup_dir":["./testdb"]}\n\nCLIENTOPT = {"host":"127.0.0.1:9092", "user":"admin", "password":"73@TuGraph"}\n\nIMPORTOPT = {"cmd":"./lgraph_import --config_file ./data/yago/yago.conf --dir ./testdb --user admin --password 73@TuGraph --graph default --overwrite 1",\n "cleanup_dir":["./testdb", "./.import_tmp"]}\n\n@pytest.mark.parametrize("importor", [IMPORTOPT], indirect=True)\n@pytest.mark.parametrize("server", [SERVEROPT], indirect=True)\n@pytest.mark.parametrize("client", [CLIENTOPT], indirect=True)\ndef test_flushdb(self, importor, server, client):\n ret = client.callCypher("MATCH (n) RETURN n LIMIT 100", "default")\n assert ret[0]\n res = json.loads(ret[1])\n assert len(res) == 21\n ret = client.callCypher("CALL db.flushDB()", "default")\n assert ret[0]\n res = json.loads(ret[1])\n assert res == None\n'})}),"\n",(0,n.jsx)(t.h4,{id:"233exportorimportor",children:"2.3.3.exportor/importor"}),"\n",(0,n.jsx)(t.p,{children:"In the sample code, before the test_export_default function is executed, the offline data import logic is executed. After the import is successful, the data of the current db is exported. Then, the offline import logic is used again to import the exported data into a new directory. The newly imported data is used to start the db and create a connection. In the body of the test_export_default function, it is determined whether the data after export and import is consistent with the original data."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'SERVEROPT = {"cmd":"./lgraph_server -c lgraph_standalone.json --directory ./testdb1 --license _FMA_IGNORE_LICENSE_CHECK_SALTED_ --port 7073 --rpc_port 9093",\n "cleanup_dir":["./testdb1"]}\n\nCLIENTOPT = {"host":"127.0.0.1:9093", "user":"admin", "password":"73@TuGraph"}\n\nIMPORT_YAGO_OPT = {"cmd":"./lgraph_import --config_file ./data/yago/yago.conf --dir ./testdb --user admin --password 73@TuGraph --graph default --overwrite 1",\n "cleanup_dir":["./.import_tmp", "./testdb"]}\n\nIMPORT_DEF_OPT = {"cmd":"./lgraph_import -c ./export/default/import.config -d ./testdb1",\n "cleanup_dir":["./.import_tmp", "./testdb1"]}\n\nEXPORT_DEF_OPT = {"cmd":"./lgraph_export -d ./testdb -e ./export/default -g default -u admin -p 73@TuGraph",\n "cleanup_dir":["./export"]}\n\n@pytest.mark.parametrize("importor", [IMPORT_YAGO_OPT], indirect=True)\n@pytest.mark.parametrize("exportor", [EXPORT_DEF_OPT], indirect=True)\n@pytest.mark.parametrize("importor_1", [IMPORT_DEF_OPT], indirect=True)\n@pytest.mark.parametrize("server", [SERVEROPT], indirect=True)\n@pytest.mark.parametrize("client", [CLIENTOPT], indirect=True)\ndef test_export_default(self, importor, exportor, importor_1, server, client):\n ret = client.callCypher("MATCH (n) RETURN n LIMIT 100", "default")\n assert ret[0]\n res = json.loads(ret[1])\n log.info("res : %s", res)\n assert len(res) == 21\n'})}),"\n",(0,n.jsx)(t.h4,{id:"234other-tests",children:"2.3.4.Other Tests"}),"\n",(0,n.jsxs)(t.p,{children:["For more test cases, please refer to the integration test code ",(0,n.jsx)(t.a,{href:"https://github.com/TuGraph-db/tugraph-db/tree/master/test/integration",children:"https://github.com/TuGraph-db/tugraph-db/tree/master/test/integration"})]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>d});var n=r(6540);const s={},a=n.createContext(s);function i(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4481],{1089:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>d,toc:()=>c});var n=r(4848),s=r(8453);const a={},i="Integration Testing",d={id:"quality/integration-testing",title:"Integration Testing",description:"This document mainly introduces how to use the TuGraph integration testing framework.",source:"@site/../docs/en-US/source/11.quality/2.integration-testing.md",sourceDirName:"11.quality",slug:"/quality/integration-testing",permalink:"/tugraph-db/en/quality/integration-testing",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Unit Testing",permalink:"/tugraph-db/en/quality/unit-testing"},next:{title:"TuGraph Contribution Guide",permalink:"/tugraph-db/en/contributor-manual/contributing"}},o={},c=[{value:"1.The Significance of TuGraph Integration Testing",id:"1the-significance-of-tugraph-integration-testing",level:2},{value:"2.TuGraph Integration Testing Framework",id:"2tugraph-integration-testing-framework",level:2},{value:"2.1.Component Description",id:"21component-description",level:3},{value:"2.2.Component Usage",id:"22component-usage",level:3},{value:"2.2.1.server",id:"221server",level:4},{value:"2.2.1.1.Startup Parameters",id:"2211startup-parameters",level:5},{value:"2.2.1.2.Startup Command",id:"2212startup-command",level:5},{value:"2.2.2.client",id:"222client",level:4},{value:"2.2.2.1.Startup Parameters",id:"2221startup-parameters",level:5},{value:"2.2.2.2.Startup Command",id:"2222startup-command",level:5},{value:"2.2.3.importor",id:"223importor",level:4},{value:"2.2.3.1.Startup Parameters",id:"2231startup-parameters",level:5},{value:"2.2.3.2.Startup Command",id:"2232startup-command",level:5},{value:"2.2.4.exportor",id:"224exportor",level:4},{value:"2.2.4.1.Startup Parameters",id:"2241startup-parameters",level:5},{value:"2.2.4.2.Startup Command",id:"2242startup-command",level:5},{value:"2.2.5.backup_binlog",id:"225backup_binlog",level:4},{value:"2.2.5.1.Startup Parameters",id:"2251startup-parameters",level:5},{value:"2.2.5.2.Startup Command",id:"2252startup-command",level:5},{value:"2.2.6.backup_copy_dir",id:"226backup_copy_dir",level:4},{value:"2.2.6.1.Startup Parameters",id:"2261startup-parameters",level:5},{value:"2.2.6.2.Startup Command",id:"2262startup-command",level:5},{value:"2.2.7.build_so",id:"227build_so",level:4},{value:"2.2.7.1.Startup Parameters",id:"2271startup-parameters",level:5},{value:"2.2.7.2.Startup Command",id:"2272startup-command",level:5},{value:"2.2.8.copy_snapshot",id:"228copy_snapshot",level:4},{value:"2.2.8.1.Startup Parameters",id:"2281startup-parameters",level:5},{value:"2.2.8.2.Startup Command",id:"2282startup-command",level:5},{value:"2.2.9.copy_dir",id:"229copy_dir",level:4},{value:"2.2.9.1.Startup Parameters",id:"2291startup-parameters",level:5},{value:"2.2.9.2.Startup Command",id:"2292startup-command",level:5},{value:"2.2.10.exec",id:"2210exec",level:4},{value:"2.2.10.1.Startup Parameters",id:"22101startup-parameters",level:5},{value:"2.2.10.2.Startup Command",id:"22102startup-command",level:5},{value:"2.2.11.algo",id:"2211algo",level:4},{value:"2.2.11.1.Startup Parameters",id:"22111startup-parameters",level:5},{value:"2.2.11.2.Startup Command",id:"22112startup-command",level:5},{value:"2.2.12.bash",id:"2212bash",level:4},{value:"2.2.12.1.Startup Parameters",id:"22121startup-parameters",level:5},{value:"2.2.12.2.Startup Command",id:"22122startup-command",level:5},{value:"2.2.13.rest",id:"2213rest",level:4},{value:"2.2.13.1.Startup Parameters",id:"22131startup-parameters",level:5},{value:"2.2.13.2.Startup Command",id:"22132startup-command",level:5},{value:"2.3.Test Cases",id:"23test-cases",level:3},{value:"2.3.1.rest",id:"231rest",level:4},{value:"2.3.2.client",id:"232client",level:4},{value:"2.3.3.exportor/importor",id:"233exportorimportor",level:4},{value:"2.3.4.Other Tests",id:"234other-tests",level:4}];function l(e){const t={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"integration-testing",children:"Integration Testing"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"This document mainly introduces how to use the TuGraph integration testing framework."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"1the-significance-of-tugraph-integration-testing",children:"1.The Significance of TuGraph Integration Testing"}),"\n",(0,n.jsx)(t.p,{children:"In unit tests and function tests, some test cases directly use Galaxy or Statemachine to perform tests, which is not a complete process. In the complete CS architecture, user requests are sent to the server through the client, and network communication is essential. To avoid bugs caused by incomplete unit testing, TuGraph uses an integration testing framework to perform end-to-end testing."}),"\n",(0,n.jsx)(t.h2,{id:"2tugraph-integration-testing-framework",children:"2.TuGraph Integration Testing Framework"}),"\n",(0,n.jsx)(t.p,{children:"TuGraph uses the Pytest framework as its integration testing framework. Pytest is currently the most widely used CS-side integration testing framework. It is known for its flexibility, ease of use, and the ability to support parameterization. Based on the functionality provided by Pytest, TuGraph abstracts different tools and controls the processing logic of each tool through parameters to facilitate efficient testing code development."}),"\n",(0,n.jsxs)(t.p,{children:["For more information on Pytest, please refer to the official website: ",(0,n.jsx)(t.a,{href:"https://docs.pytest.org/en/7.2.x/getting-started.html",children:"https://docs.pytest.org/en/7.2.x/getting-started.html"})]}),"\n",(0,n.jsx)(t.h3,{id:"21component-description",children:"2.1.Component Description"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Component Name"}),(0,n.jsx)(t.th,{children:"Component Function"}),(0,n.jsx)(t.th,{children:"Implementation Method"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"server"}),(0,n.jsx)(t.td,{children:"TuGraph standalone service"}),(0,n.jsx)(t.td,{children:"Start a child process and launch the service"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"client"}),(0,n.jsx)(t.td,{children:"TuGraph Rpc Client"}),(0,n.jsx)(t.td,{children:"Open TuGraph Python Rpc Client in the current process and send requests"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"importor"}),(0,n.jsx)(t.td,{children:"TuGraph Importor"}),(0,n.jsx)(t.td,{children:"Start a child process to process import requests"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"exportor"}),(0,n.jsx)(t.td,{children:"TuGraph Exportor"}),(0,n.jsx)(t.td,{children:"Start a child process to process export requests"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"backup_binlog"}),(0,n.jsx)(t.td,{children:"TuGraph Backup Binlog"}),(0,n.jsx)(t.td,{children:"Start a child process to process binlog backup requests"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"backup_copy_dir"}),(0,n.jsx)(t.td,{children:"TuGraph Backup"}),(0,n.jsx)(t.td,{children:"Start a child process to process full db backup requests"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"build_so"}),(0,n.jsx)(t.td,{children:"Component for compiling C++ dynamic libraries"}),(0,n.jsx)(t.td,{children:"Start a child process to handle GCC compilation logic"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"copy_snapshot"}),(0,n.jsx)(t.td,{children:"TuGraph Copy Snapshot"}),(0,n.jsx)(t.td,{children:"Handle backup snapshot requests in the current process"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"copydir"}),(0,n.jsx)(t.td,{children:"Folder copy"}),(0,n.jsx)(t.td,{children:"Handle folder copy requests in the current process"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"exec"}),(0,n.jsx)(t.td,{children:"Execute C++/Java executable files"}),(0,n.jsx)(t.td,{children:"Start a child process to launch the C++ executable file"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"algo"}),(0,n.jsx)(t.td,{children:"Execute algorithm"}),(0,n.jsx)(t.td,{children:"Start a child process to run the algorithm"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"bash"}),(0,n.jsx)(t.td,{children:"Execute bash commands"}),(0,n.jsx)(t.td,{children:"Start a child process to execute bash commands"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"rest"}),(0,n.jsx)(t.td,{children:"TuGraph Python Rest Client"}),(0,n.jsx)(t.td,{children:"Open TuGraph Python Rest Client in the current process and send requests"})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"22component-usage",children:"2.2.Component Usage"}),"\n",(0,n.jsx)(t.h4,{id:"221server",children:"2.2.1.server"}),"\n",(0,n.jsx)(t.h5,{id:"2211startup-parameters",children:"2.2.1.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n",(0,n.jsx)(t.li,{children:"cleanup_dir is the directory that needs to be cleaned up after execution, which can be multiple, passed in as a Python list"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'SERVEROPT = {"cmd":"./lgraph_server -c lgraph_standalone.json --directory ./testdb --license _FMA_IGNORE_LICENSE_CHECK_SALTED_ --port 7072 --rpc_port 9092",\n "cleanup_dir":["./testdb"]}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2212startup-command",children:"2.2.1.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control different processing logic through startup parameters. The server will be started before the function starts executing, and the server will be stopped and the directories specified in cleanup_dir will be cleaned up after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("server", [SERVEROPT], indirect=True)\ndef test_server(self, server):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"222client",children:"2.2.2.client"}),"\n",(0,n.jsx)(t.h5,{id:"2221startup-parameters",children:"2.2.2.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"host is the IP and port of the TuGraph Server"}),"\n",(0,n.jsx)(t.li,{children:"user is the username of the TuGraph Server"}),"\n",(0,n.jsx)(t.li,{children:"password is the password corresponding to the user in the TuGraph Server"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'CLIENTOPT = {"host":"127.0.0.1:9092", "user":"admin", "password":"73@TuGraph"}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2222startup-command",children:"2.2.2.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control different processing logic through startup parameters. The client will be started before the function starts executing, and the client will be stopped after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:"@pytest.mark.parametrize(\"server\", [SERVEROPT], indirect=True)\n@pytest.mark.parametrize(\"client\", [CLIENTOPT], indirect=True)\ndef test_client(self, server, client):\n ret = client.callCypher(\"CALL db.createEdgeLabel('followed', '[]', 'address', string, false, 'date', int32, false)\", \"default\")\n assert ret[0]\n ret = client.callCypher(\"CALL db.createEdgeLabel('followed', '[]', 'address', string, false, 'date', int32, false)\", \"default\")\n assert ret[0] == False\n"})}),"\n",(0,n.jsx)(t.h4,{id:"223importor",children:"2.2.3.importor"}),"\n",(0,n.jsx)(t.h5,{id:"2231startup-parameters",children:"2.2.3.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n",(0,n.jsx)(t.li,{children:"cleanup_dir is the directory that needs to be cleaned up after execution, which can be multiple, passed in as a Python list"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'IMPORTOPT = {"cmd":"./lgraph_import --config_file ./data/yago/yago.conf --dir ./testdb --user admin --password 73@TuGraph --graph default --overwrite 1",\n "cleanup_dir":["./testdb", "./.import_tmp"]}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2232startup-command",children:"2.2.3.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the import of different data through startup parameters. The data will be imported to the specified directory before the function starts executing, and the directories specified in cleanup_dir will be cleaned up after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("importor", [IMPORTOPT], indirect=True)\ndef test_importor(self, importor):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"224exportor",children:"2.2.4.exportor"}),"\n",(0,n.jsx)(t.h5,{id:"2241startup-parameters",children:"2.2.4.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n",(0,n.jsx)(t.li,{children:"cleanup_dir is the directory that needs to be cleaned up after execution, which can be multiple, passed in as a Python list"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'EXPORT_DEF_OPT = {"cmd":"./lgraph_export -d ./testdb -e ./export/default -g default -u admin -p 73@TuGraph",\n "cleanup_dir":["./export"]}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2242startup-command",children:"2.2.4.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the export of different data through startup parameters. The data will be exported to the specified directory before the function starts executing, and the directories specified in cleanup_dir will be cleaned up after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("exportor", [EXPORT_DEF_OPT], indirect=True)\ndef test_exportor(self, exportor):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"225backup_binlog",children:"2.2.5.backup_binlog"}),"\n",(0,n.jsx)(t.h5,{id:"2251startup-parameters",children:"2.2.5.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"\u91c7\u7528python\u5b57\u5178\u4f20\u5165\nUse a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n",(0,n.jsx)(t.li,{children:"cleanup_dir is the directory that needs to be cleaned up after execution, which can be multiple, passed in as a Python list"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'BINLOGOPT = {"cmd" : "./lgraph_binlog -a restore --host 127.0.0.1 --port 9093 -u admin -p 73@TuGraph -f ./testdb/binlog/*",\n "cleanup_dir":[]}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2252startup-command",children:"2.2.5.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the backup of different binlogs through startup parameters. The binlogs will be copied to the specified directory before the function starts executing, and the directories specified in cleanup_dir will be cleaned up after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("backup_binlog", [BINLOGOPT], indirect=True)\ndef test_backup_binlog(self, backup_binlog):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"226backup_copy_dir",children:"2.2.6.backup_copy_dir"}),"\n",(0,n.jsx)(t.h5,{id:"2261startup-parameters",children:"2.2.6.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n",(0,n.jsx)(t.li,{children:"cleanup_dir is the directory that needs to be cleaned up after execution, which can be multiple, passed in as a Python list"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'BACKUPOPT = {"cmd" : "./lgraph_backup --src ./testdb -dst ./testdb1",\n "cleanup_dir":[]}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2262startup-command",children:"2.2.6.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the backup of different databases through startup parameters. The database will be copied to the specified directory before the function starts executing, and the directories specified in cleanup_dir will be cleaned up after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("backup_copy_dir", [BACKUPOPT], indirect=True)\ndef test_backup_copy_dir(self, backup_copy_dir):\n\tpass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"227build_so",children:"2.2.7.build_so"}),"\n",(0,n.jsx)(t.h5,{id:"2271startup-parameters",children:"2.2.7.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command, passed in as a Python list, and multiple so can be compiled at once"}),"\n",(0,n.jsx)(t.li,{children:"so_name is the dynamic library that needs to be cleaned up after execution, which can be multiple, passed in as a Python list"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'BUILDOPT = {"cmd":["g++ -fno-gnu-unique -fPIC -g --std=c++17 -I ../../include -I ../../deps/install/include -rdynamic -O3 -fopenmp -DNDEBUG -o ./scan_graph.so ../../test/test_procedures/scan_graph.cpp ./liblgraph.so -shared",\n "g++ -fno-gnu-unique -fPIC -g --std=c++17 -I ../../include -I ../../deps/install/include -rdynamic -O3 -fopenmp -DNDEBUG -o ./sortstr.so ../../test/test_procedures/sortstr.cpp ./liblgraph.so -shared"],\n "so_name":["./scan_graph.so", "./sortstr.so"]}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2272startup-command",children:"2.2.7.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the compilation of different dynamic libraries through startup parameters. The dynamic libraries will be generated to the specified directory before the function starts executing, and the dynamic libraries specified in the so_name list will be cleaned up after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("build_so", [BUILDOPT], indirect=True)\ndef test_build_so(self, build_so):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"228copy_snapshot",children:"2.2.8.copy_snapshot"}),"\n",(0,n.jsx)(t.h5,{id:"2281startup-parameters",children:"2.2.8.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"src is the original database"}),"\n",(0,n.jsx)(t.li,{children:"dst is the snapshot copied after the backup"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'COPYSNAPOPT = {"src" : "./testdb", "dst" : "./testdb1"}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2282startup-command",children:"2.2.8.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the copying of different snapshots through startup parameters. The snapshot in src will be copied to the directory specified in dst before the function starts executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("copy_snapshot", [COPYSNAPOPT], indirect=True)\ndef test_copy_snapshot(self, copy_snapshot):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"229copy_dir",children:"2.2.9.copy_dir"}),"\n",(0,n.jsx)(t.h5,{id:"2291startup-parameters",children:"2.2.9.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"src is the original directory"}),"\n",(0,n.jsx)(t.li,{children:"dst is the directory copied after the backup"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'COPYSNAPOPT = {"src" : "./testdb", "dst" : "./testdb1"}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"2292startup-command",children:"2.2.9.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the copying of different directories through startup parameters. The directory in src will be copied to the directory specified in dst before the function starts executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("copy_dir", [COPYDIR], indirect=True)\ndef test_copy_dir(self, copy_dir):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"2210exec",children:"2.2.10.exec"}),"\n",(0,n.jsx)(t.h5,{id:"22101startup-parameters",children:"2.2.10.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'EXECOPT = {\n "cmd" : "test_rpc_client/cpp/CppClientTest/build/clienttest"\n }\n'})}),"\n",(0,n.jsx)(t.h5,{id:"22102startup-command",children:"2.2.10.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the execution of different logic through startup parameters. A child process will be started to execute the command passed in through the cmd parameter before the function starts executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("exec", [EXECOPT], indirect=True)\ndef test_exec(self, exec):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"2211algo",children:"2.2.11.algo"}),"\n",(0,n.jsx)(t.h5,{id:"22111startup-parameters",children:"2.2.11.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n",(0,n.jsx)(t.li,{children:"result is the expected execution result of the algorithm. After execution is completed, the actual result will be compared with the expected result. If they are different, the test will fail."}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'BFSEMBEDOPT = {\n "cmd" : "algo/bfs_embed ./testdb",\n "result" : ["found_vertices = 3829"]\n }\n'})}),"\n",(0,n.jsx)(t.h5,{id:"22112startup-command",children:"2.2.11.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the execution of different algorithm logic through startup parameters. A child process will be started to execute the algorithm passed in through the cmd parameter before the function starts executing. The function body will wait for the algorithm to complete and compare the result with the expected result."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("algo", [BFSEMBEDOPT], indirect=True)\ndef test_exec_bfs_embed(self, algo):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"2212bash",children:"2.2.12.bash"}),"\n",(0,n.jsx)(t.h5,{id:"22121startup-parameters",children:"2.2.12.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"cmd is the startup command"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'BASHOPT = {\n "cmd" : "sh ./test_rpc_client/cpp/CppClientTest/compile.sh"\n }\n'})}),"\n",(0,n.jsx)(t.h5,{id:"22122startup-command",children:"2.2.12.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and control the execution of different bash commands through startup parameters. A child process will be started to execute the bash command passed in through the cmd parameter before the function starts executing. The function body will wait for the command to complete."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("bash", [BASHOPT], indirect=True)\ndef test_bash(self, bash):\n pass\n'})}),"\n",(0,n.jsx)(t.h4,{id:"2213rest",children:"2.2.13.rest"}),"\n",(0,n.jsx)(t.h5,{id:"22131startup-parameters",children:"2.2.13.1.Startup Parameters"}),"\n",(0,n.jsx)(t.p,{children:"Use a Python dictionary to pass in the parameters:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"port is the port of the TuGraph Server"}),"\n",(0,n.jsx)(t.li,{children:"user is the username of the TuGraph Server"}),"\n",(0,n.jsx)(t.li,{children:"password is the password corresponding to user in TuGraph Server"}),"\n"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'RESTTOPT = {"port":"7073", "user":"admin", "password":"73@TuGraph"}\n'})}),"\n",(0,n.jsx)(t.h5,{id:"22132startup-command",children:"2.2.13.2.Startup Command"}),"\n",(0,n.jsx)(t.p,{children:"Import the tool through the fixtures component and link to different TuGraph Rest Servers through startup parameters. The client will be started before the function starts executing and stopped after the function finishes executing."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'@pytest.mark.parametrize("rest", [RESTTOPT], indirect=True)\ndef test_get_info(self, server, rest):\n\tpass\n'})}),"\n",(0,n.jsx)(t.h3,{id:"23test-cases",children:"2.3.Test Cases"}),"\n",(0,n.jsx)(t.h4,{id:"231rest",children:"2.3.1.rest"}),"\n",(0,n.jsx)(t.p,{children:"In the sample code, before the test_get_info function is executed, the server is started, and a rest client is started after the server is started. After entering the test_get_info function, some information about the server is obtained, and assert is used to determine whether cpu information is obtained."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'SERVEROPT = {"cmd":"./lgraph_server -c lgraph_standalone.json --directory ./testdb --license _FMA_IGNORE_LICENSE_CHECK_SALTED_ --port 7073 --rpc_port 9093",\n "cleanup_dir":["./testdb"]}\nRESTTOPT = {"port":"7073", "user":"admin", "password":"73@TuGraph"}\n@pytest.mark.parametrize("server", [SERVEROPT], indirect=True)\n@pytest.mark.parametrize("rest", [RESTTOPT], indirect=True)\ndef test_get_info(self, server, rest):\n res = rest.get_server_info()\n log.info("res : %s", res)\n assert(\'cpu\' in res)\n'})}),"\n",(0,n.jsx)(t.h4,{id:"232client",children:"2.3.2.client"}),"\n",(0,n.jsx)(t.p,{children:"In the sample code, before the test_flushdb function is executed, the offline data import logic is executed and the server is started. After creating a connection through the client, the function enters the test_flushdb function. The number of points is queried to determine whether the import is successful. After the import is successful, the flushDB operation is executed. assert is used again to determine whether the db can be emptied normally."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'SERVEROPT = {"cmd":"./lgraph_server -c lgraph_standalone.json --directory ./testdb --license _FMA_IGNORE_LICENSE_CHECK_SALTED_ --port 7072 --rpc_port 9092",\n "cleanup_dir":["./testdb"]}\n\nCLIENTOPT = {"host":"127.0.0.1:9092", "user":"admin", "password":"73@TuGraph"}\n\nIMPORTOPT = {"cmd":"./lgraph_import --config_file ./data/yago/yago.conf --dir ./testdb --user admin --password 73@TuGraph --graph default --overwrite 1",\n "cleanup_dir":["./testdb", "./.import_tmp"]}\n\n@pytest.mark.parametrize("importor", [IMPORTOPT], indirect=True)\n@pytest.mark.parametrize("server", [SERVEROPT], indirect=True)\n@pytest.mark.parametrize("client", [CLIENTOPT], indirect=True)\ndef test_flushdb(self, importor, server, client):\n ret = client.callCypher("MATCH (n) RETURN n LIMIT 100", "default")\n assert ret[0]\n res = json.loads(ret[1])\n assert len(res) == 21\n ret = client.callCypher("CALL db.flushDB()", "default")\n assert ret[0]\n res = json.loads(ret[1])\n assert res == None\n'})}),"\n",(0,n.jsx)(t.h4,{id:"233exportorimportor",children:"2.3.3.exportor/importor"}),"\n",(0,n.jsx)(t.p,{children:"In the sample code, before the test_export_default function is executed, the offline data import logic is executed. After the import is successful, the data of the current db is exported. Then, the offline import logic is used again to import the exported data into a new directory. The newly imported data is used to start the db and create a connection. In the body of the test_export_default function, it is determined whether the data after export and import is consistent with the original data."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-python",children:'SERVEROPT = {"cmd":"./lgraph_server -c lgraph_standalone.json --directory ./testdb1 --license _FMA_IGNORE_LICENSE_CHECK_SALTED_ --port 7073 --rpc_port 9093",\n "cleanup_dir":["./testdb1"]}\n\nCLIENTOPT = {"host":"127.0.0.1:9093", "user":"admin", "password":"73@TuGraph"}\n\nIMPORT_YAGO_OPT = {"cmd":"./lgraph_import --config_file ./data/yago/yago.conf --dir ./testdb --user admin --password 73@TuGraph --graph default --overwrite 1",\n "cleanup_dir":["./.import_tmp", "./testdb"]}\n\nIMPORT_DEF_OPT = {"cmd":"./lgraph_import -c ./export/default/import.config -d ./testdb1",\n "cleanup_dir":["./.import_tmp", "./testdb1"]}\n\nEXPORT_DEF_OPT = {"cmd":"./lgraph_export -d ./testdb -e ./export/default -g default -u admin -p 73@TuGraph",\n "cleanup_dir":["./export"]}\n\n@pytest.mark.parametrize("importor", [IMPORT_YAGO_OPT], indirect=True)\n@pytest.mark.parametrize("exportor", [EXPORT_DEF_OPT], indirect=True)\n@pytest.mark.parametrize("importor_1", [IMPORT_DEF_OPT], indirect=True)\n@pytest.mark.parametrize("server", [SERVEROPT], indirect=True)\n@pytest.mark.parametrize("client", [CLIENTOPT], indirect=True)\ndef test_export_default(self, importor, exportor, importor_1, server, client):\n ret = client.callCypher("MATCH (n) RETURN n LIMIT 100", "default")\n assert ret[0]\n res = json.loads(ret[1])\n log.info("res : %s", res)\n assert len(res) == 21\n'})}),"\n",(0,n.jsx)(t.h4,{id:"234other-tests",children:"2.3.4.Other Tests"}),"\n",(0,n.jsxs)(t.p,{children:["For more test cases, please refer to the integration test code ",(0,n.jsx)(t.a,{href:"https://github.com/TuGraph-db/tugraph-db/tree/master/test/integration",children:"https://github.com/TuGraph-db/tugraph-db/tree/master/test/integration"})]})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>d});var n=r(6540);const s={},a=n.createContext(s);function i(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c803846e.75ebb8ee.js b/assets/js/c803846e.d727b2eb.js similarity index 98% rename from assets/js/c803846e.75ebb8ee.js rename to assets/js/c803846e.d727b2eb.js index e768d5baa8..388a10dafd 100644 --- a/assets/js/c803846e.75ebb8ee.js +++ b/assets/js/c803846e.d727b2eb.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[7414],{5542:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var s=t(4848),r=t(8453);const o={},a="Cluster management",d={id:"utility-tools/ha-cluster-management",title:"Cluster management",description:"This document mainly introduces the management tools of TuGraph HA cluster, including the functions of deleting nodes, leader transfer and generating snapshots.",source:"@site/../docs/en-US/source/6.utility-tools/5.ha-cluster-management.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/ha-cluster-management",permalink:"/tugraph-db/en/utility-tools/ha-cluster-management",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Data Warmup",permalink:"/tugraph-db/en/utility-tools/data-warmup"},next:{title:"Tugraph CLI",permalink:"/tugraph-db/en/utility-tools/tugraph-cli"}},i={},c=[{value:"1 Introduction",id:"1-introduction",level:2},{value:"2. Delete node",id:"2-delete-node",level:2},{value:"3. leader transfer",id:"3-leader-transfer",level:2},{value:"4. Generate snapshot",id:"4-generate-snapshot",level:2}];function l(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"cluster-management",children:"Cluster management"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"This document mainly introduces the management tools of TuGraph HA cluster, including the functions of deleting nodes, leader transfer and generating snapshots."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"1-introduction",children:"1 Introduction"}),"\n",(0,s.jsxs)(n.p,{children:["After the HA cluster is started, you can use the ",(0,s.jsx)(n.code,{children:"lgraph_peer"})," tool for cluster management, which can perform functions such as deleting nodes, transferring leaders, and generating snapshots."]}),"\n",(0,s.jsx)(n.h2,{id:"2-delete-node",children:"2. Delete node"}),"\n",(0,s.jsxs)(n.p,{children:["For nodes in the TuGraph HA cluster that are offline for a long time or have network partitions, you can use the ",(0,s.jsx)(n.code,{children:"remove_peer"})," command of ",(0,s.jsx)(n.code,{children:"lgraph_peer"})," to delete the node. An example command is as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"$ lgraph_peer --command remove_peer --peer {peer_id} --conf {group_conf}\n"})}),"\n",(0,s.jsx)(n.p,{children:"in:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--command remove_peer"})," specifies that the operation to be performed is remove_peer, that is, delete the node."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--peer {peer_id}"})," specifies the rpc network address of the node to be deleted, such as ",(0,s.jsx)(n.code,{children:"127.0.0.1:9092"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--conf {group_conf}"})," specifies the member configuration of the HA cluster (as long as it can be connected to the master node), such as ",(0,s.jsx)(n.code,{children:"127.0.0.1:9092,127.0.0.1:9093,127.0.0.1:9094"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"3-leader-transfer",children:"3. leader transfer"}),"\n",(0,s.jsxs)(n.p,{children:["When you need to shut down or restart the master node, in order to reduce the unserviceable time of the cluster, you can use the ",(0,s.jsx)(n.code,{children:"transfer_leader"})," command of ",(0,s.jsx)(n.code,{children:"lgraph_peer"})," to transfer the master node. An example command is as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"$ lgraph_peer --command transfer_leader --peer {peer_id} --conf {group_conf}\n"})}),"\n",(0,s.jsx)(n.p,{children:"in:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--command transfer_leader"})," specifies that the operation to be performed is transfer_leader, that is, transferring the master node."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--peer {peer_id}"})," specifies the rpc network address to become the master node, such as ",(0,s.jsx)(n.code,{children:"127.0.0.1:9092"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--conf {group_conf}"})," specifies the member configuration of the HA cluster (as long as it can be connected to the master node), such as ",(0,s.jsx)(n.code,{children:"127.0.0.1:9092,127.0.0.1:9093,127.0.0.1:9094"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"4-generate-snapshot",children:"4. Generate snapshot"}),"\n",(0,s.jsxs)(n.p,{children:["For reasons such as setting ha_snapshot_interval_s to -1 when the node starts so that snapshots are not taken by default or other reasons,\nwhen you need to tell a node generate a snapshot, you can use the ",(0,s.jsx)(n.code,{children:"snapshot"})," command of ",(0,s.jsx)(n.code,{children:"lgraph_peer"}),". An example command is as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"$ lgraph_peer --command snapshot --peer {peer_id}\n"})}),"\n",(0,s.jsx)(n.p,{children:"in:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--command snapshot"})," specifies that the operation to be performed is snapshot, that is, generating a snapshot."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--peer {peer_id}"})," specifies the rpc network address of the node to generate a snapshot, such as ",(0,s.jsx)(n.code,{children:"127.0.0.1:9092"}),"."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>d});var s=t(6540);const r={},o=s.createContext(r);function a(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[7414],{5542:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>d,toc:()=>c});var s=t(4848),r=t(8453);const o={},a="Cluster management",d={id:"utility-tools/ha-cluster-management",title:"Cluster management",description:"This document mainly introduces the management tools of TuGraph HA cluster, including the functions of deleting nodes, leader transfer and generating snapshots.",source:"@site/../docs/en-US/source/6.utility-tools/5.ha-cluster-management.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/ha-cluster-management",permalink:"/tugraph-db/en/utility-tools/ha-cluster-management",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Data Warmup",permalink:"/tugraph-db/en/utility-tools/data-warmup"},next:{title:"Tugraph CLI",permalink:"/tugraph-db/en/utility-tools/tugraph-cli"}},i={},c=[{value:"1 Introduction",id:"1-introduction",level:2},{value:"2. Delete node",id:"2-delete-node",level:2},{value:"3. leader transfer",id:"3-leader-transfer",level:2},{value:"4. Generate snapshot",id:"4-generate-snapshot",level:2}];function l(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"cluster-management",children:"Cluster management"})}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"This document mainly introduces the management tools of TuGraph HA cluster, including the functions of deleting nodes, leader transfer and generating snapshots."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"1-introduction",children:"1 Introduction"}),"\n",(0,s.jsxs)(n.p,{children:["After the HA cluster is started, you can use the ",(0,s.jsx)(n.code,{children:"lgraph_peer"})," tool for cluster management, which can perform functions such as deleting nodes, transferring leaders, and generating snapshots."]}),"\n",(0,s.jsx)(n.h2,{id:"2-delete-node",children:"2. Delete node"}),"\n",(0,s.jsxs)(n.p,{children:["For nodes in the TuGraph HA cluster that are offline for a long time or have network partitions, you can use the ",(0,s.jsx)(n.code,{children:"remove_peer"})," command of ",(0,s.jsx)(n.code,{children:"lgraph_peer"})," to delete the node. An example command is as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"$ lgraph_peer --command remove_peer --peer {peer_id} --conf {group_conf}\n"})}),"\n",(0,s.jsx)(n.p,{children:"in:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--command remove_peer"})," specifies that the operation to be performed is remove_peer, that is, delete the node."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--peer {peer_id}"})," specifies the rpc network address of the node to be deleted, such as ",(0,s.jsx)(n.code,{children:"127.0.0.1:9092"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--conf {group_conf}"})," specifies the member configuration of the HA cluster (as long as it can be connected to the master node), such as ",(0,s.jsx)(n.code,{children:"127.0.0.1:9092,127.0.0.1:9093,127.0.0.1:9094"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"3-leader-transfer",children:"3. leader transfer"}),"\n",(0,s.jsxs)(n.p,{children:["When you need to shut down or restart the master node, in order to reduce the unserviceable time of the cluster, you can use the ",(0,s.jsx)(n.code,{children:"transfer_leader"})," command of ",(0,s.jsx)(n.code,{children:"lgraph_peer"})," to transfer the master node. An example command is as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"$ lgraph_peer --command transfer_leader --peer {peer_id} --conf {group_conf}\n"})}),"\n",(0,s.jsx)(n.p,{children:"in:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--command transfer_leader"})," specifies that the operation to be performed is transfer_leader, that is, transferring the master node."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--peer {peer_id}"})," specifies the rpc network address to become the master node, such as ",(0,s.jsx)(n.code,{children:"127.0.0.1:9092"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--conf {group_conf}"})," specifies the member configuration of the HA cluster (as long as it can be connected to the master node), such as ",(0,s.jsx)(n.code,{children:"127.0.0.1:9092,127.0.0.1:9093,127.0.0.1:9094"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"4-generate-snapshot",children:"4. Generate snapshot"}),"\n",(0,s.jsxs)(n.p,{children:["For reasons such as setting ha_snapshot_interval_s to -1 when the node starts so that snapshots are not taken by default or other reasons,\nwhen you need to tell a node generate a snapshot, you can use the ",(0,s.jsx)(n.code,{children:"snapshot"})," command of ",(0,s.jsx)(n.code,{children:"lgraph_peer"}),". An example command is as follows:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-shell",children:"$ lgraph_peer --command snapshot --peer {peer_id}\n"})}),"\n",(0,s.jsx)(n.p,{children:"in:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--command snapshot"})," specifies that the operation to be performed is snapshot, that is, generating a snapshot."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"--peer {peer_id}"})," specifies the rpc network address of the node to generate a snapshot, such as ",(0,s.jsx)(n.code,{children:"127.0.0.1:9092"}),"."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>d});var s=t(6540);const r={},o=s.createContext(r);function a(e){const n=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ccf6bcc5.f8b99ec9.js b/assets/js/ccf6bcc5.a1a5c566.js similarity index 98% rename from assets/js/ccf6bcc5.f8b99ec9.js rename to assets/js/ccf6bcc5.a1a5c566.js index 3d8a0a7c6e..d19f628e5a 100644 --- a/assets/js/ccf6bcc5.f8b99ec9.js +++ b/assets/js/ccf6bcc5.a1a5c566.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3268],{3734:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var r=t(4848),i=t(8453);const s={},o="Environment and version selection",a={id:"best-practices/selection",title:"Environment and version selection",description:"This document introduces how to select the system environment and deployment method",source:"@site/../docs/en-US/source/13.best-practices/4.selection.md",sourceDirName:"13.best-practices",slug:"/best-practices/selection",permalink:"/tugraph-db/en/best-practices/selection",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Data Migration",permalink:"/tugraph-db/en/best-practices/data_migration"},next:{title:"Examples of geospatial data type usage",permalink:"/tugraph-db/en/best-practices/spatial"}},d={},l=[{value:"1 Introduction",id:"1-introduction",level:2},{value:"2. Environmental capability selection",id:"2-environmental-capability-selection",level:2},{value:"3. Deployment method selection",id:"3-deployment-method-selection",level:2},{value:"4. Next steps",id:"4-next-steps",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"environment-and-version-selection",children:"Environment and version selection"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"This document introduces how to select the system environment and deployment method"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"1-introduction",children:"1 Introduction"}),"\n",(0,r.jsx)(n.p,{children:"TuGraph provides differentiated system environments and deployment methods for users with different needs to meet the needs of different users such as novices, system developers, production operation and maintenance personnel, and researchers."}),"\n",(0,r.jsx)(n.h2,{id:"2-environmental-capability-selection",children:"2. Environmental capability selection"}),"\n",(0,r.jsx)(n.p,{children:"Users can choose different environments based on actual usage scenarios. The compilation environment has the most complete capabilities and requires more third-party software. Correspondingly, the streamlined operating environment requires almost no installation of any dependent libraries and can run TuGraph's basic functions except stored procedures."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Environment"}),(0,r.jsx)(n.th,{children:"Purpose"}),(0,r.jsx)(n.th,{children:"Remarks"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Compilation environment"}),(0,r.jsx)(n.td,{children:"Compile TuGraph from source"}),(0,r.jsx)(n.td,{children:"For developers"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Running environment"}),(0,r.jsx)(n.td,{children:"Run TuGraph installation package"}),(0,r.jsx)(n.td,{children:"Applicable to most users"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Simplified operating environment"}),(0,r.jsx)(n.td,{children:"Run simplified TuGraph installation package"}),(0,r.jsx)(n.td,{children:"Less dependence on the operating system"})]})]})]}),"\n",(0,r.jsxs)(n.p,{children:["For a detailed introduction to different environments, see ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/installation&running/environment-mode",children:"link"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"3-deployment-method-selection",children:"3. Deployment method selection"}),"\n",(0,r.jsx)(n.p,{children:"TuGraph deployment only requires one server (high availability mode requires multiple servers), and you can choose a suitable deployment method based on actual resource conditions and usage scenarios."}),"\n",(0,r.jsxs)(n.p,{children:["| Deployment method | Description | Remarks |\n|----------|-----------------------|--------------- -------------------------------------------------- --------------------------|\n| Cloud deployment | Alibaba Cloud Computing Nest one-click deployment, free trial | Suitable for novices, process reference ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/installation&running/cloud-deployment",children:"Link"})," |\n| Docker deployment | Cross-platform deployment through pre-prepared Docker images | Users with hardware requirements, such as performance testing, please refer to [link](../5.developer-manual/1.installation/3.docker-deployment. md) |\n| Local deployment | Tightly coupled deployment in existing systems | Applicable to specified production environment, refer to the process ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/installation&running/local-package-deployment",children:"Link"})," |"]}),"\n",(0,r.jsx)(n.h2,{id:"4-next-steps",children:"4. Next steps"}),"\n",(0,r.jsxs)(n.p,{children:["After the deployment is completed, you can proceed to ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/installation&running/tugraph-running",children:"Start Service"})," and [Data Import](../5.developer-manual/3. server-tools/1.data-import.md) and other operations, you can also experience the entire process through ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/quick-start/demo/movie",children:"Sample Data"}),"."]})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var r=t(6540);const i={},s=r.createContext(i);function o(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3268],{3734:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var r=t(4848),i=t(8453);const s={},o="Environment and version selection",a={id:"best-practices/selection",title:"Environment and version selection",description:"This document introduces how to select the system environment and deployment method",source:"@site/../docs/en-US/source/13.best-practices/4.selection.md",sourceDirName:"13.best-practices",slug:"/best-practices/selection",permalink:"/tugraph-db/en/best-practices/selection",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Data Migration",permalink:"/tugraph-db/en/best-practices/data_migration"},next:{title:"Examples of geospatial data type usage",permalink:"/tugraph-db/en/best-practices/spatial"}},d={},l=[{value:"1 Introduction",id:"1-introduction",level:2},{value:"2. Environmental capability selection",id:"2-environmental-capability-selection",level:2},{value:"3. Deployment method selection",id:"3-deployment-method-selection",level:2},{value:"4. Next steps",id:"4-next-steps",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"environment-and-version-selection",children:"Environment and version selection"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"This document introduces how to select the system environment and deployment method"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"1-introduction",children:"1 Introduction"}),"\n",(0,r.jsx)(n.p,{children:"TuGraph provides differentiated system environments and deployment methods for users with different needs to meet the needs of different users such as novices, system developers, production operation and maintenance personnel, and researchers."}),"\n",(0,r.jsx)(n.h2,{id:"2-environmental-capability-selection",children:"2. Environmental capability selection"}),"\n",(0,r.jsx)(n.p,{children:"Users can choose different environments based on actual usage scenarios. The compilation environment has the most complete capabilities and requires more third-party software. Correspondingly, the streamlined operating environment requires almost no installation of any dependent libraries and can run TuGraph's basic functions except stored procedures."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Environment"}),(0,r.jsx)(n.th,{children:"Purpose"}),(0,r.jsx)(n.th,{children:"Remarks"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Compilation environment"}),(0,r.jsx)(n.td,{children:"Compile TuGraph from source"}),(0,r.jsx)(n.td,{children:"For developers"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Running environment"}),(0,r.jsx)(n.td,{children:"Run TuGraph installation package"}),(0,r.jsx)(n.td,{children:"Applicable to most users"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Simplified operating environment"}),(0,r.jsx)(n.td,{children:"Run simplified TuGraph installation package"}),(0,r.jsx)(n.td,{children:"Less dependence on the operating system"})]})]})]}),"\n",(0,r.jsxs)(n.p,{children:["For a detailed introduction to different environments, see ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/installation&running/environment-mode",children:"link"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"3-deployment-method-selection",children:"3. Deployment method selection"}),"\n",(0,r.jsx)(n.p,{children:"TuGraph deployment only requires one server (high availability mode requires multiple servers), and you can choose a suitable deployment method based on actual resource conditions and usage scenarios."}),"\n",(0,r.jsxs)(n.p,{children:["| Deployment method | Description | Remarks |\n|----------|-----------------------|--------------- -------------------------------------------------- --------------------------|\n| Cloud deployment | Alibaba Cloud Computing Nest one-click deployment, free trial | Suitable for novices, process reference ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/installation&running/cloud-deployment",children:"Link"})," |\n| Docker deployment | Cross-platform deployment through pre-prepared Docker images | Users with hardware requirements, such as performance testing, please refer to [link](../5.developer-manual/1.installation/3.docker-deployment. md) |\n| Local deployment | Tightly coupled deployment in existing systems | Applicable to specified production environment, refer to the process ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/installation&running/local-package-deployment",children:"Link"})," |"]}),"\n",(0,r.jsx)(n.h2,{id:"4-next-steps",children:"4. Next steps"}),"\n",(0,r.jsxs)(n.p,{children:["After the deployment is completed, you can proceed to ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/installation&running/tugraph-running",children:"Start Service"})," and [Data Import](../5.developer-manual/3. server-tools/1.data-import.md) and other operations, you can also experience the entire process through ",(0,r.jsx)(n.a,{href:"/tugraph-db/en/quick-start/demo/movie",children:"Sample Data"}),"."]})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var r=t(6540);const i={},s=r.createContext(i);function o(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cd445c99.cf39df8e.js b/assets/js/cd445c99.ef1cfb46.js similarity index 99% rename from assets/js/cd445c99.cf39df8e.js rename to assets/js/cd445c99.ef1cfb46.js index 0555172380..c446baac94 100644 --- a/assets/js/cd445c99.cf39df8e.js +++ b/assets/js/cd445c99.ef1cfb46.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5432],{8489:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>l});var t=a(4848),o=a(8453);const r={},i="Sampling API",s={id:"olap&procedure/learn/sampling_api",title:"Sampling API",description:"This document provides a detailed guide on using the Sampling API of TuGraph.",source:"@site/../docs/en-US/source/9.olap&procedure/3.learn/2.sampling_api.md",sourceDirName:"9.olap&procedure/3.learn",slug:"/olap&procedure/learn/sampling_api",permalink:"/tugraph-db/en/olap&procedure/learn/sampling_api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Learning Tutorial",permalink:"/tugraph-db/en/olap&procedure/learn/tutorial"},next:{title:"Training",permalink:"/tugraph-db/en/olap&procedure/learn/training"}},d={},l=[{value:"1. Overview",id:"1-overview",level:2},{value:"2. Graph Data Instantiation",id:"2-graph-data-instantiation",level:2},{value:"3. Introduction to Sampling Operators",id:"3-introduction-to-sampling-operators",level:2},{value:"3.1.RandomWalk Operator",id:"31randomwalk-operator",level:3},{value:"3.2.NeighborSampling Operator",id:"32neighborsampling-operator",level:3},{value:"3.3.NegativeSampling Operator",id:"33negativesampling-operator",level:3},{value:"3.4.EdgeSampling Operator",id:"34edgesampling-operator",level:3},{value:"3.5.GetDB Operator",id:"35getdb-operator",level:3},{value:"4. User-Defined Sampling Algorithm",id:"4-user-defined-sampling-algorithm",level:2}];function p(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"sampling-api",children:"Sampling API"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document provides a detailed guide on using the Sampling API of TuGraph."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1-overview",children:"1. Overview"}),"\n",(0,t.jsx)(n.p,{children:"This manual introduces the Sampling API using TuGraph."}),"\n",(0,t.jsx)(n.h2,{id:"2-graph-data-instantiation",children:"2. Graph Data Instantiation"}),"\n",(0,t.jsx)(n.p,{children:"Before the sampling operation, load the graph data according to the graph data path, and map it into the olapondb graph analysis class, the code is as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:"galaxy = PyGalaxy(args.db_path) # Create a galaxy instance based on the path\ngalaxy.SetCurrentUser(args.username, args.password) # Set the current user\ndb = galaxy.OpenGraph('default', False) # Open the graph database specified by db\ntxn = db.CreateReadTxn() # Create a transaction instance\nolapondb = PyOlapOnDB('Empty', db, txn) # Instantiate OlapOnDB based on the graph loading method, graph database instance, and transaction instance\ndel txn\ndel db\ndel galaxy\n"})}),"\n",(0,t.jsx)(n.h2,{id:"3-introduction-to-sampling-operators",children:"3. Introduction to Sampling Operators"}),"\n",(0,t.jsx)(n.p,{children:"The graph sampling operator is implemented in the cython layer and is used to sample the input graph. The generated NodeInfo is used to save point information such as feature attributes and label attributes, and EdgeInfo is used to save edge information. These metadata information can be used for features Extraction, network embedding and other tasks. Currently, the TuGraph graph learning module supports five sampling operators: GetDB, NeighborSampling, EdgeSampling, RandomWalkSampling, and NegativeSampling."}),"\n",(0,t.jsx)(n.h3,{id:"31randomwalk-operator",children:"3.1.RandomWalk Operator"}),"\n",(0,t.jsx)(n.p,{children:"Random walks are performed a specified number of times around the sampling nodes to obtain the sampling subgraph."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:"Process(db_: lgraph_db_python.PyGraphDB, olapondb: lgraph_db_python.PyOlapOnDB, feature_num: size_t, sample_node: list, step: size_t, NodeInfo: list, EdgeInfo: list)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Parameter list:"}),"\n",(0,t.jsx)(n.p,{children:"db_: An instance of the graph database.\nolapondb: Graph analysis class.\nfeature_num: The length of the feature vectors for the nodes.\nsample_node: A list of nodes to be sampled.\nnei_num: The number of neighbor nodes to be sampled for each node.\nNodeInfo: A list of dictionaries containing metadata information for the nodes.\nEdgeInfo: A list of dictionaries containing metadata information for the edges.\nReturn value: This function does not return anything."}),"\n",(0,t.jsx)(n.h3,{id:"32neighborsampling-operator",children:"3.2.NeighborSampling Operator"}),"\n",(0,t.jsx)(n.p,{children:"A certain number of nodes are sampled from the first-degree neighbors of the sampling nodes to obtain the sampling subgraph."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:"Process(db_: lgraph_db_python.PyGraphDB, olapondb: lgraph_db_python.PyOlapOnDB, feature_num: size_t, sample_node: list, nei_num: size_t, NodeInfo: list, EdgeInfo: list)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Parameter list:"}),"\n",(0,t.jsx)(n.p,{children:"db_: An instance of the graph database.\nolapondb: Graph analysis class.\nfeature_num: The length of the feature vectors for the nodes.\nsample_node: A list of nodes to be sampled.\nnei_num: The number of neighbor nodes to be sampled for each node.\nNodeInfo: A list of dictionaries containing metadata information for the nodes.\nEdgeInfo: A list of dictionaries containing metadata information for the edges.\nReturn value: This function does not return anything."}),"\n",(0,t.jsx)(n.h3,{id:"33negativesampling-operator",children:"3.3.NegativeSampling Operator"}),"\n",(0,t.jsx)(n.p,{children:"The negative sampling algorithm is used to generate a subgraph of non-existent edges."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:"Process(db_: lgraph_db_python.PyGraphDB, olapondb: lgraph_db_python.PyOlapOnDB, feature_num: size_t, num_samples: size_t, NodeInfo: list, EdgeInfo: list)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Parameter list:"}),"\n",(0,t.jsx)(n.p,{children:"db_: An instance of the graph database.\nolapondb: Graph analysis class.\nfeature_num: The length of the feature vectors for the nodes.\nnum_samples: The number of false edges to be generated.\nNodeInfo: A list of dictionaries containing metadata information for the nodes.\nEdgeInfo: A list of dictionaries containing metadata information for the edges.\nReturn value: This function does not return anything."}),"\n",(0,t.jsx)(n.h3,{id:"34edgesampling-operator",children:"3.4.EdgeSampling Operator"}),"\n",(0,t.jsx)(n.p,{children:"The edge sampling algorithm is used to generate a subgraph of sampled edges."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:"Process(db_: lgraph_db_python.PyGraphDB, olapondb: lgraph_db_python.PyOlapOnDB, feature_num: size_t, sample_rate: double, NodeInfo: list, EdgeInfo: list, EdgeInfo: list)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Parameter list:"}),"\n",(0,t.jsx)(n.p,{children:"db_: An instance of the graph database.\nolapondb: Graph analysis class.\nfeature_num: The length of the feature vectors for the nodes.\nsample_rate: The sampling rate of the edges to be selected.\nNodeInfo: A list of dictionaries containing metadata information for the nodes.\nEdgeInfo: A list of dictionaries containing metadata information for the edges.\nReturn value: This function does not return anything."}),"\n",(0,t.jsx)(n.h3,{id:"35getdb-operator",children:"3.5.GetDB Operator"}),"\n",(0,t.jsx)(n.p,{children:"Get the graph data from the database and convert it into the required data structure."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:"Process(db_: lgraph_db_python.PyGraphDB, olapondb: lgraph_db_python.PyOlapOnDB, feature_num: size_t, NodeInfo: list, EdgeInfo: list)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Parameter list:"}),"\n",(0,t.jsx)(n.p,{children:"db_: An instance of the graph database.\nolapondb: Graph analysis class.\nfeature_num: The length of the feature vectors for the nodes.\nNodeInfo: A list of dictionaries containing metadata information for the nodes.\nEdgeInfo: A list of dictionaries containing metadata information for the edges.\nReturn value: This function does not return anything."}),"\n",(0,t.jsx)(n.h2,{id:"4-user-defined-sampling-algorithm",children:"4. User-Defined Sampling Algorithm"}),"\n",(0,t.jsxs)(n.p,{children:["Users can also implement a custom sampling algorithm through the TuGraph Olap interface. For the interface document, see ",(0,t.jsx)(n.a,{href:"/tugraph-db/en/olap&procedure/olap/python-api",children:"here"}),". This document mainly introduces the interface of related functions used by the graph sampling algorithm design."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}},8453:(e,n,a)=>{a.d(n,{R:()=>i,x:()=>s});var t=a(6540);const o={},r=t.createContext(o);function i(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5432],{8489:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>d,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>s,toc:()=>l});var t=a(4848),o=a(8453);const r={},i="Sampling API",s={id:"olap&procedure/learn/sampling_api",title:"Sampling API",description:"This document provides a detailed guide on using the Sampling API of TuGraph.",source:"@site/../docs/en-US/source/9.olap&procedure/3.learn/2.sampling_api.md",sourceDirName:"9.olap&procedure/3.learn",slug:"/olap&procedure/learn/sampling_api",permalink:"/tugraph-db/en/olap&procedure/learn/sampling_api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Learning Tutorial",permalink:"/tugraph-db/en/olap&procedure/learn/tutorial"},next:{title:"Training",permalink:"/tugraph-db/en/olap&procedure/learn/training"}},d={},l=[{value:"1. Overview",id:"1-overview",level:2},{value:"2. Graph Data Instantiation",id:"2-graph-data-instantiation",level:2},{value:"3. Introduction to Sampling Operators",id:"3-introduction-to-sampling-operators",level:2},{value:"3.1.RandomWalk Operator",id:"31randomwalk-operator",level:3},{value:"3.2.NeighborSampling Operator",id:"32neighborsampling-operator",level:3},{value:"3.3.NegativeSampling Operator",id:"33negativesampling-operator",level:3},{value:"3.4.EdgeSampling Operator",id:"34edgesampling-operator",level:3},{value:"3.5.GetDB Operator",id:"35getdb-operator",level:3},{value:"4. User-Defined Sampling Algorithm",id:"4-user-defined-sampling-algorithm",level:2}];function p(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"sampling-api",children:"Sampling API"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document provides a detailed guide on using the Sampling API of TuGraph."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1-overview",children:"1. Overview"}),"\n",(0,t.jsx)(n.p,{children:"This manual introduces the Sampling API using TuGraph."}),"\n",(0,t.jsx)(n.h2,{id:"2-graph-data-instantiation",children:"2. Graph Data Instantiation"}),"\n",(0,t.jsx)(n.p,{children:"Before the sampling operation, load the graph data according to the graph data path, and map it into the olapondb graph analysis class, the code is as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:"galaxy = PyGalaxy(args.db_path) # Create a galaxy instance based on the path\ngalaxy.SetCurrentUser(args.username, args.password) # Set the current user\ndb = galaxy.OpenGraph('default', False) # Open the graph database specified by db\ntxn = db.CreateReadTxn() # Create a transaction instance\nolapondb = PyOlapOnDB('Empty', db, txn) # Instantiate OlapOnDB based on the graph loading method, graph database instance, and transaction instance\ndel txn\ndel db\ndel galaxy\n"})}),"\n",(0,t.jsx)(n.h2,{id:"3-introduction-to-sampling-operators",children:"3. Introduction to Sampling Operators"}),"\n",(0,t.jsx)(n.p,{children:"The graph sampling operator is implemented in the cython layer and is used to sample the input graph. The generated NodeInfo is used to save point information such as feature attributes and label attributes, and EdgeInfo is used to save edge information. These metadata information can be used for features Extraction, network embedding and other tasks. Currently, the TuGraph graph learning module supports five sampling operators: GetDB, NeighborSampling, EdgeSampling, RandomWalkSampling, and NegativeSampling."}),"\n",(0,t.jsx)(n.h3,{id:"31randomwalk-operator",children:"3.1.RandomWalk Operator"}),"\n",(0,t.jsx)(n.p,{children:"Random walks are performed a specified number of times around the sampling nodes to obtain the sampling subgraph."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:"Process(db_: lgraph_db_python.PyGraphDB, olapondb: lgraph_db_python.PyOlapOnDB, feature_num: size_t, sample_node: list, step: size_t, NodeInfo: list, EdgeInfo: list)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Parameter list:"}),"\n",(0,t.jsx)(n.p,{children:"db_: An instance of the graph database.\nolapondb: Graph analysis class.\nfeature_num: The length of the feature vectors for the nodes.\nsample_node: A list of nodes to be sampled.\nnei_num: The number of neighbor nodes to be sampled for each node.\nNodeInfo: A list of dictionaries containing metadata information for the nodes.\nEdgeInfo: A list of dictionaries containing metadata information for the edges.\nReturn value: This function does not return anything."}),"\n",(0,t.jsx)(n.h3,{id:"32neighborsampling-operator",children:"3.2.NeighborSampling Operator"}),"\n",(0,t.jsx)(n.p,{children:"A certain number of nodes are sampled from the first-degree neighbors of the sampling nodes to obtain the sampling subgraph."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:"Process(db_: lgraph_db_python.PyGraphDB, olapondb: lgraph_db_python.PyOlapOnDB, feature_num: size_t, sample_node: list, nei_num: size_t, NodeInfo: list, EdgeInfo: list)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Parameter list:"}),"\n",(0,t.jsx)(n.p,{children:"db_: An instance of the graph database.\nolapondb: Graph analysis class.\nfeature_num: The length of the feature vectors for the nodes.\nsample_node: A list of nodes to be sampled.\nnei_num: The number of neighbor nodes to be sampled for each node.\nNodeInfo: A list of dictionaries containing metadata information for the nodes.\nEdgeInfo: A list of dictionaries containing metadata information for the edges.\nReturn value: This function does not return anything."}),"\n",(0,t.jsx)(n.h3,{id:"33negativesampling-operator",children:"3.3.NegativeSampling Operator"}),"\n",(0,t.jsx)(n.p,{children:"The negative sampling algorithm is used to generate a subgraph of non-existent edges."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:"Process(db_: lgraph_db_python.PyGraphDB, olapondb: lgraph_db_python.PyOlapOnDB, feature_num: size_t, num_samples: size_t, NodeInfo: list, EdgeInfo: list)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Parameter list:"}),"\n",(0,t.jsx)(n.p,{children:"db_: An instance of the graph database.\nolapondb: Graph analysis class.\nfeature_num: The length of the feature vectors for the nodes.\nnum_samples: The number of false edges to be generated.\nNodeInfo: A list of dictionaries containing metadata information for the nodes.\nEdgeInfo: A list of dictionaries containing metadata information for the edges.\nReturn value: This function does not return anything."}),"\n",(0,t.jsx)(n.h3,{id:"34edgesampling-operator",children:"3.4.EdgeSampling Operator"}),"\n",(0,t.jsx)(n.p,{children:"The edge sampling algorithm is used to generate a subgraph of sampled edges."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:"Process(db_: lgraph_db_python.PyGraphDB, olapondb: lgraph_db_python.PyOlapOnDB, feature_num: size_t, sample_rate: double, NodeInfo: list, EdgeInfo: list, EdgeInfo: list)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Parameter list:"}),"\n",(0,t.jsx)(n.p,{children:"db_: An instance of the graph database.\nolapondb: Graph analysis class.\nfeature_num: The length of the feature vectors for the nodes.\nsample_rate: The sampling rate of the edges to be selected.\nNodeInfo: A list of dictionaries containing metadata information for the nodes.\nEdgeInfo: A list of dictionaries containing metadata information for the edges.\nReturn value: This function does not return anything."}),"\n",(0,t.jsx)(n.h3,{id:"35getdb-operator",children:"3.5.GetDB Operator"}),"\n",(0,t.jsx)(n.p,{children:"Get the graph data from the database and convert it into the required data structure."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-python",children:"Process(db_: lgraph_db_python.PyGraphDB, olapondb: lgraph_db_python.PyOlapOnDB, feature_num: size_t, NodeInfo: list, EdgeInfo: list)\n"})}),"\n",(0,t.jsx)(n.p,{children:"Parameter list:"}),"\n",(0,t.jsx)(n.p,{children:"db_: An instance of the graph database.\nolapondb: Graph analysis class.\nfeature_num: The length of the feature vectors for the nodes.\nNodeInfo: A list of dictionaries containing metadata information for the nodes.\nEdgeInfo: A list of dictionaries containing metadata information for the edges.\nReturn value: This function does not return anything."}),"\n",(0,t.jsx)(n.h2,{id:"4-user-defined-sampling-algorithm",children:"4. User-Defined Sampling Algorithm"}),"\n",(0,t.jsxs)(n.p,{children:["Users can also implement a custom sampling algorithm through the TuGraph Olap interface. For the interface document, see ",(0,t.jsx)(n.a,{href:"/tugraph-db/en/olap&procedure/olap/python-api",children:"here"}),". This document mainly introduces the interface of related functions used by the graph sampling algorithm design."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(p,{...e})}):p(e)}},8453:(e,n,a)=>{a.d(n,{R:()=>i,x:()=>s});var t=a(6540);const o={},r=t.createContext(o);function i(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cf75e3c6.5299505e.js b/assets/js/cf75e3c6.3ed992c2.js similarity index 96% rename from assets/js/cf75e3c6.5299505e.js rename to assets/js/cf75e3c6.3ed992c2.js index 646915d65a..7a8f244bf5 100644 --- a/assets/js/cf75e3c6.5299505e.js +++ b/assets/js/cf75e3c6.3ed992c2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5567],{3738:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>c,frontMatter:()=>a,metadata:()=>u,toc:()=>l});var o=r(4848),n=r(8453);const a={},s="TuGraph Explorer",u={id:"utility-tools/tugraph-explorer",title:"TuGraph Explorer",description:"TuGraph Explorer has merged to TuGraph Browser",source:"@site/../docs/en-US/source/6.utility-tools/8.tugraph-explorer.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/tugraph-explorer",permalink:"/tugraph-db/en/utility-tools/tugraph-explorer",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:8,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph DataX",permalink:"/tugraph-db/en/utility-tools/tugraph-datax"},next:{title:"TuGraph Python SDK",permalink:"/tugraph-db/en/client-tools/python-client"}},i={},l=[];function p(e){const t={a:"a",blockquote:"blockquote",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"tugraph-explorer",children:"TuGraph Explorer"})}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["TuGraph Explorer has merged to ",(0,o.jsx)(t.a,{href:"/tugraph-db/en/user-guide/tugraph-browser",children:"TuGraph Browser"})]}),"\n"]})]})}function c(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>s,x:()=>u});var o=r(6540);const n={},a=o.createContext(n);function s(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5567],{3738:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>c,frontMatter:()=>a,metadata:()=>u,toc:()=>l});var o=r(4848),n=r(8453);const a={},s="TuGraph Explorer",u={id:"utility-tools/tugraph-explorer",title:"TuGraph Explorer",description:"TuGraph Explorer has merged to TuGraph Browser",source:"@site/../docs/en-US/source/6.utility-tools/8.tugraph-explorer.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/tugraph-explorer",permalink:"/tugraph-db/en/utility-tools/tugraph-explorer",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:8,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph DataX",permalink:"/tugraph-db/en/utility-tools/tugraph-datax"},next:{title:"TuGraph Python SDK",permalink:"/tugraph-db/en/client-tools/python-client"}},i={},l=[];function p(e){const t={a:"a",blockquote:"blockquote",h1:"h1",header:"header",p:"p",...(0,n.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"tugraph-explorer",children:"TuGraph Explorer"})}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:["TuGraph Explorer has merged to ",(0,o.jsx)(t.a,{href:"/tugraph-db/en/user-guide/tugraph-browser",children:"TuGraph Browser"})]}),"\n"]})]})}function c(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},8453:(e,t,r)=>{r.d(t,{R:()=>s,x:()=>u});var o=r(6540);const n={},a=o.createContext(n);function s(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d05da8ca.1753553d.js b/assets/js/d05da8ca.47d6d859.js similarity index 99% rename from assets/js/d05da8ca.1753553d.js rename to assets/js/d05da8ca.47d6d859.js index b446b96859..9eaa99fab2 100644 --- a/assets/js/d05da8ca.1753553d.js +++ b/assets/js/d05da8ca.47d6d859.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8815],{7193:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>t,metadata:()=>l,toc:()=>c});var r=n(4848),s=n(8453);const t={},o="TuGraph community roles",l={id:"contributor-manual/community-roles",title:"TuGraph community roles",description:"1. Preface",source:"@site/../docs/en-US/source/12.contributor-manual/2.community-roles.md",sourceDirName:"12.contributor-manual",slug:"/contributor-manual/community-roles",permalink:"/tugraph-db/en/contributor-manual/community-roles",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Contribution Guide",permalink:"/tugraph-db/en/contributor-manual/contributing"},next:{title:"Individual Contributor License Agreement",permalink:"/tugraph-db/en/contributor-manual/individual-cla"}},u={},c=[{value:"1. Preface",id:"1-preface",level:2},{value:"2. Role summary",id:"2-role-summary",level:2},{value:"3. Contributor",id:"3-contributor",level:2},{value:"3.1. requirements",id:"31-requirements",level:3},{value:"3.2. responsibility",id:"32-responsibility",level:3},{value:"3.3. permissions",id:"33-permissions",level:3},{value:"4 Maintainer",id:"4-maintainer",level:2},{value:"4.1. requirements",id:"41-requirements",level:3},{value:"4.2. responsibility",id:"42-responsibility",level:3},{value:"4.4. permissions",id:"44-permissions",level:3},{value:"5. PMC",id:"5-pmc",level:2},{value:"5.1. requirements",id:"51-requirements",level:3},{value:"5.2. responsibility",id:"52-responsibility",level:3},{value:"5.3. permissions",id:"53-permissions",level:3}];function a(e){const i={h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.header,{children:(0,r.jsx)(i.h1,{id:"tugraph-community-roles",children:"TuGraph community roles"})}),"\n",(0,r.jsx)(i.h2,{id:"1-preface",children:"1. Preface"}),"\n",(0,r.jsx)(i.p,{children:"This document describes the roles of membership in the TuGraph community, the requirements and permissions for each role."}),"\n",(0,r.jsx)(i.h2,{id:"2-role-summary",children:"2. Role summary"}),"\n",(0,r.jsx)(i.p,{children:"This is the division of roles in the TuGraph community, describing the responsibilities of each role, the requirements to become and remain a role, and the permissions of the corresponding role."}),"\n",(0,r.jsx)(i.p,{children:"Our community is divided into three roles based on the Apache specification:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Contributor"}),"\n",(0,r.jsx)(i.li,{children:"Maintainer"}),"\n",(0,r.jsx)(i.li,{children:"PMC"}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"The requirements, responsibilities, and authorities for each role are described below."}),"\n",(0,r.jsx)(i.h2,{id:"3-contributor",children:"3. Contributor"}),"\n",(0,r.jsx)(i.h3,{id:"31-requirements",children:"3.1. requirements"}),"\n",(0,r.jsx)(i.p,{children:"Successfully submit a PR and merge in any of TuGraph's official projects."}),"\n",(0,r.jsx)(i.h3,{id:"32-responsibility",children:"3.2. responsibility"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Actively respond to issues or PR assigned to you"}),"\n",(0,r.jsx)(i.li,{children:"Help reply the issue/pr together and assign the issue to the person in charge of the corresponding module"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"33-permissions",children:"3.3. permissions"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Join the TuGraph GitHub organization and become a member of the TuGraph open source community."}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"4-maintainer",children:"4 Maintainer"}),"\n",(0,r.jsx)(i.h3,{id:"41-requirements",children:"4.1. requirements"}),"\n",(0,r.jsx)(i.p,{children:"The new Committer is recommended by the existing PMC and approved by 2/3 of the votes. The Commiter meets at least one of the following conditions:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Been a community member for more than three months"}),"\n",(0,r.jsx)(i.li,{children:"More than 10 PR for PMC approve"}),"\n",(0,r.jsx)(i.li,{children:"Complete major functions"}),"\n",(0,r.jsx)(i.li,{children:"Fixed serious bugs"}),"\n",(0,r.jsx)(i.li,{children:"Follow project development and participate in community discussion"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"42-responsibility",children:"4.2. responsibility"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Community counseling support"}),"\n",(0,r.jsx)(i.li,{children:"Actively respond to issues or PR assigned to you"}),"\n",(0,r.jsx)(i.li,{children:"The right to vote on major community decisions"}),"\n",(0,r.jsx)(i.li,{children:"Review community PR"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"44-permissions",children:"4.4. permissions"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Pull Request review permission"}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"5-pmc",children:"5. PMC"}),"\n",(0,r.jsx)(i.h3,{id:"51-requirements",children:"5.1. requirements"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Not open at the moment, if you have a strong desire please contact PMC"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"52-responsibility",children:"5.2. responsibility"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Actively participate in community discussions and give guidance to major community decisions"}),"\n",(0,r.jsx)(i.li,{children:"Responsible for ensuring that the community activities of open source projects are running smoothly"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"53-permissions",children:"5.3. permissions"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Pull Request review permission"}),"\n",(0,r.jsx)(i.li,{children:"Pull Request approve permission"}),"\n",(0,r.jsx)(i.li,{children:"Community role member management"}),"\n"]})]})}function d(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>o,x:()=>l});var r=n(6540);const s={},t=r.createContext(s);function o(e){const i=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(t.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8815],{7193:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>t,metadata:()=>l,toc:()=>c});var r=n(4848),s=n(8453);const t={},o="TuGraph community roles",l={id:"contributor-manual/community-roles",title:"TuGraph community roles",description:"1. Preface",source:"@site/../docs/en-US/source/12.contributor-manual/2.community-roles.md",sourceDirName:"12.contributor-manual",slug:"/contributor-manual/community-roles",permalink:"/tugraph-db/en/contributor-manual/community-roles",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Contribution Guide",permalink:"/tugraph-db/en/contributor-manual/contributing"},next:{title:"Individual Contributor License Agreement",permalink:"/tugraph-db/en/contributor-manual/individual-cla"}},u={},c=[{value:"1. Preface",id:"1-preface",level:2},{value:"2. Role summary",id:"2-role-summary",level:2},{value:"3. Contributor",id:"3-contributor",level:2},{value:"3.1. requirements",id:"31-requirements",level:3},{value:"3.2. responsibility",id:"32-responsibility",level:3},{value:"3.3. permissions",id:"33-permissions",level:3},{value:"4 Maintainer",id:"4-maintainer",level:2},{value:"4.1. requirements",id:"41-requirements",level:3},{value:"4.2. responsibility",id:"42-responsibility",level:3},{value:"4.4. permissions",id:"44-permissions",level:3},{value:"5. PMC",id:"5-pmc",level:2},{value:"5.1. requirements",id:"51-requirements",level:3},{value:"5.2. responsibility",id:"52-responsibility",level:3},{value:"5.3. permissions",id:"53-permissions",level:3}];function a(e){const i={h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.header,{children:(0,r.jsx)(i.h1,{id:"tugraph-community-roles",children:"TuGraph community roles"})}),"\n",(0,r.jsx)(i.h2,{id:"1-preface",children:"1. Preface"}),"\n",(0,r.jsx)(i.p,{children:"This document describes the roles of membership in the TuGraph community, the requirements and permissions for each role."}),"\n",(0,r.jsx)(i.h2,{id:"2-role-summary",children:"2. Role summary"}),"\n",(0,r.jsx)(i.p,{children:"This is the division of roles in the TuGraph community, describing the responsibilities of each role, the requirements to become and remain a role, and the permissions of the corresponding role."}),"\n",(0,r.jsx)(i.p,{children:"Our community is divided into three roles based on the Apache specification:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Contributor"}),"\n",(0,r.jsx)(i.li,{children:"Maintainer"}),"\n",(0,r.jsx)(i.li,{children:"PMC"}),"\n"]}),"\n",(0,r.jsx)(i.p,{children:"The requirements, responsibilities, and authorities for each role are described below."}),"\n",(0,r.jsx)(i.h2,{id:"3-contributor",children:"3. Contributor"}),"\n",(0,r.jsx)(i.h3,{id:"31-requirements",children:"3.1. requirements"}),"\n",(0,r.jsx)(i.p,{children:"Successfully submit a PR and merge in any of TuGraph's official projects."}),"\n",(0,r.jsx)(i.h3,{id:"32-responsibility",children:"3.2. responsibility"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Actively respond to issues or PR assigned to you"}),"\n",(0,r.jsx)(i.li,{children:"Help reply the issue/pr together and assign the issue to the person in charge of the corresponding module"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"33-permissions",children:"3.3. permissions"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Join the TuGraph GitHub organization and become a member of the TuGraph open source community."}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"4-maintainer",children:"4 Maintainer"}),"\n",(0,r.jsx)(i.h3,{id:"41-requirements",children:"4.1. requirements"}),"\n",(0,r.jsx)(i.p,{children:"The new Committer is recommended by the existing PMC and approved by 2/3 of the votes. The Commiter meets at least one of the following conditions:"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Been a community member for more than three months"}),"\n",(0,r.jsx)(i.li,{children:"More than 10 PR for PMC approve"}),"\n",(0,r.jsx)(i.li,{children:"Complete major functions"}),"\n",(0,r.jsx)(i.li,{children:"Fixed serious bugs"}),"\n",(0,r.jsx)(i.li,{children:"Follow project development and participate in community discussion"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"42-responsibility",children:"4.2. responsibility"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Community counseling support"}),"\n",(0,r.jsx)(i.li,{children:"Actively respond to issues or PR assigned to you"}),"\n",(0,r.jsx)(i.li,{children:"The right to vote on major community decisions"}),"\n",(0,r.jsx)(i.li,{children:"Review community PR"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"44-permissions",children:"4.4. permissions"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Pull Request review permission"}),"\n"]}),"\n",(0,r.jsx)(i.h2,{id:"5-pmc",children:"5. PMC"}),"\n",(0,r.jsx)(i.h3,{id:"51-requirements",children:"5.1. requirements"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Not open at the moment, if you have a strong desire please contact PMC"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"52-responsibility",children:"5.2. responsibility"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Actively participate in community discussions and give guidance to major community decisions"}),"\n",(0,r.jsx)(i.li,{children:"Responsible for ensuring that the community activities of open source projects are running smoothly"}),"\n"]}),"\n",(0,r.jsx)(i.h3,{id:"53-permissions",children:"5.3. permissions"}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsx)(i.li,{children:"Pull Request review permission"}),"\n",(0,r.jsx)(i.li,{children:"Pull Request approve permission"}),"\n",(0,r.jsx)(i.li,{children:"Community role member management"}),"\n"]})]})}function d(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,r.jsx)(i,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,i,n)=>{n.d(i,{R:()=>o,x:()=>l});var r=n(6540);const s={},t=r.createContext(s);function o(e){const i=r.useContext(t);return r.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(t.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d1d3a510.8f141c35.js b/assets/js/d1d3a510.94a4f7e7.js similarity index 98% rename from assets/js/d1d3a510.8f141c35.js rename to assets/js/d1d3a510.94a4f7e7.js index c63ce85ee9..b187862ae2 100644 --- a/assets/js/d1d3a510.8f141c35.js +++ b/assets/js/d1d3a510.94a4f7e7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6916],{5861:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>h});var r=t(4848),o=t(8453);const s={},a="Heterogeneous Graph",i={id:"olap&procedure/learn/heterogeneous_graph",title:"Heterogeneous Graph",description:"This document describes how to use heterogeneous graphs for training.",source:"@site/../docs/en-US/source/9.olap&procedure/3.learn/4.heterogeneous_graph.md",sourceDirName:"9.olap&procedure/3.learn",slug:"/olap&procedure/learn/heterogeneous_graph",permalink:"/tugraph-db/en/olap&procedure/learn/heterogeneous_graph",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Training",permalink:"/tugraph-db/en/olap&procedure/learn/training"},next:{title:"Privilege",permalink:"/tugraph-db/en/permission/privilege"}},d={},h=[{value:"1. Introduction to Heterogeneous Graph",id:"1-introduction-to-heterogeneous-graph",level:2},{value:"2. Creating a Heterogeneous Graph",id:"2-creating-a-heterogeneous-graph",level:2},{value:"3. Heterogeneous graph query interface",id:"3-heterogeneous-graph-query-interface",level:2},{value:"3.1 Querying Node Types",id:"31-querying-node-types",level:3},{value:"3.2 Querying Edge Types",id:"32-querying-edge-types",level:3},{value:"3.3 Querying Node and Edge Types",id:"33-querying-node-and-edge-types",level:3},{value:"4 Heterogeneous graph output format",id:"4-heterogeneous-graph-output-format",level:2},{value:"5. Training Heterogeneous Graphs",id:"5-training-heterogeneous-graphs",level:2}];function l(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"heterogeneous-graph",children:"Heterogeneous Graph"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"This document describes how to use heterogeneous graphs for training."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"1-introduction-to-heterogeneous-graph",children:"1. Introduction to Heterogeneous Graph"}),"\n",(0,r.jsx)(n.p,{children:"A heterogeneous graph is a graph structure composed of nodes and edges of different types. In a heterogeneous graph, nodes and edges can have diverse attributes and relationships, representing different entities and their complex associations."}),"\n",(0,r.jsx)(n.p,{children:"In a heterogeneous graph, node types can represent different entities such as users, products, topics, etc., while edge types represent the relationships between different entities, such as the follow relationship between users, or the purchase relationship between users and products. Nodes and edges can have different attributes."}),"\n",(0,r.jsx)(n.p,{children:"Heterogeneous graphs provide a powerful graph model that can better express and analyze real-world systems with multiple entity types and complex relationships. They have broad application prospects and research value in various fields of data analysis and applications."}),"\n",(0,r.jsx)(n.h2,{id:"2-creating-a-heterogeneous-graph",children:"2. Creating a Heterogeneous Graph"}),"\n",(0,r.jsx)(n.p,{children:"In TuGraph, a heterogeneous graph is composed of a series of edge relationships. Each relationship is defined by a triplet of strings: (source node type, edge type, target node type). The creation of a heterogeneous graph is similar to that of a homogeneous graph, but the triplet definition needs to be specified when creating the graph. The following example demonstrates:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:' olapondb = PyOlapOnDB(\'Empty\', db, txn, [("node", "edge", "node")])\n'})}),"\n",(0,r.jsx)(n.p,{children:"In the code snippet above, the fourth parameter is the edge relationship definition of the heterogeneous graph. By specifying this parameter, you can select specific node and edge types for graph construction and training. If this parameter is not specified, all node and edge types will be used for graph construction by default."}),"\n",(0,r.jsx)(n.h2,{id:"3-heterogeneous-graph-query-interface",children:"3. Heterogeneous graph query interface"}),"\n",(0,r.jsx)(n.p,{children:"To facilitate user usage, TuGraph provides interfaces for querying node and edge types when the fourth parameter is given. The following examples demonstrate these interfaces:"}),"\n",(0,r.jsx)(n.h3,{id:"31-querying-node-types",children:"3.1 Querying Node Types"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"olapondb.ntypes()\n"})}),"\n",(0,r.jsx)(n.p,{children:"The return value is a list of node types, such as ['node1', 'node2', 'node3']."}),"\n",(0,r.jsx)(n.h3,{id:"32-querying-edge-types",children:"3.2 Querying Edge Types"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"olapondb.etypes()\n"})}),"\n",(0,r.jsx)(n.p,{children:"The return value is a list of edge types, such as ['edge1', 'edge2', 'edge3']."}),"\n",(0,r.jsx)(n.h3,{id:"33-querying-node-and-edge-types",children:"3.3 Querying Node and Edge Types"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"olapondb.metagraph()\n"})}),"\n",(0,r.jsx)(n.p,{children:"The return value is a list of string triplets (source node type, edge type, target node type), such as\n[('node1', 'edge1', 'node2'), ('node2', 'edge2', 'node3')]."}),"\n",(0,r.jsx)(n.h2,{id:"4-heterogeneous-graph-output-format",children:"4 Heterogeneous graph output format"}),"\n",(0,r.jsx)(n.p,{children:"The same as the homogeneous graph, the sampling data results of the heterogeneous graph are also stored in NodeInfo and EdgeInfo.\nOutput data can be obtained in the following ways."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:" NodeInfo = []\n EdgeInfo = []\n getdb.Process(db, olapondb, feature_len, NodeInfo, EdgeInfo)\n"})}),"\n",(0,r.jsx)(n.p,{children:"The result of its stored information is as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Graph Data"}),(0,r.jsx)(n.th,{children:"Storage Location"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Edge Source"}),(0,r.jsx)(n.td,{children:"EdgeInfo[0]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Edge Destination"}),(0,r.jsx)(n.td,{children:"EdgeInfo[1]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Edge Type"}),(0,r.jsx)(n.td,{children:"EdgeInfo[2]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Vertex ID"}),(0,r.jsx)(n.td,{children:"NodeInfo[0]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Vertex Feature"}),(0,r.jsx)(n.td,{children:"NodeInfo[1]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Vertex Label"}),(0,r.jsx)(n.td,{children:"NodeInfo[2]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Vertex Type"}),(0,r.jsx)(n.td,{children:"NodeInfo[3]"})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"5-training-heterogeneous-graphs",children:"5. Training Heterogeneous Graphs"}),"\n",(0,r.jsx)(n.p,{children:"The goal of training a heterogeneous graph is to learn the representation of nodes and edges in the graph for subsequent tasks such as node classification, link prediction, and graph clustering. To achieve this goal, researchers have proposed a variety of models based on graph neural networks (GNNs). These models update the representation of nodes by aggregating the information of neighboring nodes, thereby capturing the complex relationships in the graph structure."}),"\n",(0,r.jsx)(n.p,{children:"Since heterogeneous graphs contain nodes and edges of multiple types, it is necessary to consider how to process these different types of information when designing GNN models. One common approach is to design different aggregation functions to process different types of neighboring nodes. In addition, it is also necessary to consider how to integrate these different types of information together so that the model can effectively learn the representation of nodes and edges."}),"\n",(0,r.jsx)(n.p,{children:"TuGraph provides a method for training heterogeneous graphs using the ogbn-mag dataset, which can be used for reference."}),"\n",(0,r.jsx)(n.p,{children:"The official docker provided by TuGraph does not yet provide an environment for heterogeneous graph training, so users need to install relevant dependency packages by themselves.\nBefore training, you need to download the ogb and pandas packages. The specific installation method is as follows:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"pip3 install ogb\npip3 install pandas==0.24.2\n"})}),"\n",(0,r.jsx)(n.p,{children:"The training code looks like this:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"def train(graph, model, model_save_path):\n optimizer = torch.optim.Adam(model.parameters(), lr=1e-2, weight_decay=5e-4)\n model.train()\n s = time.time()\n load_time = time.time()\n graph = dgl.add_self_loop(graph)\n logits = model(graph, graph.ndata['feat'])\n loss = loss_fcn(logits, graph.ndata['label'])\n optimizer.zero_grad()\n loss.backward()\n optimizer.step()\n train_time = time.time()\n # print('load time', load_time - s, 'train_time', train_time - load_time)\n current_loss = float(loss)\n if model_save_path != \"\":\n if 'min_loss' not in train.__dict__:\n train.min_loss = current_loss\n elif current_loss < train.min_loss:\n train.min_loss = current_loss\n model_save_path = 'best_model.pth'\n torch.save(model.state_dict(), model_save_path)\n return current_loss\n"})}),"\n",(0,r.jsx)(n.p,{children:"The complete training code can be found in tugraph/learn/examples/train_full_mag.py."})]})}function p(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>i});var r=t(6540);const o={},s=r.createContext(o);function a(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6916],{5861:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>i,toc:()=>h});var r=t(4848),o=t(8453);const s={},a="Heterogeneous Graph",i={id:"olap&procedure/learn/heterogeneous_graph",title:"Heterogeneous Graph",description:"This document describes how to use heterogeneous graphs for training.",source:"@site/../docs/en-US/source/9.olap&procedure/3.learn/4.heterogeneous_graph.md",sourceDirName:"9.olap&procedure/3.learn",slug:"/olap&procedure/learn/heterogeneous_graph",permalink:"/tugraph-db/en/olap&procedure/learn/heterogeneous_graph",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Training",permalink:"/tugraph-db/en/olap&procedure/learn/training"},next:{title:"Privilege",permalink:"/tugraph-db/en/permission/privilege"}},d={},h=[{value:"1. Introduction to Heterogeneous Graph",id:"1-introduction-to-heterogeneous-graph",level:2},{value:"2. Creating a Heterogeneous Graph",id:"2-creating-a-heterogeneous-graph",level:2},{value:"3. Heterogeneous graph query interface",id:"3-heterogeneous-graph-query-interface",level:2},{value:"3.1 Querying Node Types",id:"31-querying-node-types",level:3},{value:"3.2 Querying Edge Types",id:"32-querying-edge-types",level:3},{value:"3.3 Querying Node and Edge Types",id:"33-querying-node-and-edge-types",level:3},{value:"4 Heterogeneous graph output format",id:"4-heterogeneous-graph-output-format",level:2},{value:"5. Training Heterogeneous Graphs",id:"5-training-heterogeneous-graphs",level:2}];function l(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"heterogeneous-graph",children:"Heterogeneous Graph"})}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"This document describes how to use heterogeneous graphs for training."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"1-introduction-to-heterogeneous-graph",children:"1. Introduction to Heterogeneous Graph"}),"\n",(0,r.jsx)(n.p,{children:"A heterogeneous graph is a graph structure composed of nodes and edges of different types. In a heterogeneous graph, nodes and edges can have diverse attributes and relationships, representing different entities and their complex associations."}),"\n",(0,r.jsx)(n.p,{children:"In a heterogeneous graph, node types can represent different entities such as users, products, topics, etc., while edge types represent the relationships between different entities, such as the follow relationship between users, or the purchase relationship between users and products. Nodes and edges can have different attributes."}),"\n",(0,r.jsx)(n.p,{children:"Heterogeneous graphs provide a powerful graph model that can better express and analyze real-world systems with multiple entity types and complex relationships. They have broad application prospects and research value in various fields of data analysis and applications."}),"\n",(0,r.jsx)(n.h2,{id:"2-creating-a-heterogeneous-graph",children:"2. Creating a Heterogeneous Graph"}),"\n",(0,r.jsx)(n.p,{children:"In TuGraph, a heterogeneous graph is composed of a series of edge relationships. Each relationship is defined by a triplet of strings: (source node type, edge type, target node type). The creation of a heterogeneous graph is similar to that of a homogeneous graph, but the triplet definition needs to be specified when creating the graph. The following example demonstrates:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:' olapondb = PyOlapOnDB(\'Empty\', db, txn, [("node", "edge", "node")])\n'})}),"\n",(0,r.jsx)(n.p,{children:"In the code snippet above, the fourth parameter is the edge relationship definition of the heterogeneous graph. By specifying this parameter, you can select specific node and edge types for graph construction and training. If this parameter is not specified, all node and edge types will be used for graph construction by default."}),"\n",(0,r.jsx)(n.h2,{id:"3-heterogeneous-graph-query-interface",children:"3. Heterogeneous graph query interface"}),"\n",(0,r.jsx)(n.p,{children:"To facilitate user usage, TuGraph provides interfaces for querying node and edge types when the fourth parameter is given. The following examples demonstrate these interfaces:"}),"\n",(0,r.jsx)(n.h3,{id:"31-querying-node-types",children:"3.1 Querying Node Types"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"olapondb.ntypes()\n"})}),"\n",(0,r.jsx)(n.p,{children:"The return value is a list of node types, such as ['node1', 'node2', 'node3']."}),"\n",(0,r.jsx)(n.h3,{id:"32-querying-edge-types",children:"3.2 Querying Edge Types"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"olapondb.etypes()\n"})}),"\n",(0,r.jsx)(n.p,{children:"The return value is a list of edge types, such as ['edge1', 'edge2', 'edge3']."}),"\n",(0,r.jsx)(n.h3,{id:"33-querying-node-and-edge-types",children:"3.3 Querying Node and Edge Types"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"olapondb.metagraph()\n"})}),"\n",(0,r.jsx)(n.p,{children:"The return value is a list of string triplets (source node type, edge type, target node type), such as\n[('node1', 'edge1', 'node2'), ('node2', 'edge2', 'node3')]."}),"\n",(0,r.jsx)(n.h2,{id:"4-heterogeneous-graph-output-format",children:"4 Heterogeneous graph output format"}),"\n",(0,r.jsx)(n.p,{children:"The same as the homogeneous graph, the sampling data results of the heterogeneous graph are also stored in NodeInfo and EdgeInfo.\nOutput data can be obtained in the following ways."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:" NodeInfo = []\n EdgeInfo = []\n getdb.Process(db, olapondb, feature_len, NodeInfo, EdgeInfo)\n"})}),"\n",(0,r.jsx)(n.p,{children:"The result of its stored information is as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Graph Data"}),(0,r.jsx)(n.th,{children:"Storage Location"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Edge Source"}),(0,r.jsx)(n.td,{children:"EdgeInfo[0]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Edge Destination"}),(0,r.jsx)(n.td,{children:"EdgeInfo[1]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Edge Type"}),(0,r.jsx)(n.td,{children:"EdgeInfo[2]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Vertex ID"}),(0,r.jsx)(n.td,{children:"NodeInfo[0]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Vertex Feature"}),(0,r.jsx)(n.td,{children:"NodeInfo[1]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Vertex Label"}),(0,r.jsx)(n.td,{children:"NodeInfo[2]"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Vertex Type"}),(0,r.jsx)(n.td,{children:"NodeInfo[3]"})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"5-training-heterogeneous-graphs",children:"5. Training Heterogeneous Graphs"}),"\n",(0,r.jsx)(n.p,{children:"The goal of training a heterogeneous graph is to learn the representation of nodes and edges in the graph for subsequent tasks such as node classification, link prediction, and graph clustering. To achieve this goal, researchers have proposed a variety of models based on graph neural networks (GNNs). These models update the representation of nodes by aggregating the information of neighboring nodes, thereby capturing the complex relationships in the graph structure."}),"\n",(0,r.jsx)(n.p,{children:"Since heterogeneous graphs contain nodes and edges of multiple types, it is necessary to consider how to process these different types of information when designing GNN models. One common approach is to design different aggregation functions to process different types of neighboring nodes. In addition, it is also necessary to consider how to integrate these different types of information together so that the model can effectively learn the representation of nodes and edges."}),"\n",(0,r.jsx)(n.p,{children:"TuGraph provides a method for training heterogeneous graphs using the ogbn-mag dataset, which can be used for reference."}),"\n",(0,r.jsx)(n.p,{children:"The official docker provided by TuGraph does not yet provide an environment for heterogeneous graph training, so users need to install relevant dependency packages by themselves.\nBefore training, you need to download the ogb and pandas packages. The specific installation method is as follows:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"pip3 install ogb\npip3 install pandas==0.24.2\n"})}),"\n",(0,r.jsx)(n.p,{children:"The training code looks like this:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-python",children:"def train(graph, model, model_save_path):\n optimizer = torch.optim.Adam(model.parameters(), lr=1e-2, weight_decay=5e-4)\n model.train()\n s = time.time()\n load_time = time.time()\n graph = dgl.add_self_loop(graph)\n logits = model(graph, graph.ndata['feat'])\n loss = loss_fcn(logits, graph.ndata['label'])\n optimizer.zero_grad()\n loss.backward()\n optimizer.step()\n train_time = time.time()\n # print('load time', load_time - s, 'train_time', train_time - load_time)\n current_loss = float(loss)\n if model_save_path != \"\":\n if 'min_loss' not in train.__dict__:\n train.min_loss = current_loss\n elif current_loss < train.min_loss:\n train.min_loss = current_loss\n model_save_path = 'best_model.pth'\n torch.save(model.state_dict(), model_save_path)\n return current_loss\n"})}),"\n",(0,r.jsx)(n.p,{children:"The complete training code can be found in tugraph/learn/examples/train_full_mag.py."})]})}function p(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>i});var r=t(6540);const o={},s=r.createContext(o);function a(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e166abdf.75ee1bff.js b/assets/js/e166abdf.1ade5365.js similarity index 98% rename from assets/js/e166abdf.75ee1bff.js rename to assets/js/e166abdf.1ade5365.js index 1f901840e0..ee3e30c470 100644 --- a/assets/js/e166abdf.75ee1bff.js +++ b/assets/js/e166abdf.1ade5365.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[214],{2536:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>u});var r=n(4848),i=n(8453);const a={},o="Architecture",s={id:"introduction/architecture",title:"Architecture",description:"This document mainly introduces the product architecture of TuGraph.",source:"@site/../docs/en-US/source/2.introduction/6.architecture.md",sourceDirName:"2.introduction",slug:"/introduction/architecture",permalink:"/tugraph-db/en/introduction/architecture",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:6,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"HTAP",permalink:"/tugraph-db/en/introduction/characteristics/htap"},next:{title:"Functionality",permalink:"/tugraph-db/en/introduction/functionality"}},c={},u=[{value:"1.Introduction",id:"1introduction",level:2}];function l(e){const t={blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"architecture",children:"Architecture"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"This document mainly introduces the product architecture of TuGraph."}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Architecture",src:n(6915).A+"",width:"1074",height:"522"})}),"\n",(0,r.jsx)(t.p,{children:"The following diagram shows the overall architecture of an enterprise-level graph database from the perspective of functional modules, using TuGraph as an example, from bottom to top:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Software and hardware environment. This involves the development and use environment of the graph database. TuGraph is mainly developed based on the underlying C++ language, and is compatible with most operating systems and CPUs on the market."}),"\n",(0,r.jsx)(t.li,{children:"Storage layer, including the KV storage layer and the graph storage layer. The storage layer needs to support various functions required by the calculation layer."}),"\n",(0,r.jsx)(t.li,{children:"Calculation layer. The calculation layer should include the graph transaction engine, graph analysis engine, and graph neural network engine. It also includes a variety of programming interfaces provided by the server, including descriptive query language Cypher, stored procedures, and so on."}),"\n",(0,r.jsx)(t.li,{children:"Client. The client SDK should support multiple languages such as Java, Python, and C++, and also support command-line interaction. The Browser and Explorer reduce the threshold for using the graph database through web-based interaction."}),"\n",(0,r.jsx)(t.li,{children:"In terms of ecological tools, it covers the development, operation, and management links of enterprise-level graph databases, improving usability."}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},6915:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/architecture-en-6f0f1b61b5aa56a47aa991d2cdd3b41a.png"},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>s});var r=n(6540);const i={},a=r.createContext(i);function o(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[214],{2536:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>u});var r=n(4848),i=n(8453);const a={},o="Architecture",s={id:"introduction/architecture",title:"Architecture",description:"This document mainly introduces the product architecture of TuGraph.",source:"@site/../docs/en-US/source/2.introduction/6.architecture.md",sourceDirName:"2.introduction",slug:"/introduction/architecture",permalink:"/tugraph-db/en/introduction/architecture",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:6,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"HTAP",permalink:"/tugraph-db/en/introduction/characteristics/htap"},next:{title:"Functionality",permalink:"/tugraph-db/en/introduction/functionality"}},c={},u=[{value:"1.Introduction",id:"1introduction",level:2}];function l(e){const t={blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",img:"img",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.header,{children:(0,r.jsx)(t.h1,{id:"architecture",children:"Architecture"})}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"This document mainly introduces the product architecture of TuGraph."}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Architecture",src:n(6915).A+"",width:"1074",height:"522"})}),"\n",(0,r.jsx)(t.p,{children:"The following diagram shows the overall architecture of an enterprise-level graph database from the perspective of functional modules, using TuGraph as an example, from bottom to top:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Software and hardware environment. This involves the development and use environment of the graph database. TuGraph is mainly developed based on the underlying C++ language, and is compatible with most operating systems and CPUs on the market."}),"\n",(0,r.jsx)(t.li,{children:"Storage layer, including the KV storage layer and the graph storage layer. The storage layer needs to support various functions required by the calculation layer."}),"\n",(0,r.jsx)(t.li,{children:"Calculation layer. The calculation layer should include the graph transaction engine, graph analysis engine, and graph neural network engine. It also includes a variety of programming interfaces provided by the server, including descriptive query language Cypher, stored procedures, and so on."}),"\n",(0,r.jsx)(t.li,{children:"Client. The client SDK should support multiple languages such as Java, Python, and C++, and also support command-line interaction. The Browser and Explorer reduce the threshold for using the graph database through web-based interaction."}),"\n",(0,r.jsx)(t.li,{children:"In terms of ecological tools, it covers the development, operation, and management links of enterprise-level graph databases, improving usability."}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},6915:(e,t,n)=>{n.d(t,{A:()=>r});const r=n.p+"assets/images/architecture-en-6f0f1b61b5aa56a47aa991d2cdd3b41a.png"},8453:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>s});var r=n(6540);const i={},a=r.createContext(i);function o(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e1aa53d6.9db38469.js b/assets/js/e1aa53d6.f4182e93.js similarity index 99% rename from assets/js/e1aa53d6.9db38469.js rename to assets/js/e1aa53d6.f4182e93.js index 29386545f0..024b8f10dd 100644 --- a/assets/js/e1aa53d6.9db38469.js +++ b/assets/js/e1aa53d6.f4182e93.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3657],{7061:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>o});var t=r(4848),s=r(8453);const i={},a="Tugraph Running",l={id:"installation&running/tugraph-running",title:"Tugraph Running",description:"This document describes the operation mode of the TuGraph service, starting, stopping, and restarting operations.And TuGraph's service configuration parameters, configuration file format, and command-line configuration parameters.",source:"@site/../docs/en-US/source/5.installation&running/7.tugraph-running.md",sourceDirName:"5.installation&running",slug:"/installation&running/tugraph-running",permalink:"/tugraph-db/en/installation&running/tugraph-running",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:7,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Compile",permalink:"/tugraph-db/en/installation&running/compile"},next:{title:"High Availability mode",permalink:"/tugraph-db/en/installation&running/high-availability-mode"}},d={},o=[{value:"1. Prerequisites",id:"1-prerequisites",level:2},{value:"2.The operation mode",id:"2the-operation-mode",level:2},{value:"2.1.Running a normal process",id:"21running-a-normal-process",level:3},{value:"2.2.Run process daemon mode",id:"22run-process-daemon-mode",level:3},{value:"3.Service operation",id:"3service-operation",level:2},{value:"3.1.Start the service",id:"31start-the-service",level:3},{value:"3.2.Stop the service",id:"32stop-the-service",level:3},{value:"3.3.Restart the service",id:"33restart-the-service",level:3},{value:"3.4.Switch between old and new front-end",id:"34switch-between-old-and-new-front-end",level:3},{value:"4.Service configuration",id:"4service-configuration",level:2},{value:"4.1.Configuration parameters",id:"41configuration-parameters",level:3},{value:"4.2.Server configuration file",id:"42server-configuration-file",level:3}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",nobr:"nobr",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"tugraph-running",children:"Tugraph Running"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document describes the operation mode of the TuGraph service, starting, stopping, and restarting operations.And TuGraph's service configuration parameters, configuration file format, and command-line configuration parameters."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1-prerequisites",children:"1. Prerequisites"}),"\n",(0,t.jsxs)(n.p,{children:["TuGraph has the following prerequisites for its execution: a correct ",(0,t.jsx)(n.a,{href:"/tugraph-db/en/installation&running/environment",children:"installation of TuGraph"}),"."]}),"\n",(0,t.jsx)(n.p,{children:'TuGraph execution requires ensuring that the library file "liblgraph.so" is located in the environment variable LD_LIBRARY_PATH.'}),"\n",(0,t.jsx)(n.p,{children:"The user running the TuGraph process does not need superuser privileges. However, they need read permissions for the configuration file (usually lgraph.json) and any files referenced within it. Additionally, they should have write permissions for data folders, log files, etc."}),"\n",(0,t.jsx)(n.h2,{id:"2the-operation-mode",children:"2.The operation mode"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph can be started as a normal process in the foreground or as a daemon in the background."}),"\n",(0,t.jsx)(n.p,{children:"When running as a normal process, TuGraph can print logs directly to the terminal, which is handy when debugging server configurations. However, because the foreground process is terminated after the terminal exits, the user must ensure that the terminal remains open while the TuGraph server is running. In daemon mode, on the other hand, the TuGraph server can continue to run even if the terminal that started it exits. If TuGraph needs to run for a long time, it is recommended to start the TuGraph server in daemon mode."}),"\n",(0,t.jsx)(n.h3,{id:"21running-a-normal-process",children:"2.1.Running a normal process"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"lgraph_server -d run"})," command runs TuGraph as a normal process. Normal processes depend on the command line terminal, so when the terminal ends, the TuGraph process is automatically terminated. Normal process mode with ",(0,t.jsx)(n.code,{children:'--log_dir ""'})," can output the process log directly to the terminal, so it is easier to debug.Note: When not using the ",(0,t.jsx)(n.code,{children:"-d run"})," command, the default behavior is to run as a normal process."]}),"\n",(0,t.jsx)(n.p,{children:"The default path for lgraph_server is: /usr/local/bin/lgraph_server."}),"\n",(0,t.jsx)(n.p,{children:"The default path for lgraph.json is: /usr/local/etc/lgraph.json."}),"\n",(0,t.jsx)(n.p,{children:"Start the command\uff1a"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:'$ ./lgraph_server -d run -c lgraph.json --log_dir ""\n'})}),"\n",(0,t.jsx)(n.p,{children:"or:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:'$ ./lgraph_server -c lgraph.json --log_dir ""\n'})}),"\n",(0,t.jsx)(n.p,{children:"Example of running output in normal mode\uff1a"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:'**********************************************************************\n* TuGraph Graph Database v4.3.2 *\n* *\n* Copyright(C) 2018-2023 Ant Group. All rights reserved. *\n* *\n**********************************************************************\nServer is configured with the following parameters:\n Backup log enable: 0\n DB directory: /var/lib/lgraph/data\n HA enable: 0\n HTTP port: 7070\n HTTP web dir: /usr/local/share/lgraph/browser-resource\n RPC enable: 1\n RPC port: 9090\n SSL enable: 0\n Whether the token is unlimited: 0\n audit log enable: 0\n bind host: 0.0.0.0\n bolt port: 7687\n disable auth: 0\n durable: 0\n log dir: ""\n log verbose: 1\n number of bolt io threads: 1\n optimistic transaction: 0\n reset admin password if you forget: 0\n subprocess idle limit: 600\n thread limit: 0\n[20240730 15:34:27.848783 0x00007f81bb3889c0 INFO src/server/lgraph_server.h:78] [StateMachine] Builtin services are disabled according to ServerOptions.has_builtin_services\n[20240730 15:34:27.849116 0x00007f81bb3889c0 INFO src/server/lgraph_server.cpp:268] Listening for RPC on port 9090\n[20240730 15:34:27.868819 0x00007f81bb3889c0 INFO src/restful/server/rest_server.cpp:479] Listening for REST on port 7070\n[20240730 15:34:27.869970 0x00006e7d435ff700 INFO src/server/bolt_server.cpp:36] bolt server run\n[20240730 15:34:27.870040 0x00007f81bb3889c0 INFO src/server/lgraph_server.cpp:302] Server started.\n'})}),"\n",(0,t.jsx)(n.p,{children:"In normal process mode, the user can prematurely terminate the TuGraph process by pressing 'CTRL+C'."}),"\n",(0,t.jsx)(n.h3,{id:"22run-process-daemon-mode",children:"2.2.Run process daemon mode"}),"\n",(0,t.jsx)(n.p,{children:"Start the command\uff1a"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"$ ./lgraph_server -d start -c lgraph.json\n"})}),"\n",(0,t.jsx)(n.p,{children:"Example output from running in daemon mode:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"Starting lgraph...\nThe service process is started at pid 12109.\n"})}),"\n",(0,t.jsx)(n.p,{children:"The TuGraph server process started by this command is a daemon process that loads the relevant configuration from the file 'lgraph.json'. After the server starts, it will start printing logs in a log file that can then be used to determine the status of the server."}),"\n",(0,t.jsx)(n.h2,{id:"3service-operation",children:"3.Service operation"}),"\n",(0,t.jsx)(n.h3,{id:"31start-the-service",children:"3.1.Start the service"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph needs to be started using the 'lgraph_server -d start' command line. The following is an example of the command to start TuGraph:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ ./lgraph_server -d start -c lgraph.json\nStarting lgraph...\nThe service process is started at pid 12109.\n"})}),"\n",(0,t.jsx)(n.p,{children:"The TuGraph server process started by this command is a daemon process that loads the relevant configuration from the file 'lgraph.json'. After the server starts, it will start printing logs in a log file that can then be used to determine the status of the server."}),"\n",(0,t.jsx)(n.h3,{id:"32stop-the-service",children:"3.2.Stop the service"}),"\n",(0,t.jsx)(n.p,{children:"You can stop the TuGraph daemon using the 'kill' command and the 'lgraph_server -d stop' command. Since it is possible to run multiple TuGraph server processes on the same computer, we distinguish between the different server processes using the '.pid 'file, which is written to the working directory where the process was started. Therefore, you need to run the command 'lgraph_server-d stop' in the same working directory to stop the correct server process."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"user@host:~/tugraph$ ./lgraph_server -d start -c lgraph.json\n20200508122306.378: Starting lgraph...\n20200508122306.379: The service process is started at pid 93.\n\nuser@host:~/tugraph$ cat ./lgraph.pid\n93\n\nuser@host:~/tugraph$ ./lgraph_server -d stop -c lgraph.json\n20200508122334.857: Stopping lgraph...\n20200508122334.857: Process stopped.\n"})}),"\n",(0,t.jsx)(n.h3,{id:"33restart-the-service",children:"3.3.Restart the service"}),"\n",(0,t.jsx)(n.p,{children:"Users can also restart the TuGraph service by 'lgraph_server -d restart' :"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ ./lgraph_server -d restart\nStopping lgraph...\nProcess stopped.\nStarting lgraph...\nThe service process is started at pid 20899.\n"})}),"\n",(0,t.jsx)(n.h3,{id:"34switch-between-old-and-new-front-end",children:"3.4.Switch between old and new front-end"}),"\n",(0,t.jsxs)(n.p,{children:['To access the container and choose between the old and new versions of the frontend, modify the configuration file located at "/usr/local/etc/lgraph.json". For the old version, change the value of the "web" parameter to "/usr/local/share/lgraph/resource"; for the new version, set it to "/usr/local/share/lgraph/browser-resource". Once you\'ve finished editing the configuration file, run the command ',(0,t.jsx)(n.code,{children:"docker restart tugraph"})," to apply the changes. Bear in mind that the new version is the default selection."]}),"\n",(0,t.jsx)(n.h2,{id:"4service-configuration",children:"4.Service configuration"}),"\n",(0,t.jsx)(n.p,{children:"The TuGraph server loads configurations from the configuration file and command line options at startup, and if different values are specified for the same option in the configuration file and command line, the value specified in the command line will be used preferentially."}),"\n",(0,t.jsx)(n.h3,{id:"41configuration-parameters",children:"4.1.Configuration parameters"}),"\n",(0,t.jsx)(n.p,{children:"The parameters and their types are described as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:(0,t.jsx)(n.strong,{children:"Parameter names"})}),(0,t.jsx)(n.th,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.nobr,{children:"Type"})})}),(0,t.jsx)(n.th,{children:(0,t.jsx)(n.strong,{children:"Instructions"})})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"directory"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Directory where data files are stored. If the directory does not exist, it is automatically created. The default directory is /var/lib/lgraph/data."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"durable"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsxs)(n.td,{children:["Whether to enable real-time persistence. Turning off persistence can reduce the disk IO overhead when writing, but data may be lost in extreme cases such as machine power failure. The default value is ",(0,t.jsx)(n.code,{children:"true"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"host"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"The IP address on which the REST server listens. The default address is 0.0.0.0. Note: In HA mode, the host needs to be set to the IP address of the corresponding server and cannot be set to 0.0.0.0."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"port"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"The Port on which the REST server listens. The default port is 7070."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"enable_rpc"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Whether to use RPC services. The default value is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"rpc_port"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Port used by RPC and HA services. The default port number is 9090."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"bolt_port"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Port used by Bolt Client. The default port number is 7687."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"enable_ha"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Whether to enable the HA mode. The default value is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_log_dir"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"HA log directory. The HA mode needs to be enabled. The default value is null."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"verbose"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Detail level of log output information. The value can be 0,1,2. The larger the value, the more detailed the output information. The default value is 1."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"log_dir"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Directory where log files are stored. The default directory is /var/log/lgraph/."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ssl_auth"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Whether to use SSL authentication. When HTTPS is enabled, only the HTTPS service is enabled on the REST server. The default value is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"web"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"The storage location for web files (including visualization components) is set by default in the directory /usr/local/share/lgraph/browser-resource. For previous older versions, this directory was situated at /usr/local/share/lgraph/resource ."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"server_cert"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"certificate file path used by the server when SSL authentication is enabled. The default path is/usr/local/etc/lgraph/server - cert.pem."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"server_key"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"The public key file used by the server when SSL authentication is enabled. The default directory is/usr/local/etc/lgraph/server - key.pem\u3002"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"enable_audit_log"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Whether to enable audit logs. The default value is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"audit_log_expire"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"When audit logs are enabled, the validity period (hours) of audit logs is automatically cleared upon timeout. If the value is 0, the logs are not cleared. The default value is 0."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"audit_log_dir"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Specifies the directory for storing log files when audit logs are enabled. The default directory is $directory/",(0,t.jsx)(n.em,{children:"audit_log"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"load_plugins"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Import all stored procedures when starting the service. The default value is true."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"optimistic_txn"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Enable optimistic multithreaded write transactions for Cypher. The default is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"disable_auth"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Disable REST authentication. The default is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_snapshot_interval_s"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Snapshot interval (in seconds). The default value is 604800. -1 means not to automatically generate snapshots."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_heartbeat_interval_ms"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Heartbeat interval in milliseconds. The default value is 1000."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_node_offline_ms"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"The heartbeat times out and the interval (in milliseconds) between nodes going offline. The default value is 60000."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_node_remove_ms"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"The interval (in milliseconds) at which a node is considered completely dead and removed from the list. The default value is 120000."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_first_snapshot_start_time"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:'The time when the first snapshot is taken, the format is "HH:MM:SS", which means the first snapshot is taken at the next HH:MM:SS time point, and then every ha_snapshot_interval_s seconds. The default value is "", which means that the first snapshot is taken randomly at any time within 0-ha_snapshot_interval_s, and then a snapshot is taken every ha_snapshot_interval_s seconds.'})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"enable_ip_check"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Allow IP address whitelists. The default value is false\u3002"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"idle_seconds"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"The maximum number of seconds a child process can be idle. The default value is 600."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"enable_backup_log"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Whether to enable backup logging. The default value is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"backup_log_dir"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"The directory where backup files are stored. The default value is null."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"snapshot_dir"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Directory where snapshot files are stored. The default value is null."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"thread_limit"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"The maximum number of threads that can be used simultaneously. The default value is 0, which means that no restriction is imposed. The license file prevails."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"unlimited_token"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Whether to set the link token to be infinite. The default value is false and the validity period is 24 hours."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"reset_admin_password"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:'Whether to reset the password. The default value is false. When the value is true, the password will be reset to "73@TuGraph"\u3002'})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"enable_fulltext_index"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Whether to enable the full-text index function, the default value is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"fulltext_analyzer"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Full-text index tokenizer type. Can be set to ",(0,t.jsx)(n.code,{children:"StandardAnalyzer"})," or ",(0,t.jsx)(n.code,{children:"SmartChineseAnalyzer"}),". Default is ",(0,t.jsx)(n.code,{children:"StandardAnalyzer"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"fulltext_commit_interval"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Full-text index data submission period, for write operations, in seconds. The default is 0, which commits immediately."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"fulltext_refresh_interval"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Full-text index data refresh cycle, for read operations, in seconds. The default is 0, and the latest written data can be read immediately."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_conf"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Initialize the HA cluster according to host1:port1,host2:port2,host3:port3, the default value is empty."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_node_join_group_s"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"The waiting time for a node to try to join the high availability cluster, in seconds, the default is 10."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_bootstrap_role"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Whether to use bootstrap to start, and the server role to start using this method, 0 means not to use bootstrap to start, 1 means to use bootstrap to start and this node is a leader, 2 means to use bootstrap to start and this node is a follower, only these 3 options. The default value is 0."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"help"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Print the help message. The default value is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"browser.credential_timeout"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Browser cache expiration time for usernames and passwords."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"browser.retain_connection_credentials"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"whether the browser caches usernames and passwords.."})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"42server-configuration-file",children:"4.2.Server configuration file"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph's configuration file is stored in JSON format. It is recommended that most configuration be stored in configuration files and that some configuration parameters be modified only temporarily using command-line options when needed."}),"\n",(0,t.jsx)(n.p,{children:"A typical configuration file looks like this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "directory" : "/var/lib/lgraph/data",\n "host" : "0.0.0.0",\n "port" : 7070,\n "rpc_port" : 9090,\n "enable_rpc" : true,\n "bolt_port": 7687,\n "enable_ha" : false,\n "verbose" : 1,\n "log_dir" : "/var/log/lgraph_log",\n "disable_auth" : false,\n "ssl_auth" : false,\n "server_key" : "/usr/local/etc/lgraph/server-key.pem",\n "server_cert" : "/usr/local/etc/lgraph/server-cert.pem",\n "web" : "/usr/local/share/lgraph/browser-resource"\n}\n'})})]})}function c(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>a,x:()=>l});var t=r(6540);const s={},i=t.createContext(s);function a(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[3657],{7061:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>c,frontMatter:()=>i,metadata:()=>l,toc:()=>o});var t=r(4848),s=r(8453);const i={},a="Tugraph Running",l={id:"installation&running/tugraph-running",title:"Tugraph Running",description:"This document describes the operation mode of the TuGraph service, starting, stopping, and restarting operations.And TuGraph's service configuration parameters, configuration file format, and command-line configuration parameters.",source:"@site/../docs/en-US/source/5.installation&running/7.tugraph-running.md",sourceDirName:"5.installation&running",slug:"/installation&running/tugraph-running",permalink:"/tugraph-db/en/installation&running/tugraph-running",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:7,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Compile",permalink:"/tugraph-db/en/installation&running/compile"},next:{title:"High Availability mode",permalink:"/tugraph-db/en/installation&running/high-availability-mode"}},d={},o=[{value:"1. Prerequisites",id:"1-prerequisites",level:2},{value:"2.The operation mode",id:"2the-operation-mode",level:2},{value:"2.1.Running a normal process",id:"21running-a-normal-process",level:3},{value:"2.2.Run process daemon mode",id:"22run-process-daemon-mode",level:3},{value:"3.Service operation",id:"3service-operation",level:2},{value:"3.1.Start the service",id:"31start-the-service",level:3},{value:"3.2.Stop the service",id:"32stop-the-service",level:3},{value:"3.3.Restart the service",id:"33restart-the-service",level:3},{value:"3.4.Switch between old and new front-end",id:"34switch-between-old-and-new-front-end",level:3},{value:"4.Service configuration",id:"4service-configuration",level:2},{value:"4.1.Configuration parameters",id:"41configuration-parameters",level:3},{value:"4.2.Server configuration file",id:"42server-configuration-file",level:3}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",nobr:"nobr",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"tugraph-running",children:"Tugraph Running"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document describes the operation mode of the TuGraph service, starting, stopping, and restarting operations.And TuGraph's service configuration parameters, configuration file format, and command-line configuration parameters."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1-prerequisites",children:"1. Prerequisites"}),"\n",(0,t.jsxs)(n.p,{children:["TuGraph has the following prerequisites for its execution: a correct ",(0,t.jsx)(n.a,{href:"/tugraph-db/en/installation&running/environment",children:"installation of TuGraph"}),"."]}),"\n",(0,t.jsx)(n.p,{children:'TuGraph execution requires ensuring that the library file "liblgraph.so" is located in the environment variable LD_LIBRARY_PATH.'}),"\n",(0,t.jsx)(n.p,{children:"The user running the TuGraph process does not need superuser privileges. However, they need read permissions for the configuration file (usually lgraph.json) and any files referenced within it. Additionally, they should have write permissions for data folders, log files, etc."}),"\n",(0,t.jsx)(n.h2,{id:"2the-operation-mode",children:"2.The operation mode"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph can be started as a normal process in the foreground or as a daemon in the background."}),"\n",(0,t.jsx)(n.p,{children:"When running as a normal process, TuGraph can print logs directly to the terminal, which is handy when debugging server configurations. However, because the foreground process is terminated after the terminal exits, the user must ensure that the terminal remains open while the TuGraph server is running. In daemon mode, on the other hand, the TuGraph server can continue to run even if the terminal that started it exits. If TuGraph needs to run for a long time, it is recommended to start the TuGraph server in daemon mode."}),"\n",(0,t.jsx)(n.h3,{id:"21running-a-normal-process",children:"2.1.Running a normal process"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"lgraph_server -d run"})," command runs TuGraph as a normal process. Normal processes depend on the command line terminal, so when the terminal ends, the TuGraph process is automatically terminated. Normal process mode with ",(0,t.jsx)(n.code,{children:'--log_dir ""'})," can output the process log directly to the terminal, so it is easier to debug.Note: When not using the ",(0,t.jsx)(n.code,{children:"-d run"})," command, the default behavior is to run as a normal process."]}),"\n",(0,t.jsx)(n.p,{children:"The default path for lgraph_server is: /usr/local/bin/lgraph_server."}),"\n",(0,t.jsx)(n.p,{children:"The default path for lgraph.json is: /usr/local/etc/lgraph.json."}),"\n",(0,t.jsx)(n.p,{children:"Start the command\uff1a"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:'$ ./lgraph_server -d run -c lgraph.json --log_dir ""\n'})}),"\n",(0,t.jsx)(n.p,{children:"or:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:'$ ./lgraph_server -c lgraph.json --log_dir ""\n'})}),"\n",(0,t.jsx)(n.p,{children:"Example of running output in normal mode\uff1a"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:'**********************************************************************\n* TuGraph Graph Database v4.3.2 *\n* *\n* Copyright(C) 2018-2023 Ant Group. All rights reserved. *\n* *\n**********************************************************************\nServer is configured with the following parameters:\n Backup log enable: 0\n DB directory: /var/lib/lgraph/data\n HA enable: 0\n HTTP port: 7070\n HTTP web dir: /usr/local/share/lgraph/browser-resource\n RPC enable: 1\n RPC port: 9090\n SSL enable: 0\n Whether the token is unlimited: 0\n audit log enable: 0\n bind host: 0.0.0.0\n bolt port: 7687\n disable auth: 0\n durable: 0\n log dir: ""\n log verbose: 1\n number of bolt io threads: 1\n optimistic transaction: 0\n reset admin password if you forget: 0\n subprocess idle limit: 600\n thread limit: 0\n[20240730 15:34:27.848783 0x00007f81bb3889c0 INFO src/server/lgraph_server.h:78] [StateMachine] Builtin services are disabled according to ServerOptions.has_builtin_services\n[20240730 15:34:27.849116 0x00007f81bb3889c0 INFO src/server/lgraph_server.cpp:268] Listening for RPC on port 9090\n[20240730 15:34:27.868819 0x00007f81bb3889c0 INFO src/restful/server/rest_server.cpp:479] Listening for REST on port 7070\n[20240730 15:34:27.869970 0x00006e7d435ff700 INFO src/server/bolt_server.cpp:36] bolt server run\n[20240730 15:34:27.870040 0x00007f81bb3889c0 INFO src/server/lgraph_server.cpp:302] Server started.\n'})}),"\n",(0,t.jsx)(n.p,{children:"In normal process mode, the user can prematurely terminate the TuGraph process by pressing 'CTRL+C'."}),"\n",(0,t.jsx)(n.h3,{id:"22run-process-daemon-mode",children:"2.2.Run process daemon mode"}),"\n",(0,t.jsx)(n.p,{children:"Start the command\uff1a"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"$ ./lgraph_server -d start -c lgraph.json\n"})}),"\n",(0,t.jsx)(n.p,{children:"Example output from running in daemon mode:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"Starting lgraph...\nThe service process is started at pid 12109.\n"})}),"\n",(0,t.jsx)(n.p,{children:"The TuGraph server process started by this command is a daemon process that loads the relevant configuration from the file 'lgraph.json'. After the server starts, it will start printing logs in a log file that can then be used to determine the status of the server."}),"\n",(0,t.jsx)(n.h2,{id:"3service-operation",children:"3.Service operation"}),"\n",(0,t.jsx)(n.h3,{id:"31start-the-service",children:"3.1.Start the service"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph needs to be started using the 'lgraph_server -d start' command line. The following is an example of the command to start TuGraph:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ ./lgraph_server -d start -c lgraph.json\nStarting lgraph...\nThe service process is started at pid 12109.\n"})}),"\n",(0,t.jsx)(n.p,{children:"The TuGraph server process started by this command is a daemon process that loads the relevant configuration from the file 'lgraph.json'. After the server starts, it will start printing logs in a log file that can then be used to determine the status of the server."}),"\n",(0,t.jsx)(n.h3,{id:"32stop-the-service",children:"3.2.Stop the service"}),"\n",(0,t.jsx)(n.p,{children:"You can stop the TuGraph daemon using the 'kill' command and the 'lgraph_server -d stop' command. Since it is possible to run multiple TuGraph server processes on the same computer, we distinguish between the different server processes using the '.pid 'file, which is written to the working directory where the process was started. Therefore, you need to run the command 'lgraph_server-d stop' in the same working directory to stop the correct server process."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"user@host:~/tugraph$ ./lgraph_server -d start -c lgraph.json\n20200508122306.378: Starting lgraph...\n20200508122306.379: The service process is started at pid 93.\n\nuser@host:~/tugraph$ cat ./lgraph.pid\n93\n\nuser@host:~/tugraph$ ./lgraph_server -d stop -c lgraph.json\n20200508122334.857: Stopping lgraph...\n20200508122334.857: Process stopped.\n"})}),"\n",(0,t.jsx)(n.h3,{id:"33restart-the-service",children:"3.3.Restart the service"}),"\n",(0,t.jsx)(n.p,{children:"Users can also restart the TuGraph service by 'lgraph_server -d restart' :"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ ./lgraph_server -d restart\nStopping lgraph...\nProcess stopped.\nStarting lgraph...\nThe service process is started at pid 20899.\n"})}),"\n",(0,t.jsx)(n.h3,{id:"34switch-between-old-and-new-front-end",children:"3.4.Switch between old and new front-end"}),"\n",(0,t.jsxs)(n.p,{children:['To access the container and choose between the old and new versions of the frontend, modify the configuration file located at "/usr/local/etc/lgraph.json". For the old version, change the value of the "web" parameter to "/usr/local/share/lgraph/resource"; for the new version, set it to "/usr/local/share/lgraph/browser-resource". Once you\'ve finished editing the configuration file, run the command ',(0,t.jsx)(n.code,{children:"docker restart tugraph"})," to apply the changes. Bear in mind that the new version is the default selection."]}),"\n",(0,t.jsx)(n.h2,{id:"4service-configuration",children:"4.Service configuration"}),"\n",(0,t.jsx)(n.p,{children:"The TuGraph server loads configurations from the configuration file and command line options at startup, and if different values are specified for the same option in the configuration file and command line, the value specified in the command line will be used preferentially."}),"\n",(0,t.jsx)(n.h3,{id:"41configuration-parameters",children:"4.1.Configuration parameters"}),"\n",(0,t.jsx)(n.p,{children:"The parameters and their types are described as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:(0,t.jsx)(n.strong,{children:"Parameter names"})}),(0,t.jsx)(n.th,{children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.nobr,{children:"Type"})})}),(0,t.jsx)(n.th,{children:(0,t.jsx)(n.strong,{children:"Instructions"})})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"directory"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Directory where data files are stored. If the directory does not exist, it is automatically created. The default directory is /var/lib/lgraph/data."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"durable"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsxs)(n.td,{children:["Whether to enable real-time persistence. Turning off persistence can reduce the disk IO overhead when writing, but data may be lost in extreme cases such as machine power failure. The default value is ",(0,t.jsx)(n.code,{children:"true"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"host"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"The IP address on which the REST server listens. The default address is 0.0.0.0. Note: In HA mode, the host needs to be set to the IP address of the corresponding server and cannot be set to 0.0.0.0."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"port"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"The Port on which the REST server listens. The default port is 7070."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"enable_rpc"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Whether to use RPC services. The default value is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"rpc_port"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Port used by RPC and HA services. The default port number is 9090."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"bolt_port"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Port used by Bolt Client. The default port number is 7687."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"enable_ha"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Whether to enable the HA mode. The default value is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_log_dir"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"HA log directory. The HA mode needs to be enabled. The default value is null."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"verbose"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Detail level of log output information. The value can be 0,1,2. The larger the value, the more detailed the output information. The default value is 1."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"log_dir"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Directory where log files are stored. The default directory is /var/log/lgraph/."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ssl_auth"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Whether to use SSL authentication. When HTTPS is enabled, only the HTTPS service is enabled on the REST server. The default value is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"web"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"The storage location for web files (including visualization components) is set by default in the directory /usr/local/share/lgraph/browser-resource. For previous older versions, this directory was situated at /usr/local/share/lgraph/resource ."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"server_cert"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"certificate file path used by the server when SSL authentication is enabled. The default path is/usr/local/etc/lgraph/server - cert.pem."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"server_key"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"The public key file used by the server when SSL authentication is enabled. The default directory is/usr/local/etc/lgraph/server - key.pem\u3002"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"enable_audit_log"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Whether to enable audit logs. The default value is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"audit_log_expire"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"When audit logs are enabled, the validity period (hours) of audit logs is automatically cleared upon timeout. If the value is 0, the logs are not cleared. The default value is 0."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"audit_log_dir"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Specifies the directory for storing log files when audit logs are enabled. The default directory is $directory/",(0,t.jsx)(n.em,{children:"audit_log"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"load_plugins"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Import all stored procedures when starting the service. The default value is true."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"optimistic_txn"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Enable optimistic multithreaded write transactions for Cypher. The default is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"disable_auth"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Disable REST authentication. The default is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_snapshot_interval_s"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Snapshot interval (in seconds). The default value is 604800. -1 means not to automatically generate snapshots."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_heartbeat_interval_ms"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Heartbeat interval in milliseconds. The default value is 1000."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_node_offline_ms"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"The heartbeat times out and the interval (in milliseconds) between nodes going offline. The default value is 60000."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_node_remove_ms"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"The interval (in milliseconds) at which a node is considered completely dead and removed from the list. The default value is 120000."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_first_snapshot_start_time"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:'The time when the first snapshot is taken, the format is "HH:MM:SS", which means the first snapshot is taken at the next HH:MM:SS time point, and then every ha_snapshot_interval_s seconds. The default value is "", which means that the first snapshot is taken randomly at any time within 0-ha_snapshot_interval_s, and then a snapshot is taken every ha_snapshot_interval_s seconds.'})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"enable_ip_check"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Allow IP address whitelists. The default value is false\u3002"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"idle_seconds"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"The maximum number of seconds a child process can be idle. The default value is 600."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"enable_backup_log"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Whether to enable backup logging. The default value is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"backup_log_dir"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"The directory where backup files are stored. The default value is null."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"snapshot_dir"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Directory where snapshot files are stored. The default value is null."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"thread_limit"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"The maximum number of threads that can be used simultaneously. The default value is 0, which means that no restriction is imposed. The license file prevails."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"unlimited_token"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Whether to set the link token to be infinite. The default value is false and the validity period is 24 hours."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"reset_admin_password"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:'Whether to reset the password. The default value is false. When the value is true, the password will be reset to "73@TuGraph"\u3002'})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"enable_fulltext_index"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Whether to enable the full-text index function, the default value is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"fulltext_analyzer"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsxs)(n.td,{children:["Full-text index tokenizer type. Can be set to ",(0,t.jsx)(n.code,{children:"StandardAnalyzer"})," or ",(0,t.jsx)(n.code,{children:"SmartChineseAnalyzer"}),". Default is ",(0,t.jsx)(n.code,{children:"StandardAnalyzer"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"fulltext_commit_interval"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Full-text index data submission period, for write operations, in seconds. The default is 0, which commits immediately."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"fulltext_refresh_interval"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Full-text index data refresh cycle, for read operations, in seconds. The default is 0, and the latest written data can be read immediately."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_conf"}),(0,t.jsx)(n.td,{children:"string"}),(0,t.jsx)(n.td,{children:"Initialize the HA cluster according to host1:port1,host2:port2,host3:port3, the default value is empty."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_node_join_group_s"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"The waiting time for a node to try to join the high availability cluster, in seconds, the default is 10."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"ha_bootstrap_role"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Whether to use bootstrap to start, and the server role to start using this method, 0 means not to use bootstrap to start, 1 means to use bootstrap to start and this node is a leader, 2 means to use bootstrap to start and this node is a follower, only these 3 options. The default value is 0."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"help"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"Print the help message. The default value is false."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"browser.credential_timeout"}),(0,t.jsx)(n.td,{children:"int"}),(0,t.jsx)(n.td,{children:"Browser cache expiration time for usernames and passwords."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"browser.retain_connection_credentials"}),(0,t.jsx)(n.td,{children:"boolean"}),(0,t.jsx)(n.td,{children:"whether the browser caches usernames and passwords.."})]})]})]}),"\n",(0,t.jsx)(n.h3,{id:"42server-configuration-file",children:"4.2.Server configuration file"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph's configuration file is stored in JSON format. It is recommended that most configuration be stored in configuration files and that some configuration parameters be modified only temporarily using command-line options when needed."}),"\n",(0,t.jsx)(n.p,{children:"A typical configuration file looks like this:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "directory" : "/var/lib/lgraph/data",\n "host" : "0.0.0.0",\n "port" : 7070,\n "rpc_port" : 9090,\n "enable_rpc" : true,\n "bolt_port": 7687,\n "enable_ha" : false,\n "verbose" : 1,\n "log_dir" : "/var/log/lgraph_log",\n "disable_auth" : false,\n "ssl_auth" : false,\n "server_key" : "/usr/local/etc/lgraph/server-key.pem",\n "server_cert" : "/usr/local/etc/lgraph/server-cert.pem",\n "web" : "/usr/local/share/lgraph/browser-resource"\n}\n'})})]})}function c(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>a,x:()=>l});var t=r(6540);const s={},i=t.createContext(s);function a(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e48326fb.283ec13a.js b/assets/js/e48326fb.be73c242.js similarity index 96% rename from assets/js/e48326fb.283ec13a.js rename to assets/js/e48326fb.be73c242.js index 96191db7ba..16d8698a2f 100644 --- a/assets/js/e48326fb.283ec13a.js +++ b/assets/js/e48326fb.be73c242.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[2351],{8936:(t,n,e)=>{e.r(n),e.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>u,toc:()=>c});var i=e(4848),o=e(8453);const s={},r="Unit Testing",u={id:"quality/unit-testing",title:"Unit Testing",description:"This document is the unit testing documentation for TuGraph.",source:"@site/../docs/en-US/source/11.quality/1.unit-testing.md",sourceDirName:"11.quality",slug:"/quality/unit-testing",permalink:"/tugraph-db/en/quality/unit-testing",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Log",permalink:"/tugraph-db/en/permission/log"},next:{title:"Integration Testing",permalink:"/tugraph-db/en/quality/integration-testing"}},a={},c=[{value:"1.Introduction",id:"1introduction",level:2}];function d(t){const n={blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",p:"p",...(0,o.R)(),...t.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"unit-testing",children:"Unit Testing"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"This document is the unit testing documentation for TuGraph."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph unit testing uses the gtest framework, which can choose to run all tests at once or specify certain tests."})]})}function l(t={}){const{wrapper:n}={...(0,o.R)(),...t.components};return n?(0,i.jsx)(n,{...t,children:(0,i.jsx)(d,{...t})}):d(t)}},8453:(t,n,e)=>{e.d(n,{R:()=>r,x:()=>u});var i=e(6540);const o={},s=i.createContext(o);function r(t){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof t?t(n):{...n,...t}}),[n,t])}function u(t){let n;return n=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:r(t.components),i.createElement(s.Provider,{value:n},t.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[2351],{8936:(t,n,e)=>{e.r(n),e.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>l,frontMatter:()=>s,metadata:()=>u,toc:()=>c});var i=e(4848),o=e(8453);const s={},r="Unit Testing",u={id:"quality/unit-testing",title:"Unit Testing",description:"This document is the unit testing documentation for TuGraph.",source:"@site/../docs/en-US/source/11.quality/1.unit-testing.md",sourceDirName:"11.quality",slug:"/quality/unit-testing",permalink:"/tugraph-db/en/quality/unit-testing",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Log",permalink:"/tugraph-db/en/permission/log"},next:{title:"Integration Testing",permalink:"/tugraph-db/en/quality/integration-testing"}},a={},c=[{value:"1.Introduction",id:"1introduction",level:2}];function d(t){const n={blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",p:"p",...(0,o.R)(),...t.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"unit-testing",children:"Unit Testing"})}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"This document is the unit testing documentation for TuGraph."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph unit testing uses the gtest framework, which can choose to run all tests at once or specify certain tests."})]})}function l(t={}){const{wrapper:n}={...(0,o.R)(),...t.components};return n?(0,i.jsx)(n,{...t,children:(0,i.jsx)(d,{...t})}):d(t)}},8453:(t,n,e)=>{e.d(n,{R:()=>r,x:()=>u});var i=e(6540);const o={},s=i.createContext(o);function r(t){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof t?t(n):{...n,...t}}),[n,t])}function u(t){let n;return n=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:r(t.components),i.createElement(s.Provider,{value:n},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/e523e931.c8aa6d3e.js b/assets/js/e523e931.219e1523.js similarity index 99% rename from assets/js/e523e931.c8aa6d3e.js rename to assets/js/e523e931.219e1523.js index eb79aa0919..acb66f70e7 100644 --- a/assets/js/e523e931.c8aa6d3e.js +++ b/assets/js/e523e931.219e1523.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[1246],{2615:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var a=t(4848),i=t(8453);const r={},o="OlapOnDB API",s={id:"olap&procedure/olap/olap-on-db-api",title:"OlapOnDB API",description:"This document provides detailed instructions for using the OlapOnDB API",source:"@site/../docs/en-US/source/9.olap&procedure/2.olap/3.olap-on-db-api.md",sourceDirName:"9.olap&procedure/2.olap",slug:"/olap&procedure/olap/olap-on-db-api",permalink:"/tugraph-db/en/olap&procedure/olap/olap-on-db-api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"OlapBase API",permalink:"/tugraph-db/en/olap&procedure/olap/olap-base-api"},next:{title:"OlapOnDisk API",permalink:"/tugraph-db/en/olap&procedure/olap/olap-on-disk-api"}},l={},d=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Schema",id:"2schema",level:2},{value:"2.1.Snapshot Based Storage Structure",id:"21snapshot-based-storage-structure",level:3},{value:"2.2.BSP Calculation Model",id:"22bsp-calculation-model",level:3},{value:"3.Algorithm example",id:"3algorithm-example",level:2},{value:"3.1.Main function",id:"31main-function",level:3},{value:"3.2.PageRank Algorithm process",id:"32pagerank-algorithm-process",level:3},{value:"4.1.Transaction creation",id:"41transaction-creation",level:3},{value:"4.2.Parallelization to create a directed graph",id:"42parallelization-to-create-a-directed-graph",level:3},{value:"4.3.Create undirected graphs in parallel",id:"43create-undirected-graphs-in-parallel",level:3},{value:"4.4.Obtain the output degree",id:"44obtain-the-output-degree",level:3},{value:"4.5.Obtain the input degree",id:"45obtain-the-input-degree",level:3},{value:"4.6.Gets the outgoing edge set",id:"46gets-the-outgoing-edge-set",level:3},{value:"4.7.Gets the incoming edge set",id:"47gets-the-incoming-edge-set",level:3},{value:"4.8.Get the node ID of OlapOnDB corresponding to the node in TuGraph",id:"48get-the-node-id-of-olapondb-corresponding-to-the-node-in-tugraph",level:3},{value:"4.9.Gets the node number of TuGraph corresponding to a node in OlapOnDB",id:"49gets-the-node-number-of-tugraph-corresponding-to-a-node-in-olapondb",level:3},{value:"4.10.Description of active vertices",id:"410description-of-active-vertices",level:3}];function c(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"olapondb-api",children:"OlapOnDB API"})}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"This document provides detailed instructions for using the OlapOnDB API"}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,a.jsx)(n.p,{children:"Generally speaking, users need to implement the process of subgraph extraction by themselves. Then use the rich interface in TuGraph to implement your own graph analysis algorithm."}),"\n",(0,a.jsx)(n.p,{children:"This document mainly introduces the Procedure and Embed interface design, and introduces some common interface, specific interface information see include/lgraph/olap_on_db.h file."}),"\n",(0,a.jsx)(n.h2,{id:"2schema",children:"2.Schema"}),"\n",(0,a.jsx)(n.p,{children:"Procedure and Embed auxiliary functions are mainly included in the OlapOnDB class, and some more frequently used functions will be introduced one by one"}),"\n",(0,a.jsx)(n.p,{children:"OLAP is associated with the following common data structures in TuGraph:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["DB graph analysis class ",(0,a.jsx)(n.code,{children:"OlapOnDB"})]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["Vertex array ",(0,a.jsx)(n.code,{children:"ParallelVector"})]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["Vertex set ",(0,a.jsx)(n.code,{children:"ParallelBitset"})]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["Side data structure ",(0,a.jsx)(n.code,{children:"AdjUnit/AdjUnit"})]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["Edge collection data structure ",(0,a.jsx)(n.code,{children:"AdjList"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"21snapshot-based-storage-structure",children:"2.1.Snapshot Based Storage Structure"}),"\n",(0,a.jsx)(n.p,{children:'The OlapOnDB class in TuGraph provides a data "snapshot," that is, a fully usable copy of a given data set that includes a mirror image of the corresponding data at a certain point in time (the point at which the copy was started). Because OLAP operations involve only reads and not writes, OlapOnDB arranges data in a more compact manner, saving space while improving data access locality.'}),"\n",(0,a.jsx)(n.h3,{id:"22bsp-calculation-model",children:"2.2.BSP Calculation Model"}),"\n",(0,a.jsx)(n.p,{children:"TuGraph uses the BSP (Bulk Synchronous Parallel) model in the process of calculation, which makes the process can be executed in parallel, and greatly improves the efficiency of the program."}),"\n",(0,a.jsx)(n.p,{children:"The core idea of BSP calculation model is to propose and use Super Step. After OlapOnDB is created, the computation on this data is divided into multiple supersteps, such as PageRank, which is divided into multiple iterations, and each iteration is a Super Step. There is explicit synchronization between different Super Steps to ensure that all threads proceed to the next Super Step at the same time after completing the same superstep. Within a Super Step, all threads execute asynchronously, using parallelism to improve computational efficiency."}),"\n",(0,a.jsx)(n.p,{children:"BSP calculation model can effectively avoid deadlock, and achieve coarse-grained global synchronization in hardware mode by means of obstacle synchronization, so that graph computation can be executed in parallel, and programmers do not need to spend much time on synchronization mutual exclusion."}),"\n",(0,a.jsx)(n.h2,{id:"3algorithm-example",children:"3.Algorithm example"}),"\n",(0,a.jsx)(n.p,{children:"Here is an explanation of the PageRank algorithm, which is mainly divided into the main function Process and the PageRank algorithm process function."}),"\n",(0,a.jsx)(n.h3,{id:"31main-function",children:"3.1.Main function"}),"\n",(0,a.jsx)(n.p,{children:"The main function has three input parameters, 'TuGraph' database parameter 'db', the request 'request' obtained from the web side, and the return value 'response' given to the web side. The overall process can be divided into the following steps:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Obtain related parameters"}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Create a snapshot class"}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Main process of PageRank algorithm"}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Obtain and send the return value of the web page"}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:'extern "C" bool Process(GraphDB & db, const std::string & request, std::string & response) {\n\n // Obtain the number of iterations from web side requests (num_iterations)\uff0c\n int num_iterations = 20;\n try {\n json input = json::parse(request);\n num_iterations = input["num_iterations"].get();\n } catch (std::exception & e) {\n throw std::runtime_error("json parse error");\n return false;\n }\n\n // Read transaction creation and snapshot class creation\n auto txn = db.CreateReadTxn();\n OlapOnDB olapondb(\n db,\n txn,\n SNAPSHOT_PARALLEL\n );\n\n // Create a pr array to store the pr value for each node\n ParallelVector pr = olapondb.AllocVertexArray();\n // pagerank algorithm main process, obtain the pagerank value of each node\n PageRankCore(olapondb, num_iterations, pr);\n\n auto all_vertices = olapondb.AllocVertexSubset();\n all_vertices.Fill();\n /*\n Function Purpose: Gets the number of the node with the largest pagerank among all nodes\n\n Function flow description: This function executes Func A for node vi (also known as the active vertices) corresponding to all bits of 1 in the vertex set all_vertices. The return value of Func A is then used as the second input parameter of Func B to obtain the local maximum value (because the first input parameter is 0. So the return value is actually the pagerank value of each node). Finally, the return value of all threads is summarized, and Func B is executed again to get the global return value, and stored in the max_pr_vi variable\n */\n size_t max_pr_vi = olapondb.ProcessVertexActive(\n\n //Func A\n [&](size_t vi) {\n return vi;\n },\n all_vertices,\n 0,\n\n //Func B\n [&](size_t a, size_t b) {\n return pr[a] > pr[b] ? a : b;\n }\n );\n\n // Retrieve and send the return value from the web page\n json output;\n output["max_pr_vid"] = olapondb.OriginalVid(max_pr_vi);\n output["max_pr_val"] = pr[max_pr_vi];\n response = output.dump();\n return true;\n}\n'})}),"\n",(0,a.jsx)(n.h3,{id:"32pagerank-algorithm-process",children:"3.2.PageRank Algorithm process"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"pagerank"})," main process has two input parameters, snapshot class (subgraph) and iteration times, the overall process can be divided into the following steps:"]}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsx)(n.li,{children:"Initialization of related data structures"}),"\n",(0,a.jsx)(n.li,{children:"Initialize the pagerank value of each node"}),"\n",(0,a.jsx)(n.li,{children:"Calculation of pagerank value of each node, active vertices for all vertices (means that all vertices need to calculate pagerank value)"}),"\n",(0,a.jsx)(n.li,{children:"Obtain the pagerank value after 'num_iterations' of each node"}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:'void PageRankCore(OlapBase& graph, int num_iterations, ParallelVector& curr) {\n\n // Initialization of related data structures\n auto all_vertices = olapondb.AllocVertexSubset();\n all_vertices.Fill();\n auto curr = olapondb.AllocVertexArray();\n auto next = olapondb.AllocVertexArray();\n size_t num_vertices = olapondb.NumVertices();\n double one_over_n = (double)1 / num_vertices;\n\n // The initialization of the pagerank value of each node is inversely proportional to the degree of the node\n double delta = graph.ProcessVertexActive(\n [&](size_t vi) {\n curr[vi] = one_over_n;\n if (olapondb.OutDegree(vi) > 0) {\n curr[vi] /= olapondb.OutDegree(vi);\n }\n return one_over_n;\n },\n all_vertices);\n\n // Total iteration process\n double d = (double)0.85;\n for (int ii = 0;ii < num_iterations;ii ++) {\n printf("delta(%d)=%lf\\n", ii, delta);\n next.Fill((double)0);\n\n /*\n Function Purpose: Calculates the pagerank of all nodes\n\n Function flow description: This function is used to calculate the pagerank value of all nodes. Execute Func C on node vi corresponding to all the bits of 1 in all_vertices to obtain the pagerank value of vi in the current iteration and return the pagerank change value of vi node. The total change value of all active nodes is finally summarized and returned through the internal processing of the function, which is stored in the delta variable\n */\n delta = graph.ProcessVertexActive(\n // Func C\n [&](size_t vi) {\n double sum = 0;\n\n // Gets the pagerank value of the current node from its neighbor\n for (auto & edge : olapondb.InEdges(vi)) {\n size_t src = edge.neighbour;\n sum += curr[src];\n }\n next[vi] = sum;\n\n // pagerank value calculation core formula\n next[vi] = (1 - d) * one_over_n + d * next[vi];\n if (ii == num_iterations - 1) {\n return (double)0;\n } else {\n\n // Statistics of relevant intermediate variables\n if (olapondb.OutDegree(vi) > 0) {\n next[vi] /= olapondb.OutDegree(vi);\n return fabs(next[vi] - curr[vi]) * olapondb.OutDegree(vi);\n } else {\n return fabs(next[vi] - curr[vi]);\n }\n }\n },\n all_vertices\n );\n\n // The pagerank value obtained in this iteration is output as the input of the next iteration\n curr.Swap(next);\n }\n}\n'})}),"\n",(0,a.jsx)(n.h3,{id:"41transaction-creation",children:"4.1.Transaction creation"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:"// Create a read transaction\nauto txn = db.CreateReadTxn();\n\n// Write transaction creation\nauto txn = db.CreateWriteTxn();\n"})}),"\n",(0,a.jsx)(n.h3,{id:"42parallelization-to-create-a-directed-graph",children:"4.2.Parallelization to create a directed graph"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:"OlapOnDB olapondb(\ndb,\ntxn,\nSNAPSHOT_PARALLEL\n)\n"})}),"\n",(0,a.jsx)(n.h3,{id:"43create-undirected-graphs-in-parallel",children:"4.3.Create undirected graphs in parallel"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:"OlapOnDB olapondb(\ndb,\ntxn,\nSNAPSHOT_PARALLEL | SNAPSHOT_UNDIRECTED;\n)\n"})}),"\n",(0,a.jsx)(n.h3,{id:"44obtain-the-output-degree",children:"4.4.Obtain the output degree"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:"size_t OutDegree(size_t vid)\n"})}),"\n",(0,a.jsx)(n.h3,{id:"45obtain-the-input-degree",children:"4.5.Obtain the input degree"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:"size_t InDegree(size_t vid)\n"})}),"\n",(0,a.jsx)(n.h3,{id:"46gets-the-outgoing-edge-set",children:"4.6.Gets the outgoing edge set"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:'/*\n Function name: AdjList OutEdges(size_t vid)\n\n Data structure:\n\n An AdjList can be understood as an array of structures of type AdjUnit\n\n AdjUnit has two member variables: 1. size_t neighbour 2. edge_data: neighbour indicates the number of the target node pointed by the outgoing edge. If the value is a licensed graph, the data type of edge_data is the same as the weight value of the edge in the input file\n\n Example Output all outgoing neighbors of node vid\n*/\nfor (auto & edge : olapondb.OutEdges(vid)) {\n size_t dst = edge.neighbour;\n printf("src = %lu,dst = %lu\\n",vid,dst);\n}\n'})}),"\n",(0,a.jsx)(n.h3,{id:"47gets-the-incoming-edge-set",children:"4.7.Gets the incoming edge set"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:'AdjList InEdges(size_t vid)\n\n// Example: Outputs all inbound neighbors of node vid\nfor (auto & edge : olapondb.InEdges(vid)) {\nsize_t dst = edge.neighbour;\nprintf("src = %lu,dst = %lu\\n",vid,dst);\n}\n'})}),"\n",(0,a.jsx)(n.h3,{id:"48get-the-node-id-of-olapondb-corresponding-to-the-node-in-tugraph",children:"4.8.Get the node ID of OlapOnDB corresponding to the node in TuGraph"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:"size_t OriginalVid(size_t vid)\n\n// Note: The node numbers entered in TuGraph can be non-numbers, such as names. When OlapOnDB subgraphs are generated, names and other names will be converted to numbers for subsequent processing. Therefore, this method may not be applicable to some specific scenarios\n"})}),"\n",(0,a.jsx)(n.h3,{id:"49gets-the-node-number-of-tugraph-corresponding-to-a-node-in-olapondb",children:"4.9.Gets the node number of TuGraph corresponding to a node in OlapOnDB"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:"size_t MappedVid(size_t original_vid)\n"})}),"\n",(0,a.jsx)(n.h3,{id:"410description-of-active-vertices",children:"4.10.Description of active vertices"}),"\n",(0,a.jsx)(n.p,{children:"Active vertices refer to the vertices that need to be processed in the batch function. In this example, we simply output the number of active vertices and summarize the number of active vertices:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:'ParallelBitset temp = 000111; // The current active vertices are vertices 3, 4 and 5\n\nsize_t delta = ForEachActiveVertex(\n//void c\n[&](size_t vi) {\nprintf("active_vertexId = %lu\\n",vi);\nreturn 1;\n},\nall_vertices\n);\n'})}),"\n",(0,a.jsx)(n.p,{children:"The result of this function is obvious. Because of multiple threads, the output order may vary:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"active_vertexId = 3\nactive_vertexId = 4\nactive_vertexId = 5\n"})}),"\n",(0,a.jsx)(n.p,{children:"The local return value is 1. This function will add all the local return values in a thread-safe manner to the final return value, which is stored in the delta variable, and the final value is 3"})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>s});var a=t(6540);const i={},r=a.createContext(i);function o(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[1246],{2615:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var a=t(4848),i=t(8453);const r={},o="OlapOnDB API",s={id:"olap&procedure/olap/olap-on-db-api",title:"OlapOnDB API",description:"This document provides detailed instructions for using the OlapOnDB API",source:"@site/../docs/en-US/source/9.olap&procedure/2.olap/3.olap-on-db-api.md",sourceDirName:"9.olap&procedure/2.olap",slug:"/olap&procedure/olap/olap-on-db-api",permalink:"/tugraph-db/en/olap&procedure/olap/olap-on-db-api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:3,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"OlapBase API",permalink:"/tugraph-db/en/olap&procedure/olap/olap-base-api"},next:{title:"OlapOnDisk API",permalink:"/tugraph-db/en/olap&procedure/olap/olap-on-disk-api"}},l={},d=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.Schema",id:"2schema",level:2},{value:"2.1.Snapshot Based Storage Structure",id:"21snapshot-based-storage-structure",level:3},{value:"2.2.BSP Calculation Model",id:"22bsp-calculation-model",level:3},{value:"3.Algorithm example",id:"3algorithm-example",level:2},{value:"3.1.Main function",id:"31main-function",level:3},{value:"3.2.PageRank Algorithm process",id:"32pagerank-algorithm-process",level:3},{value:"4.1.Transaction creation",id:"41transaction-creation",level:3},{value:"4.2.Parallelization to create a directed graph",id:"42parallelization-to-create-a-directed-graph",level:3},{value:"4.3.Create undirected graphs in parallel",id:"43create-undirected-graphs-in-parallel",level:3},{value:"4.4.Obtain the output degree",id:"44obtain-the-output-degree",level:3},{value:"4.5.Obtain the input degree",id:"45obtain-the-input-degree",level:3},{value:"4.6.Gets the outgoing edge set",id:"46gets-the-outgoing-edge-set",level:3},{value:"4.7.Gets the incoming edge set",id:"47gets-the-incoming-edge-set",level:3},{value:"4.8.Get the node ID of OlapOnDB corresponding to the node in TuGraph",id:"48get-the-node-id-of-olapondb-corresponding-to-the-node-in-tugraph",level:3},{value:"4.9.Gets the node number of TuGraph corresponding to a node in OlapOnDB",id:"49gets-the-node-number-of-tugraph-corresponding-to-a-node-in-olapondb",level:3},{value:"4.10.Description of active vertices",id:"410description-of-active-vertices",level:3}];function c(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"olapondb-api",children:"OlapOnDB API"})}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"This document provides detailed instructions for using the OlapOnDB API"}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,a.jsx)(n.p,{children:"Generally speaking, users need to implement the process of subgraph extraction by themselves. Then use the rich interface in TuGraph to implement your own graph analysis algorithm."}),"\n",(0,a.jsx)(n.p,{children:"This document mainly introduces the Procedure and Embed interface design, and introduces some common interface, specific interface information see include/lgraph/olap_on_db.h file."}),"\n",(0,a.jsx)(n.h2,{id:"2schema",children:"2.Schema"}),"\n",(0,a.jsx)(n.p,{children:"Procedure and Embed auxiliary functions are mainly included in the OlapOnDB class, and some more frequently used functions will be introduced one by one"}),"\n",(0,a.jsx)(n.p,{children:"OLAP is associated with the following common data structures in TuGraph:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["DB graph analysis class ",(0,a.jsx)(n.code,{children:"OlapOnDB"})]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["Vertex array ",(0,a.jsx)(n.code,{children:"ParallelVector"})]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["Vertex set ",(0,a.jsx)(n.code,{children:"ParallelBitset"})]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["Side data structure ",(0,a.jsx)(n.code,{children:"AdjUnit/AdjUnit"})]}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsxs)(n.p,{children:["Edge collection data structure ",(0,a.jsx)(n.code,{children:"AdjList"})]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"21snapshot-based-storage-structure",children:"2.1.Snapshot Based Storage Structure"}),"\n",(0,a.jsx)(n.p,{children:'The OlapOnDB class in TuGraph provides a data "snapshot," that is, a fully usable copy of a given data set that includes a mirror image of the corresponding data at a certain point in time (the point at which the copy was started). Because OLAP operations involve only reads and not writes, OlapOnDB arranges data in a more compact manner, saving space while improving data access locality.'}),"\n",(0,a.jsx)(n.h3,{id:"22bsp-calculation-model",children:"2.2.BSP Calculation Model"}),"\n",(0,a.jsx)(n.p,{children:"TuGraph uses the BSP (Bulk Synchronous Parallel) model in the process of calculation, which makes the process can be executed in parallel, and greatly improves the efficiency of the program."}),"\n",(0,a.jsx)(n.p,{children:"The core idea of BSP calculation model is to propose and use Super Step. After OlapOnDB is created, the computation on this data is divided into multiple supersteps, such as PageRank, which is divided into multiple iterations, and each iteration is a Super Step. There is explicit synchronization between different Super Steps to ensure that all threads proceed to the next Super Step at the same time after completing the same superstep. Within a Super Step, all threads execute asynchronously, using parallelism to improve computational efficiency."}),"\n",(0,a.jsx)(n.p,{children:"BSP calculation model can effectively avoid deadlock, and achieve coarse-grained global synchronization in hardware mode by means of obstacle synchronization, so that graph computation can be executed in parallel, and programmers do not need to spend much time on synchronization mutual exclusion."}),"\n",(0,a.jsx)(n.h2,{id:"3algorithm-example",children:"3.Algorithm example"}),"\n",(0,a.jsx)(n.p,{children:"Here is an explanation of the PageRank algorithm, which is mainly divided into the main function Process and the PageRank algorithm process function."}),"\n",(0,a.jsx)(n.h3,{id:"31main-function",children:"3.1.Main function"}),"\n",(0,a.jsx)(n.p,{children:"The main function has three input parameters, 'TuGraph' database parameter 'db', the request 'request' obtained from the web side, and the return value 'response' given to the web side. The overall process can be divided into the following steps:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Obtain related parameters"}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Create a snapshot class"}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Main process of PageRank algorithm"}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Obtain and send the return value of the web page"}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:'extern "C" bool Process(GraphDB & db, const std::string & request, std::string & response) {\n\n // Obtain the number of iterations from web side requests (num_iterations)\uff0c\n int num_iterations = 20;\n try {\n json input = json::parse(request);\n num_iterations = input["num_iterations"].get();\n } catch (std::exception & e) {\n throw std::runtime_error("json parse error");\n return false;\n }\n\n // Read transaction creation and snapshot class creation\n auto txn = db.CreateReadTxn();\n OlapOnDB olapondb(\n db,\n txn,\n SNAPSHOT_PARALLEL\n );\n\n // Create a pr array to store the pr value for each node\n ParallelVector pr = olapondb.AllocVertexArray();\n // pagerank algorithm main process, obtain the pagerank value of each node\n PageRankCore(olapondb, num_iterations, pr);\n\n auto all_vertices = olapondb.AllocVertexSubset();\n all_vertices.Fill();\n /*\n Function Purpose: Gets the number of the node with the largest pagerank among all nodes\n\n Function flow description: This function executes Func A for node vi (also known as the active vertices) corresponding to all bits of 1 in the vertex set all_vertices. The return value of Func A is then used as the second input parameter of Func B to obtain the local maximum value (because the first input parameter is 0. So the return value is actually the pagerank value of each node). Finally, the return value of all threads is summarized, and Func B is executed again to get the global return value, and stored in the max_pr_vi variable\n */\n size_t max_pr_vi = olapondb.ProcessVertexActive(\n\n //Func A\n [&](size_t vi) {\n return vi;\n },\n all_vertices,\n 0,\n\n //Func B\n [&](size_t a, size_t b) {\n return pr[a] > pr[b] ? a : b;\n }\n );\n\n // Retrieve and send the return value from the web page\n json output;\n output["max_pr_vid"] = olapondb.OriginalVid(max_pr_vi);\n output["max_pr_val"] = pr[max_pr_vi];\n response = output.dump();\n return true;\n}\n'})}),"\n",(0,a.jsx)(n.h3,{id:"32pagerank-algorithm-process",children:"3.2.PageRank Algorithm process"}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.code,{children:"pagerank"})," main process has two input parameters, snapshot class (subgraph) and iteration times, the overall process can be divided into the following steps:"]}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsx)(n.li,{children:"Initialization of related data structures"}),"\n",(0,a.jsx)(n.li,{children:"Initialize the pagerank value of each node"}),"\n",(0,a.jsx)(n.li,{children:"Calculation of pagerank value of each node, active vertices for all vertices (means that all vertices need to calculate pagerank value)"}),"\n",(0,a.jsx)(n.li,{children:"Obtain the pagerank value after 'num_iterations' of each node"}),"\n"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:'void PageRankCore(OlapBase& graph, int num_iterations, ParallelVector& curr) {\n\n // Initialization of related data structures\n auto all_vertices = olapondb.AllocVertexSubset();\n all_vertices.Fill();\n auto curr = olapondb.AllocVertexArray();\n auto next = olapondb.AllocVertexArray();\n size_t num_vertices = olapondb.NumVertices();\n double one_over_n = (double)1 / num_vertices;\n\n // The initialization of the pagerank value of each node is inversely proportional to the degree of the node\n double delta = graph.ProcessVertexActive(\n [&](size_t vi) {\n curr[vi] = one_over_n;\n if (olapondb.OutDegree(vi) > 0) {\n curr[vi] /= olapondb.OutDegree(vi);\n }\n return one_over_n;\n },\n all_vertices);\n\n // Total iteration process\n double d = (double)0.85;\n for (int ii = 0;ii < num_iterations;ii ++) {\n printf("delta(%d)=%lf\\n", ii, delta);\n next.Fill((double)0);\n\n /*\n Function Purpose: Calculates the pagerank of all nodes\n\n Function flow description: This function is used to calculate the pagerank value of all nodes. Execute Func C on node vi corresponding to all the bits of 1 in all_vertices to obtain the pagerank value of vi in the current iteration and return the pagerank change value of vi node. The total change value of all active nodes is finally summarized and returned through the internal processing of the function, which is stored in the delta variable\n */\n delta = graph.ProcessVertexActive(\n // Func C\n [&](size_t vi) {\n double sum = 0;\n\n // Gets the pagerank value of the current node from its neighbor\n for (auto & edge : olapondb.InEdges(vi)) {\n size_t src = edge.neighbour;\n sum += curr[src];\n }\n next[vi] = sum;\n\n // pagerank value calculation core formula\n next[vi] = (1 - d) * one_over_n + d * next[vi];\n if (ii == num_iterations - 1) {\n return (double)0;\n } else {\n\n // Statistics of relevant intermediate variables\n if (olapondb.OutDegree(vi) > 0) {\n next[vi] /= olapondb.OutDegree(vi);\n return fabs(next[vi] - curr[vi]) * olapondb.OutDegree(vi);\n } else {\n return fabs(next[vi] - curr[vi]);\n }\n }\n },\n all_vertices\n );\n\n // The pagerank value obtained in this iteration is output as the input of the next iteration\n curr.Swap(next);\n }\n}\n'})}),"\n",(0,a.jsx)(n.h3,{id:"41transaction-creation",children:"4.1.Transaction creation"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:"// Create a read transaction\nauto txn = db.CreateReadTxn();\n\n// Write transaction creation\nauto txn = db.CreateWriteTxn();\n"})}),"\n",(0,a.jsx)(n.h3,{id:"42parallelization-to-create-a-directed-graph",children:"4.2.Parallelization to create a directed graph"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:"OlapOnDB olapondb(\ndb,\ntxn,\nSNAPSHOT_PARALLEL\n)\n"})}),"\n",(0,a.jsx)(n.h3,{id:"43create-undirected-graphs-in-parallel",children:"4.3.Create undirected graphs in parallel"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:"OlapOnDB olapondb(\ndb,\ntxn,\nSNAPSHOT_PARALLEL | SNAPSHOT_UNDIRECTED;\n)\n"})}),"\n",(0,a.jsx)(n.h3,{id:"44obtain-the-output-degree",children:"4.4.Obtain the output degree"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:"size_t OutDegree(size_t vid)\n"})}),"\n",(0,a.jsx)(n.h3,{id:"45obtain-the-input-degree",children:"4.5.Obtain the input degree"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:"size_t InDegree(size_t vid)\n"})}),"\n",(0,a.jsx)(n.h3,{id:"46gets-the-outgoing-edge-set",children:"4.6.Gets the outgoing edge set"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:'/*\n Function name: AdjList OutEdges(size_t vid)\n\n Data structure:\n\n An AdjList can be understood as an array of structures of type AdjUnit\n\n AdjUnit has two member variables: 1. size_t neighbour 2. edge_data: neighbour indicates the number of the target node pointed by the outgoing edge. If the value is a licensed graph, the data type of edge_data is the same as the weight value of the edge in the input file\n\n Example Output all outgoing neighbors of node vid\n*/\nfor (auto & edge : olapondb.OutEdges(vid)) {\n size_t dst = edge.neighbour;\n printf("src = %lu,dst = %lu\\n",vid,dst);\n}\n'})}),"\n",(0,a.jsx)(n.h3,{id:"47gets-the-incoming-edge-set",children:"4.7.Gets the incoming edge set"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:'AdjList InEdges(size_t vid)\n\n// Example: Outputs all inbound neighbors of node vid\nfor (auto & edge : olapondb.InEdges(vid)) {\nsize_t dst = edge.neighbour;\nprintf("src = %lu,dst = %lu\\n",vid,dst);\n}\n'})}),"\n",(0,a.jsx)(n.h3,{id:"48get-the-node-id-of-olapondb-corresponding-to-the-node-in-tugraph",children:"4.8.Get the node ID of OlapOnDB corresponding to the node in TuGraph"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:"size_t OriginalVid(size_t vid)\n\n// Note: The node numbers entered in TuGraph can be non-numbers, such as names. When OlapOnDB subgraphs are generated, names and other names will be converted to numbers for subsequent processing. Therefore, this method may not be applicable to some specific scenarios\n"})}),"\n",(0,a.jsx)(n.h3,{id:"49gets-the-node-number-of-tugraph-corresponding-to-a-node-in-olapondb",children:"4.9.Gets the node number of TuGraph corresponding to a node in OlapOnDB"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:"size_t MappedVid(size_t original_vid)\n"})}),"\n",(0,a.jsx)(n.h3,{id:"410description-of-active-vertices",children:"4.10.Description of active vertices"}),"\n",(0,a.jsx)(n.p,{children:"Active vertices refer to the vertices that need to be processed in the batch function. In this example, we simply output the number of active vertices and summarize the number of active vertices:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-c",children:'ParallelBitset temp = 000111; // The current active vertices are vertices 3, 4 and 5\n\nsize_t delta = ForEachActiveVertex(\n//void c\n[&](size_t vi) {\nprintf("active_vertexId = %lu\\n",vi);\nreturn 1;\n},\nall_vertices\n);\n'})}),"\n",(0,a.jsx)(n.p,{children:"The result of this function is obvious. Because of multiple threads, the output order may vary:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"active_vertexId = 3\nactive_vertexId = 4\nactive_vertexId = 5\n"})}),"\n",(0,a.jsx)(n.p,{children:"The local return value is 1. This function will add all the local return values in a thread-safe manner to the final return value, which is stored in the delta variable, and the final value is 3"})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>s});var a=t(6540);const i={},r=a.createContext(i);function o(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ecfd9356.e9277bf7.js b/assets/js/ecfd9356.935fbcd8.js similarity index 98% rename from assets/js/ecfd9356.e9277bf7.js rename to assets/js/ecfd9356.935fbcd8.js index 07005110b2..7664f3fed1 100644 --- a/assets/js/ecfd9356.e9277bf7.js +++ b/assets/js/ecfd9356.935fbcd8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[1128],{4229:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var t=r(4848),i=r(8453);const a={},o="Environment",s={id:"installation&running/environment",title:"Environment",description:"This document provides an overview of the required hardware and software environment for deploying TuGraph.",source:"@site/../docs/en-US/source/5.installation&running/1.environment.md",sourceDirName:"5.installation&running",slug:"/installation&running/environment",permalink:"/tugraph-db/en/installation&running/environment",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Browser(old version)",permalink:"/tugraph-db/en/user-guide/tugraph-browser-legacy"},next:{title:"Environment Mode",permalink:"/tugraph-db/en/installation&running/environment-mode"}},d={},l=[{value:"1.Hardware Environment",id:"1hardware-environment",level:2},{value:"1.1. CPU",id:"11-cpu",level:3},{value:"1.2. Memory",id:"12-memory",level:3},{value:"1.3. Storage",id:"13-storage",level:3},{value:"2. Software environment",id:"2-software-environment",level:2},{value:"2.1. Operating System",id:"21-operating-system",level:3},{value:"2.2. System Libraries",id:"22-system-libraries",level:3},{value:"3.Recommended Configuration",id:"3recommended-configuration",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"environment",children:"Environment"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document provides an overview of the required hardware and software environment for deploying TuGraph."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1hardware-environment",children:"1.Hardware Environment"}),"\n",(0,t.jsx)(n.h3,{id:"11-cpu",children:"1.1. CPU"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph supports X86_64 and ARM64 architectures for both physical, virtual, and containerized environments. Tested and certified hardware platforms include Intel, AMD, Kunpeng, Hygon, Feiteng, and others."}),"\n",(0,t.jsx)(n.h3,{id:"12-memory",children:"1.2. Memory"}),"\n",(0,t.jsx)(n.p,{children:"We recommend having a memory capacity that is equal to or greater than the actual data size. For optimal performance, caching all data in memory is ideal. In terms of data locality, graph databases have poorer locality compared to relational databases. Therefore, if the data cannot fit in memory, frequent swapping may occur."}),"\n",(0,t.jsx)(n.h3,{id:"13-storage",children:"1.3. Storage"}),"\n",(0,t.jsx)(n.p,{children:"We strongly recommend using NVMe SSD as external storage. The database performs numerous synchronous write operations, often in a random manner, making the read/write performance of the external storage critical to the overall database performance. Hence, high IOPS and low-latency NVMe SSDs are the optimal choice."}),"\n",(0,t.jsx)(n.p,{children:"If circumstances permit only the use of SATA interface SSDs or cloud-based network disks, although performance may be affected, TuGraph can still run correctly."}),"\n",(0,t.jsx)(n.p,{children:"It is recommended to have external storage size at least four times the actual data size. For example, if the data size is 1TB, preparing a 4TB hard drive would be more reliable."}),"\n",(0,t.jsx)(n.h2,{id:"2-software-environment",children:"2. Software environment"}),"\n",(0,t.jsx)(n.h3,{id:"21-operating-system",children:"2.1. Operating System"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph is compatible with popular operating systems, including Ubuntu, CentOS, SUSE, Galaxy Kylin, China Standard Software, UOS, and others, all of which have been tested and certified."}),"\n",(0,t.jsx)(n.p,{children:"Among them, the most stable system versions are Ubuntu 18.04, CentOS 7, and CentOS 8."}),"\n",(0,t.jsx)(n.h3,{id:"22-system-libraries",children:"2.2. System Libraries"}),"\n",(0,t.jsxs)(n.p,{children:["The requirements for system libraries differ between the compilation environment and the runtime environment. For specific details, please refer to the",(0,t.jsx)(n.a,{href:"/tugraph-db/en/installation&running/environment-mode",children:"environment mode"}),"\u3002"]}),"\n",(0,t.jsx)(n.h2,{id:"3recommended-configuration",children:"3.Recommended Configuration"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Hardware"}),(0,t.jsx)(n.th,{children:"Minimum Configuration"}),(0,t.jsx)(n.th,{children:"Recommended Configuration"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"CPU"}),(0,t.jsx)(n.td,{children:"4 Cores"}),(0,t.jsx)(n.td,{children:"64 Cores"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Memory"}),(0,t.jsx)(n.td,{children:"4GB"}),(0,t.jsx)(n.td,{children:"512GB"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Storage"}),(0,t.jsx)(n.td,{children:"100GB"}),(0,t.jsx)(n.td,{children:"2TB NVMe SSD"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OS"}),(0,t.jsx)(n.td,{children:"Linux 4.9"}),(0,t.jsx)(n.td,{children:"CentOS 7.3"})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>s});var t=r(6540);const i={},a=t.createContext(i);function o(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[1128],{4229:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var t=r(4848),i=r(8453);const a={},o="Environment",s={id:"installation&running/environment",title:"Environment",description:"This document provides an overview of the required hardware and software environment for deploying TuGraph.",source:"@site/../docs/en-US/source/5.installation&running/1.environment.md",sourceDirName:"5.installation&running",slug:"/installation&running/environment",permalink:"/tugraph-db/en/installation&running/environment",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Browser(old version)",permalink:"/tugraph-db/en/user-guide/tugraph-browser-legacy"},next:{title:"Environment Mode",permalink:"/tugraph-db/en/installation&running/environment-mode"}},d={},l=[{value:"1.Hardware Environment",id:"1hardware-environment",level:2},{value:"1.1. CPU",id:"11-cpu",level:3},{value:"1.2. Memory",id:"12-memory",level:3},{value:"1.3. Storage",id:"13-storage",level:3},{value:"2. Software environment",id:"2-software-environment",level:2},{value:"2.1. Operating System",id:"21-operating-system",level:3},{value:"2.2. System Libraries",id:"22-system-libraries",level:3},{value:"3.Recommended Configuration",id:"3recommended-configuration",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"environment",children:"Environment"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document provides an overview of the required hardware and software environment for deploying TuGraph."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1hardware-environment",children:"1.Hardware Environment"}),"\n",(0,t.jsx)(n.h3,{id:"11-cpu",children:"1.1. CPU"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph supports X86_64 and ARM64 architectures for both physical, virtual, and containerized environments. Tested and certified hardware platforms include Intel, AMD, Kunpeng, Hygon, Feiteng, and others."}),"\n",(0,t.jsx)(n.h3,{id:"12-memory",children:"1.2. Memory"}),"\n",(0,t.jsx)(n.p,{children:"We recommend having a memory capacity that is equal to or greater than the actual data size. For optimal performance, caching all data in memory is ideal. In terms of data locality, graph databases have poorer locality compared to relational databases. Therefore, if the data cannot fit in memory, frequent swapping may occur."}),"\n",(0,t.jsx)(n.h3,{id:"13-storage",children:"1.3. Storage"}),"\n",(0,t.jsx)(n.p,{children:"We strongly recommend using NVMe SSD as external storage. The database performs numerous synchronous write operations, often in a random manner, making the read/write performance of the external storage critical to the overall database performance. Hence, high IOPS and low-latency NVMe SSDs are the optimal choice."}),"\n",(0,t.jsx)(n.p,{children:"If circumstances permit only the use of SATA interface SSDs or cloud-based network disks, although performance may be affected, TuGraph can still run correctly."}),"\n",(0,t.jsx)(n.p,{children:"It is recommended to have external storage size at least four times the actual data size. For example, if the data size is 1TB, preparing a 4TB hard drive would be more reliable."}),"\n",(0,t.jsx)(n.h2,{id:"2-software-environment",children:"2. Software environment"}),"\n",(0,t.jsx)(n.h3,{id:"21-operating-system",children:"2.1. Operating System"}),"\n",(0,t.jsx)(n.p,{children:"TuGraph is compatible with popular operating systems, including Ubuntu, CentOS, SUSE, Galaxy Kylin, China Standard Software, UOS, and others, all of which have been tested and certified."}),"\n",(0,t.jsx)(n.p,{children:"Among them, the most stable system versions are Ubuntu 18.04, CentOS 7, and CentOS 8."}),"\n",(0,t.jsx)(n.h3,{id:"22-system-libraries",children:"2.2. System Libraries"}),"\n",(0,t.jsxs)(n.p,{children:["The requirements for system libraries differ between the compilation environment and the runtime environment. For specific details, please refer to the",(0,t.jsx)(n.a,{href:"/tugraph-db/en/installation&running/environment-mode",children:"environment mode"}),"\u3002"]}),"\n",(0,t.jsx)(n.h2,{id:"3recommended-configuration",children:"3.Recommended Configuration"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Hardware"}),(0,t.jsx)(n.th,{children:"Minimum Configuration"}),(0,t.jsx)(n.th,{children:"Recommended Configuration"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"CPU"}),(0,t.jsx)(n.td,{children:"4 Cores"}),(0,t.jsx)(n.td,{children:"64 Cores"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Memory"}),(0,t.jsx)(n.td,{children:"4GB"}),(0,t.jsx)(n.td,{children:"512GB"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Storage"}),(0,t.jsx)(n.td,{children:"100GB"}),(0,t.jsx)(n.td,{children:"2TB NVMe SSD"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OS"}),(0,t.jsx)(n.td,{children:"Linux 4.9"}),(0,t.jsx)(n.td,{children:"CentOS 7.3"})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>s});var t=r(6540);const i={},a=t.createContext(i);function o(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f01c9311.d2d65d20.js b/assets/js/f01c9311.d822b0e3.js similarity index 99% rename from assets/js/f01c9311.d2d65d20.js rename to assets/js/f01c9311.d822b0e3.js index 7b23a4e283..26b313a0fa 100644 --- a/assets/js/f01c9311.d2d65d20.js +++ b/assets/js/f01c9311.d822b0e3.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6999],{8051:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=t(4848),s=t(8453);const o={},a="Bolt client",i={id:"client-tools/bolt-client",title:"Bolt client",description:"TuGraph implements Neo4j's bolt protocol, you can use Neo4j's client to access TuGraph.",source:"@site/../docs/en-US/source/7.client-tools/5.bolt-client.md",sourceDirName:"7.client-tools",slug:"/client-tools/bolt-client",permalink:"/tugraph-db/en/client-tools/bolt-client",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph-OGM",permalink:"/tugraph-db/en/client-tools/tugraph-ogm"},next:{title:"TuGraph console client",permalink:"/tugraph-db/en/client-tools/bolt-console-client"}},l={},c=[{value:"Enable bolt port",id:"enable-bolt-port",level:2},{value:"Use case example",id:"use-case-example",level:2},{value:"Limitations on use",id:"limitations-on-use",level:2},{value:"Example of Client Usage",id:"example-of-client-usage",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"bolt-client",children:"Bolt client"})}),"\n",(0,r.jsx)(n.p,{children:"TuGraph implements Neo4j's bolt protocol, you can use Neo4j's client to access TuGraph."}),"\n",(0,r.jsx)(n.h2,{id:"enable-bolt-port",children:"Enable bolt port"}),"\n",(0,r.jsxs)(n.p,{children:["The Bolt port is enabled by default on port 7687. If you need to change the port, you can do so in the configuration file. For services deployed using the Docker method, the configuration file is located within the container at ",(0,r.jsx)(n.code,{children:"/usr/local/etc/lgraph.json"}),"; for services deployed using the RPM package, the configuration file is on the server at ",(0,r.jsx)(n.code,{children:"/usr/local/etc/lgraph.json"}),". To apply the port change, you will need to restart the service. Specific instructions for restarting the service can be found in ",(0,r.jsx)(n.a,{href:"../../5.installation&running/7.tugraph-running.md",children:"Tugraph Running"}),'. Additionally, for a detailed explanation of the configuration options available in the configuration file, see the "Configuration parameters" section in ',(0,r.jsx)(n.a,{href:"../../5.installation&running/7.tugraph-running.md",children:"Tugraph Running"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"use-case-example",children:"Use case example"}),"\n",(0,r.jsx)(n.p,{children:"Add Maven dependency"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-xml",children:"\n org.neo4j.driver\n neo4j-java-driver\n 4.4.2\n\n"})}),"\n",(0,r.jsx)(n.p,{children:"Instantiate the client as follows:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:' Driver driver = GraphDatabase.driver("bolt://ip:port", AuthTokens.basic("admin", "73@TuGraph"));\n'})}),"\n",(0,r.jsx)(n.p,{children:"Common statements:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:' //Create a session through the driver object, setting the session to connect to a specific database, to execute Cypher statements.\n Session session = driver.session(SessionConfig.forDatabase("default"));\n //Clear the graph project, please do not attempt this lightly as it will delete both the schema and data of the selected graph project.\n session.run("CALL db.dropDB()");\n //Create vertex\n session.run("CALL db.createVertexLabel(\'person\', \'id\' , \'id\' ,INT32, false, \'name\' ,STRING, false)");\n //Create edge\n session.run("CALL db.createEdgeLabel(\'is_friend\',\'[[\\"person\\",\\"person\\"]]\')");\n //Create index\n session.run("CALL db.addIndex(\\"person\\", \\"name\\", false)");\n //Insert vertex data\n session.run("create (n1:person {name:\'jack\',id:1}), (n2:person {name:\'lucy\',id:2})");\n //Insert edge data\n session.run("match (n1:person {id:1}), (n2:person {id:2}) create (n1)-[r:is_friend]->(n2)");\n //Query vertices and edges\n Result res = session.run("match (n)-[r]->(m) return n,r,m");\n //Parameterized Query\n String cypherQuery = "MATCH (n1:person {id:$id})-[r]-(n2:person {name:$name}) RETURN n1, r, n2";\n Result result1 = session.run(cypherQuery, parameters("id", 1, "name", "lucy"));\n while (result1.hasNext()) {\n Record record = result1.next();\n System.out.println("n1: " + record.get("n1").asMap());\n System.out.println("r: " + record.get("r").asMap());\n System.out.println("n2: " + record.get("n2").asMap());\n } \n //Delete vertex data\n session.run("match (n1:person {id:1}) delete n1");\n //Delete edge data\n session.run("match (n1:person {id:1})-[r]-(n2:person{id:2}) delete r");\n //Delete edge\n session.run("CALL db.deleteLabel(\'edge\', \'is_friend\')");\n //Delete vertex\n session.run("CALL db.deleteLabel(\'vertex\', \'person\')");\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Details on the use of Cypher and stored procedures can be found in ",(0,r.jsx)(n.a,{href:"../../8.query/1.cypher.md",children:"Cypher"})]}),"\n",(0,r.jsx)(n.h2,{id:"limitations-on-use",children:"Limitations on use"}),"\n",(0,r.jsx)(n.p,{children:"Currently, our system does not fully support all advanced features of the Neo4j Bolt protocol. In particular, immediate transaction processing and flexible weak schema, two unique capabilities of the Neo4j client, are not yet supported. Therefore, when using the client, please make sure to avoid operations that involve these features to ensure smooth running of the application and consistency of data."}),"\n",(0,r.jsx)(n.h2,{id:"example-of-client-usage",children:"Example of Client Usage"}),"\n",(0,r.jsxs)(n.p,{children:["In the code directory under demo/Bolt, there are examples in Golang, JavaScript, Java, JavaScript, Python, and Rust. To learn more, see ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-db/tree/master/demo",children:"Example of Client Usage"})]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>i});var r=t(6540);const s={},o=r.createContext(s);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[6999],{8051:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=t(4848),s=t(8453);const o={},a="Bolt client",i={id:"client-tools/bolt-client",title:"Bolt client",description:"TuGraph implements Neo4j's bolt protocol, you can use Neo4j's client to access TuGraph.",source:"@site/../docs/en-US/source/7.client-tools/5.bolt-client.md",sourceDirName:"7.client-tools",slug:"/client-tools/bolt-client",permalink:"/tugraph-db/en/client-tools/bolt-client",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:5,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph-OGM",permalink:"/tugraph-db/en/client-tools/tugraph-ogm"},next:{title:"TuGraph console client",permalink:"/tugraph-db/en/client-tools/bolt-console-client"}},l={},c=[{value:"Enable bolt port",id:"enable-bolt-port",level:2},{value:"Use case example",id:"use-case-example",level:2},{value:"Limitations on use",id:"limitations-on-use",level:2},{value:"Example of Client Usage",id:"example-of-client-usage",level:2}];function d(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"bolt-client",children:"Bolt client"})}),"\n",(0,r.jsx)(n.p,{children:"TuGraph implements Neo4j's bolt protocol, you can use Neo4j's client to access TuGraph."}),"\n",(0,r.jsx)(n.h2,{id:"enable-bolt-port",children:"Enable bolt port"}),"\n",(0,r.jsxs)(n.p,{children:["The Bolt port is enabled by default on port 7687. If you need to change the port, you can do so in the configuration file. For services deployed using the Docker method, the configuration file is located within the container at ",(0,r.jsx)(n.code,{children:"/usr/local/etc/lgraph.json"}),"; for services deployed using the RPM package, the configuration file is on the server at ",(0,r.jsx)(n.code,{children:"/usr/local/etc/lgraph.json"}),". To apply the port change, you will need to restart the service. Specific instructions for restarting the service can be found in ",(0,r.jsx)(n.a,{href:"../../5.installation&running/7.tugraph-running.md",children:"Tugraph Running"}),'. Additionally, for a detailed explanation of the configuration options available in the configuration file, see the "Configuration parameters" section in ',(0,r.jsx)(n.a,{href:"../../5.installation&running/7.tugraph-running.md",children:"Tugraph Running"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"use-case-example",children:"Use case example"}),"\n",(0,r.jsx)(n.p,{children:"Add Maven dependency"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-xml",children:"\n org.neo4j.driver\n neo4j-java-driver\n 4.4.2\n\n"})}),"\n",(0,r.jsx)(n.p,{children:"Instantiate the client as follows:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:' Driver driver = GraphDatabase.driver("bolt://ip:port", AuthTokens.basic("admin", "73@TuGraph"));\n'})}),"\n",(0,r.jsx)(n.p,{children:"Common statements:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:' //Create a session through the driver object, setting the session to connect to a specific database, to execute Cypher statements.\n Session session = driver.session(SessionConfig.forDatabase("default"));\n //Clear the graph project, please do not attempt this lightly as it will delete both the schema and data of the selected graph project.\n session.run("CALL db.dropDB()");\n //Create vertex\n session.run("CALL db.createVertexLabel(\'person\', \'id\' , \'id\' ,INT32, false, \'name\' ,STRING, false)");\n //Create edge\n session.run("CALL db.createEdgeLabel(\'is_friend\',\'[[\\"person\\",\\"person\\"]]\')");\n //Create index\n session.run("CALL db.addIndex(\\"person\\", \\"name\\", false)");\n //Insert vertex data\n session.run("create (n1:person {name:\'jack\',id:1}), (n2:person {name:\'lucy\',id:2})");\n //Insert edge data\n session.run("match (n1:person {id:1}), (n2:person {id:2}) create (n1)-[r:is_friend]->(n2)");\n //Query vertices and edges\n Result res = session.run("match (n)-[r]->(m) return n,r,m");\n //Parameterized Query\n String cypherQuery = "MATCH (n1:person {id:$id})-[r]-(n2:person {name:$name}) RETURN n1, r, n2";\n Result result1 = session.run(cypherQuery, parameters("id", 1, "name", "lucy"));\n while (result1.hasNext()) {\n Record record = result1.next();\n System.out.println("n1: " + record.get("n1").asMap());\n System.out.println("r: " + record.get("r").asMap());\n System.out.println("n2: " + record.get("n2").asMap());\n } \n //Delete vertex data\n session.run("match (n1:person {id:1}) delete n1");\n //Delete edge data\n session.run("match (n1:person {id:1})-[r]-(n2:person{id:2}) delete r");\n //Delete edge\n session.run("CALL db.deleteLabel(\'edge\', \'is_friend\')");\n //Delete vertex\n session.run("CALL db.deleteLabel(\'vertex\', \'person\')");\n'})}),"\n",(0,r.jsxs)(n.p,{children:["Details on the use of Cypher and stored procedures can be found in ",(0,r.jsx)(n.a,{href:"../../8.query/1.cypher.md",children:"Cypher"})]}),"\n",(0,r.jsx)(n.h2,{id:"limitations-on-use",children:"Limitations on use"}),"\n",(0,r.jsx)(n.p,{children:"Currently, our system does not fully support all advanced features of the Neo4j Bolt protocol. In particular, immediate transaction processing and flexible weak schema, two unique capabilities of the Neo4j client, are not yet supported. Therefore, when using the client, please make sure to avoid operations that involve these features to ensure smooth running of the application and consistency of data."}),"\n",(0,r.jsx)(n.h2,{id:"example-of-client-usage",children:"Example of Client Usage"}),"\n",(0,r.jsxs)(n.p,{children:["In the code directory under demo/Bolt, there are examples in Golang, JavaScript, Java, JavaScript, Python, and Rust. To learn more, see ",(0,r.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-db/tree/master/demo",children:"Example of Client Usage"})]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>i});var r=t(6540);const s={},o=r.createContext(s);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f0d3c377.d2da98db.js b/assets/js/f0d3c377.25815bae.js similarity index 98% rename from assets/js/f0d3c377.d2da98db.js rename to assets/js/f0d3c377.25815bae.js index 9bed45eea0..0fa020091a 100644 --- a/assets/js/f0d3c377.d2da98db.js +++ b/assets/js/f0d3c377.25815bae.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5322],{6914:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(4848),r=a(8453);const o={},s="Data Warmup",i={id:"utility-tools/data-warmup",title:"Data Warmup",description:"This document mainly introduces the data Warmup function of TuGraph.",source:"@site/../docs/en-US/source/6.utility-tools/4.data-warmup.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/data-warmup",permalink:"/tugraph-db/en/utility-tools/data-warmup",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Backup and Restore",permalink:"/tugraph-db/en/utility-tools/backup-and-restore"},next:{title:"Cluster management",permalink:"/tugraph-db/en/utility-tools/ha-cluster-management"}},d={},u=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.lgraph_warmup",id:"2lgraph_warmup",level:2}];function l(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"data-warmup",children:"Data Warmup"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"This document mainly introduces the data Warmup function of TuGraph."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,n.jsx)(t.p,{children:"TuGraph is a disk-based database where data loaded into memory only when accessed. Therefore, for a period of time after the server just turned on, the system performance may be degraded due to frequent IO operations. At this point, we can improve this problem by data warm-up."}),"\n",(0,n.jsx)(t.h2,{id:"2lgraph_warmup",children:"2.lgraph_warmup"}),"\n",(0,n.jsx)(t.p,{children:"Data warmup can be done using the tool lgraph_warmup. An example of its use is as follows:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ lgraph_warmup -d {directory} -g {graph_list}\n"})}),"\n",(0,n.jsx)(t.p,{children:"Details:"}),"\n",(0,n.jsx)(t.p,{children:"The - '-d {db_dir}' option specifies the data directory for the TuGraph server"}),"\n",(0,n.jsx)(t.p,{children:"The - '-g {graph_list}' option specifies the names of graphs to be warmed-up, separated by commas"}),"\n",(0,n.jsx)(t.p,{children:"The warm-up process takes different times depending on the data size and the type of disk being used. Preheating a large database on a mechanical disk may take a long time. Please wait patiently."})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>i});var n=a(6540);const r={},o=n.createContext(r);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5322],{6914:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>u});var n=a(4848),r=a(8453);const o={},s="Data Warmup",i={id:"utility-tools/data-warmup",title:"Data Warmup",description:"This document mainly introduces the data Warmup function of TuGraph.",source:"@site/../docs/en-US/source/6.utility-tools/4.data-warmup.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/data-warmup",permalink:"/tugraph-db/en/utility-tools/data-warmup",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Backup and Restore",permalink:"/tugraph-db/en/utility-tools/backup-and-restore"},next:{title:"Cluster management",permalink:"/tugraph-db/en/utility-tools/ha-cluster-management"}},d={},u=[{value:"1.Introduction",id:"1introduction",level:2},{value:"2.lgraph_warmup",id:"2lgraph_warmup",level:2}];function l(e){const t={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"data-warmup",children:"Data Warmup"})}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsx)(t.p,{children:"This document mainly introduces the data Warmup function of TuGraph."}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,n.jsx)(t.p,{children:"TuGraph is a disk-based database where data loaded into memory only when accessed. Therefore, for a period of time after the server just turned on, the system performance may be degraded due to frequent IO operations. At this point, we can improve this problem by data warm-up."}),"\n",(0,n.jsx)(t.h2,{id:"2lgraph_warmup",children:"2.lgraph_warmup"}),"\n",(0,n.jsx)(t.p,{children:"Data warmup can be done using the tool lgraph_warmup. An example of its use is as follows:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-bash",children:"$ lgraph_warmup -d {directory} -g {graph_list}\n"})}),"\n",(0,n.jsx)(t.p,{children:"Details:"}),"\n",(0,n.jsx)(t.p,{children:"The - '-d {db_dir}' option specifies the data directory for the TuGraph server"}),"\n",(0,n.jsx)(t.p,{children:"The - '-g {graph_list}' option specifies the names of graphs to be warmed-up, separated by commas"}),"\n",(0,n.jsx)(t.p,{children:"The warm-up process takes different times depending on the data size and the type of disk being used. Preheating a large database on a mechanical disk may take a long time. Please wait patiently."})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},8453:(e,t,a)=>{a.d(t,{R:()=>s,x:()=>i});var n=a(6540);const r={},o=n.createContext(r);function s(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f5a37f2d.3855de93.js b/assets/js/f5a37f2d.fe64c836.js similarity index 99% rename from assets/js/f5a37f2d.3855de93.js rename to assets/js/f5a37f2d.fe64c836.js index b50c974f2b..7ba8ab8f2f 100644 --- a/assets/js/f5a37f2d.3855de93.js +++ b/assets/js/f5a37f2d.fe64c836.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8321],{932:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var r=t(4848),s=t(8453);const i={},o="TuGraph-OGM",a={id:"client-tools/tugraph-ogm",title:"TuGraph-OGM",description:"@TODO",source:"@site/../docs/en-US/source/7.client-tools/4.tugraph-ogm.md",sourceDirName:"7.client-tools",slug:"/client-tools/tugraph-ogm",permalink:"/tugraph-db/en/client-tools/tugraph-ogm",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Java SDK",permalink:"/tugraph-db/en/client-tools/java-client"},next:{title:"Bolt client",permalink:"/tugraph-db/en/client-tools/bolt-client"}},d={},l=[{value:"1.Introduction",id:"1introduction",level:2},{value:"1.1.Functions of TuGraph-OGM",id:"11functions-of-tugraph-ogm",level:3},{value:"2.Compile TuGraph-OGM",id:"2compile-tugraph-ogm",level:2},{value:"3.Use TuGraph-OGM",id:"3use-tugraph-ogm",level:2},{value:"3.1.\u6784\u5efa\u56fe\u5bf9\u8c61",id:"31\u6784\u5efa\u56fe\u5bf9\u8c61",level:3},{value:"3.2.\u4e0eTuGraph\u5efa\u7acb\u8fde\u63a5",id:"32\u4e0etugraph\u5efa\u7acb\u8fde\u63a5",level:3},{value:"3.3.Perform CRUD operations through OGM",id:"33perform-crud-operations-through-ogm",level:3}];function c(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",id:"id",p:"p",pre:"pre",t:"t",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"tugraph-ogm",children:"TuGraph-OGM"})}),"\n",(0,r.jsx)(n.p,{children:"@TODO"}),"\n",(0,r.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"TuGraph-OGM project is open source on other repositories."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"TuGraph-OGM (Object Graph Mapping) is a graph object mapping tool designed for TuGraph. It supports the mapping of Java objects (POJO) into TuGraph. The classes in Java are mapped to nodes in the graph, the collections in the classes are mapped to edges, and the properties of the classes are mapped to the attributes of the graph objects. It also provides corresponding functions to manipulate the graph database. Therefore, Java developers can easily use TuGraph database in the familiar ecosystem. TuGraph-OGM is also compatible with Neo4j-OGM. Neo4j ecosystem users can migrate seamlessly to TuGraph database."}),"\n",(0,r.jsx)(n.h3,{id:"11functions-of-tugraph-ogm",children:"1.1.Functions of TuGraph-OGM"}),"\n",(0,r.jsx)(n.p,{children:"TuGraph-OGM provides the following functions for operating TuGraph:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Function"}),(0,r.jsx)(n.th,{children:"Usage"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Insert single vertex/edge"}),(0,r.jsx)(n.td,{children:"void session.save(T object)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Batch insert vertexs/edges"}),(0,r.jsx)(n.td,{children:"void session.save(T object)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Delete vertex and its corresponding edges"}),(0,r.jsx)(n.td,{children:"void session.delete(T object)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Delete all vertexs with specific label"}),(0,r.jsx)(n.td,{children:"void session.deleteAll(Class type)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Clear the database"}),(0,r.jsx)(n.td,{children:"void purgeDatabase()"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Update vertex"}),(0,r.jsx)(n.td,{children:"void session.save(T newObject)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Query single node by id"}),(0,r.jsxs)(n.td,{children:["T load(Class",(0,r.jsx)(n.t,{children:" type, ID id)"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Query multiple nodes by ids"}),(0,r.jsxs)(n.td,{children:["Collection loadAll(Class type, Collection",(0,r.jsx)(n.id,{children:" ids)"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Query all nodes with specific label"}),(0,r.jsx)(n.td,{children:"Collection loadAll(Class type)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Query with conditions"}),(0,r.jsx)(n.td,{children:"Collection loadAll(Class type, Filters filters)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Cypher query (specify the return type)"}),(0,r.jsx)(n.td,{children:"T queryForObject(Class objectType, String cypher, Map parameters)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Cypher query"}),(0,r.jsx)(n.td,{children:"Result query(String cypher, Map parameters)"})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"2compile-tugraph-ogm",children:"2.Compile TuGraph-OGM"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"cd tugraph-ogm\nmvn clean install -DskipTests -Denforcer.skip=true\n"})}),"\n",(0,r.jsx)(n.h2,{id:"3use-tugraph-ogm",children:"3.Use TuGraph-OGM"}),"\n",(0,r.jsxs)(n.p,{children:["Please refer to the detailed examples in TuGraphOGMDemo under the demo folder.How to import dependencies in ",(0,r.jsx)(n.code,{children:"pom.xml"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"\n org.neo4j\n neo4j-ogm-api\n 0.1.0-SNAPSHOT\n \n\n \n org.neo4j\n neo4j-ogm-core\n 0.1.0-SNAPSHOT\n \n\n \n org.neo4j\n tugraph-rpc-driver\n 0.1.0-SNAPSHOT\n \n"})}),"\n",(0,r.jsx)(n.h3,{id:"31\u6784\u5efa\u56fe\u5bf9\u8c61",children:"3.1.\u6784\u5efa\u56fe\u5bf9\u8c61"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@NodeEntity\npublic class Movie { // create Movie vertex\n @Id\n private Long id; // Movie id\n private String title; // title attribute\n private int released; // released attribute\n\n // create Edge ACTS_IN (actor)-[:ACTS_IN]->(movie)\n @Relationship(type = "ACTS_IN", direction = Relationship.Direction.INCOMING)\n Set actors = new HashSet<>();\n\n public Movie(String title, int year) {\n this.title = title;\n this.released = year;\n }\n\n public Long getId() {\n return id;\n }\n\n public void setReleased(int released) {\n this.released = released;\n }\n}\n\n@NodeEntity\npublic class Actor { // create Actor vertex\n @Id\n private Long id;\n private String name;\n\n @Relationship(type = "ACTS_IN", direction = Relationship.Direction.OUTGOING)\n private Set movies = new HashSet<>();\n\n public Actor(String name) {\n this.name = name;\n }\n\n public void actsIn(Movie movie) {\n movies.add(movie);\n movie.getActors().add(this);\n }\n}\n'})}),"\n",(0,r.jsx)(n.h3,{id:"32\u4e0etugraph\u5efa\u7acb\u8fde\u63a5",children:"3.2.\u4e0eTuGraph\u5efa\u7acb\u8fde\u63a5"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'// configuration\nString databaseUri = "list://ip:port";\nString username = "admin";\nString password = "73@TuGraph";\n//Start driver\nDriver driver = new RpcDriver();\nConfiguration.Builder baseConfigurationBuilder = new Configuration.Builder()\n .uri(databaseUri)\n .verifyConnection(true)\n .credentials(username, password);\n driver.configure(baseConfigurationBuilder.build());\ndriver.configure(baseConfigurationBuilder.build());\n// Open session\nSessionFactory sessionFactory = new SessionFactory(driver, "entity_path");\nSession session = sessionFactory.openSession();\n'})}),"\n",(0,r.jsx)(n.h3,{id:"33perform-crud-operations-through-ogm",children:"3.3.Perform CRUD operations through OGM"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'// new\nMovie jokes = new Movie("Jokes", 1990); // Create Movie-vertex "jokes"\nsession.save(jokes); // Store "jokes" in TuGraph\n\nMovie speed = new Movie("Speed", 2019);\nActor alice = new Actor("Alice Neeves");\nalice.actsIn(speed); // Connect the "speed" vertex with the "alice" vertex through the ACTS_IN relationship\nsession.save(speed); // Store two vertexs and one edge\n\n// delete\nsession.delete(alice); // Delete the "alice" vertex and its connected edge\nMovie m = session.load(Movie.class, jokes.getId()); // Get the "jokes" vertex based on its id\nsession.delete(m); // Delete the "jokes" node\n\n// update\nspeed.setReleased(2018);\nsession.save(speed); // Update the "speed" attribute\n\n// get\nCollection movies = session.loadAll(Movie.class); // Get all Movie vertexs\nCollection moviesFilter = session.loadAll(Movie.class,\n new Filter("released", ComparisonOperator.LESS_THAN, 1995)); // Query all movies released before 1995\n\n// Call Cypher\nHashMap parameters = new HashMap<>();\nparameters.put("Speed", 2018);\nMovie cm = session.queryForObject(Movie.class,\n "MATCH (cm:Movie{Speed: $Speed}) RETURN *", parameters); // Query the Movie with "Speed" of 2018\n\nsession.query("CALL db.createVertexLabel(\'Director\', \'name\', \'name\'," +\n "STRING, false, \'age\', INT16, true)", emptyMap()); // Create vertex label "Director"\nsession.query("CALL db.createEdgeLabel(\'DIRECT\', \'[]\')", emptyMap()); // Create edge label "DIRECT"\nResult createResult = session.query(\n "CREATE (n:Movie{title:\\"The Shawshank Redemption\\", released:1994})" +\n "<-[r:DIRECT]-" +\n "(n2:Director{name:\\"Frank Darabont\\", age:63})",\n emptyMap());\nQueryStatistics statistics = createResult.queryStatistics(); // Get the create result\nSystem.out.println("created " + statistics.getNodesCreated() + " vertices"); // View the number of vertexs created\nSystem.out.println("created " + statistics.getRelationshipsCreated() + " edges"); //View the number of edges created\n\n// Clear the database\nsession.deleteAll(Movie.class); // Delete all Movie vertexs\nsession.purgeDatabase(); // Delete all data\n'})})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var r=t(6540);const s={},i=r.createContext(s);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8321],{932:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var r=t(4848),s=t(8453);const i={},o="TuGraph-OGM",a={id:"client-tools/tugraph-ogm",title:"TuGraph-OGM",description:"@TODO",source:"@site/../docs/en-US/source/7.client-tools/4.tugraph-ogm.md",sourceDirName:"7.client-tools",slug:"/client-tools/tugraph-ogm",permalink:"/tugraph-db/en/client-tools/tugraph-ogm",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"TuGraph Java SDK",permalink:"/tugraph-db/en/client-tools/java-client"},next:{title:"Bolt client",permalink:"/tugraph-db/en/client-tools/bolt-client"}},d={},l=[{value:"1.Introduction",id:"1introduction",level:2},{value:"1.1.Functions of TuGraph-OGM",id:"11functions-of-tugraph-ogm",level:3},{value:"2.Compile TuGraph-OGM",id:"2compile-tugraph-ogm",level:2},{value:"3.Use TuGraph-OGM",id:"3use-tugraph-ogm",level:2},{value:"3.1.\u6784\u5efa\u56fe\u5bf9\u8c61",id:"31\u6784\u5efa\u56fe\u5bf9\u8c61",level:3},{value:"3.2.\u4e0eTuGraph\u5efa\u7acb\u8fde\u63a5",id:"32\u4e0etugraph\u5efa\u7acb\u8fde\u63a5",level:3},{value:"3.3.Perform CRUD operations through OGM",id:"33perform-crud-operations-through-ogm",level:3}];function c(e){const n={blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",id:"id",p:"p",pre:"pre",t:"t",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"tugraph-ogm",children:"TuGraph-OGM"})}),"\n",(0,r.jsx)(n.p,{children:"@TODO"}),"\n",(0,r.jsx)(n.h2,{id:"1introduction",children:"1.Introduction"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsx)(n.p,{children:"TuGraph-OGM project is open source on other repositories."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"TuGraph-OGM (Object Graph Mapping) is a graph object mapping tool designed for TuGraph. It supports the mapping of Java objects (POJO) into TuGraph. The classes in Java are mapped to nodes in the graph, the collections in the classes are mapped to edges, and the properties of the classes are mapped to the attributes of the graph objects. It also provides corresponding functions to manipulate the graph database. Therefore, Java developers can easily use TuGraph database in the familiar ecosystem. TuGraph-OGM is also compatible with Neo4j-OGM. Neo4j ecosystem users can migrate seamlessly to TuGraph database."}),"\n",(0,r.jsx)(n.h3,{id:"11functions-of-tugraph-ogm",children:"1.1.Functions of TuGraph-OGM"}),"\n",(0,r.jsx)(n.p,{children:"TuGraph-OGM provides the following functions for operating TuGraph:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Function"}),(0,r.jsx)(n.th,{children:"Usage"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Insert single vertex/edge"}),(0,r.jsx)(n.td,{children:"void session.save(T object)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Batch insert vertexs/edges"}),(0,r.jsx)(n.td,{children:"void session.save(T object)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Delete vertex and its corresponding edges"}),(0,r.jsx)(n.td,{children:"void session.delete(T object)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Delete all vertexs with specific label"}),(0,r.jsx)(n.td,{children:"void session.deleteAll(Class type)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Clear the database"}),(0,r.jsx)(n.td,{children:"void purgeDatabase()"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Update vertex"}),(0,r.jsx)(n.td,{children:"void session.save(T newObject)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Query single node by id"}),(0,r.jsxs)(n.td,{children:["T load(Class",(0,r.jsx)(n.t,{children:" type, ID id)"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Query multiple nodes by ids"}),(0,r.jsxs)(n.td,{children:["Collection loadAll(Class type, Collection",(0,r.jsx)(n.id,{children:" ids)"})]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Query all nodes with specific label"}),(0,r.jsx)(n.td,{children:"Collection loadAll(Class type)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Query with conditions"}),(0,r.jsx)(n.td,{children:"Collection loadAll(Class type, Filters filters)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Cypher query (specify the return type)"}),(0,r.jsx)(n.td,{children:"T queryForObject(Class objectType, String cypher, Map parameters)"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Cypher query"}),(0,r.jsx)(n.td,{children:"Result query(String cypher, Map parameters)"})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"2compile-tugraph-ogm",children:"2.Compile TuGraph-OGM"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"cd tugraph-ogm\nmvn clean install -DskipTests -Denforcer.skip=true\n"})}),"\n",(0,r.jsx)(n.h2,{id:"3use-tugraph-ogm",children:"3.Use TuGraph-OGM"}),"\n",(0,r.jsxs)(n.p,{children:["Please refer to the detailed examples in TuGraphOGMDemo under the demo folder.How to import dependencies in ",(0,r.jsx)(n.code,{children:"pom.xml"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"\n org.neo4j\n neo4j-ogm-api\n 0.1.0-SNAPSHOT\n \n\n \n org.neo4j\n neo4j-ogm-core\n 0.1.0-SNAPSHOT\n \n\n \n org.neo4j\n tugraph-rpc-driver\n 0.1.0-SNAPSHOT\n \n"})}),"\n",(0,r.jsx)(n.h3,{id:"31\u6784\u5efa\u56fe\u5bf9\u8c61",children:"3.1.\u6784\u5efa\u56fe\u5bf9\u8c61"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@NodeEntity\npublic class Movie { // create Movie vertex\n @Id\n private Long id; // Movie id\n private String title; // title attribute\n private int released; // released attribute\n\n // create Edge ACTS_IN (actor)-[:ACTS_IN]->(movie)\n @Relationship(type = "ACTS_IN", direction = Relationship.Direction.INCOMING)\n Set actors = new HashSet<>();\n\n public Movie(String title, int year) {\n this.title = title;\n this.released = year;\n }\n\n public Long getId() {\n return id;\n }\n\n public void setReleased(int released) {\n this.released = released;\n }\n}\n\n@NodeEntity\npublic class Actor { // create Actor vertex\n @Id\n private Long id;\n private String name;\n\n @Relationship(type = "ACTS_IN", direction = Relationship.Direction.OUTGOING)\n private Set movies = new HashSet<>();\n\n public Actor(String name) {\n this.name = name;\n }\n\n public void actsIn(Movie movie) {\n movies.add(movie);\n movie.getActors().add(this);\n }\n}\n'})}),"\n",(0,r.jsx)(n.h3,{id:"32\u4e0etugraph\u5efa\u7acb\u8fde\u63a5",children:"3.2.\u4e0eTuGraph\u5efa\u7acb\u8fde\u63a5"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'// configuration\nString databaseUri = "list://ip:port";\nString username = "admin";\nString password = "73@TuGraph";\n//Start driver\nDriver driver = new RpcDriver();\nConfiguration.Builder baseConfigurationBuilder = new Configuration.Builder()\n .uri(databaseUri)\n .verifyConnection(true)\n .credentials(username, password);\n driver.configure(baseConfigurationBuilder.build());\ndriver.configure(baseConfigurationBuilder.build());\n// Open session\nSessionFactory sessionFactory = new SessionFactory(driver, "entity_path");\nSession session = sessionFactory.openSession();\n'})}),"\n",(0,r.jsx)(n.h3,{id:"33perform-crud-operations-through-ogm",children:"3.3.Perform CRUD operations through OGM"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'// new\nMovie jokes = new Movie("Jokes", 1990); // Create Movie-vertex "jokes"\nsession.save(jokes); // Store "jokes" in TuGraph\n\nMovie speed = new Movie("Speed", 2019);\nActor alice = new Actor("Alice Neeves");\nalice.actsIn(speed); // Connect the "speed" vertex with the "alice" vertex through the ACTS_IN relationship\nsession.save(speed); // Store two vertexs and one edge\n\n// delete\nsession.delete(alice); // Delete the "alice" vertex and its connected edge\nMovie m = session.load(Movie.class, jokes.getId()); // Get the "jokes" vertex based on its id\nsession.delete(m); // Delete the "jokes" node\n\n// update\nspeed.setReleased(2018);\nsession.save(speed); // Update the "speed" attribute\n\n// get\nCollection movies = session.loadAll(Movie.class); // Get all Movie vertexs\nCollection moviesFilter = session.loadAll(Movie.class,\n new Filter("released", ComparisonOperator.LESS_THAN, 1995)); // Query all movies released before 1995\n\n// Call Cypher\nHashMap parameters = new HashMap<>();\nparameters.put("Speed", 2018);\nMovie cm = session.queryForObject(Movie.class,\n "MATCH (cm:Movie{Speed: $Speed}) RETURN *", parameters); // Query the Movie with "Speed" of 2018\n\nsession.query("CALL db.createVertexLabel(\'Director\', \'name\', \'name\'," +\n "STRING, false, \'age\', INT16, true)", emptyMap()); // Create vertex label "Director"\nsession.query("CALL db.createEdgeLabel(\'DIRECT\', \'[]\')", emptyMap()); // Create edge label "DIRECT"\nResult createResult = session.query(\n "CREATE (n:Movie{title:\\"The Shawshank Redemption\\", released:1994})" +\n "<-[r:DIRECT]-" +\n "(n2:Director{name:\\"Frank Darabont\\", age:63})",\n emptyMap());\nQueryStatistics statistics = createResult.queryStatistics(); // Get the create result\nSystem.out.println("created " + statistics.getNodesCreated() + " vertices"); // View the number of vertexs created\nSystem.out.println("created " + statistics.getRelationshipsCreated() + " edges"); //View the number of edges created\n\n// Clear the database\nsession.deleteAll(Movie.class); // Delete all Movie vertexs\nsession.purgeDatabase(); // Delete all data\n'})})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var r=t(6540);const s={},i=r.createContext(s);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f7c36d28.2bdac649.js b/assets/js/f7c36d28.18d97080.js similarity index 99% rename from assets/js/f7c36d28.2bdac649.js rename to assets/js/f7c36d28.18d97080.js index ff9b4d94d6..c710a6ea18 100644 --- a/assets/js/f7c36d28.2bdac649.js +++ b/assets/js/f7c36d28.18d97080.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4803],{3841:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var a=t(4848),r=t(8453);const o={},s="Using TuGraph Graph Learning Module for Node Classification",i={id:"best-practices/learn_practices",title:"Using TuGraph Graph Learning Module for Node Classification",description:"1. Introduction",source:"@site/../docs/en-US/source/13.best-practices/2.learn_practices.md",sourceDirName:"13.best-practices",slug:"/best-practices/learn_practices",permalink:"/tugraph-db/en/best-practices/learn_practices",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Importing Data from Relational Databases to TuGraph",permalink:"/tugraph-db/en/best-practices/rdbms-to-tugraph"},next:{title:"Data Migration",permalink:"/tugraph-db/en/best-practices/data_migration"}},d={},l=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2. Prerequisites",id:"2-prerequisites",level:2},{value:"3. Import Cora Dataset to TuGraph Database",id:"3-import-cora-dataset-to-tugraph-database",level:2},{value:"3.1. Introduction to Cora Dataset",id:"31-introduction-to-cora-dataset",level:3},{value:"3.2. Data Import",id:"32-data-import",level:3},{value:"4. Feature Conversion",id:"4-feature-conversion",level:2},{value:"5. Compile Sampling Operator",id:"5-compile-sampling-operator",level:2},{value:"6. Model training and saving",id:"6-model-training-and-saving",level:2},{value:"6.1. Data Loading",id:"61-data-loading",level:3},{value:"6.2. Build Sampler",id:"62-build-sampler",level:3},{value:"6.3. Convert the results to the required format",id:"63-convert-the-results-to-the-required-format",level:3},{value:"6.4. Build the GCN model",id:"64-build-the-gcn-model",level:3},{value:"6.5. Train the GCN model",id:"65-train-the-gcn-model",level:3}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"using-tugraph-graph-learning-module-for-node-classification",children:"Using TuGraph Graph Learning Module for Node Classification"})}),"\n",(0,a.jsx)(n.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,a.jsx)(n.p,{children:"GNN is a powerful tool for many machine learning tasks on graphs. In this introductory tutorial, you will learn the basic workflow of using GNN for node classification, i.e., predicting the category of nodes in a graph."}),"\n",(0,a.jsx)(n.p,{children:"This document will show how to build a GNN for semi-supervised node classification on the Cora dataset with only a few labels, which is a citation network with papers as nodes and citations as edges. The task is to predict the category of a given paper.\nBy completing this tutorial, you will be able to:"}),"\n",(0,a.jsx)(n.p,{children:"Load the Cora dataset."}),"\n",(0,a.jsx)(n.p,{children:"Sample and build a GNN model using the sampling operator provided by TuGraph.\nTrain the GNN model for node classification on CPU or GPU."}),"\n",(0,a.jsx)(n.p,{children:"This document requires some experience in using graph neural networks and DGL."}),"\n",(0,a.jsx)(n.h2,{id:"2-prerequisites",children:"2. Prerequisites"}),"\n",(0,a.jsx)(n.p,{children:"The TuGraph graph learning module requires TuGraph-db version 3.5.1 or above."}),"\n",(0,a.jsx)(n.p,{children:"It is recommended to use Docker image tugraph-compile 1.2.4 or above for TuGraph deployment:"}),"\n",(0,a.jsx)(n.p,{children:"tugraph/tugraph-compile-ubuntu18.04:latest"}),"\n",(0,a.jsx)(n.p,{children:"tugraph/tugraph-compile-centos7:latest"}),"\n",(0,a.jsx)(n.p,{children:"tugraph/tugraph-compile-centos8:latest"}),"\n",(0,a.jsxs)(n.p,{children:["The above images can be obtained on DockerHub.\nPlease refer to ",(0,a.jsx)(n.a,{href:"/tugraph-db/en/quick-start/preparation",children:"Quick Start"})," for specific operations."]}),"\n",(0,a.jsx)(n.h2,{id:"3-import-cora-dataset-to-tugraph-database",children:"3. Import Cora Dataset to TuGraph Database"}),"\n",(0,a.jsx)(n.h3,{id:"31-introduction-to-cora-dataset",children:"3.1. Introduction to Cora Dataset"}),"\n",(0,a.jsx)(n.p,{children:"The Cora dataset consists of 2708 papers, classified into 7 categories. Each paper is represented by a 1433-dimensional bag-of-words feature, indicating whether a certain word appears in the paper. These bag-of-words features have been preprocessed to be normalized to a range from 0 to 1. The edges represent citation relationships between papers."}),"\n",(0,a.jsx)(n.p,{children:"TuGraph has provided the Cora dataset import tool, which users can use directly."}),"\n",(0,a.jsx)(n.h3,{id:"32-data-import",children:"3.2. Data Import"}),"\n",(0,a.jsx)(n.p,{children:"The Cora dataset is located in the test/integration/data/algo directory and contains the cora_vertices point set and the cora_edge edge set."}),"\n",(0,a.jsxs)(n.p,{children:["First, the Cora dataset needs to be imported into the TuGraph database. Please refer to ",(0,a.jsx)(n.a,{href:"/tugraph-db/en/utility-tools/data-import",children:"Data Import"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"In the build/output section below the line:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cp -r ../../test/integration/data/ ./ && cp -r ../../learn/examples/* ./\n"})}),"\n",(0,a.jsx)(n.p,{children:"The number of commands related to the relevant document is to be built/output."}),"\n",(0,a.jsx)(n.p,{children:"Execute the following command in the build/output directory:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"./lgraph_import -c ./data/algo/cora.conf --dir ./coradb --overwrite 1\n"})}),"\n",(0,a.jsx)(n.p,{children:"Here, cora.conf is the graph schema file representing the format of graph data, which can be found in test/integration/data/algo/cora.conf. coradb is the name of the graph data file after import, which represents the storage location of graph data."}),"\n",(0,a.jsx)(n.h2,{id:"4-feature-conversion",children:"4. Feature Conversion"}),"\n",(0,a.jsx)(n.p,{children:"Since the features in the Cora dataset are float arrays of length 1433, which are not supported by TuGraph for loading, they can be imported as strings and converted to char* for easier access later. The implementation can be referred to the feature_float.cpp file.\nThe specific execution process is as follows:"}),"\n",(0,a.jsxs)(n.p,{children:["Compile the import plugin in the build directory.(Can be skipped if TuGraph has been compiled):\n",(0,a.jsx)(n.code,{children:"make feature_float_embed"})]}),"\n",(0,a.jsxs)(n.p,{children:["Execute the following command in the build/output directory to perform the conversion:\n",(0,a.jsx)(n.code,{children:"./algo/feature_float_embed ./coradb"})]}),"\n",(0,a.jsx)(n.h2,{id:"5-compile-sampling-operator",children:"5. Compile Sampling Operator"}),"\n",(0,a.jsxs)(n.p,{children:["The sampling operator is used to obtain graph data from the database and convert it into the required data structure. The specific execution process is as follows:\nCan be skipped if TuGraph has been compiled.\nExecute the following command in the tugraph-db/build directory:\n",(0,a.jsx)(n.code,{children:"make -j2"})]}),"\n",(0,a.jsxs)(n.p,{children:["or execute the following command in the tugraph-db/learn/procedures directory:\n",(0,a.jsx)(n.code,{children:"python3 setup.py build_ext -i"})]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'from lgraph_db_python import *\nimport importlib\ngetdb = importlib.import_module("getdb")\ngetdb.Process(db, olapondb, feature_len, NodeInfo, EdgeInfo)\n'})}),"\n",(0,a.jsx)(n.p,{children:"As shown in the code, after obtaining the algorithm .so file, import and use it."}),"\n",(0,a.jsx)(n.h2,{id:"6-model-training-and-saving",children:"6. Model training and saving"}),"\n",(0,a.jsxs)(n.p,{children:["TuGraph calls the operators of the cython layer in the python layer to realize the training of the graph learning model.\nThe usage of the TuGraph graph learning module is introduced as follows:\nExecute under the build/output folder\n",(0,a.jsx)(n.code,{children:"python3 train_full_cora.py --model_save_path ./cora_model"}),"\nYou can start training.\nIf the final printed loss value is less than 0.9, the training is successful. So far, the graph model training is completed, and the model is saved in the cora_model file."]}),"\n",(0,a.jsx)(n.p,{children:"The detailed training process is as follows:"}),"\n",(0,a.jsx)(n.h3,{id:"61-data-loading",children:"6.1. Data Loading"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:"galaxy = PyGalaxy(args.db_path)\ngalaxy.SetCurrentUser(args.username, args.password)\ndb = galaxy.OpenGraph(args.graph_name, False)\n"})}),"\n",(0,a.jsx)(n.p,{children:"As shown in the code, load the data into memory based on the path of the graph data, username, password, and subgraph name. TuGraph can load multiple subgraphs for graph training, but we only load one subgraph here."}),"\n",(0,a.jsx)(n.h3,{id:"62-build-sampler",children:"6.2. Build Sampler"}),"\n",(0,a.jsx)(n.p,{children:"During the training process, the GetDB operator is first used to obtain the graph data from the database and convert it into the required data structure. The specific code is as follows:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:" GetDB.Process(db_: lgraph_db_python.PyGraphDB, olapondb: lgraph_db_python.PyOlapOnDB, feature_num: size_t, NodeInfo: list, EdgeInfo: list)\n"})}),"\n",(0,a.jsx)(n.p,{children:"As shown in the code, the results are stored in NodeInfo and EdgeInfo. NodeInfo and EdgeInfo are python list results, and their stored information is as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,a.jsxs)(n.table,{children:[(0,a.jsx)(n.thead,{children:(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.th,{children:"Graph Data"}),(0,a.jsx)(n.th,{children:"Storage Position"})]})}),(0,a.jsxs)(n.tbody,{children:[(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Edge source"}),(0,a.jsx)(n.td,{children:"EdgeInfo[0]"})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Edge destination"}),(0,a.jsx)(n.td,{children:"EdgeInfo[1]"})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Vertex ID"}),(0,a.jsx)(n.td,{children:"NodeInfo[0]"})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Vertex features"}),(0,a.jsx)(n.td,{children:"NodeInfo[1]"})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Vertex label"}),(0,a.jsx)(n.td,{children:"NodeInfo[2]"})]})]})]}),"\n",(0,a.jsx)(n.p,{children:"Then a sampler is constructed:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:"batch_size = 5\ncount = 2708\nsampler = TugraphSample(args)\ndataloader = dgl.dataloading.DataLoader(fake_g,\n torch.arange(count),\n sampler,\n batch_size=batch_size,\n num_workers=0,\n )\n"})}),"\n",(0,a.jsx)(n.h3,{id:"63-convert-the-results-to-the-required-format",children:"6.3. Convert the results to the required format"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:"src = EdgeInfo[0].astype('int64')\ndst = EdgeInfo[1].astype('int64')\nnodes_idx = NodeInfo[0].astype('int64')\nremap(src, dst, nodes_idx)\nfeatures = NodeInfo[1].astype('float32')\nlabels = NodeInfo[2].astype('int64')\ng = dgl.graph((src, dst))\ng.ndata['feat'] = torch.tensor(features)\ng.ndata['label'] = torch.tensor(labels)\nreturn g\n"})}),"\n",(0,a.jsx)(n.p,{children:"The results are converted to the required format to fit the training format."}),"\n",(0,a.jsx)(n.h3,{id:"64-build-the-gcn-model",children:"6.4. Build the GCN model"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:"class GCN(nn.Module):\n def __init__(self, in_size, hid_size, out_size):\n super().__init__()\n self.layers = nn.ModuleList()\n # two-layer GCN\n self.layers.append(dgl.nn.GraphConv(in_size, hid_size, activation=F.relu))\n self.layers.append(dgl.nn.GraphConv(hid_size, out_size))\n self.dropout = nn.Dropout(0.5)\n def forward(self, g, features):\n h = features\n for i, layer in enumerate(self.layers):\n if i != 0:\n h = self.dropout(h)\n h = layer(g, h)\n return h\ndef build_model():\n in_size = feature_len # feature_len is the length of features, which is 1433 here\n out_size = classes # classes is the number of classes, which is 7 here\n model = GCN(in_size, 16, out_size) # 16 is the size of the hidden layer\n return model\n"})}),"\n",(0,a.jsx)(n.p,{children:"In this tutorial, a two-layer Graph Convolutional Network (GCN) will be built. Each layer aggregates neighbor information to compute new node representations."}),"\n",(0,a.jsx)(n.h3,{id:"65-train-the-gcn-model",children:"6.5. Train the GCN model"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:"loss_fcn = nn.CrossEntropyLoss()\ndef train(graph, model, model_save_path):\n optimizer = torch.optim.Adam(model.parameters(), lr=1e-2, weight_decay=5e-4)\n model.train()\n s = time.time()\n load_time = time.time()\n graph = dgl.add_self_loop(graph)\n logits = model(graph, graph.ndata['feat'])\n loss = loss_fcn(logits, graph.ndata['label'])\n optimizer.zero_grad()\n loss.backward()\n optimizer.step()\n train_time = time.time()\n current_loss = float(loss)\n if model_save_path != \"\": #If you need to save the model, give the model save path\n if 'min_loss' not in train.__dict__:\n train.min_loss = current_loss\n elif current_loss < train.min_loss:\n train.min_loss = current_loss\n model_save_path = 'best_model.pth'\n torch.save(model.state_dict(), model_save_path)\n return current_loss\n\nfor epoch in range(50):\n model.train()\n total_loss = 0\n loss = train(g, model)\n if epoch % 5 == 0:\n print('In epoch', epoch, ', loss', loss)\n sys.stdout.flush()\n"})}),"\n",(0,a.jsx)(n.p,{children:"As shown in the code, iterative training is performed 50 times according to the defined sampler, optimizer and model, and the trained model is saved to the path model_save_path."}),"\n",(0,a.jsx)(n.p,{children:"The output is as follows:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"In epoch 0 , loss 1.9586775302886963\nIn epoch 5 , loss 1.543689250946045\nIn epoch 10 , loss 1.160698413848877\nIn epoch 15 , loss 0.8862786889076233\nIn epoch 20 , loss 0.6973256468772888\nIn epoch 25 , loss 0.5770673751831055\nIn epoch 30 , loss 0.5271289348602295\nIn epoch 35 , loss 0.45514997839927673\nIn epoch 40 , loss 0.43748989701271057\nIn epoch 45 , loss 0.3906335234642029\n"})}),"\n",(0,a.jsx)(n.p,{children:"The graph learning module can be accelerated by using a GPU. If users want to run it on the GPU, they need to install the corresponding GPU driver and environment. For details, please refer to learn/README.md."}),"\n",(0,a.jsx)(n.p,{children:"The complete code can be found in learn/examples/train_full_cora.py."})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>i});var a=t(6540);const r={},o=a.createContext(r);function s(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[4803],{3841:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>s,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>l});var a=t(4848),r=t(8453);const o={},s="Using TuGraph Graph Learning Module for Node Classification",i={id:"best-practices/learn_practices",title:"Using TuGraph Graph Learning Module for Node Classification",description:"1. Introduction",source:"@site/../docs/en-US/source/13.best-practices/2.learn_practices.md",sourceDirName:"13.best-practices",slug:"/best-practices/learn_practices",permalink:"/tugraph-db/en/best-practices/learn_practices",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:2,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Importing Data from Relational Databases to TuGraph",permalink:"/tugraph-db/en/best-practices/rdbms-to-tugraph"},next:{title:"Data Migration",permalink:"/tugraph-db/en/best-practices/data_migration"}},d={},l=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2. Prerequisites",id:"2-prerequisites",level:2},{value:"3. Import Cora Dataset to TuGraph Database",id:"3-import-cora-dataset-to-tugraph-database",level:2},{value:"3.1. Introduction to Cora Dataset",id:"31-introduction-to-cora-dataset",level:3},{value:"3.2. Data Import",id:"32-data-import",level:3},{value:"4. Feature Conversion",id:"4-feature-conversion",level:2},{value:"5. Compile Sampling Operator",id:"5-compile-sampling-operator",level:2},{value:"6. Model training and saving",id:"6-model-training-and-saving",level:2},{value:"6.1. Data Loading",id:"61-data-loading",level:3},{value:"6.2. Build Sampler",id:"62-build-sampler",level:3},{value:"6.3. Convert the results to the required format",id:"63-convert-the-results-to-the-required-format",level:3},{value:"6.4. Build the GCN model",id:"64-build-the-gcn-model",level:3},{value:"6.5. Train the GCN model",id:"65-train-the-gcn-model",level:3}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"using-tugraph-graph-learning-module-for-node-classification",children:"Using TuGraph Graph Learning Module for Node Classification"})}),"\n",(0,a.jsx)(n.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,a.jsx)(n.p,{children:"GNN is a powerful tool for many machine learning tasks on graphs. In this introductory tutorial, you will learn the basic workflow of using GNN for node classification, i.e., predicting the category of nodes in a graph."}),"\n",(0,a.jsx)(n.p,{children:"This document will show how to build a GNN for semi-supervised node classification on the Cora dataset with only a few labels, which is a citation network with papers as nodes and citations as edges. The task is to predict the category of a given paper.\nBy completing this tutorial, you will be able to:"}),"\n",(0,a.jsx)(n.p,{children:"Load the Cora dataset."}),"\n",(0,a.jsx)(n.p,{children:"Sample and build a GNN model using the sampling operator provided by TuGraph.\nTrain the GNN model for node classification on CPU or GPU."}),"\n",(0,a.jsx)(n.p,{children:"This document requires some experience in using graph neural networks and DGL."}),"\n",(0,a.jsx)(n.h2,{id:"2-prerequisites",children:"2. Prerequisites"}),"\n",(0,a.jsx)(n.p,{children:"The TuGraph graph learning module requires TuGraph-db version 3.5.1 or above."}),"\n",(0,a.jsx)(n.p,{children:"It is recommended to use Docker image tugraph-compile 1.2.4 or above for TuGraph deployment:"}),"\n",(0,a.jsx)(n.p,{children:"tugraph/tugraph-compile-ubuntu18.04:latest"}),"\n",(0,a.jsx)(n.p,{children:"tugraph/tugraph-compile-centos7:latest"}),"\n",(0,a.jsx)(n.p,{children:"tugraph/tugraph-compile-centos8:latest"}),"\n",(0,a.jsxs)(n.p,{children:["The above images can be obtained on DockerHub.\nPlease refer to ",(0,a.jsx)(n.a,{href:"/tugraph-db/en/quick-start/preparation",children:"Quick Start"})," for specific operations."]}),"\n",(0,a.jsx)(n.h2,{id:"3-import-cora-dataset-to-tugraph-database",children:"3. Import Cora Dataset to TuGraph Database"}),"\n",(0,a.jsx)(n.h3,{id:"31-introduction-to-cora-dataset",children:"3.1. Introduction to Cora Dataset"}),"\n",(0,a.jsx)(n.p,{children:"The Cora dataset consists of 2708 papers, classified into 7 categories. Each paper is represented by a 1433-dimensional bag-of-words feature, indicating whether a certain word appears in the paper. These bag-of-words features have been preprocessed to be normalized to a range from 0 to 1. The edges represent citation relationships between papers."}),"\n",(0,a.jsx)(n.p,{children:"TuGraph has provided the Cora dataset import tool, which users can use directly."}),"\n",(0,a.jsx)(n.h3,{id:"32-data-import",children:"3.2. Data Import"}),"\n",(0,a.jsx)(n.p,{children:"The Cora dataset is located in the test/integration/data/algo directory and contains the cora_vertices point set and the cora_edge edge set."}),"\n",(0,a.jsxs)(n.p,{children:["First, the Cora dataset needs to be imported into the TuGraph database. Please refer to ",(0,a.jsx)(n.a,{href:"/tugraph-db/en/utility-tools/data-import",children:"Data Import"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"In the build/output section below the line:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"cp -r ../../test/integration/data/ ./ && cp -r ../../learn/examples/* ./\n"})}),"\n",(0,a.jsx)(n.p,{children:"The number of commands related to the relevant document is to be built/output."}),"\n",(0,a.jsx)(n.p,{children:"Execute the following command in the build/output directory:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"./lgraph_import -c ./data/algo/cora.conf --dir ./coradb --overwrite 1\n"})}),"\n",(0,a.jsx)(n.p,{children:"Here, cora.conf is the graph schema file representing the format of graph data, which can be found in test/integration/data/algo/cora.conf. coradb is the name of the graph data file after import, which represents the storage location of graph data."}),"\n",(0,a.jsx)(n.h2,{id:"4-feature-conversion",children:"4. Feature Conversion"}),"\n",(0,a.jsx)(n.p,{children:"Since the features in the Cora dataset are float arrays of length 1433, which are not supported by TuGraph for loading, they can be imported as strings and converted to char* for easier access later. The implementation can be referred to the feature_float.cpp file.\nThe specific execution process is as follows:"}),"\n",(0,a.jsxs)(n.p,{children:["Compile the import plugin in the build directory.(Can be skipped if TuGraph has been compiled):\n",(0,a.jsx)(n.code,{children:"make feature_float_embed"})]}),"\n",(0,a.jsxs)(n.p,{children:["Execute the following command in the build/output directory to perform the conversion:\n",(0,a.jsx)(n.code,{children:"./algo/feature_float_embed ./coradb"})]}),"\n",(0,a.jsx)(n.h2,{id:"5-compile-sampling-operator",children:"5. Compile Sampling Operator"}),"\n",(0,a.jsxs)(n.p,{children:["The sampling operator is used to obtain graph data from the database and convert it into the required data structure. The specific execution process is as follows:\nCan be skipped if TuGraph has been compiled.\nExecute the following command in the tugraph-db/build directory:\n",(0,a.jsx)(n.code,{children:"make -j2"})]}),"\n",(0,a.jsxs)(n.p,{children:["or execute the following command in the tugraph-db/learn/procedures directory:\n",(0,a.jsx)(n.code,{children:"python3 setup.py build_ext -i"})]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:'from lgraph_db_python import *\nimport importlib\ngetdb = importlib.import_module("getdb")\ngetdb.Process(db, olapondb, feature_len, NodeInfo, EdgeInfo)\n'})}),"\n",(0,a.jsx)(n.p,{children:"As shown in the code, after obtaining the algorithm .so file, import and use it."}),"\n",(0,a.jsx)(n.h2,{id:"6-model-training-and-saving",children:"6. Model training and saving"}),"\n",(0,a.jsxs)(n.p,{children:["TuGraph calls the operators of the cython layer in the python layer to realize the training of the graph learning model.\nThe usage of the TuGraph graph learning module is introduced as follows:\nExecute under the build/output folder\n",(0,a.jsx)(n.code,{children:"python3 train_full_cora.py --model_save_path ./cora_model"}),"\nYou can start training.\nIf the final printed loss value is less than 0.9, the training is successful. So far, the graph model training is completed, and the model is saved in the cora_model file."]}),"\n",(0,a.jsx)(n.p,{children:"The detailed training process is as follows:"}),"\n",(0,a.jsx)(n.h3,{id:"61-data-loading",children:"6.1. Data Loading"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:"galaxy = PyGalaxy(args.db_path)\ngalaxy.SetCurrentUser(args.username, args.password)\ndb = galaxy.OpenGraph(args.graph_name, False)\n"})}),"\n",(0,a.jsx)(n.p,{children:"As shown in the code, load the data into memory based on the path of the graph data, username, password, and subgraph name. TuGraph can load multiple subgraphs for graph training, but we only load one subgraph here."}),"\n",(0,a.jsx)(n.h3,{id:"62-build-sampler",children:"6.2. Build Sampler"}),"\n",(0,a.jsx)(n.p,{children:"During the training process, the GetDB operator is first used to obtain the graph data from the database and convert it into the required data structure. The specific code is as follows:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:" GetDB.Process(db_: lgraph_db_python.PyGraphDB, olapondb: lgraph_db_python.PyOlapOnDB, feature_num: size_t, NodeInfo: list, EdgeInfo: list)\n"})}),"\n",(0,a.jsx)(n.p,{children:"As shown in the code, the results are stored in NodeInfo and EdgeInfo. NodeInfo and EdgeInfo are python list results, and their stored information is as follows:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,a.jsxs)(n.table,{children:[(0,a.jsx)(n.thead,{children:(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.th,{children:"Graph Data"}),(0,a.jsx)(n.th,{children:"Storage Position"})]})}),(0,a.jsxs)(n.tbody,{children:[(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Edge source"}),(0,a.jsx)(n.td,{children:"EdgeInfo[0]"})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Edge destination"}),(0,a.jsx)(n.td,{children:"EdgeInfo[1]"})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Vertex ID"}),(0,a.jsx)(n.td,{children:"NodeInfo[0]"})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Vertex features"}),(0,a.jsx)(n.td,{children:"NodeInfo[1]"})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{children:"Vertex label"}),(0,a.jsx)(n.td,{children:"NodeInfo[2]"})]})]})]}),"\n",(0,a.jsx)(n.p,{children:"Then a sampler is constructed:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:"batch_size = 5\ncount = 2708\nsampler = TugraphSample(args)\ndataloader = dgl.dataloading.DataLoader(fake_g,\n torch.arange(count),\n sampler,\n batch_size=batch_size,\n num_workers=0,\n )\n"})}),"\n",(0,a.jsx)(n.h3,{id:"63-convert-the-results-to-the-required-format",children:"6.3. Convert the results to the required format"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:"src = EdgeInfo[0].astype('int64')\ndst = EdgeInfo[1].astype('int64')\nnodes_idx = NodeInfo[0].astype('int64')\nremap(src, dst, nodes_idx)\nfeatures = NodeInfo[1].astype('float32')\nlabels = NodeInfo[2].astype('int64')\ng = dgl.graph((src, dst))\ng.ndata['feat'] = torch.tensor(features)\ng.ndata['label'] = torch.tensor(labels)\nreturn g\n"})}),"\n",(0,a.jsx)(n.p,{children:"The results are converted to the required format to fit the training format."}),"\n",(0,a.jsx)(n.h3,{id:"64-build-the-gcn-model",children:"6.4. Build the GCN model"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:"class GCN(nn.Module):\n def __init__(self, in_size, hid_size, out_size):\n super().__init__()\n self.layers = nn.ModuleList()\n # two-layer GCN\n self.layers.append(dgl.nn.GraphConv(in_size, hid_size, activation=F.relu))\n self.layers.append(dgl.nn.GraphConv(hid_size, out_size))\n self.dropout = nn.Dropout(0.5)\n def forward(self, g, features):\n h = features\n for i, layer in enumerate(self.layers):\n if i != 0:\n h = self.dropout(h)\n h = layer(g, h)\n return h\ndef build_model():\n in_size = feature_len # feature_len is the length of features, which is 1433 here\n out_size = classes # classes is the number of classes, which is 7 here\n model = GCN(in_size, 16, out_size) # 16 is the size of the hidden layer\n return model\n"})}),"\n",(0,a.jsx)(n.p,{children:"In this tutorial, a two-layer Graph Convolutional Network (GCN) will be built. Each layer aggregates neighbor information to compute new node representations."}),"\n",(0,a.jsx)(n.h3,{id:"65-train-the-gcn-model",children:"6.5. Train the GCN model"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-python",children:"loss_fcn = nn.CrossEntropyLoss()\ndef train(graph, model, model_save_path):\n optimizer = torch.optim.Adam(model.parameters(), lr=1e-2, weight_decay=5e-4)\n model.train()\n s = time.time()\n load_time = time.time()\n graph = dgl.add_self_loop(graph)\n logits = model(graph, graph.ndata['feat'])\n loss = loss_fcn(logits, graph.ndata['label'])\n optimizer.zero_grad()\n loss.backward()\n optimizer.step()\n train_time = time.time()\n current_loss = float(loss)\n if model_save_path != \"\": #If you need to save the model, give the model save path\n if 'min_loss' not in train.__dict__:\n train.min_loss = current_loss\n elif current_loss < train.min_loss:\n train.min_loss = current_loss\n model_save_path = 'best_model.pth'\n torch.save(model.state_dict(), model_save_path)\n return current_loss\n\nfor epoch in range(50):\n model.train()\n total_loss = 0\n loss = train(g, model)\n if epoch % 5 == 0:\n print('In epoch', epoch, ', loss', loss)\n sys.stdout.flush()\n"})}),"\n",(0,a.jsx)(n.p,{children:"As shown in the code, iterative training is performed 50 times according to the defined sampler, optimizer and model, and the trained model is saved to the path model_save_path."}),"\n",(0,a.jsx)(n.p,{children:"The output is as follows:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"In epoch 0 , loss 1.9586775302886963\nIn epoch 5 , loss 1.543689250946045\nIn epoch 10 , loss 1.160698413848877\nIn epoch 15 , loss 0.8862786889076233\nIn epoch 20 , loss 0.6973256468772888\nIn epoch 25 , loss 0.5770673751831055\nIn epoch 30 , loss 0.5271289348602295\nIn epoch 35 , loss 0.45514997839927673\nIn epoch 40 , loss 0.43748989701271057\nIn epoch 45 , loss 0.3906335234642029\n"})}),"\n",(0,a.jsx)(n.p,{children:"The graph learning module can be accelerated by using a GPU. If users want to run it on the GPU, they need to install the corresponding GPU driver and environment. For details, please refer to learn/README.md."}),"\n",(0,a.jsx)(n.p,{children:"The complete code can be found in learn/examples/train_full_cora.py."})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>i});var a=t(6540);const r={},o=a.createContext(r);function s(e){const n=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f8266f2b.401f41de.js b/assets/js/f8266f2b.28aae18b.js similarity index 99% rename from assets/js/f8266f2b.401f41de.js rename to assets/js/f8266f2b.28aae18b.js index a09fda38f2..e405e68e38 100644 --- a/assets/js/f8266f2b.401f41de.js +++ b/assets/js/f8266f2b.28aae18b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[1349],{2400:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var t=i(4848),r=i(8453);const a={},o="Data Importing",s={id:"utility-tools/data-import",title:"Data Importing",description:"This document describes the data import function of TuGraph. These include delimiters in CSV format, sample formats for jsonline, and two modes for importing online and offline.",source:"@site/../docs/en-US/source/6.utility-tools/1.data-import.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/data-import",permalink:"/tugraph-db/en/utility-tools/data-import",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"High Availability mode",permalink:"/tugraph-db/en/installation&running/high-availability-mode"},next:{title:"Data Export",permalink:"/tugraph-db/en/utility-tools/data-export"}},l={},d=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2.CSV file format delimiter",id:"2csv-file-format-delimiter",level:2},{value:"3.The configuration file",id:"3the-configuration-file",level:2},{value:"3.1.Configuration File Format",id:"31configuration-file-format",level:3},{value:"3.1.1.The keyword",id:"311the-keyword",level:4},{value:"3.1.2. Index length",id:"312-index-length",level:4},{value:"3.1.2.1.unique index",id:"3121unique-index",level:5},{value:"3.1.2.2.pair_unique index",id:"3122pair_unique-index",level:5},{value:"3.1.2.3. Non-unique index",id:"3123-non-unique-index",level:5},{value:"3.2.Example Configuration File",id:"32example-configuration-file",level:3},{value:"4.Offline full import",id:"4offline-full-import",level:2},{value:"4.1.Offline Import Example",id:"41offline-import-example",level:3},{value:"5.Online incremental Import",id:"5online-incremental-import",level:2},{value:"6. Online full import",id:"6-online-full-import",level:2},{value:"6.1 Import from original data",id:"61-import-from-original-data",level:3},{value:"6.2 Import from database file",id:"62-import-from-database-file",level:3}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"data-importing",children:"Data Importing"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document describes the data import function of TuGraph. These include delimiters in CSV format, sample formats for jsonline, and two modes for importing online and offline."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,t.jsxs)(n.p,{children:["After the installation is successful, you can use the ",(0,t.jsx)(n.code,{children:"lgraph_import"})," batch import tool to import existing data into TuGraph. ",(0,t.jsx)(n.code,{children:"lgraph_import"})," supports importing data from CSV files and JSON data sources."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"sonline format, a row of a json array string"})}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"CSV format"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[movies.csv]\nid, name, year, rating\ntt0188766,King of Comedy,1999,7.3\ntt0286112,Shaolin Soccer,2001,7.3\ntt4701660,The Mermaid,2016,6.3\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"jsonline format"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'["tt0188766","King of Comedy",1999,7.3]\n["tt0286112","Shaolin Soccer",2001,7.3]\n["tt4701660","The Mermaid",2016,6.3]\n'})}),"\n",(0,t.jsx)(n.p,{children:"TuGraph supports two data importing modes\uff1a"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.em,{children:"offline"}),"\uff1aRead the data and import it into a data file for the specified server, it should only be done when the server is offline."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.em,{children:"online"}),"\uff1aRead the data and send it to the running server, which then imports the data into its database."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"2csv-file-format-delimiter",children:"2.CSV file format delimiter"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"CSV delimiters can be single-character or multi-character strings, which cannot contain 'r' or 'n'. Note that different shells handle input strings differently, so different escape handling may be required for different shell input parameters.\n"})}),"\n",(0,t.jsx)(n.p,{children:"In addition, 'lgraph_import' also supports the following escape characters for entering special symbols:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Escape character"}),(0,t.jsx)(n.th,{children:"Instructions"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"\\"}),(0,t.jsxs)(n.td,{children:["The backslash",(0,t.jsx)(n.code,{children:"\\\\"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"\\a"}),(0,t.jsx)(n.td,{children:"ASCII code 0x07"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"\\f"}),(0,t.jsx)(n.td,{children:"form-feed\uff0cASCII code 0x0c"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"\\t"}),(0,t.jsx)(n.td,{children:"Horizontal tab characters\uff0c ASCII code 0x09"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"\\v"}),(0,t.jsx)(n.td,{children:"Vertical tab characters\uff0c ASCII code 0x0b"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"\\xnn"}),(0,t.jsx)(n.td,{children:"Two hexadecimal digits representing one byte\uff0cexample \\x9A"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"\\nnn"}),(0,t.jsx)(n.td,{children:"A three-digit octal number representing a single byte\uff0cexample \\001, \\443\uff0cdata range cannot exceed 255"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"Demo\uff1a"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'$ ./lgraph_import -c ./import.config --delimiter "\\001\\002"\n'})}),"\n",(0,t.jsx)(n.h2,{id:"3the-configuration-file",children:"3.The configuration file"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"`lgraph_import`tool configures the environment using the specified configuration file. The configuration file describes the paths to the input files, the vertices/edges they represent, and the vertex/edge format.\n"})}),"\n",(0,t.jsx)(n.h3,{id:"31configuration-file-format",children:"3.1.Configuration File Format"}),"\n",(0,t.jsx)(n.p,{children:"The configuration file consists of two parts: schema and files. The 'schema' part defines label, and the 'files' part describes the data files to be imported."}),"\n",(0,t.jsx)(n.h4,{id:"311the-keyword",children:"3.1.1.The keyword"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["schema (Array\uff09\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"label\uff08required\uff0cstring\uff09"}),"\n",(0,t.jsx)(n.li,{children:"type\uff08required\uff0c VERTEX or EDGE\uff09"}),"\n",(0,t.jsxs)(n.li,{children:["properties\uff08Array\uff0crequired for vertex\uff0cIf there is no property for the edge, you can leave it unconfigured\uff09\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"name\uff08required, string\uff09"}),"\n",(0,t.jsx)(n.li,{children:"type \uff08required,\uff0cBOOL\uff0cINT8\uff0cINT16\uff0cINT32\uff0cINT64\uff0cDATE\uff0cDATETIME\uff0cFLOAT\uff0cDOUBLE\uff0cSTRING\uff0cBLOB\uff09"}),"\n",(0,t.jsx)(n.li,{children:"optional\uff08optional\uff0cIndicates that the field can be configured or not configured\uff09"}),"\n",(0,t.jsx)(n.li,{children:"index\uff08optional\uff0cWhether the field needs to be indexed\uff09"}),"\n",(0,t.jsx)(n.li,{children:"unique\uff08optional, whether the field indexed and is of type unique\uff09"}),"\n",(0,t.jsx)(n.li,{children:"pair_unique\uff08optional, whether the field indexed and is of type pair_unique\uff09only one unique and pair_unique can be set. Setting up and running at the same time will terminate due to an input exception"}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:"primary (vertex-only configuration, specify a property that uniquely identifies a point in the primary key field)"}),"\n",(0,t.jsx)(n.li,{children:"temproal (edge-only configuration, optional, specifies the timestamp field for storage tier sorting)"}),"\n",(0,t.jsx)(n.li,{children:"temporal_field_order (edge-only configuration, optional, the default value is ASC, indicating the ascending order, or DESC, indicating the descending order)"}),"\n",(0,t.jsx)(n.li,{children:"constraints (edge-only configuration, optional, array form, start and end labels, unconfigured or empty means unrestricted)"}),"\n",(0,t.jsxs)(n.li,{children:["detach_property (optional, both Edge and Vertex can config\uff0cdefault is ",(0,t.jsx)(n.code,{children:"false"}),". ",(0,t.jsx)(n.code,{children:"true"})," means the property data is stored in detached model, which can reduce io read amplification in cases with less memory and much property data.)"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["files \uff08Array\uff09\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"path\uff08required\uff0cstring\uff0cThe value can be a file path or a directory path. If it is a directory, all files in the directory will be imported. Ensure that they have the same schema\uff09"}),"\n",(0,t.jsx)(n.li,{children:"header\uff08Optional, numeric, header in the first few lines of the file, or 0\uff09"}),"\n",(0,t.jsx)(n.li,{children:"format\uff08required\uff0cJSON or CSV\uff09"}),"\n",(0,t.jsx)(n.li,{children:"label\uff08required\uff0cstring\uff09"}),"\n",(0,t.jsxs)(n.li,{children:["columns\uff08Array\uff09\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SRC_ID (Special string\uff0conly on the edges,That means this column is the source data)"}),"\n",(0,t.jsx)(n.li,{children:"DST_ID (A special string, only on the edges, indicates that this column is the destination data)"}),"\n",(0,t.jsx)(n.li,{children:"SKIP \xa0 (A special string to skip this column of data)"}),"\n",(0,t.jsx)(n.li,{children:"[property]"}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:"SRC_ID (Edge-only configuration. The value is the start label)"}),"\n",(0,t.jsx)(n.li,{children:"DST_ID (Edge-only configuration. The value is the destination point label)"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"312-index-length",children:"3.1.2. Index length"}),"\n",(0,t.jsx)(n.p,{children:"Because TuGraph has limits on the length of keys, unique indexes do not allow the establishment of indexes that exceed the limit length. Non-unique indexes will truncate attributes that exceed the length limit, and when traversing non-unique indexes through iterators, the key obtained It is also truncated and may not be consistent with expectations. The truncation length is different for different types of non-unique indexes."}),"\n",(0,t.jsx)(n.h5,{id:"3121unique-index",children:"3.1.2.1.unique index"}),"\n",(0,t.jsx)(n.p,{children:"A unique index is globally unique, and the maximum length of the index key is 480 bytes. Primary is a special unique index, so the maximum key length is also 480 bytes, and no index can be created if it exceeds 480 bytes."}),"\n",(0,t.jsx)(n.h5,{id:"3122pair_unique-index",children:"3.1.2.2.pair_unique index"}),"\n",(0,t.jsx)(n.p,{children:"A pair_unique index refers to a unique index between two nodes. This type of index can only be created in the edge schema. This type of index adds the vid of the source node and the target node after the user-specified key. Each vid is 5 bytes. length. Therefore, the maximum key length is 470 bytes, and indexing cannot be established if it exceeds 470 bytes."}),"\n",(0,t.jsx)(n.h5,{id:"3123-non-unique-index",children:"3.1.2.3. Non-unique index"}),"\n",(0,t.jsx)(n.p,{children:"A non-unique index refers to an index that neither unique nor pair_unique is set to 1. In the implementation of TuGraph, one key of this type of index may be mapped to multiple values. In order to speed up search and writing, the user-specified The key is followed by the maximum value in a set of vid or euid. For non-unique indexes created in nodes, the key is followed by vid, and each vid is 5 bytes in length, so the maximum length is 475 bytes.\nFor non-unique indexes created in edges, the key is followed by euid, and each euid is 24 bytes long, so the maximum length is 456 bytes. If the index key exceeds the corresponding length, it will be automatically truncated."}),"\n",(0,t.jsx)(n.h3,{id:"32example-configuration-file",children:"3.2.Example Configuration File"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "schema": [\n {\n "label": "actor",\n "type": "VERTEX",\n "properties": [\n { "name": "aid", "type": "STRING" },\n { "name": "name", "type": "STRING" }\n ],\n "primary": "aid"\n },\n {\n "label": "movie",\n "type": "VERTEX",\n "properties": [\n { "name": "mid", "type": "STRING" },\n { "name": "name", "type": "STRING" },\n { "name": "year", "type": "INT16" },\n { "name": "rate", "type": "FLOAT", "optional": true }\n ],\n "primary": "mid",\n "detach_property": false\n },\n {\n "label": "play_in",\n "type": "EDGE",\n "properties": [{ "name": "role", "type": "STRING", "optional": true }],\n "constraints": [["actor", "movie"]]\n }\n ],\n "files": [\n {\n "path": "actors.csv",\n "header": 2,\n "format": "CSV",\n "label": "actor",\n "columns": ["aid", "name"]\n },\n {\n "path": "movies.csv",\n "header": 2,\n "format": "CSV",\n "label": "movie",\n "columns": ["mid", "name", "year", "rate"]\n },\n {\n "path": "roles.csv",\n "header": 2,\n "format": "CSV",\n "label": "play_in",\n "SRC_ID": "actor",\n "DST_ID": "movie",\n "columns": ["SRC_ID", "role", "DST_ID"]\n }\n ]\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:"For the above Example Configuration File, three labels defined: two point types' actor 'and' movie ', and one edge type 'role'. Each label describes: the name of the label, the type (dot or edge), which attribute fields are available, and the type of each field. For points, the primary field also defined; For edges, the constraints field also defined, which limits the starting and ending points of the edges."}),"\n",(0,t.jsx)(n.p,{children:"It also describes three data files, two dot data files' actors.csv 'and' movies.csv ', and one edge data file 'roles.csv'. Each section describes the path of the file, the format of the data, the first few lines of the header, the label of the data, and the corresponding field of each column in each row of data in the file."}),"\n",(0,t.jsx)(n.p,{children:"For the above configuration files, the import tool will first create labels' actor ', 'movie', and 'role' in TuGraph, and then perform data import of the three files."}),"\n",(0,t.jsx)(n.h2,{id:"4offline-full-import",children:"4.Offline full import"}),"\n",(0,t.jsx)(n.p,{children:"The offline mode can be used only on offline servers. An offline import creates a new graph, so it's more suitable for your first data import on a newly installed TuGraph server."}),"\n",(0,t.jsx)(n.p,{children:"To use the 'lgraph_import' tool in offline mode, you can specify the 'lgraph_import --online false' option. To see the command-line options available, use 'lgraph_import --online false --help' :"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:'$ ./lgraph_import --online false -help\nAvailable command line options:\n --log Log file to use, empty means stderr. Default="".\n -v, --verbose Verbose level to use, higher means more verbose.\n Default=1.\n ...\n -h, --help Print this help message. Default=0.\n'})}),"\n",(0,t.jsx)(n.p,{children:"Command line arguments:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"-c, --config_file"})," ",(0,t.jsx)(n.code,{children:"config_file"}),": Import the configuration file name in the following format:"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"--log"})," ",(0,t.jsx)(n.code,{children:"log_dir"}),": Log directory. The default is an empty string, in which case the log information output to the console."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"--verbose"})," ",(0,t.jsx)(n.code,{children:"0/1/2"}),": Log level. The higher the log level, the more detailed the output information is. The default value is 1."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"-i, --continue_on_error"})," ",(0,t.jsx)(n.code,{children:"true/false"}),": If an error occurs, skip the error and continue. The default is false. If an error occurs, exit."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"-d, --dir"})," ",(0,t.jsx)(n.code,{children:"{diretory}"}),":The database directory to which the import tool will write data. Default is'./db '."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"--delimiter"})," ",(0,t.jsx)(n.code,{children:"{delimiter}"}),": Data file separator. This is used only when the data source is in CSV format. The default is', '\u3002"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"-u, --username"})," ",(0,t.jsx)(n.code,{children:"{user}"}),": Username of the database. You need to be an administrator to perform offline import."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"-p, --password"})," ",(0,t.jsx)(n.code,{children:"{password}"}),": Specifies the password of the database user"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"--overwrite"})," ",(0,t.jsx)(n.code,{children:"true/false"}),": Whether to overwrite data. When set to true, the data directory overwritten if it already exists. Default to 'false'."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"-g, --graph"})," ",(0,t.jsx)(n.code,{children:"{graph_name}"}),": Specify the kind of graph to import."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"-h, --help"}),": The help information displayed."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"41offline-import-example",children:"4.1.Offline Import Example"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"In this example, we use the movie-actor data described above to demonstrate the use of the import tool. The data to be imported is divided into three files: 'movies.csv', 'actors.csv', and 'roles.csv'.\n"})}),"\n",(0,t.jsxs)(n.p,{children:["'movies.csv' contains information about movies, where each movie has an id (as a primary key for retrieval), and each movie also has attributes such as title, year, and rating. (Data from ",(0,t.jsx)(n.a,{href:"http://www.imdb.com",children:"IMDb"}),")."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:" [movies.csv]\n id, name, year, rating\n tt0188766,King of Comedy,1999,7.3\n tt0286112,Shaolin Soccer,2001,7.3\n tt4701660,The Mermaid,2016,6.3\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"The jsonline format is as follows:\nAll fields can be strings, which will be converted to the corresponding type when imported"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'["tt0188766","King of Comedy",1999,7.3]\n["tt0286112","Shaolin Soccer",2001,7.3]\n["tt4701660","The Mermaid",2016,6.3]\n'})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'["tt0188766","King of Comedy","1999","7.3"]\n["tt0286112","Shaolin Soccer","2001","7.3"]\n["tt4701660","The Mermaid","2016","6.3"]\n'})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"actors.csv"}),"It contains information about the actors. Each actor also has an id, as well as properties such as name."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:" [actors.csv]\n id, name\n nm015950,Stephen Chow\n nm0628806,Man-Tat Ng\n nm0156444,Cecilia Cheung\n nm2514879,Yuqi Zhang\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"The corresponding jsonline format is as follows:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'["nm015950","Stephen Chow"]\n["nm0628806","Man-Tat Ng"]\n["nm0156444","Cecilia Cheung"]\n["nm2514879","Yuqi Zhang"]\n'})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"roles.csv"}),"It contains information about which role an actor played in which movie. Each row records a character played by a given actor in a given movie, corresponding to an edge in the database.",(0,t.jsx)(n.code,{children:"SRC_ID"})," and ",(0,t.jsx)(n.code,{children:"DST_ID"})," are the source and target vertices of the edge, which are the 'primary' properties defined in 'actors.csv' and 'movies.csv', respectively."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:" [roles.csv]\n actor, role, movie\n nm015950,Tianchou Yin,tt0188766\n nm015950,Steel Leg,tt0286112\n nm0628806,,tt0188766\n nm0628806,coach,tt0286112\n nm0156444,PiaoPiao Liu,tt0188766\n nm2514879,Ruolan Li,tt4701660\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"The corresponding jsonline format is as follows:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'["nm015950","Tianchou Yin","tt0188766"]\n["nm015950","Steel Leg","tt0286112"]\n["nm0628806",null,"tt0188766"]\n["nm0628806","coach","tt0286112"]\n["nm0156444","PiaoPiao Liu","tt0188766"]\n["nm2514879","Ruolan Li","tt4701660"]\n'})}),"\n",(0,t.jsx)(n.p,{children:"'configuration file import.conf', notice that there are two HEADER lines in each file, so we need to specify the 'HEADER=2' option."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "schema": [\n {\n "label": "actor",\n "type": "VERTEX",\n "properties": [\n { "name": "aid", "type": "STRING" },\n { "name": "name", "type": "STRING" }\n ],\n "primary": "aid"\n },\n {\n "label": "movie",\n "type": "VERTEX",\n "properties": [\n { "name": "mid", "type": "STRING" },\n { "name": "name", "type": "STRING" },\n { "name": "year", "type": "INT16" },\n { "name": "rate", "type": "FLOAT", "optional": true }\n ],\n "primary": "mid"\n },\n {\n "label": "play_in",\n "type": "EDGE",\n "properties": [{ "name": "role", "type": "STRING", "optional": true }],\n "constraints": [["actor", "movie"]]\n }\n ],\n "files": [\n {\n "path": "actors.csv",\n "header": 2,\n "format": "CSV",\n "label": "actor",\n "columns": ["aid", "name"]\n },\n {\n "path": "movies.csv",\n "header": 2,\n "format": "CSV",\n "label": "movie",\n "columns": ["mid", "name", "year", "rate"]\n },\n {\n "path": "roles.csv",\n "header": 2,\n "format": "CSV",\n "label": "play_in",\n "SRC_ID": "actor",\n "DST_ID": "movie",\n "columns": ["SRC_ID", "role", "DST_ID"]\n }\n ]\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:"Using the import configuration file, we can now import data using the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"$ ./lgraph_import\n -c import.conf # Read configuration information from import.conf\n --dir /data/lgraph_db # Store the data in /data/lgraph_db\n --graph mygraph # Import the graph named mygraph\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Notice"}),"\uff1a"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"If a graph named 'mygraph' already exists, the import tool will print an error message and exit. To force a graph to be overwritten, use the '--overwrite true' option."}),"\n",(0,t.jsx)(n.li,{children:"Configuration and data files must be stored in UTF-8 encoding (or normal ASCII encoding, which is a subset of UTF-8). If any file uses an encoding other than UTF-8 (for example, UTF-8 with BOM or GBK), the import will fail and output a profiler error."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"5online-incremental-import",children:"5.Online incremental Import"}),"\n",(0,t.jsx)(n.p,{children:"The online import mode can be used to import a batch of files into an already running instance of TuGraph. This is handy for processing incremental batch updates that typically occur at fixed intervals. The 'lgraph_import --online true' option enables the import tool to work in online mode. Like offline mode, online mode has its own set of command-line options, which can be printed using the '-h, --help' options:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:'$ lgraph_import --online true -h\nAvailable command line options:\n --online Whether to import online.\n -h, --help Print this help message. Default=0.\n\nAvailable command line options:\n --log Log file to use, empty means stderr. Default="".\n -v, --verbose Verbose level to use, higher means more verbose.\n Default=1.\n -c, --config_file Config file path.\n -r, --url DB REST API address.\n -u, --username DB username.\n -p, --password DB password.\n -i, --continue_on_error\n When we hit a duplicate uid or missing uid, should we\n continue or abort. Default=0.\n -g, --graph The name of the graph to import into. Default=default.\n --skip_packages How many packages should we skip. Default=0.\n --delimiter Delimiter used in the CSV files\n --breakpoint_continue\n When the transmission process is interrupted,whether\n to re-transmit from zero package next time. Default=false\n -h, --help Print this help message. Default=0.\n'})}),"\n",(0,t.jsx)(n.p,{children:"The configuration related to the file specified in the configuration file, and its format is exactly the same as' offline mode '. However, instead of importing the data into a local database, we are now sending the data to a running TuGraph instance, which is typically running on a different computer than the client machine on which the import tool is running. Therefore, we need to specify the URL, DB user, and password for the HTTP address of the remote machine."}),"\n",(0,t.jsx)(n.p,{children:"If the user and password are valid, and the specified graph exists, the import tool sends the data to the server, which then parses the data and writes it to the specified graph. The data will be sent in a packet of about 16 MB, interrupted at the nearest newline. Each package imported atomically, which means that if the package is successfully imported, all data is successfully imported; otherwise, none of the data enters the database. If '--continue_on_error true' is specified, data integrity errors are ignored and offending lines are ignored. Otherwise, the import stops at the first error package and prints out the number of packages that have been imported. In this case, the user can modify the data to eliminate errors, and then use '--skip_packages N' to redo the import to skip the imported packages."}),"\n",(0,t.jsx)(n.h2,{id:"6-online-full-import",children:"6. Online full import"}),"\n",(0,t.jsx)(n.p,{children:"Online full import can be used to import a batch of files into a running TuGraph instance. TuGraph supports importing two different types of data into the instance online:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Original data files of the same type as the offline import (csv, etc.)"}),"\n",(0,t.jsx)(n.li,{children:"The underlying storage file of TuGraph is the data.mdb file. This file can be generated by offline import, or it can be a file of other TuGraph db.\nThe applicable scenarios of these two methods are different. The first method is to directly import data into TuGraph. The advantage is that it is automatically imported at one time and the operation steps are simple. However, an offline import thread will be started on the server side, which is only suitable for small-scale data import in a stand-alone situation. The second is to import the prepared underlying storage files into TuGraph. Although the mdb file needs to be prepared in advance, it does not have high requirements on system resources. It also supports remote download and file import, which is very convenient and suitable for high availability. Online import of schema or large-scale data."}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"61-import-from-original-data",children:"6.1 Import from original data"}),"\n",(0,t.jsxs)(n.p,{children:["The execution method of importing from the original data is to send an import request to the running TuGraph instance. After receiving the request, the instance first uses offline import (V3) to import the data into a temporary db, and then creates a new subgraph in the instance and The data files of the temporary db are migrated to the new subgraph, and finally the metadata of the instance is refreshed. Compared with online incremental import, online full import has higher performance. The ",(0,t.jsx)(n.code,{children:"lgraph_import --online true --online_type 1"})," option enables the import tool to fully import online. Like ",(0,t.jsx)(n.code,{children:"offline mode"}),", online mode has its own set of command line options, which can be printed using the ",(0,t.jsx)(n.code,{children:"-h, --help"})," option:\nOnline full import can be used to import a batch of files into an already running TuGraph instance. The execution method is to send an import request to the running TuGraph instance. After receiving the request, the instance first uses offline import (V3) to import the data into a temporary db, and then creates a new subgraph in the instance and stores the data in the temporary db. The files are migrated to the new subgraph, and finally the instance's metadata is refreshed. Compared with online incremental import, online full import has higher performance and is suitable for processing large-scale data. The ",(0,t.jsx)(n.code,{children:"lgraph_import --online true --full true"})," option enables the import tool to fully import online.\nLike ",(0,t.jsx)(n.code,{children:"offline mode"}),", online mode has its own set of command line options, which can be printed using the ",(0,t.jsx)(n.code,{children:"-h, --help"})," option:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:'$ lgraph_import --online true --online_type 1 -h\nAvailable command line options:\n --online_type The type of import online, 0 for increment, 1 for full\n import data,2 for full import file. Default=0.\n --v3 Whether to use lgraph import V3. Default=1.\n -h, --help Print this help message. Default=0.\n\nAvailable command line options:\n --online_type The type of import online, 0 for increment, 1 for full\n import data,2 for full import file. Default=0.\n -h, --help Print this help message. Default=0.\n\nAvailable command line options:\n -c, --config_file Config file path.\n -r, --url DB REST API address.\n -u, --user DB username.\n -p, --password DB password.\n -i, --continue_on_error\n When we hit a duplicate uid or missing uid, should we\n continue or abort. Default=0.\n -g, --graph The name of the graph to import into. Default=default.\n --delimiter Delimiter used in the CSV files. Default=,.\n --log Log dir to use, empty means stderr. Default="".\n -v, --verbose Verbose level to use, higher means more verbose.\n Default=1.\n --overwrite Whether to overwrite the existing DB if it already\n exists. Default=0.\n --parse_block_size Block size per parse. Default=8388608.\n --parse_block_threads\n How many threads to parse the data block. Default=5.\n --parse_file_threadsHow many threads to parse the files. Default=5.\n --generate_sst_threads\n How many threads to generate sst files. Default=15.\n --read_rocksdb_threads\n How many threads to read rocksdb in the final stage.\n Default=15.\n --vid_num_per_reading\n How many vertex data to read each time. Default=10000.\n --max_size_per_reading\n Maximum size of kvs per reading. Default=33554432.\n --compact Whether to compact. Default=0.\n --keep_vid_in_memoryWhether to keep vids in memory. Default=1.\n --enable_fulltext_index\n Whether to enable fulltext index. Default=0.\n --fulltext_index_analyzer\n fulltext index analyzer. Default=StandardAnalyzer.\n Possible values: {<2>: SmartChineseAnalyzer,\n StandardAnalyzer}\n -h, --help Print this help message. Default=0.\n'})}),"\n",(0,t.jsxs)(n.p,{children:["The relevant configuration of the file is specified in the configuration file, and its format is exactly the same as in ",(0,t.jsx)(n.code,{children:"offline mode"}),". However, instead of importing the data into a local database, we now import the data into a running TuGraph instance, which is typically running on a different machine than the client machine running the import tool. Therefore, we need to specify the URL, DB user and password of the remote computer's HTTP address. Moreover, the configuration file (config_file parameter) is required to be the uri path on the TuGraph instance machine, and its file configuration is also required to be the absolute path of the resource on the TuGraph instance machine."]}),"\n",(0,t.jsxs)(n.p,{children:["If the user and password are valid, the import tool will perform an online full import on the server side. If the graph you want to import already exists, you can use the ",(0,t.jsx)(n.code,{children:"--overwrite true"})," option to force overwriting of the subgraph."]}),"\n",(0,t.jsx)(n.h3,{id:"62-import-from-database-file",children:"6.2 Import from database file"}),"\n",(0,t.jsx)(n.p,{children:"Although the full online import of original data is simple to operate and has high performance, it requires high server resources and takes a long time. A more general way is to first use offline import to import the subgraph in an empty db, obtain the data.mdb file, and then import the file into the TuGraph service online. How to use it is as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"$ ./lgraph_import --online true --online_type 2 -h\nAvailable command line options:\n --online Whether to import online. Default=0.\n --v3 Whether to use lgraph import V3. Default=1.\n -h, --help Print this help message. Default=0.\n\nAvailable command line options:\n --online_type The type of import online, 0 for increment, 1 for full\n import data,2 for full import file. Default=0.\n -h, --help Print this help message. Default=0.\n\nAvailable command line options:\n -r, --url DB REST API address.\n -u, --user DB username.\n -p, --password DB password.\n -g, --graph The name of the graph to import into. Default=default.\n --path The path of data file.\n --remote Whether to download file from remote server. Default=0.\n -h, --help Print this help message. Default=0.\n"})}),"\n",(0,t.jsx)(n.p,{children:"In addition to the url, user and password parameters used in ordinary online import, the online full import method imported from a database file uses the graph parameter to specify the name of the imported subgraph, the path parameter to specify the file path, and remote to specify whether the file exists remotely or locally. If it is a local file, you need to ensure that all nodes in the HA cluster have the file in the path. If it is a remote file, it will be downloaded first and then imported. It should be noted that since there is only one copy of data.mdb, it is necessary to ensure that the environment of each node of HA and the machine where data.mdb is generated offline are completely consistent to ensure that no environmental problems will occur."})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>s});var t=i(6540);const r={},a=t.createContext(r);function o(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[1349],{2400:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var t=i(4848),r=i(8453);const a={},o="Data Importing",s={id:"utility-tools/data-import",title:"Data Importing",description:"This document describes the data import function of TuGraph. These include delimiters in CSV format, sample formats for jsonline, and two modes for importing online and offline.",source:"@site/../docs/en-US/source/6.utility-tools/1.data-import.md",sourceDirName:"6.utility-tools",slug:"/utility-tools/data-import",permalink:"/tugraph-db/en/utility-tools/data-import",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:1,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"High Availability mode",permalink:"/tugraph-db/en/installation&running/high-availability-mode"},next:{title:"Data Export",permalink:"/tugraph-db/en/utility-tools/data-export"}},l={},d=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2.CSV file format delimiter",id:"2csv-file-format-delimiter",level:2},{value:"3.The configuration file",id:"3the-configuration-file",level:2},{value:"3.1.Configuration File Format",id:"31configuration-file-format",level:3},{value:"3.1.1.The keyword",id:"311the-keyword",level:4},{value:"3.1.2. Index length",id:"312-index-length",level:4},{value:"3.1.2.1.unique index",id:"3121unique-index",level:5},{value:"3.1.2.2.pair_unique index",id:"3122pair_unique-index",level:5},{value:"3.1.2.3. Non-unique index",id:"3123-non-unique-index",level:5},{value:"3.2.Example Configuration File",id:"32example-configuration-file",level:3},{value:"4.Offline full import",id:"4offline-full-import",level:2},{value:"4.1.Offline Import Example",id:"41offline-import-example",level:3},{value:"5.Online incremental Import",id:"5online-incremental-import",level:2},{value:"6. Online full import",id:"6-online-full-import",level:2},{value:"6.1 Import from original data",id:"61-import-from-original-data",level:3},{value:"6.2 Import from database file",id:"62-import-from-database-file",level:3}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"data-importing",children:"Data Importing"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"This document describes the data import function of TuGraph. These include delimiters in CSV format, sample formats for jsonline, and two modes for importing online and offline."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,t.jsxs)(n.p,{children:["After the installation is successful, you can use the ",(0,t.jsx)(n.code,{children:"lgraph_import"})," batch import tool to import existing data into TuGraph. ",(0,t.jsx)(n.code,{children:"lgraph_import"})," supports importing data from CSV files and JSON data sources."]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"sonline format, a row of a json array string"})}),"\n"]}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"CSV format"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[movies.csv]\nid, name, year, rating\ntt0188766,King of Comedy,1999,7.3\ntt0286112,Shaolin Soccer,2001,7.3\ntt4701660,The Mermaid,2016,6.3\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"jsonline format"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'["tt0188766","King of Comedy",1999,7.3]\n["tt0286112","Shaolin Soccer",2001,7.3]\n["tt4701660","The Mermaid",2016,6.3]\n'})}),"\n",(0,t.jsx)(n.p,{children:"TuGraph supports two data importing modes\uff1a"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.em,{children:"offline"}),"\uff1aRead the data and import it into a data file for the specified server, it should only be done when the server is offline."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.em,{children:"online"}),"\uff1aRead the data and send it to the running server, which then imports the data into its database."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"2csv-file-format-delimiter",children:"2.CSV file format delimiter"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"CSV delimiters can be single-character or multi-character strings, which cannot contain 'r' or 'n'. Note that different shells handle input strings differently, so different escape handling may be required for different shell input parameters.\n"})}),"\n",(0,t.jsx)(n.p,{children:"In addition, 'lgraph_import' also supports the following escape characters for entering special symbols:"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Escape character"}),(0,t.jsx)(n.th,{children:"Instructions"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"\\"}),(0,t.jsxs)(n.td,{children:["The backslash",(0,t.jsx)(n.code,{children:"\\\\"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"\\a"}),(0,t.jsx)(n.td,{children:"ASCII code 0x07"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"\\f"}),(0,t.jsx)(n.td,{children:"form-feed\uff0cASCII code 0x0c"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"\\t"}),(0,t.jsx)(n.td,{children:"Horizontal tab characters\uff0c ASCII code 0x09"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"\\v"}),(0,t.jsx)(n.td,{children:"Vertical tab characters\uff0c ASCII code 0x0b"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"\\xnn"}),(0,t.jsx)(n.td,{children:"Two hexadecimal digits representing one byte\uff0cexample \\x9A"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"\\nnn"}),(0,t.jsx)(n.td,{children:"A three-digit octal number representing a single byte\uff0cexample \\001, \\443\uff0cdata range cannot exceed 255"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"Demo\uff1a"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'$ ./lgraph_import -c ./import.config --delimiter "\\001\\002"\n'})}),"\n",(0,t.jsx)(n.h2,{id:"3the-configuration-file",children:"3.The configuration file"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"`lgraph_import`tool configures the environment using the specified configuration file. The configuration file describes the paths to the input files, the vertices/edges they represent, and the vertex/edge format.\n"})}),"\n",(0,t.jsx)(n.h3,{id:"31configuration-file-format",children:"3.1.Configuration File Format"}),"\n",(0,t.jsx)(n.p,{children:"The configuration file consists of two parts: schema and files. The 'schema' part defines label, and the 'files' part describes the data files to be imported."}),"\n",(0,t.jsx)(n.h4,{id:"311the-keyword",children:"3.1.1.The keyword"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["schema (Array\uff09\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"label\uff08required\uff0cstring\uff09"}),"\n",(0,t.jsx)(n.li,{children:"type\uff08required\uff0c VERTEX or EDGE\uff09"}),"\n",(0,t.jsxs)(n.li,{children:["properties\uff08Array\uff0crequired for vertex\uff0cIf there is no property for the edge, you can leave it unconfigured\uff09\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"name\uff08required, string\uff09"}),"\n",(0,t.jsx)(n.li,{children:"type \uff08required,\uff0cBOOL\uff0cINT8\uff0cINT16\uff0cINT32\uff0cINT64\uff0cDATE\uff0cDATETIME\uff0cFLOAT\uff0cDOUBLE\uff0cSTRING\uff0cBLOB\uff09"}),"\n",(0,t.jsx)(n.li,{children:"optional\uff08optional\uff0cIndicates that the field can be configured or not configured\uff09"}),"\n",(0,t.jsx)(n.li,{children:"index\uff08optional\uff0cWhether the field needs to be indexed\uff09"}),"\n",(0,t.jsx)(n.li,{children:"unique\uff08optional, whether the field indexed and is of type unique\uff09"}),"\n",(0,t.jsx)(n.li,{children:"pair_unique\uff08optional, whether the field indexed and is of type pair_unique\uff09only one unique and pair_unique can be set. Setting up and running at the same time will terminate due to an input exception"}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:"primary (vertex-only configuration, specify a property that uniquely identifies a point in the primary key field)"}),"\n",(0,t.jsx)(n.li,{children:"temproal (edge-only configuration, optional, specifies the timestamp field for storage tier sorting)"}),"\n",(0,t.jsx)(n.li,{children:"temporal_field_order (edge-only configuration, optional, the default value is ASC, indicating the ascending order, or DESC, indicating the descending order)"}),"\n",(0,t.jsx)(n.li,{children:"constraints (edge-only configuration, optional, array form, start and end labels, unconfigured or empty means unrestricted)"}),"\n",(0,t.jsxs)(n.li,{children:["detach_property (optional, both Edge and Vertex can config\uff0cdefault is ",(0,t.jsx)(n.code,{children:"false"}),". ",(0,t.jsx)(n.code,{children:"true"})," means the property data is stored in detached model, which can reduce io read amplification in cases with less memory and much property data.)"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["files \uff08Array\uff09\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"path\uff08required\uff0cstring\uff0cThe value can be a file path or a directory path. If it is a directory, all files in the directory will be imported. Ensure that they have the same schema\uff09"}),"\n",(0,t.jsx)(n.li,{children:"header\uff08Optional, numeric, header in the first few lines of the file, or 0\uff09"}),"\n",(0,t.jsx)(n.li,{children:"format\uff08required\uff0cJSON or CSV\uff09"}),"\n",(0,t.jsx)(n.li,{children:"label\uff08required\uff0cstring\uff09"}),"\n",(0,t.jsxs)(n.li,{children:["columns\uff08Array\uff09\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"SRC_ID (Special string\uff0conly on the edges,That means this column is the source data)"}),"\n",(0,t.jsx)(n.li,{children:"DST_ID (A special string, only on the edges, indicates that this column is the destination data)"}),"\n",(0,t.jsx)(n.li,{children:"SKIP \xa0 (A special string to skip this column of data)"}),"\n",(0,t.jsx)(n.li,{children:"[property]"}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:"SRC_ID (Edge-only configuration. The value is the start label)"}),"\n",(0,t.jsx)(n.li,{children:"DST_ID (Edge-only configuration. The value is the destination point label)"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"312-index-length",children:"3.1.2. Index length"}),"\n",(0,t.jsx)(n.p,{children:"Because TuGraph has limits on the length of keys, unique indexes do not allow the establishment of indexes that exceed the limit length. Non-unique indexes will truncate attributes that exceed the length limit, and when traversing non-unique indexes through iterators, the key obtained It is also truncated and may not be consistent with expectations. The truncation length is different for different types of non-unique indexes."}),"\n",(0,t.jsx)(n.h5,{id:"3121unique-index",children:"3.1.2.1.unique index"}),"\n",(0,t.jsx)(n.p,{children:"A unique index is globally unique, and the maximum length of the index key is 480 bytes. Primary is a special unique index, so the maximum key length is also 480 bytes, and no index can be created if it exceeds 480 bytes."}),"\n",(0,t.jsx)(n.h5,{id:"3122pair_unique-index",children:"3.1.2.2.pair_unique index"}),"\n",(0,t.jsx)(n.p,{children:"A pair_unique index refers to a unique index between two nodes. This type of index can only be created in the edge schema. This type of index adds the vid of the source node and the target node after the user-specified key. Each vid is 5 bytes. length. Therefore, the maximum key length is 470 bytes, and indexing cannot be established if it exceeds 470 bytes."}),"\n",(0,t.jsx)(n.h5,{id:"3123-non-unique-index",children:"3.1.2.3. Non-unique index"}),"\n",(0,t.jsx)(n.p,{children:"A non-unique index refers to an index that neither unique nor pair_unique is set to 1. In the implementation of TuGraph, one key of this type of index may be mapped to multiple values. In order to speed up search and writing, the user-specified The key is followed by the maximum value in a set of vid or euid. For non-unique indexes created in nodes, the key is followed by vid, and each vid is 5 bytes in length, so the maximum length is 475 bytes.\nFor non-unique indexes created in edges, the key is followed by euid, and each euid is 24 bytes long, so the maximum length is 456 bytes. If the index key exceeds the corresponding length, it will be automatically truncated."}),"\n",(0,t.jsx)(n.h3,{id:"32example-configuration-file",children:"3.2.Example Configuration File"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "schema": [\n {\n "label": "actor",\n "type": "VERTEX",\n "properties": [\n { "name": "aid", "type": "STRING" },\n { "name": "name", "type": "STRING" }\n ],\n "primary": "aid"\n },\n {\n "label": "movie",\n "type": "VERTEX",\n "properties": [\n { "name": "mid", "type": "STRING" },\n { "name": "name", "type": "STRING" },\n { "name": "year", "type": "INT16" },\n { "name": "rate", "type": "FLOAT", "optional": true }\n ],\n "primary": "mid",\n "detach_property": false\n },\n {\n "label": "play_in",\n "type": "EDGE",\n "properties": [{ "name": "role", "type": "STRING", "optional": true }],\n "constraints": [["actor", "movie"]]\n }\n ],\n "files": [\n {\n "path": "actors.csv",\n "header": 2,\n "format": "CSV",\n "label": "actor",\n "columns": ["aid", "name"]\n },\n {\n "path": "movies.csv",\n "header": 2,\n "format": "CSV",\n "label": "movie",\n "columns": ["mid", "name", "year", "rate"]\n },\n {\n "path": "roles.csv",\n "header": 2,\n "format": "CSV",\n "label": "play_in",\n "SRC_ID": "actor",\n "DST_ID": "movie",\n "columns": ["SRC_ID", "role", "DST_ID"]\n }\n ]\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:"For the above Example Configuration File, three labels defined: two point types' actor 'and' movie ', and one edge type 'role'. Each label describes: the name of the label, the type (dot or edge), which attribute fields are available, and the type of each field. For points, the primary field also defined; For edges, the constraints field also defined, which limits the starting and ending points of the edges."}),"\n",(0,t.jsx)(n.p,{children:"It also describes three data files, two dot data files' actors.csv 'and' movies.csv ', and one edge data file 'roles.csv'. Each section describes the path of the file, the format of the data, the first few lines of the header, the label of the data, and the corresponding field of each column in each row of data in the file."}),"\n",(0,t.jsx)(n.p,{children:"For the above configuration files, the import tool will first create labels' actor ', 'movie', and 'role' in TuGraph, and then perform data import of the three files."}),"\n",(0,t.jsx)(n.h2,{id:"4offline-full-import",children:"4.Offline full import"}),"\n",(0,t.jsx)(n.p,{children:"The offline mode can be used only on offline servers. An offline import creates a new graph, so it's more suitable for your first data import on a newly installed TuGraph server."}),"\n",(0,t.jsx)(n.p,{children:"To use the 'lgraph_import' tool in offline mode, you can specify the 'lgraph_import --online false' option. To see the command-line options available, use 'lgraph_import --online false --help' :"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:'$ ./lgraph_import --online false -help\nAvailable command line options:\n --log Log file to use, empty means stderr. Default="".\n -v, --verbose Verbose level to use, higher means more verbose.\n Default=1.\n ...\n -h, --help Print this help message. Default=0.\n'})}),"\n",(0,t.jsx)(n.p,{children:"Command line arguments:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"-c, --config_file"})," ",(0,t.jsx)(n.code,{children:"config_file"}),": Import the configuration file name in the following format:"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"--log"})," ",(0,t.jsx)(n.code,{children:"log_dir"}),": Log directory. The default is an empty string, in which case the log information output to the console."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"--verbose"})," ",(0,t.jsx)(n.code,{children:"0/1/2"}),": Log level. The higher the log level, the more detailed the output information is. The default value is 1."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"-i, --continue_on_error"})," ",(0,t.jsx)(n.code,{children:"true/false"}),": If an error occurs, skip the error and continue. The default is false. If an error occurs, exit."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"-d, --dir"})," ",(0,t.jsx)(n.code,{children:"{diretory}"}),":The database directory to which the import tool will write data. Default is'./db '."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"--delimiter"})," ",(0,t.jsx)(n.code,{children:"{delimiter}"}),": Data file separator. This is used only when the data source is in CSV format. The default is', '\u3002"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"-u, --username"})," ",(0,t.jsx)(n.code,{children:"{user}"}),": Username of the database. You need to be an administrator to perform offline import."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"-p, --password"})," ",(0,t.jsx)(n.code,{children:"{password}"}),": Specifies the password of the database user"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"--overwrite"})," ",(0,t.jsx)(n.code,{children:"true/false"}),": Whether to overwrite data. When set to true, the data directory overwritten if it already exists. Default to 'false'."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"-g, --graph"})," ",(0,t.jsx)(n.code,{children:"{graph_name}"}),": Specify the kind of graph to import."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"-h, --help"}),": The help information displayed."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"41offline-import-example",children:"4.1.Offline Import Example"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"In this example, we use the movie-actor data described above to demonstrate the use of the import tool. The data to be imported is divided into three files: 'movies.csv', 'actors.csv', and 'roles.csv'.\n"})}),"\n",(0,t.jsxs)(n.p,{children:["'movies.csv' contains information about movies, where each movie has an id (as a primary key for retrieval), and each movie also has attributes such as title, year, and rating. (Data from ",(0,t.jsx)(n.a,{href:"http://www.imdb.com",children:"IMDb"}),")."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:" [movies.csv]\n id, name, year, rating\n tt0188766,King of Comedy,1999,7.3\n tt0286112,Shaolin Soccer,2001,7.3\n tt4701660,The Mermaid,2016,6.3\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"The jsonline format is as follows:\nAll fields can be strings, which will be converted to the corresponding type when imported"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'["tt0188766","King of Comedy",1999,7.3]\n["tt0286112","Shaolin Soccer",2001,7.3]\n["tt4701660","The Mermaid",2016,6.3]\n'})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'["tt0188766","King of Comedy","1999","7.3"]\n["tt0286112","Shaolin Soccer","2001","7.3"]\n["tt4701660","The Mermaid","2016","6.3"]\n'})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"actors.csv"}),"It contains information about the actors. Each actor also has an id, as well as properties such as name."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:" [actors.csv]\n id, name\n nm015950,Stephen Chow\n nm0628806,Man-Tat Ng\n nm0156444,Cecilia Cheung\n nm2514879,Yuqi Zhang\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"The corresponding jsonline format is as follows:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'["nm015950","Stephen Chow"]\n["nm0628806","Man-Tat Ng"]\n["nm0156444","Cecilia Cheung"]\n["nm2514879","Yuqi Zhang"]\n'})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"roles.csv"}),"It contains information about which role an actor played in which movie. Each row records a character played by a given actor in a given movie, corresponding to an edge in the database.",(0,t.jsx)(n.code,{children:"SRC_ID"})," and ",(0,t.jsx)(n.code,{children:"DST_ID"})," are the source and target vertices of the edge, which are the 'primary' properties defined in 'actors.csv' and 'movies.csv', respectively."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:" [roles.csv]\n actor, role, movie\n nm015950,Tianchou Yin,tt0188766\n nm015950,Steel Leg,tt0286112\n nm0628806,,tt0188766\n nm0628806,coach,tt0286112\n nm0156444,PiaoPiao Liu,tt0188766\n nm2514879,Ruolan Li,tt4701660\n"})}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"The corresponding jsonline format is as follows:"}),"\n"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'["nm015950","Tianchou Yin","tt0188766"]\n["nm015950","Steel Leg","tt0286112"]\n["nm0628806",null,"tt0188766"]\n["nm0628806","coach","tt0286112"]\n["nm0156444","PiaoPiao Liu","tt0188766"]\n["nm2514879","Ruolan Li","tt4701660"]\n'})}),"\n",(0,t.jsx)(n.p,{children:"'configuration file import.conf', notice that there are two HEADER lines in each file, so we need to specify the 'HEADER=2' option."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-json",children:'{\n "schema": [\n {\n "label": "actor",\n "type": "VERTEX",\n "properties": [\n { "name": "aid", "type": "STRING" },\n { "name": "name", "type": "STRING" }\n ],\n "primary": "aid"\n },\n {\n "label": "movie",\n "type": "VERTEX",\n "properties": [\n { "name": "mid", "type": "STRING" },\n { "name": "name", "type": "STRING" },\n { "name": "year", "type": "INT16" },\n { "name": "rate", "type": "FLOAT", "optional": true }\n ],\n "primary": "mid"\n },\n {\n "label": "play_in",\n "type": "EDGE",\n "properties": [{ "name": "role", "type": "STRING", "optional": true }],\n "constraints": [["actor", "movie"]]\n }\n ],\n "files": [\n {\n "path": "actors.csv",\n "header": 2,\n "format": "CSV",\n "label": "actor",\n "columns": ["aid", "name"]\n },\n {\n "path": "movies.csv",\n "header": 2,\n "format": "CSV",\n "label": "movie",\n "columns": ["mid", "name", "year", "rate"]\n },\n {\n "path": "roles.csv",\n "header": 2,\n "format": "CSV",\n "label": "play_in",\n "SRC_ID": "actor",\n "DST_ID": "movie",\n "columns": ["SRC_ID", "role", "DST_ID"]\n }\n ]\n}\n'})}),"\n",(0,t.jsx)(n.p,{children:"Using the import configuration file, we can now import data using the following command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"$ ./lgraph_import\n -c import.conf # Read configuration information from import.conf\n --dir /data/lgraph_db # Store the data in /data/lgraph_db\n --graph mygraph # Import the graph named mygraph\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Notice"}),"\uff1a"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"If a graph named 'mygraph' already exists, the import tool will print an error message and exit. To force a graph to be overwritten, use the '--overwrite true' option."}),"\n",(0,t.jsx)(n.li,{children:"Configuration and data files must be stored in UTF-8 encoding (or normal ASCII encoding, which is a subset of UTF-8). If any file uses an encoding other than UTF-8 (for example, UTF-8 with BOM or GBK), the import will fail and output a profiler error."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"5online-incremental-import",children:"5.Online incremental Import"}),"\n",(0,t.jsx)(n.p,{children:"The online import mode can be used to import a batch of files into an already running instance of TuGraph. This is handy for processing incremental batch updates that typically occur at fixed intervals. The 'lgraph_import --online true' option enables the import tool to work in online mode. Like offline mode, online mode has its own set of command-line options, which can be printed using the '-h, --help' options:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:'$ lgraph_import --online true -h\nAvailable command line options:\n --online Whether to import online.\n -h, --help Print this help message. Default=0.\n\nAvailable command line options:\n --log Log file to use, empty means stderr. Default="".\n -v, --verbose Verbose level to use, higher means more verbose.\n Default=1.\n -c, --config_file Config file path.\n -r, --url DB REST API address.\n -u, --username DB username.\n -p, --password DB password.\n -i, --continue_on_error\n When we hit a duplicate uid or missing uid, should we\n continue or abort. Default=0.\n -g, --graph The name of the graph to import into. Default=default.\n --skip_packages How many packages should we skip. Default=0.\n --delimiter Delimiter used in the CSV files\n --breakpoint_continue\n When the transmission process is interrupted,whether\n to re-transmit from zero package next time. Default=false\n -h, --help Print this help message. Default=0.\n'})}),"\n",(0,t.jsx)(n.p,{children:"The configuration related to the file specified in the configuration file, and its format is exactly the same as' offline mode '. However, instead of importing the data into a local database, we are now sending the data to a running TuGraph instance, which is typically running on a different computer than the client machine on which the import tool is running. Therefore, we need to specify the URL, DB user, and password for the HTTP address of the remote machine."}),"\n",(0,t.jsx)(n.p,{children:"If the user and password are valid, and the specified graph exists, the import tool sends the data to the server, which then parses the data and writes it to the specified graph. The data will be sent in a packet of about 16 MB, interrupted at the nearest newline. Each package imported atomically, which means that if the package is successfully imported, all data is successfully imported; otherwise, none of the data enters the database. If '--continue_on_error true' is specified, data integrity errors are ignored and offending lines are ignored. Otherwise, the import stops at the first error package and prints out the number of packages that have been imported. In this case, the user can modify the data to eliminate errors, and then use '--skip_packages N' to redo the import to skip the imported packages."}),"\n",(0,t.jsx)(n.h2,{id:"6-online-full-import",children:"6. Online full import"}),"\n",(0,t.jsx)(n.p,{children:"Online full import can be used to import a batch of files into a running TuGraph instance. TuGraph supports importing two different types of data into the instance online:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsx)(n.li,{children:"Original data files of the same type as the offline import (csv, etc.)"}),"\n",(0,t.jsx)(n.li,{children:"The underlying storage file of TuGraph is the data.mdb file. This file can be generated by offline import, or it can be a file of other TuGraph db.\nThe applicable scenarios of these two methods are different. The first method is to directly import data into TuGraph. The advantage is that it is automatically imported at one time and the operation steps are simple. However, an offline import thread will be started on the server side, which is only suitable for small-scale data import in a stand-alone situation. The second is to import the prepared underlying storage files into TuGraph. Although the mdb file needs to be prepared in advance, it does not have high requirements on system resources. It also supports remote download and file import, which is very convenient and suitable for high availability. Online import of schema or large-scale data."}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"61-import-from-original-data",children:"6.1 Import from original data"}),"\n",(0,t.jsxs)(n.p,{children:["The execution method of importing from the original data is to send an import request to the running TuGraph instance. After receiving the request, the instance first uses offline import (V3) to import the data into a temporary db, and then creates a new subgraph in the instance and The data files of the temporary db are migrated to the new subgraph, and finally the metadata of the instance is refreshed. Compared with online incremental import, online full import has higher performance. The ",(0,t.jsx)(n.code,{children:"lgraph_import --online true --online_type 1"})," option enables the import tool to fully import online. Like ",(0,t.jsx)(n.code,{children:"offline mode"}),", online mode has its own set of command line options, which can be printed using the ",(0,t.jsx)(n.code,{children:"-h, --help"})," option:\nOnline full import can be used to import a batch of files into an already running TuGraph instance. The execution method is to send an import request to the running TuGraph instance. After receiving the request, the instance first uses offline import (V3) to import the data into a temporary db, and then creates a new subgraph in the instance and stores the data in the temporary db. The files are migrated to the new subgraph, and finally the instance's metadata is refreshed. Compared with online incremental import, online full import has higher performance and is suitable for processing large-scale data. The ",(0,t.jsx)(n.code,{children:"lgraph_import --online true --full true"})," option enables the import tool to fully import online.\nLike ",(0,t.jsx)(n.code,{children:"offline mode"}),", online mode has its own set of command line options, which can be printed using the ",(0,t.jsx)(n.code,{children:"-h, --help"})," option:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:'$ lgraph_import --online true --online_type 1 -h\nAvailable command line options:\n --online_type The type of import online, 0 for increment, 1 for full\n import data,2 for full import file. Default=0.\n --v3 Whether to use lgraph import V3. Default=1.\n -h, --help Print this help message. Default=0.\n\nAvailable command line options:\n --online_type The type of import online, 0 for increment, 1 for full\n import data,2 for full import file. Default=0.\n -h, --help Print this help message. Default=0.\n\nAvailable command line options:\n -c, --config_file Config file path.\n -r, --url DB REST API address.\n -u, --user DB username.\n -p, --password DB password.\n -i, --continue_on_error\n When we hit a duplicate uid or missing uid, should we\n continue or abort. Default=0.\n -g, --graph The name of the graph to import into. Default=default.\n --delimiter Delimiter used in the CSV files. Default=,.\n --log Log dir to use, empty means stderr. Default="".\n -v, --verbose Verbose level to use, higher means more verbose.\n Default=1.\n --overwrite Whether to overwrite the existing DB if it already\n exists. Default=0.\n --parse_block_size Block size per parse. Default=8388608.\n --parse_block_threads\n How many threads to parse the data block. Default=5.\n --parse_file_threadsHow many threads to parse the files. Default=5.\n --generate_sst_threads\n How many threads to generate sst files. Default=15.\n --read_rocksdb_threads\n How many threads to read rocksdb in the final stage.\n Default=15.\n --vid_num_per_reading\n How many vertex data to read each time. Default=10000.\n --max_size_per_reading\n Maximum size of kvs per reading. Default=33554432.\n --compact Whether to compact. Default=0.\n --keep_vid_in_memoryWhether to keep vids in memory. Default=1.\n --enable_fulltext_index\n Whether to enable fulltext index. Default=0.\n --fulltext_index_analyzer\n fulltext index analyzer. Default=StandardAnalyzer.\n Possible values: {<2>: SmartChineseAnalyzer,\n StandardAnalyzer}\n -h, --help Print this help message. Default=0.\n'})}),"\n",(0,t.jsxs)(n.p,{children:["The relevant configuration of the file is specified in the configuration file, and its format is exactly the same as in ",(0,t.jsx)(n.code,{children:"offline mode"}),". However, instead of importing the data into a local database, we now import the data into a running TuGraph instance, which is typically running on a different machine than the client machine running the import tool. Therefore, we need to specify the URL, DB user and password of the remote computer's HTTP address. Moreover, the configuration file (config_file parameter) is required to be the uri path on the TuGraph instance machine, and its file configuration is also required to be the absolute path of the resource on the TuGraph instance machine."]}),"\n",(0,t.jsxs)(n.p,{children:["If the user and password are valid, the import tool will perform an online full import on the server side. If the graph you want to import already exists, you can use the ",(0,t.jsx)(n.code,{children:"--overwrite true"})," option to force overwriting of the subgraph."]}),"\n",(0,t.jsx)(n.h3,{id:"62-import-from-database-file",children:"6.2 Import from database file"}),"\n",(0,t.jsx)(n.p,{children:"Although the full online import of original data is simple to operate and has high performance, it requires high server resources and takes a long time. A more general way is to first use offline import to import the subgraph in an empty db, obtain the data.mdb file, and then import the file into the TuGraph service online. How to use it is as follows:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-shell",children:"$ ./lgraph_import --online true --online_type 2 -h\nAvailable command line options:\n --online Whether to import online. Default=0.\n --v3 Whether to use lgraph import V3. Default=1.\n -h, --help Print this help message. Default=0.\n\nAvailable command line options:\n --online_type The type of import online, 0 for increment, 1 for full\n import data,2 for full import file. Default=0.\n -h, --help Print this help message. Default=0.\n\nAvailable command line options:\n -r, --url DB REST API address.\n -u, --user DB username.\n -p, --password DB password.\n -g, --graph The name of the graph to import into. Default=default.\n --path The path of data file.\n --remote Whether to download file from remote server. Default=0.\n -h, --help Print this help message. Default=0.\n"})}),"\n",(0,t.jsx)(n.p,{children:"In addition to the url, user and password parameters used in ordinary online import, the online full import method imported from a database file uses the graph parameter to specify the name of the imported subgraph, the path parameter to specify the file path, and remote to specify whether the file exists remotely or locally. If it is a local file, you need to ensure that all nodes in the HA cluster have the file in the path. If it is a remote file, it will be downloaded first and then imported. It should be noted that since there is only one copy of data.mdb, it is necessary to ensure that the environment of each node of HA and the machine where data.mdb is generated offline are completely consistent to ensure that no environmental problems will occur."})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>s});var t=i(6540);const r={},a=t.createContext(r);function o(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f8bd24ea.1015e958.js b/assets/js/f8bd24ea.bf2fc0f0.js similarity index 98% rename from assets/js/f8bd24ea.1015e958.js rename to assets/js/f8bd24ea.bf2fc0f0.js index 47f04f4e0c..cc099285a8 100644 --- a/assets/js/f8bd24ea.1015e958.js +++ b/assets/js/f8bd24ea.bf2fc0f0.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[1611],{8757:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var a=t(4848),o=t(8453);const i={},l="Local Package Deployment",r={id:"installation&running/local-package-deployment",title:"Local Package Deployment",description:"This document describes TuGraph Local Package Deployment.",source:"@site/../docs/en-US/source/5.installation&running/4.local-package-deployment.md",sourceDirName:"5.installation&running",slug:"/installation&running/local-package-deployment",permalink:"/tugraph-db/en/installation&running/local-package-deployment",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Docker Deployment",permalink:"/tugraph-db/en/installation&running/docker-deployment"},next:{title:"Cloud Deployment",permalink:"/tugraph-db/en/installation&running/cloud-deployment"}},s={},d=[{value:"1. Environment preparation",id:"1-environment-preparation",level:2},{value:"2. Download the installation package",id:"2-download-the-installation-package",level:2},{value:"3. Installation method under CentOS",id:"3-installation-method-under-centos",level:2},{value:"4. Installation method under Ubuntu",id:"4-installation-method-under-ubuntu",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"local-package-deployment",children:"Local Package Deployment"})}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"This document describes TuGraph Local Package Deployment."}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"1-environment-preparation",children:"1. Environment preparation"}),"\n",(0,a.jsx)(n.p,{children:"TuGraph local package deployment requires a corresponding environment, and quick verification can use streamlined installation packages, which require almost no third-party libraries."}),"\n",(0,a.jsx)(n.p,{children:"If you need to use the complete TuGraph function, please refer to the tugraph-db source code directory ci/images/tugraph-runtime-*-Dockerfile. This script contains the complete environment construction process."}),"\n",(0,a.jsx)(n.h2,{id:"2-download-the-installation-package",children:"2. Download the installation package"}),"\n",(0,a.jsxs)(n.p,{children:['For the latest version of the installation package address, see "TuGraph-Latest-Version" of ',(0,a.jsx)(n.a,{href:"../../1.guide.md",children:"Guide"})]}),"\n",(0,a.jsxs)(n.p,{children:["You can also visit Github to download: ",(0,a.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-db/releases",children:"TuGraph Release"})]}),"\n",(0,a.jsx)(n.h2,{id:"3-installation-method-under-centos",children:"3. Installation method under CentOS"}),"\n",(0,a.jsx)(n.p,{children:"The .rpm installation package for TuGraph installed on CentOS, which contains the TuGraph executable file as well as header files and related library files required for writing embedded programs and stored procedures."}),"\n",(0,a.jsx)(n.p,{children:"Use the downloaded `tugraph_x.y.z.rpm installation package to install it in the terminal. You only need to run the following command:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"$ rpm -ivh tugraph-x.y.z.rpm\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Users can also specify the installation directory by specifying the ",(0,a.jsx)(n.code,{children:"--prefix"})," option."]}),"\n",(0,a.jsx)(n.h2,{id:"4-installation-method-under-ubuntu",children:"4. Installation method under Ubuntu"}),"\n",(0,a.jsx)(n.p,{children:"A .deb installation package for TuGraph installed on Ubuntu, which contains the TuGraph executable file as well as header files and related library files required for writing embedded programs and stored procedures."}),"\n",(0,a.jsxs)(n.p,{children:["Use the downloaded ",(0,a.jsx)(n.code,{children:"tugraph_x.y.z.deb"})," installation package to install it in the terminal. You only need to run the following command:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"$ sudo dpkg -i tugraph-x.y.z.deb\n"})}),"\n",(0,a.jsxs)(n.p,{children:["This command installs TuGraph in the ",(0,a.jsx)(n.code,{children:"/usr/local"})," directory by default. Users can also change the installation directory by specifying the ",(0,a.jsx)(n.code,{children:"--instdir="})," option."]})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>r});var a=t(6540);const o={},i=a.createContext(o);function l(e){const n=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),a.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[1611],{8757:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>r,toc:()=>d});var a=t(4848),o=t(8453);const i={},l="Local Package Deployment",r={id:"installation&running/local-package-deployment",title:"Local Package Deployment",description:"This document describes TuGraph Local Package Deployment.",source:"@site/../docs/en-US/source/5.installation&running/4.local-package-deployment.md",sourceDirName:"5.installation&running",slug:"/installation&running/local-package-deployment",permalink:"/tugraph-db/en/installation&running/local-package-deployment",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Docker Deployment",permalink:"/tugraph-db/en/installation&running/docker-deployment"},next:{title:"Cloud Deployment",permalink:"/tugraph-db/en/installation&running/cloud-deployment"}},s={},d=[{value:"1. Environment preparation",id:"1-environment-preparation",level:2},{value:"2. Download the installation package",id:"2-download-the-installation-package",level:2},{value:"3. Installation method under CentOS",id:"3-installation-method-under-centos",level:2},{value:"4. Installation method under Ubuntu",id:"4-installation-method-under-ubuntu",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"local-package-deployment",children:"Local Package Deployment"})}),"\n",(0,a.jsxs)(n.blockquote,{children:["\n",(0,a.jsx)(n.p,{children:"This document describes TuGraph Local Package Deployment."}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"1-environment-preparation",children:"1. Environment preparation"}),"\n",(0,a.jsx)(n.p,{children:"TuGraph local package deployment requires a corresponding environment, and quick verification can use streamlined installation packages, which require almost no third-party libraries."}),"\n",(0,a.jsx)(n.p,{children:"If you need to use the complete TuGraph function, please refer to the tugraph-db source code directory ci/images/tugraph-runtime-*-Dockerfile. This script contains the complete environment construction process."}),"\n",(0,a.jsx)(n.h2,{id:"2-download-the-installation-package",children:"2. Download the installation package"}),"\n",(0,a.jsxs)(n.p,{children:['For the latest version of the installation package address, see "TuGraph-Latest-Version" of ',(0,a.jsx)(n.a,{href:"../../1.guide.md",children:"Guide"})]}),"\n",(0,a.jsxs)(n.p,{children:["You can also visit Github to download: ",(0,a.jsx)(n.a,{href:"https://github.com/TuGraph-family/tugraph-db/releases",children:"TuGraph Release"})]}),"\n",(0,a.jsx)(n.h2,{id:"3-installation-method-under-centos",children:"3. Installation method under CentOS"}),"\n",(0,a.jsx)(n.p,{children:"The .rpm installation package for TuGraph installed on CentOS, which contains the TuGraph executable file as well as header files and related library files required for writing embedded programs and stored procedures."}),"\n",(0,a.jsx)(n.p,{children:"Use the downloaded `tugraph_x.y.z.rpm installation package to install it in the terminal. You only need to run the following command:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"$ rpm -ivh tugraph-x.y.z.rpm\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Users can also specify the installation directory by specifying the ",(0,a.jsx)(n.code,{children:"--prefix"})," option."]}),"\n",(0,a.jsx)(n.h2,{id:"4-installation-method-under-ubuntu",children:"4. Installation method under Ubuntu"}),"\n",(0,a.jsx)(n.p,{children:"A .deb installation package for TuGraph installed on Ubuntu, which contains the TuGraph executable file as well as header files and related library files required for writing embedded programs and stored procedures."}),"\n",(0,a.jsxs)(n.p,{children:["Use the downloaded ",(0,a.jsx)(n.code,{children:"tugraph_x.y.z.deb"})," installation package to install it in the terminal. You only need to run the following command:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"$ sudo dpkg -i tugraph-x.y.z.deb\n"})}),"\n",(0,a.jsxs)(n.p,{children:["This command installs TuGraph in the ",(0,a.jsx)(n.code,{children:"/usr/local"})," directory by default. Users can also change the installation directory by specifying the ",(0,a.jsx)(n.code,{children:"--instdir="})," option."]})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>r});var a=t(6540);const o={},i=a.createContext(o);function l(e){const n=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),a.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/facc0445.38b210dd.js b/assets/js/facc0445.c5d55231.js similarity index 99% rename from assets/js/facc0445.38b210dd.js rename to assets/js/facc0445.c5d55231.js index 449e8b1746..cc81c10254 100644 --- a/assets/js/facc0445.38b210dd.js +++ b/assets/js/facc0445.c5d55231.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[7615],{2663:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>r,contentTitle:()=>h,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var t=n(4848),a=n(8453);const o={},h="Three Kingdoms",s={id:"quick-start/demo/three-kingdoms",title:"Three Kingdoms",description:"This document mainly introduces the usage of the Three Kingdoms demo.",source:"@site/../docs/en-US/source/3.quick-start/2.demo/4.three-kingdoms.md",sourceDirName:"3.quick-start/2.demo",slug:"/quick-start/demo/three-kingdoms",permalink:"/tugraph-db/en/quick-start/demo/three-kingdoms",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"The Three Body",permalink:"/tugraph-db/en/quick-start/demo/the-three-body"},next:{title:"Demo:Round The World",permalink:"/tugraph-db/en/quick-start/demo/round-the-world"}},r={},d=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2. Data Modeling",id:"2-data-modeling",level:2},{value:"3. Data Import",id:"3-data-import",level:2},{value:"4. Cypher Query",id:"4-cypher-query",level:2},{value:"4.1. Why did Zhuge Liang Choose Liu Bei?",id:"41-why-did-zhuge-liang-choose-liu-bei",level:3},{value:"4.2. Why Did Cao Cao Achieve More Than Liu Bei?",id:"42-why-did-cao-cao-achieve-more-than-liu-bei",level:3},{value:"4.3. Why Did the Most Powerful Wei Kingdom in the Three Kingdoms Perish First?",id:"43-why-did-the-most-powerful-wei-kingdom-in-the-three-kingdoms-perish-first",level:3},{value:"4.4. What Were the Strengths of Each of the Three Kingdoms?",id:"44-what-were-the-strengths-of-each-of-the-three-kingdoms",level:3},{value:"4.5. How Should Cao Cao's Military Ability Be Evaluated?",id:"45-how-should-cao-caos-military-ability-be-evaluated",level:3},{value:"5. Remarks",id:"5-remarks",level:2}];function l(e){const i={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"three-kingdoms",children:"Three Kingdoms"})}),"\n",(0,t.jsxs)(i.blockquote,{children:["\n",(0,t.jsx)(i.p,{children:"This document mainly introduces the usage of the Three Kingdoms demo."}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,t.jsx)(i.p,{children:"Due to the lack of historical records, there are often many mysteries surrounding even well-known historical events. Taking the history of the Three Kingdoms as an example, why did Zhuge Liang come out of seclusion to help Liu Bei, and why there was a huge gap in achievements between Cao Cao and Liu Bei, both heroes of the time, are some of the unsolved mysteries. Historians in the past often used two-dimensional relationship analysis of history, and the conclusions drawn were often one-sided. Using TuGraph to import historical figures and events of the Three Kingdoms into a graph model, and analyzing them using graph calculation methods can help us obtain more valuable knowledge from limited information, which is a very meaningful interdisciplinary attempt."}),"\n",(0,t.jsx)(i.h2,{id:"2-data-modeling",children:"2. Data Modeling"}),"\n",(0,t.jsxs)(i.p,{children:['We designed 5 types of vertices and 5 types of edges. The vertices include "Lord", "Province", "Civilian", "Military Officer", and "Battle"; the edges include "Father", "Brother", "Belongs To", "Native Place", and "Participate In". The specific modeling information is shown below:\n',(0,t.jsx)(i.img,{alt:"image.png",src:n(2591).A+"",width:"1124",height:"1160"})]}),"\n",(0,t.jsx)(i.h2,{id:"3-data-import",children:"3. Data Import"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsx)(i.p,{children:"Manual import"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Data storage directory: ",(0,t.jsx)(i.a,{href:"https://github.com/TuGraph-family/tugraph-db-demo",children:"https://github.com/TuGraph-family/tugraph-db-demo"}),"."]}),"\n",(0,t.jsxs)(i.li,{children:["Modify the DATA_PATH in import.json according to the corresponding data storage directory. For more details, please refer to ",(0,t.jsx)(i.a,{href:"/tugraph-db/en/utility-tools/data-import",children:"Data Importing"}),"."]}),"\n",(0,t.jsx)(i.li,{children:"After starting the TuGraph service, access ${HOST_IP}:7070 to open the web page and confirm whether the data is imported successfully."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsx)(i.p,{children:"Automatic creation"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Click ",(0,t.jsx)(i.code,{children:"New Graph Project"}),", select the Three Kingdoms data, fill in the graph project configuration, and the system will automatically create the Three Kingdoms scene graph project."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"4-cypher-query",children:"4. Cypher Query"}),"\n",(0,t.jsx)(i.h3,{id:"41-why-did-zhuge-liang-choose-liu-bei",children:"4.1. Why did Zhuge Liang Choose Liu Bei?"}),"\n",(0,t.jsx)(i.p,{children:"The following Cypher command can be used to view the relationship between Zhuge Liang, Cao Cao, and Liu Bei:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"MATCH p = (cc:\u4e3b\u516c {name: '\u66f9\u64cd'})-[*1..3]-(zgl:\u6587\u81e3 {name: '\u8bf8\u845b\u4eae'}) RETURN p\n"})}),"\n",(0,t.jsxs)(i.p,{children:["The query result is shown in the following figure:\n",(0,t.jsx)(i.img,{alt:"image.png",src:n(9242).A+"",width:"1527",height:"999"}),"\nFrom the graph, we can intuitively see that one of the shortest paths between Cao Cao and Zhuge Liang includes the battle of Xuzhou. Cao Cao once committed a massacre in Xuzhou because his father was killed, and nobody would choose a warlord who had previously massacred their hometown as their lord. In contrast, Liu Bei once prevented Cao Cao's violence during the battle of Xuzhou, which should be one of the reasons why Zhuge Liang had a good impression of Liu Bei."]}),"\n",(0,t.jsx)(i.h3,{id:"42-why-did-cao-cao-achieve-more-than-liu-bei",children:"4.2. Why Did Cao Cao Achieve More Than Liu Bei?"}),"\n",(0,t.jsx)(i.p,{children:"The following Cypher command can be used to view the family's support for Cao Cao's career:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'MATCH (cc:\u4e3b\u516c{name:"\u66f9\u64cd"})<-[r:\u96b6\u5c5e]-(wj:\u6b66\u5c06) WHERE wj.name REGEXP "\u66f9.*" OR wj.name REGEXP "\u590f\u4faf.*" return cc,wj,r\n'})}),"\n",(0,t.jsxs)(i.p,{children:["The query result is shown in the following figure:\n",(0,t.jsx)(i.img,{alt:"image.png",src:n(6673).A+"",width:"1527",height:"999"}),"\nThe most important thing for pacifying the world is military talent. Cao Cao's father originally had the surname Xiahou, but was adopted into the Cao family. The Cao and Xiahou families were both local big clans in Qiao County, providing Cao Cao with a large number of military talents such as Xiahou Dun, Xiahou Yuan, Cao Ren, and Cao Hong in the early days of his career. In contrast, Liu Bei's father died early and he didn't have any family support. He only gathered his Five Tiger Generals when he was over 50 years old, by which time the best time to fight for land in the chaotic world had passed. Cao Cao had already controlled six of the nine provinces in the world."]}),"\n",(0,t.jsx)(i.h3,{id:"43-why-did-the-most-powerful-wei-kingdom-in-the-three-kingdoms-perish-first",children:"4.3. Why Did the Most Powerful Wei Kingdom in the Three Kingdoms Perish First?"}),"\n",(0,t.jsx)(i.p,{children:"The following Cypher command can be used to view the important civilian officials of the Cao Cao group:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'MATCH (cc:\u4e3b\u516c)<-[r:\u96b6\u5c5e]-(wc) WHERE cc.name REGEXP "\u66f9.*" AND (label(wc) = "\u6587\u81e3" OR label(wc) = "\u4e3b\u516c") return cc,wc,r\n'})}),"\n",(0,t.jsxs)(i.p,{children:["The query result is shown in the following figure:\n",(0,t.jsx)(i.img,{alt:"image.png",src:n(5544).A+"",width:"1527",height:"999"}),"\nIn fact, Cao Wei was overthrown in the Gao Ping Ling incident in 249 AD, after only 29 years of existence, which was shorter than Shu Han (43 years) and Dong Wu (51 years). The reason why the most powerful Wei Kingdom in the Three Kingdoms perished first was that the civilian official system of Cao Wei (the nine-rank system) made it easy for power to be concentrated in the hands of aristocratic families. From the graph, we can see that almost all the important civilian officials of Cao Cao and Cao Pi's generations were from aristocratic families, such as Xun Clan of Yingchuan, Zhong Clan of Yingchuan, Chen Clan of Yingchuan, Jia Clan of Wuxi, etc. There was even a trend of regionalization, centered on Yingchuan. Ultimately, the regime was usurped by the Sima family of Henei, which had close ties with the Xun Clan of Yingchuan."]}),"\n",(0,t.jsx)(i.h3,{id:"44-what-were-the-strengths-of-each-of-the-three-kingdoms",children:"4.4. What Were the Strengths of Each of the Three Kingdoms?"}),"\n",(0,t.jsx)(i.p,{children:"The following Cypher command can be used to view the population strength of each group in the Three Kingdoms:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'MATCH (p) WHERE (label(p)="\u4e3b\u516c" OR label(p)="\u6587\u81e3" OR label(p)="\u6b66\u5c06") AND p.hometown IN ["\u5e7d\u5dde","\u5180\u5dde","\u9752\u5dde","\u5e76\u5dde","\u51c9\u5dde","\u53f8\u5dde","\u8c6b\u5dde","\u5156\u5dde","\u5f90\u5dde"] WITH COUNT(p) AS w\nMATCH (p) WHERE (label(p)="\u4e3b\u516c" OR label(p)="\u6587\u81e3" OR label(p)="\u6b66\u5c06") AND p.hometown IN ["\u76ca\u5dde"] WITH COUNT(p) AS s,w\nMATCH (p) WHERE (label(p)="\u4e3b\u516c" OR label(p)="\u6587\u81e3" OR label(p)="\u6b66\u5c06") AND p.hometown IN ["\u626c\u5dde","\u8346\u5dde","\u4ea4\u5dde"]\nRETURN w as \u9b4f\u4eba\u53e3,s as \u8700\u4eba\u53e3,count(p) as \u5434\u4eba\u53e3\n'})}),"\n",(0,t.jsxs)(i.p,{children:["The query result is shown in the following table:\n",(0,t.jsx)(i.img,{alt:"image.png",src:n(1335).A+"",width:"1527",height:"999"}),"\nIn ancient society, an important indicator of a country's strength was its population. Since population data is missing, we estimate the population of each province using the birthplace data of all lords, civilians, and military officers in the Three Kingdoms. It is found that among the main characters of the Three Kingdoms, 60 belong to Wei, 23 belong to Wu, and only 2 belong to Shu, which proves that Wei was indeed the most powerful country in the Three Kingdoms."]}),"\n",(0,t.jsx)(i.h3,{id:"45-how-should-cao-caos-military-ability-be-evaluated",children:"4.5. How Should Cao Cao's Military Ability Be Evaluated?"}),"\n",(0,t.jsx)(i.p,{children:"The following Cypher command can be used to view the main battles that Cao Cao participated in:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'MATCH (cc:\u4e3b\u516c{name:"\u66f9\u64cd"})-[e]-(zy:\u6218\u5f79) RETURN cc,zy,e\n'})}),"\n",(0,t.jsxs)(i.p,{children:["The query result is shown in the following figure:\n",(0,t.jsx)(i.img,{alt:"image.png",src:n(1838).A+"",width:"1527",height:"999"}),"\nFrom the graph, we can see that Cao Cao participated in 8 out of the 15 major battles in the Three Kingdoms, with a high participation rate. However, Cao Cao only won the battles of Xuzhou, Yanzhou, Guandu, and Xiangyang, while losing the battles of Hanzhong, Wancheng, the Campaign against Dong Zhuo and the Battle of Red Cliffs. His overall win rate was 50%, which proves that Cao Cao was not a very outstanding military strategist."]}),"\n",(0,t.jsx)(i.h2,{id:"5-remarks",children:"5. Remarks"}),"\n",(0,t.jsx)(i.p,{children:"More analysis is needed and encouraged to be added by everyone!"})]})}function c(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},9242:(e,i,n)=>{n.d(i,{A:()=>t});const t=n.p+"assets/images/three-kingdoms-cypher1-959ef771556fbe22ad88314b24b7e6e7.png"},6673:(e,i,n)=>{n.d(i,{A:()=>t});const t=n.p+"assets/images/three-kingdoms-cypher2-d345fe10f1310a6c86fdf81afaf7a860.png"},5544:(e,i,n)=>{n.d(i,{A:()=>t});const t=n.p+"assets/images/three-kingdoms-cypher3-5d7837e0c354f6d6f0b7a7343a05b12d.png"},1335:(e,i,n)=>{n.d(i,{A:()=>t});const t=n.p+"assets/images/three-kingdoms-cypher4-b4ee597e34a8b026d14f09b83862f8bb.png"},1838:(e,i,n)=>{n.d(i,{A:()=>t});const t=n.p+"assets/images/three-kingdoms-cypher5-531165798a411a41937056e72136cfc9.png"},2591:(e,i,n)=>{n.d(i,{A:()=>t});const t=n.p+"assets/images/three-kingdoms-schema-86cedb325b48b2d0b9d4ccbd4ffd4ffd.png"},8453:(e,i,n)=>{n.d(i,{R:()=>h,x:()=>s});var t=n(6540);const a={},o=t.createContext(a);function h(e){const i=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function s(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:h(e.components),t.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[7615],{2663:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>r,contentTitle:()=>h,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>d});var t=n(4848),a=n(8453);const o={},h="Three Kingdoms",s={id:"quick-start/demo/three-kingdoms",title:"Three Kingdoms",description:"This document mainly introduces the usage of the Three Kingdoms demo.",source:"@site/../docs/en-US/source/3.quick-start/2.demo/4.three-kingdoms.md",sourceDirName:"3.quick-start/2.demo",slug:"/quick-start/demo/three-kingdoms",permalink:"/tugraph-db/en/quick-start/demo/three-kingdoms",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"The Three Body",permalink:"/tugraph-db/en/quick-start/demo/the-three-body"},next:{title:"Demo:Round The World",permalink:"/tugraph-db/en/quick-start/demo/round-the-world"}},r={},d=[{value:"1. Introduction",id:"1-introduction",level:2},{value:"2. Data Modeling",id:"2-data-modeling",level:2},{value:"3. Data Import",id:"3-data-import",level:2},{value:"4. Cypher Query",id:"4-cypher-query",level:2},{value:"4.1. Why did Zhuge Liang Choose Liu Bei?",id:"41-why-did-zhuge-liang-choose-liu-bei",level:3},{value:"4.2. Why Did Cao Cao Achieve More Than Liu Bei?",id:"42-why-did-cao-cao-achieve-more-than-liu-bei",level:3},{value:"4.3. Why Did the Most Powerful Wei Kingdom in the Three Kingdoms Perish First?",id:"43-why-did-the-most-powerful-wei-kingdom-in-the-three-kingdoms-perish-first",level:3},{value:"4.4. What Were the Strengths of Each of the Three Kingdoms?",id:"44-what-were-the-strengths-of-each-of-the-three-kingdoms",level:3},{value:"4.5. How Should Cao Cao's Military Ability Be Evaluated?",id:"45-how-should-cao-caos-military-ability-be-evaluated",level:3},{value:"5. Remarks",id:"5-remarks",level:2}];function l(e){const i={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"three-kingdoms",children:"Three Kingdoms"})}),"\n",(0,t.jsxs)(i.blockquote,{children:["\n",(0,t.jsx)(i.p,{children:"This document mainly introduces the usage of the Three Kingdoms demo."}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"1-introduction",children:"1. Introduction"}),"\n",(0,t.jsx)(i.p,{children:"Due to the lack of historical records, there are often many mysteries surrounding even well-known historical events. Taking the history of the Three Kingdoms as an example, why did Zhuge Liang come out of seclusion to help Liu Bei, and why there was a huge gap in achievements between Cao Cao and Liu Bei, both heroes of the time, are some of the unsolved mysteries. Historians in the past often used two-dimensional relationship analysis of history, and the conclusions drawn were often one-sided. Using TuGraph to import historical figures and events of the Three Kingdoms into a graph model, and analyzing them using graph calculation methods can help us obtain more valuable knowledge from limited information, which is a very meaningful interdisciplinary attempt."}),"\n",(0,t.jsx)(i.h2,{id:"2-data-modeling",children:"2. Data Modeling"}),"\n",(0,t.jsxs)(i.p,{children:['We designed 5 types of vertices and 5 types of edges. The vertices include "Lord", "Province", "Civilian", "Military Officer", and "Battle"; the edges include "Father", "Brother", "Belongs To", "Native Place", and "Participate In". The specific modeling information is shown below:\n',(0,t.jsx)(i.img,{alt:"image.png",src:n(2591).A+"",width:"1124",height:"1160"})]}),"\n",(0,t.jsx)(i.h2,{id:"3-data-import",children:"3. Data Import"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsx)(i.p,{children:"Manual import"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Data storage directory: ",(0,t.jsx)(i.a,{href:"https://github.com/TuGraph-family/tugraph-db-demo",children:"https://github.com/TuGraph-family/tugraph-db-demo"}),"."]}),"\n",(0,t.jsxs)(i.li,{children:["Modify the DATA_PATH in import.json according to the corresponding data storage directory. For more details, please refer to ",(0,t.jsx)(i.a,{href:"/tugraph-db/en/utility-tools/data-import",children:"Data Importing"}),"."]}),"\n",(0,t.jsx)(i.li,{children:"After starting the TuGraph service, access ${HOST_IP}:7070 to open the web page and confirm whether the data is imported successfully."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(i.li,{children:["\n",(0,t.jsx)(i.p,{children:"Automatic creation"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Click ",(0,t.jsx)(i.code,{children:"New Graph Project"}),", select the Three Kingdoms data, fill in the graph project configuration, and the system will automatically create the Three Kingdoms scene graph project."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(i.h2,{id:"4-cypher-query",children:"4. Cypher Query"}),"\n",(0,t.jsx)(i.h3,{id:"41-why-did-zhuge-liang-choose-liu-bei",children:"4.1. Why did Zhuge Liang Choose Liu Bei?"}),"\n",(0,t.jsx)(i.p,{children:"The following Cypher command can be used to view the relationship between Zhuge Liang, Cao Cao, and Liu Bei:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:"MATCH p = (cc:\u4e3b\u516c {name: '\u66f9\u64cd'})-[*1..3]-(zgl:\u6587\u81e3 {name: '\u8bf8\u845b\u4eae'}) RETURN p\n"})}),"\n",(0,t.jsxs)(i.p,{children:["The query result is shown in the following figure:\n",(0,t.jsx)(i.img,{alt:"image.png",src:n(9242).A+"",width:"1527",height:"999"}),"\nFrom the graph, we can intuitively see that one of the shortest paths between Cao Cao and Zhuge Liang includes the battle of Xuzhou. Cao Cao once committed a massacre in Xuzhou because his father was killed, and nobody would choose a warlord who had previously massacred their hometown as their lord. In contrast, Liu Bei once prevented Cao Cao's violence during the battle of Xuzhou, which should be one of the reasons why Zhuge Liang had a good impression of Liu Bei."]}),"\n",(0,t.jsx)(i.h3,{id:"42-why-did-cao-cao-achieve-more-than-liu-bei",children:"4.2. Why Did Cao Cao Achieve More Than Liu Bei?"}),"\n",(0,t.jsx)(i.p,{children:"The following Cypher command can be used to view the family's support for Cao Cao's career:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'MATCH (cc:\u4e3b\u516c{name:"\u66f9\u64cd"})<-[r:\u96b6\u5c5e]-(wj:\u6b66\u5c06) WHERE wj.name REGEXP "\u66f9.*" OR wj.name REGEXP "\u590f\u4faf.*" return cc,wj,r\n'})}),"\n",(0,t.jsxs)(i.p,{children:["The query result is shown in the following figure:\n",(0,t.jsx)(i.img,{alt:"image.png",src:n(6673).A+"",width:"1527",height:"999"}),"\nThe most important thing for pacifying the world is military talent. Cao Cao's father originally had the surname Xiahou, but was adopted into the Cao family. The Cao and Xiahou families were both local big clans in Qiao County, providing Cao Cao with a large number of military talents such as Xiahou Dun, Xiahou Yuan, Cao Ren, and Cao Hong in the early days of his career. In contrast, Liu Bei's father died early and he didn't have any family support. He only gathered his Five Tiger Generals when he was over 50 years old, by which time the best time to fight for land in the chaotic world had passed. Cao Cao had already controlled six of the nine provinces in the world."]}),"\n",(0,t.jsx)(i.h3,{id:"43-why-did-the-most-powerful-wei-kingdom-in-the-three-kingdoms-perish-first",children:"4.3. Why Did the Most Powerful Wei Kingdom in the Three Kingdoms Perish First?"}),"\n",(0,t.jsx)(i.p,{children:"The following Cypher command can be used to view the important civilian officials of the Cao Cao group:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'MATCH (cc:\u4e3b\u516c)<-[r:\u96b6\u5c5e]-(wc) WHERE cc.name REGEXP "\u66f9.*" AND (label(wc) = "\u6587\u81e3" OR label(wc) = "\u4e3b\u516c") return cc,wc,r\n'})}),"\n",(0,t.jsxs)(i.p,{children:["The query result is shown in the following figure:\n",(0,t.jsx)(i.img,{alt:"image.png",src:n(5544).A+"",width:"1527",height:"999"}),"\nIn fact, Cao Wei was overthrown in the Gao Ping Ling incident in 249 AD, after only 29 years of existence, which was shorter than Shu Han (43 years) and Dong Wu (51 years). The reason why the most powerful Wei Kingdom in the Three Kingdoms perished first was that the civilian official system of Cao Wei (the nine-rank system) made it easy for power to be concentrated in the hands of aristocratic families. From the graph, we can see that almost all the important civilian officials of Cao Cao and Cao Pi's generations were from aristocratic families, such as Xun Clan of Yingchuan, Zhong Clan of Yingchuan, Chen Clan of Yingchuan, Jia Clan of Wuxi, etc. There was even a trend of regionalization, centered on Yingchuan. Ultimately, the regime was usurped by the Sima family of Henei, which had close ties with the Xun Clan of Yingchuan."]}),"\n",(0,t.jsx)(i.h3,{id:"44-what-were-the-strengths-of-each-of-the-three-kingdoms",children:"4.4. What Were the Strengths of Each of the Three Kingdoms?"}),"\n",(0,t.jsx)(i.p,{children:"The following Cypher command can be used to view the population strength of each group in the Three Kingdoms:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'MATCH (p) WHERE (label(p)="\u4e3b\u516c" OR label(p)="\u6587\u81e3" OR label(p)="\u6b66\u5c06") AND p.hometown IN ["\u5e7d\u5dde","\u5180\u5dde","\u9752\u5dde","\u5e76\u5dde","\u51c9\u5dde","\u53f8\u5dde","\u8c6b\u5dde","\u5156\u5dde","\u5f90\u5dde"] WITH COUNT(p) AS w\nMATCH (p) WHERE (label(p)="\u4e3b\u516c" OR label(p)="\u6587\u81e3" OR label(p)="\u6b66\u5c06") AND p.hometown IN ["\u76ca\u5dde"] WITH COUNT(p) AS s,w\nMATCH (p) WHERE (label(p)="\u4e3b\u516c" OR label(p)="\u6587\u81e3" OR label(p)="\u6b66\u5c06") AND p.hometown IN ["\u626c\u5dde","\u8346\u5dde","\u4ea4\u5dde"]\nRETURN w as \u9b4f\u4eba\u53e3,s as \u8700\u4eba\u53e3,count(p) as \u5434\u4eba\u53e3\n'})}),"\n",(0,t.jsxs)(i.p,{children:["The query result is shown in the following table:\n",(0,t.jsx)(i.img,{alt:"image.png",src:n(1335).A+"",width:"1527",height:"999"}),"\nIn ancient society, an important indicator of a country's strength was its population. Since population data is missing, we estimate the population of each province using the birthplace data of all lords, civilians, and military officers in the Three Kingdoms. It is found that among the main characters of the Three Kingdoms, 60 belong to Wei, 23 belong to Wu, and only 2 belong to Shu, which proves that Wei was indeed the most powerful country in the Three Kingdoms."]}),"\n",(0,t.jsx)(i.h3,{id:"45-how-should-cao-caos-military-ability-be-evaluated",children:"4.5. How Should Cao Cao's Military Ability Be Evaluated?"}),"\n",(0,t.jsx)(i.p,{children:"The following Cypher command can be used to view the main battles that Cao Cao participated in:"}),"\n",(0,t.jsx)(i.pre,{children:(0,t.jsx)(i.code,{children:'MATCH (cc:\u4e3b\u516c{name:"\u66f9\u64cd"})-[e]-(zy:\u6218\u5f79) RETURN cc,zy,e\n'})}),"\n",(0,t.jsxs)(i.p,{children:["The query result is shown in the following figure:\n",(0,t.jsx)(i.img,{alt:"image.png",src:n(1838).A+"",width:"1527",height:"999"}),"\nFrom the graph, we can see that Cao Cao participated in 8 out of the 15 major battles in the Three Kingdoms, with a high participation rate. However, Cao Cao only won the battles of Xuzhou, Yanzhou, Guandu, and Xiangyang, while losing the battles of Hanzhong, Wancheng, the Campaign against Dong Zhuo and the Battle of Red Cliffs. His overall win rate was 50%, which proves that Cao Cao was not a very outstanding military strategist."]}),"\n",(0,t.jsx)(i.h2,{id:"5-remarks",children:"5. Remarks"}),"\n",(0,t.jsx)(i.p,{children:"More analysis is needed and encouraged to be added by everyone!"})]})}function c(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},9242:(e,i,n)=>{n.d(i,{A:()=>t});const t=n.p+"assets/images/three-kingdoms-cypher1-959ef771556fbe22ad88314b24b7e6e7.png"},6673:(e,i,n)=>{n.d(i,{A:()=>t});const t=n.p+"assets/images/three-kingdoms-cypher2-d345fe10f1310a6c86fdf81afaf7a860.png"},5544:(e,i,n)=>{n.d(i,{A:()=>t});const t=n.p+"assets/images/three-kingdoms-cypher3-5d7837e0c354f6d6f0b7a7343a05b12d.png"},1335:(e,i,n)=>{n.d(i,{A:()=>t});const t=n.p+"assets/images/three-kingdoms-cypher4-b4ee597e34a8b026d14f09b83862f8bb.png"},1838:(e,i,n)=>{n.d(i,{A:()=>t});const t=n.p+"assets/images/three-kingdoms-cypher5-531165798a411a41937056e72136cfc9.png"},2591:(e,i,n)=>{n.d(i,{A:()=>t});const t=n.p+"assets/images/three-kingdoms-schema-86cedb325b48b2d0b9d4ccbd4ffd4ffd.png"},8453:(e,i,n)=>{n.d(i,{R:()=>h,x:()=>s});var t=n(6540);const a={},o=t.createContext(a);function h(e){const i=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function s(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:h(e.components),t.createElement(o.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fd689854.0183f75c.js b/assets/js/fd689854.e2ec635d.js similarity index 99% rename from assets/js/fd689854.0183f75c.js rename to assets/js/fd689854.e2ec635d.js index b07ad660cf..2d3cdb32f3 100644 --- a/assets/js/fd689854.0183f75c.js +++ b/assets/js/fd689854.e2ec635d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[2435],{2914:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>c,frontMatter:()=>s,metadata:()=>a,toc:()=>o});var i=t(4848),r=t(8453);const s={},d="TuGraph schema Instructions",a={id:"introduction/schema",title:"TuGraph schema Instructions",description:"1.The data model",source:"@site/../docs/en-US/source/2.introduction/4.schema.md",sourceDirName:"2.introduction",slug:"/introduction/schema",permalink:"/tugraph-db/en/introduction/schema",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1728991741e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"What is TuGraph",permalink:"/tugraph-db/en/introduction/what-is-tugraph"},next:{title:"Performance Oriented",permalink:"/tugraph-db/en/introduction/characteristics/performance-oriented"}},h={},o=[{value:"1.The data model",id:"1the-data-model",level:2},{value:"1.1.Graph model",id:"11graph-model",level:3},{value:"1.2.The data type",id:"12the-data-type",level:3},{value:"1.3.Index",id:"13index",level:3},{value:"1.3.1 Single index",id:"131-single-index",level:4},{value:"1.3.1.1 Node index",id:"1311-node-index",level:4},{value:"1.3.1.1.1 unique index",id:"13111-unique-index",level:5},{value:"1.3.1.1.2 non_unique index",id:"13112-non_unique-index",level:5},{value:"1.3.1.2 Edge index",id:"1312-edge-index",level:4},{value:"1.3.1.2.1 unique index",id:"13121-unique-index",level:5},{value:"1.3.1.2.2 pair_unique index",id:"13122-pair_unique-index",level:5},{value:"1.3.1.2.3 non_unique index",id:"13123-non_unique-index",level:5},{value:"1.3.2 Composite index",id:"132-composite-index",level:4},{value:"1.3.2.1 Unique index",id:"1321-unique-index",level:5},{value:"1.3.2.2 non_unique index",id:"1322-non_unique-index",level:5},{value:"2. Graph Project, Vertex, Edge, and Attribute Naming Conventions and suggestions",id:"2-graph-project-vertex-edge-and-attribute-naming-conventions-and-suggestions",level:2},{value:"2.1 Naming Rules",id:"21-naming-rules",level:3},{value:"2.2 Usage Restrictions",id:"22-usage-restrictions",level:3},{value:"2.3 Naming Suggestions",id:"23-naming-suggestions",level:3}];function l(e){const n={code:"code",div:"div",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"tugraph-schema--instructions",children:"TuGraph schema Instructions"})}),"\n",(0,i.jsx)(n.h2,{id:"1the-data-model",children:"1.The data model"}),"\n",(0,i.jsx)(n.h3,{id:"11graph-model",children:"1.1.Graph model"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph is a strong schema, directed property graph database with multi-graph capability."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Graph Project: Each database service can host multiple graph projects (multi-graphs), and each graph project can have its own access control configuration. The database administrator can create or delete specified graph projects."}),"\n",(0,i.jsxs)(n.li,{children:["Vertex: Refers to entity, generally used to express real-world entities, such as a movie or an actor.\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Primary Key: User-defined vertex data primary key, unique in the corresponding graph project and vertex type."}),"\n",(0,i.jsx)(n.li,{children:"VID: Refers to the auto-generated unique ID of the vertex, which cannot be modified by the user."}),"\n",(0,i.jsx)(n.li,{children:"Upper Limit: Each graph project can store up to 2^(40) vertex data."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Edge: Used to express the relationship between vertexs, such as an actor appears in a movie.\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Directed Edge: The edge is a directed edge. If you want to simulate an undirected edge, the user can create two edges with opposite directions."}),"\n",(0,i.jsx)(n.li,{children:"Duplicate Edge: TuGraph currently supports duplicate edges. If you want to ensure the uniqueness of the edge, you need to implement it through business policies."}),"\n",(0,i.jsx)(n.li,{children:"Upper Limit: Up to 2^(32) edge data can be stored between two vertex data."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:"Property Graph: vertexs and edges can have properties associated with them, and each property can have a different type."}),"\n",(0,i.jsxs)(n.li,{children:["Strong-typed: Each vertex and edge has only one label, and after creating a label, there is a cost to modify the number and type of attributes.\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Specify the starting/ending vertex type of the edge: You can limit the starting and ending vertex types of the edge, and support different vertex types of the starting and ending vertexs of the same type of edge, such as individuals transferring money to companies, companies transferring money to companies. After specifying the starting/ending vertex type of the edge, you can add multiple sets of starting/ending vertex types, but you cannot delete the restricted starting/ending vertex types."}),"\n",(0,i.jsx)(n.li,{children:"Unrestricted Mode: Supports creating edge data of this type between any two vertex types without specifying the starting and ending vertex types of the edge. Note: After specifying the starting/ending vertex type of the edge, the unrestricted mode cannot be used again."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"12the-data-type",children:"1.2.The data type"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph Supports a variety of data types that can be used as attributes, the specific supported data types are as follows:"}),"\nTable 1. TuGraph supported data types\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Type"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Min"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Max"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"BOOL"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Boolean"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"INT8"}),(0,i.jsx)(n.td,{children:"-128"}),(0,i.jsx)(n.td,{children:"127"}),(0,i.jsx)(n.td,{children:"8-bit int"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"INT16"}),(0,i.jsx)(n.td,{children:"-32768"}),(0,i.jsx)(n.td,{children:"32767"}),(0,i.jsx)(n.td,{children:"16-bit int"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"INT32"}),(0,i.jsx)(n.td,{children:"- 2^31"}),(0,i.jsx)(n.td,{children:"2^31 - 1"}),(0,i.jsx)(n.td,{children:"32-bit int"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"INT64"}),(0,i.jsx)(n.td,{children:"- 2^63"}),(0,i.jsx)(n.td,{children:"2^63 - 1"}),(0,i.jsx)(n.td,{children:"64-bit int"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"DATE"}),(0,i.jsx)(n.td,{children:"0000-00-00"}),(0,i.jsx)(n.td,{children:"9999-12-31"}),(0,i.jsx)(n.td,{children:'"YYYY-MM-DD" Date of format'})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"DATETIME"}),(0,i.jsx)(n.td,{children:"0000-00-00 00:00:00.000000"}),(0,i.jsx)(n.td,{children:"9999-12-31 23:59:59.999999"}),(0,i.jsxs)(n.td,{children:['"YYYY-MM-DD hh:mm',(0,i.jsx)(n.div,{children:".ffffff"}),'"Format of the date and time']})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"FLOAT"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"32-bit float"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"DOUBLE"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"64-bit float"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"STRING"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"A string of variable length"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"BLOB"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"Binary data"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"POINT"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"EWKB format data of point"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"LINESTRING"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"EWKB format data of linestring"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"POLYGON"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"EWKB format data of polygon"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"FLOAT_VECTOR"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"The dynamic vector containing 32-bit float numbers"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.em,{children:"BLOB data is BASE64 encoded in input and output"})}),"\n",(0,i.jsx)(n.h3,{id:"13index",children:"1.3.Index"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph supports indexing vertex fields."}),"\n",(0,i.jsx)(n.p,{children:"Indexes can be unique or non-unique. If a unique index is created for a vertex label, TuGraph will perform a data integrity check to ensure the uniqueness of the index before modifying the vertex of the label."}),"\n",(0,i.jsx)(n.p,{children:"Each index built on a single field of a label, and multiple fields can be indexed using the same label."}),"\n",(0,i.jsx)(n.p,{children:"BLOB fields cannot be indexed."}),"\n",(0,i.jsx)(n.p,{children:"TuGraph supports creating indexes on node or edge attributes to improve query efficiency. Its characteristics are as follows:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Indexes include single indexes and composite indexes. A single index is created based on a single property of a node or an edge, while a composite index is created based on multiple properties of a node or an edge (no more than 16). Indexes can be created on multiple sets of properties for the same node or edge."}),"\n",(0,i.jsx)(n.li,{children:"If a unique index is created for a node label, when modifying a node for that label, a data integrity check is first performed to ensure the uniqueness of the index."}),"\n",(0,i.jsx)(n.li,{children:"Attributes of type BLOB cannot be indexed."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"There are multiple index types for TuGraph's vertices and edges. Different index types have different functions and restrictions, as follows:"}),"\n",(0,i.jsx)(n.h4,{id:"131-single-index",children:"1.3.1 Single index"}),"\n",(0,i.jsx)(n.h4,{id:"1311-node-index",children:"1.3.1.1 Node index"}),"\n",(0,i.jsx)(n.h5,{id:"13111-unique-index",children:"1.3.1.1.1 unique index"}),"\n",(0,i.jsxs)(n.p,{children:["The unique index of a node refers to a globally unique index. That is, if a unique index is set for an attribute, in the same graph, the attribute of nodes with the same label will not have the same value.\nThe maximum length of a unique index key is 480 bytes. ",(0,i.jsx)(n.strong,{children:"Unique indexes cannot be created for attributes exceeding 480 bytes"}),".\nPrimary is a special unique index, so the maximum key length is also 480 bytes."]}),"\n",(0,i.jsx)(n.h5,{id:"13112-non_unique-index",children:"1.3.1.1.2 non_unique index"}),"\n",(0,i.jsxs)(n.p,{children:["The non_unique index of a node refers to a non-global unique index, that is, if an attribute is set with a non_unique index,\nIn the same graph, nodes with the same label can have the same value for this attribute.\nSince a key in a non_unique index may be mapped to multiple values, in order to speed up search and writing,\nThe maximum value of a group of vids with the same index key is added after the user-specified key.\nEach vid is 5 bytes long, so the maximum length of a non_unique index key is 475 bytes.\nHowever, unlike unique indexes, non_unique indexes can also be established if they exceed 475 bytes.\nHowever, when indexing such an attribute, only ",(0,i.jsx)(n.strong,{children:"the first 475 bytes"})," will be intercepted as the index key (the value stored in the attribute itself will not be affected).\nMoreover, when traversing through an iterator, the first 475 bytes of the query value are automatically intercepted before traversing.\nTherefore, the results may be inconsistent with expectations and require users to filter again."]}),"\n",(0,i.jsx)(n.h4,{id:"1312-edge-index",children:"1.3.1.2 Edge index"}),"\n",(0,i.jsx)(n.h5,{id:"13121-unique-index",children:"1.3.1.2.1 unique index"}),"\n",(0,i.jsxs)(n.p,{children:["Similar to node, the unique index of an edge refers to a globally unique index. That is, if an attribute is set to a unique index, in the same graph, the attribute of the edge with the same label will not have the same value.\nThe maximum length of a unique index key is 480 bytes. ",(0,i.jsx)(n.strong,{children:"Unique indexes cannot be created for attributes exceeding 480 bytes"}),"."]}),"\n",(0,i.jsx)(n.h5,{id:"13122-pair_unique-index",children:"1.3.1.2.2 pair_unique index"}),"\n",(0,i.jsxs)(n.p,{children:["pair_unique index refers to the unique index between two nodes, that is, if an attribute sets a unique index, between the same set of the starting node and the ending node in the same graph,\nEdges with the same label will not have the same value for this attribute. In order to ensure that the pair_unique index key does not repeat between the starting node and the end node of the same group,\nThe index adds the starting and ending vids after the user-specified key. Each vid is 5 bytes in length.\nTherefore, the maximum key length is 470 bytes, and ",(0,i.jsx)(n.strong,{children:"a pair_unique index cannot be created for attributes exceeding 470 bytes"}),"."]}),"\n",(0,i.jsx)(n.h5,{id:"13123-non_unique-index",children:"1.3.1.2.3 non_unique index"}),"\n",(0,i.jsxs)(n.p,{children:["Similar to node, the non_unique index of an edge refers to a non-global unique index, that is, if an attribute sets a non_unique index,\nIn the same graph, edges with the same label can have the same value for this attribute.\nSince a key in a non_unique index may be mapped to multiple values, in order to speed up search and writing,\nThe maximum value of a group of eids with the same index key is added after the user-specified key.\nEach eid is 24 bytes in length, so the maximum length of a non_unique index key is 456 bytes.\nHowever, unlike unique indexes, non_unique indexes can also be established if they exceed 456 bytes.\nHowever, when indexing such an attribute, only ",(0,i.jsx)(n.strong,{children:"the first 456 bytes"})," will be intercepted as the index key (the value stored in the attribute itself will not be affected).\nMoreover, when traversing through an iterator, the first 475 bytes of the query value are automatically intercepted before traversing.\nTherefore, the results may be inconsistent with expectations and require users to filter again."]}),"\n",(0,i.jsx)(n.h4,{id:"132-composite-index",children:"1.3.2 Composite index"}),"\n",(0,i.jsx)(n.p,{children:"Currently, composite indexes are only supported for multiple properties of a vertex, and not supported for properties of an edge. There are two types of composite indexes: unique indexes and non-unique indexes. The requirements for creating a composite index are as follows:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"The number of properties for creating a composite index should be between 2 and 16 (inclusive)."}),"\n",(0,i.jsx)(n.li,{children:"For a unique composite index, the sum of the lengths of the properties cannot exceed 480 - 2 * (number of properties - 1) bytes, while for a non-unique composite index, it cannot exceed 475 - 2 * (number of properties - 1) bytes."}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"1321-unique-index",children:"1.3.2.1 Unique index"}),"\n",(0,i.jsx)(n.p,{children:"Similar to a vertex's single unique index, a vertex's composite unique index refers to a globally unique index, meaning that for a set of properties with a unique index, there will not be another vertex with the same label in the same graph that has the same value for that group of properties.\nDue to the underlying storage design, the composite index key needs to retain the length of the properties; therefore, the maximum length for a composite unique index key is 480 - 2 * (number of properties - 1) bytes. Properties exceeding this length cannot be indexed uniquely."}),"\n",(0,i.jsx)(n.h5,{id:"1322-non_unique-index",children:"1.3.2.2 non_unique index"}),"\n",(0,i.jsx)(n.p,{children:"Similar to a vertex's single non-unique index, a vertex's non-unique index refers to a non-globally unique index, meaning that for a set of properties with a non-unique index, different vertices with the same label in the same graph may have the same value for that group of properties.\nSince a non-unique index key may map to multiple values to accelerate lookups and writing, the maximum value from a group of vertex IDs (vid) has been appended to the user-specified key where the index keys are identical. Each vid is 5 bytes in length; thus, the maximum length for a non-unique index key is 475 - 2 * (number of properties - 1) bytes. Properties exceeding this length cannot be indexed non-uniquely."}),"\n",(0,i.jsx)(n.h2,{id:"2-graph-project-vertex-edge-and-attribute-naming-conventions-and-suggestions",children:"2. Graph Project, Vertex, Edge, and Attribute Naming Conventions and suggestions"}),"\n",(0,i.jsx)(n.h3,{id:"21-naming-rules",children:"2.1 Naming Rules"}),"\n",(0,i.jsx)(n.p,{children:"Graph projects, vertices, edges, and attributes are identifiers. This section describes the allowed syntax for identifiers in TuGraph.\nThe table below describes the maximum length and allowed characters for each type of identifier."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Identifier"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Length"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Allowed Characters"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"User, role, graph project"}),(0,i.jsx)(n.td,{children:"1-64 characters"}),(0,i.jsx)(n.td,{children:"Chinese, letters, numbers, underscore, and the first character cannot be a number"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Vertex type, edge type, attribute"}),(0,i.jsx)(n.td,{children:"1-256 characters"}),(0,i.jsx)(n.td,{children:"Chinese, letters, numbers, underscore, and the first character cannot be a number"})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"22-usage-restrictions",children:"2.2 Usage Restrictions"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Maximum number"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Number of users, number of roles"}),(0,i.jsx)(n.td,{children:"65536"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Number of graphs"}),(0,i.jsx)(n.td,{children:"4096"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Number of vertex and edge types per graph"}),(0,i.jsx)(n.td,{children:"4096"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Number of attributes per type"}),(0,i.jsx)(n.td,{children:"1024"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"Note:\n1.Special characters and keywords: When using special characters or keywords, they need to be enclosed in backquotes (``) for reference;"}),"\n",(0,i.jsxs)(n.p,{children:["Example: ",(0,i.jsx)(n.code,{children:"match (`match`:match) return `match`.id limit 1"})]}),"\n",(0,i.jsx)(n.p,{children:"2.Case sensitivity: TuGraph is case-sensitive;"}),"\n",(0,i.jsx)(n.p,{children:"3.Graph project, vertex/edge, and attribute names can be reused, but attribute names under the same vertex or edge cannot be duplicated;"}),"\n",(0,i.jsx)(n.p,{children:"4.Reserved keywords for attribute names: SRC_ID / DST_ID / SKIP."}),"\n",(0,i.jsx)(n.h3,{id:"23-naming-suggestions",children:"2.3 Naming Suggestions"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Identifier"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Suggestions"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Graph project"}),(0,i.jsx)(n.td,{children:"Start with a letter or Chinese character"}),(0,i.jsx)(n.td,{children:"Examples: graph123, project123, etc."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Vertex/edge type"}),(0,i.jsx)(n.td,{children:"Start with a letter or Chinese character and use underscores to separate words"}),(0,i.jsx)(n.td,{children:"Examples: person, act_in, etc."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Attribute"}),(0,i.jsx)(n.td,{children:"Letters or Chinese characters"}),(0,i.jsx)(n.td,{children:"Examples: name, age, etc."})]})]})]})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>d,x:()=>a});var i=t(6540);const r={},s=i.createContext(r);function d(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[2435],{2914:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>h,contentTitle:()=>d,default:()=>c,frontMatter:()=>s,metadata:()=>a,toc:()=>o});var i=t(4848),r=t(8453);const s={},d="TuGraph schema Instructions",a={id:"introduction/schema",title:"TuGraph schema Instructions",description:"1.The data model",source:"@site/../docs/en-US/source/2.introduction/4.schema.md",sourceDirName:"2.introduction",slug:"/introduction/schema",permalink:"/tugraph-db/en/introduction/schema",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedBy:"wanzhongyun",lastUpdatedAt:1729046169e3,sidebarPosition:4,frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"What is TuGraph",permalink:"/tugraph-db/en/introduction/what-is-tugraph"},next:{title:"Performance Oriented",permalink:"/tugraph-db/en/introduction/characteristics/performance-oriented"}},h={},o=[{value:"1.The data model",id:"1the-data-model",level:2},{value:"1.1.Graph model",id:"11graph-model",level:3},{value:"1.2.The data type",id:"12the-data-type",level:3},{value:"1.3.Index",id:"13index",level:3},{value:"1.3.1 Single index",id:"131-single-index",level:4},{value:"1.3.1.1 Node index",id:"1311-node-index",level:4},{value:"1.3.1.1.1 unique index",id:"13111-unique-index",level:5},{value:"1.3.1.1.2 non_unique index",id:"13112-non_unique-index",level:5},{value:"1.3.1.2 Edge index",id:"1312-edge-index",level:4},{value:"1.3.1.2.1 unique index",id:"13121-unique-index",level:5},{value:"1.3.1.2.2 pair_unique index",id:"13122-pair_unique-index",level:5},{value:"1.3.1.2.3 non_unique index",id:"13123-non_unique-index",level:5},{value:"1.3.2 Composite index",id:"132-composite-index",level:4},{value:"1.3.2.1 Unique index",id:"1321-unique-index",level:5},{value:"1.3.2.2 non_unique index",id:"1322-non_unique-index",level:5},{value:"2. Graph Project, Vertex, Edge, and Attribute Naming Conventions and suggestions",id:"2-graph-project-vertex-edge-and-attribute-naming-conventions-and-suggestions",level:2},{value:"2.1 Naming Rules",id:"21-naming-rules",level:3},{value:"2.2 Usage Restrictions",id:"22-usage-restrictions",level:3},{value:"2.3 Naming Suggestions",id:"23-naming-suggestions",level:3}];function l(e){const n={code:"code",div:"div",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"tugraph-schema--instructions",children:"TuGraph schema Instructions"})}),"\n",(0,i.jsx)(n.h2,{id:"1the-data-model",children:"1.The data model"}),"\n",(0,i.jsx)(n.h3,{id:"11graph-model",children:"1.1.Graph model"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph is a strong schema, directed property graph database with multi-graph capability."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Graph Project: Each database service can host multiple graph projects (multi-graphs), and each graph project can have its own access control configuration. The database administrator can create or delete specified graph projects."}),"\n",(0,i.jsxs)(n.li,{children:["Vertex: Refers to entity, generally used to express real-world entities, such as a movie or an actor.\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Primary Key: User-defined vertex data primary key, unique in the corresponding graph project and vertex type."}),"\n",(0,i.jsx)(n.li,{children:"VID: Refers to the auto-generated unique ID of the vertex, which cannot be modified by the user."}),"\n",(0,i.jsx)(n.li,{children:"Upper Limit: Each graph project can store up to 2^(40) vertex data."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Edge: Used to express the relationship between vertexs, such as an actor appears in a movie.\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Directed Edge: The edge is a directed edge. If you want to simulate an undirected edge, the user can create two edges with opposite directions."}),"\n",(0,i.jsx)(n.li,{children:"Duplicate Edge: TuGraph currently supports duplicate edges. If you want to ensure the uniqueness of the edge, you need to implement it through business policies."}),"\n",(0,i.jsx)(n.li,{children:"Upper Limit: Up to 2^(32) edge data can be stored between two vertex data."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.li,{children:"Property Graph: vertexs and edges can have properties associated with them, and each property can have a different type."}),"\n",(0,i.jsxs)(n.li,{children:["Strong-typed: Each vertex and edge has only one label, and after creating a label, there is a cost to modify the number and type of attributes.\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Specify the starting/ending vertex type of the edge: You can limit the starting and ending vertex types of the edge, and support different vertex types of the starting and ending vertexs of the same type of edge, such as individuals transferring money to companies, companies transferring money to companies. After specifying the starting/ending vertex type of the edge, you can add multiple sets of starting/ending vertex types, but you cannot delete the restricted starting/ending vertex types."}),"\n",(0,i.jsx)(n.li,{children:"Unrestricted Mode: Supports creating edge data of this type between any two vertex types without specifying the starting and ending vertex types of the edge. Note: After specifying the starting/ending vertex type of the edge, the unrestricted mode cannot be used again."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"12the-data-type",children:"1.2.The data type"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph Supports a variety of data types that can be used as attributes, the specific supported data types are as follows:"}),"\nTable 1. TuGraph supported data types\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Type"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Min"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Max"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"BOOL"}),(0,i.jsx)(n.td,{children:"false"}),(0,i.jsx)(n.td,{children:"true"}),(0,i.jsx)(n.td,{children:"Boolean"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"INT8"}),(0,i.jsx)(n.td,{children:"-128"}),(0,i.jsx)(n.td,{children:"127"}),(0,i.jsx)(n.td,{children:"8-bit int"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"INT16"}),(0,i.jsx)(n.td,{children:"-32768"}),(0,i.jsx)(n.td,{children:"32767"}),(0,i.jsx)(n.td,{children:"16-bit int"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"INT32"}),(0,i.jsx)(n.td,{children:"- 2^31"}),(0,i.jsx)(n.td,{children:"2^31 - 1"}),(0,i.jsx)(n.td,{children:"32-bit int"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"INT64"}),(0,i.jsx)(n.td,{children:"- 2^63"}),(0,i.jsx)(n.td,{children:"2^63 - 1"}),(0,i.jsx)(n.td,{children:"64-bit int"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"DATE"}),(0,i.jsx)(n.td,{children:"0000-00-00"}),(0,i.jsx)(n.td,{children:"9999-12-31"}),(0,i.jsx)(n.td,{children:'"YYYY-MM-DD" Date of format'})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"DATETIME"}),(0,i.jsx)(n.td,{children:"0000-00-00 00:00:00.000000"}),(0,i.jsx)(n.td,{children:"9999-12-31 23:59:59.999999"}),(0,i.jsxs)(n.td,{children:['"YYYY-MM-DD hh:mm',(0,i.jsx)(n.div,{children:".ffffff"}),'"Format of the date and time']})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"FLOAT"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"32-bit float"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"DOUBLE"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"64-bit float"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"STRING"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"A string of variable length"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"BLOB"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"Binary data"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"POINT"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"EWKB format data of point"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"LINESTRING"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"EWKB format data of linestring"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"POLYGON"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"EWKB format data of polygon"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"FLOAT_VECTOR"}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{}),(0,i.jsx)(n.td,{children:"The dynamic vector containing 32-bit float numbers"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.em,{children:"BLOB data is BASE64 encoded in input and output"})}),"\n",(0,i.jsx)(n.h3,{id:"13index",children:"1.3.Index"}),"\n",(0,i.jsx)(n.p,{children:"TuGraph supports indexing vertex fields."}),"\n",(0,i.jsx)(n.p,{children:"Indexes can be unique or non-unique. If a unique index is created for a vertex label, TuGraph will perform a data integrity check to ensure the uniqueness of the index before modifying the vertex of the label."}),"\n",(0,i.jsx)(n.p,{children:"Each index built on a single field of a label, and multiple fields can be indexed using the same label."}),"\n",(0,i.jsx)(n.p,{children:"BLOB fields cannot be indexed."}),"\n",(0,i.jsx)(n.p,{children:"TuGraph supports creating indexes on node or edge attributes to improve query efficiency. Its characteristics are as follows:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Indexes include single indexes and composite indexes. A single index is created based on a single property of a node or an edge, while a composite index is created based on multiple properties of a node or an edge (no more than 16). Indexes can be created on multiple sets of properties for the same node or edge."}),"\n",(0,i.jsx)(n.li,{children:"If a unique index is created for a node label, when modifying a node for that label, a data integrity check is first performed to ensure the uniqueness of the index."}),"\n",(0,i.jsx)(n.li,{children:"Attributes of type BLOB cannot be indexed."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"There are multiple index types for TuGraph's vertices and edges. Different index types have different functions and restrictions, as follows:"}),"\n",(0,i.jsx)(n.h4,{id:"131-single-index",children:"1.3.1 Single index"}),"\n",(0,i.jsx)(n.h4,{id:"1311-node-index",children:"1.3.1.1 Node index"}),"\n",(0,i.jsx)(n.h5,{id:"13111-unique-index",children:"1.3.1.1.1 unique index"}),"\n",(0,i.jsxs)(n.p,{children:["The unique index of a node refers to a globally unique index. That is, if a unique index is set for an attribute, in the same graph, the attribute of nodes with the same label will not have the same value.\nThe maximum length of a unique index key is 480 bytes. ",(0,i.jsx)(n.strong,{children:"Unique indexes cannot be created for attributes exceeding 480 bytes"}),".\nPrimary is a special unique index, so the maximum key length is also 480 bytes."]}),"\n",(0,i.jsx)(n.h5,{id:"13112-non_unique-index",children:"1.3.1.1.2 non_unique index"}),"\n",(0,i.jsxs)(n.p,{children:["The non_unique index of a node refers to a non-global unique index, that is, if an attribute is set with a non_unique index,\nIn the same graph, nodes with the same label can have the same value for this attribute.\nSince a key in a non_unique index may be mapped to multiple values, in order to speed up search and writing,\nThe maximum value of a group of vids with the same index key is added after the user-specified key.\nEach vid is 5 bytes long, so the maximum length of a non_unique index key is 475 bytes.\nHowever, unlike unique indexes, non_unique indexes can also be established if they exceed 475 bytes.\nHowever, when indexing such an attribute, only ",(0,i.jsx)(n.strong,{children:"the first 475 bytes"})," will be intercepted as the index key (the value stored in the attribute itself will not be affected).\nMoreover, when traversing through an iterator, the first 475 bytes of the query value are automatically intercepted before traversing.\nTherefore, the results may be inconsistent with expectations and require users to filter again."]}),"\n",(0,i.jsx)(n.h4,{id:"1312-edge-index",children:"1.3.1.2 Edge index"}),"\n",(0,i.jsx)(n.h5,{id:"13121-unique-index",children:"1.3.1.2.1 unique index"}),"\n",(0,i.jsxs)(n.p,{children:["Similar to node, the unique index of an edge refers to a globally unique index. That is, if an attribute is set to a unique index, in the same graph, the attribute of the edge with the same label will not have the same value.\nThe maximum length of a unique index key is 480 bytes. ",(0,i.jsx)(n.strong,{children:"Unique indexes cannot be created for attributes exceeding 480 bytes"}),"."]}),"\n",(0,i.jsx)(n.h5,{id:"13122-pair_unique-index",children:"1.3.1.2.2 pair_unique index"}),"\n",(0,i.jsxs)(n.p,{children:["pair_unique index refers to the unique index between two nodes, that is, if an attribute sets a unique index, between the same set of the starting node and the ending node in the same graph,\nEdges with the same label will not have the same value for this attribute. In order to ensure that the pair_unique index key does not repeat between the starting node and the end node of the same group,\nThe index adds the starting and ending vids after the user-specified key. Each vid is 5 bytes in length.\nTherefore, the maximum key length is 470 bytes, and ",(0,i.jsx)(n.strong,{children:"a pair_unique index cannot be created for attributes exceeding 470 bytes"}),"."]}),"\n",(0,i.jsx)(n.h5,{id:"13123-non_unique-index",children:"1.3.1.2.3 non_unique index"}),"\n",(0,i.jsxs)(n.p,{children:["Similar to node, the non_unique index of an edge refers to a non-global unique index, that is, if an attribute sets a non_unique index,\nIn the same graph, edges with the same label can have the same value for this attribute.\nSince a key in a non_unique index may be mapped to multiple values, in order to speed up search and writing,\nThe maximum value of a group of eids with the same index key is added after the user-specified key.\nEach eid is 24 bytes in length, so the maximum length of a non_unique index key is 456 bytes.\nHowever, unlike unique indexes, non_unique indexes can also be established if they exceed 456 bytes.\nHowever, when indexing such an attribute, only ",(0,i.jsx)(n.strong,{children:"the first 456 bytes"})," will be intercepted as the index key (the value stored in the attribute itself will not be affected).\nMoreover, when traversing through an iterator, the first 475 bytes of the query value are automatically intercepted before traversing.\nTherefore, the results may be inconsistent with expectations and require users to filter again."]}),"\n",(0,i.jsx)(n.h4,{id:"132-composite-index",children:"1.3.2 Composite index"}),"\n",(0,i.jsx)(n.p,{children:"Currently, composite indexes are only supported for multiple properties of a vertex, and not supported for properties of an edge. There are two types of composite indexes: unique indexes and non-unique indexes. The requirements for creating a composite index are as follows:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"The number of properties for creating a composite index should be between 2 and 16 (inclusive)."}),"\n",(0,i.jsx)(n.li,{children:"For a unique composite index, the sum of the lengths of the properties cannot exceed 480 - 2 * (number of properties - 1) bytes, while for a non-unique composite index, it cannot exceed 475 - 2 * (number of properties - 1) bytes."}),"\n"]}),"\n",(0,i.jsx)(n.h5,{id:"1321-unique-index",children:"1.3.2.1 Unique index"}),"\n",(0,i.jsx)(n.p,{children:"Similar to a vertex's single unique index, a vertex's composite unique index refers to a globally unique index, meaning that for a set of properties with a unique index, there will not be another vertex with the same label in the same graph that has the same value for that group of properties.\nDue to the underlying storage design, the composite index key needs to retain the length of the properties; therefore, the maximum length for a composite unique index key is 480 - 2 * (number of properties - 1) bytes. Properties exceeding this length cannot be indexed uniquely."}),"\n",(0,i.jsx)(n.h5,{id:"1322-non_unique-index",children:"1.3.2.2 non_unique index"}),"\n",(0,i.jsx)(n.p,{children:"Similar to a vertex's single non-unique index, a vertex's non-unique index refers to a non-globally unique index, meaning that for a set of properties with a non-unique index, different vertices with the same label in the same graph may have the same value for that group of properties.\nSince a non-unique index key may map to multiple values to accelerate lookups and writing, the maximum value from a group of vertex IDs (vid) has been appended to the user-specified key where the index keys are identical. Each vid is 5 bytes in length; thus, the maximum length for a non-unique index key is 475 - 2 * (number of properties - 1) bytes. Properties exceeding this length cannot be indexed non-uniquely."}),"\n",(0,i.jsx)(n.h2,{id:"2-graph-project-vertex-edge-and-attribute-naming-conventions-and-suggestions",children:"2. Graph Project, Vertex, Edge, and Attribute Naming Conventions and suggestions"}),"\n",(0,i.jsx)(n.h3,{id:"21-naming-rules",children:"2.1 Naming Rules"}),"\n",(0,i.jsx)(n.p,{children:"Graph projects, vertices, edges, and attributes are identifiers. This section describes the allowed syntax for identifiers in TuGraph.\nThe table below describes the maximum length and allowed characters for each type of identifier."}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Identifier"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Length"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Allowed Characters"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"User, role, graph project"}),(0,i.jsx)(n.td,{children:"1-64 characters"}),(0,i.jsx)(n.td,{children:"Chinese, letters, numbers, underscore, and the first character cannot be a number"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Vertex type, edge type, attribute"}),(0,i.jsx)(n.td,{children:"1-256 characters"}),(0,i.jsx)(n.td,{children:"Chinese, letters, numbers, underscore, and the first character cannot be a number"})]})]})]}),"\n",(0,i.jsx)(n.h3,{id:"22-usage-restrictions",children:"2.2 Usage Restrictions"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Maximum number"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Number of users, number of roles"}),(0,i.jsx)(n.td,{children:"65536"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Number of graphs"}),(0,i.jsx)(n.td,{children:"4096"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Number of vertex and edge types per graph"}),(0,i.jsx)(n.td,{children:"4096"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Number of attributes per type"}),(0,i.jsx)(n.td,{children:"1024"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"Note:\n1.Special characters and keywords: When using special characters or keywords, they need to be enclosed in backquotes (``) for reference;"}),"\n",(0,i.jsxs)(n.p,{children:["Example: ",(0,i.jsx)(n.code,{children:"match (`match`:match) return `match`.id limit 1"})]}),"\n",(0,i.jsx)(n.p,{children:"2.Case sensitivity: TuGraph is case-sensitive;"}),"\n",(0,i.jsx)(n.p,{children:"3.Graph project, vertex/edge, and attribute names can be reused, but attribute names under the same vertex or edge cannot be duplicated;"}),"\n",(0,i.jsx)(n.p,{children:"4.Reserved keywords for attribute names: SRC_ID / DST_ID / SKIP."}),"\n",(0,i.jsx)(n.h3,{id:"23-naming-suggestions",children:"2.3 Naming Suggestions"}),"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Identifier"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Description"})}),(0,i.jsx)(n.th,{children:(0,i.jsx)(n.strong,{children:"Suggestions"})})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Graph project"}),(0,i.jsx)(n.td,{children:"Start with a letter or Chinese character"}),(0,i.jsx)(n.td,{children:"Examples: graph123, project123, etc."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Vertex/edge type"}),(0,i.jsx)(n.td,{children:"Start with a letter or Chinese character and use underscores to separate words"}),(0,i.jsx)(n.td,{children:"Examples: person, act_in, etc."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"Attribute"}),(0,i.jsx)(n.td,{children:"Letters or Chinese characters"}),(0,i.jsx)(n.td,{children:"Examples: name, age, etc."})]})]})]})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>d,x:()=>a});var i=t(6540);const r={},s=i.createContext(r);function d(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.d825a6d7.js b/assets/js/main.4c61da86.js similarity index 93% rename from assets/js/main.d825a6d7.js rename to assets/js/main.4c61da86.js index 6889e84f96..60cb010305 100644 --- a/assets/js/main.d825a6d7.js +++ b/assets/js/main.4c61da86.js @@ -1,2 +1,2 @@ -/*! For license information please see main.d825a6d7.js.LICENSE.txt */ -(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[8792],{8328:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});n(6540);var r=n(3259),a=n.n(r),o=n(4054);const i={"014f8bbd":[()=>n.e(388).then(n.bind(n,7617)),"@site/../docs/zh-CN/source/5.installation&running/5.cloud-deployment.md",7617],"01542782":[()=>n.e(2390).then(n.bind(n,167)),"@site/../docs/zh-CN/source/9.olap&procedure/2.olap/1.tutorial.md",167],"01e03274":[()=>n.e(4251).then(n.bind(n,3145)),"@site/../docs/zh-CN/source/2.introduction/3.what-is-tugraph.md",3145],"0600a389":[()=>n.e(9836).then(n.bind(n,236)),"@site/../docs/zh-CN/source/development_guide.md",236],"0668f123":[()=>n.e(6381).then(n.bind(n,7843)),"@site/../docs/en-US/source/4.user-guide/2.tugraph-browser-legacy.md",7843],"09407736":[()=>n.e(3059).then(n.bind(n,9644)),"@site/../docs/zh-CN/source/2.introduction/6.architecture.md",9644],"0969a4ab":[()=>n.e(7243).then(n.bind(n,8948)),"@site/../docs/en-US/source/3.quick-start/2.demo/3.the-three-body.md",8948],"0c0c4b81":[()=>n.e(7384).then(n.bind(n,3244)),"@site/../docs/zh-CN/source/7.client-tools/1.python-client.md",3244],"0f9aa85a":[()=>n.e(9898).then(n.bind(n,6240)),"@site/../docs/zh-CN/source/3.quick-start/2.demo/3.the-three-body.md",6240],"10b14cef":[()=>n.e(8661).then(n.bind(n,1177)),"@site/../docs/zh-CN/source/12.contributor-manual/5.roadmap.md",1177],"12614a71":[()=>n.e(3796).then(n.bind(n,8674)),"@site/../docs/en-US/source/9.olap&procedure/3.learn/1.tutorial.md",8674],"139425bc":[()=>n.e(4890).then(n.t.bind(n,5067,19)),"@generated/docusaurus-plugin-content-docs/en/__plugin.json",5067],"153b9838":[()=>n.e(8404).then(n.bind(n,9136)),"@site/../docs/en-US/source/3.quick-start/1.preparation.md",9136],"15c6efac":[()=>n.e(3179).then(n.bind(n,9752)),"@site/../docs/zh-CN/source/3.quick-start/2.demo/2.wandering-earth.md",9752],17896441:[()=>Promise.all([n.e(1869),n.e(9408),n.e(8401)]).then(n.bind(n,6795)),"@theme/DocItem",6795],"180c4957":[()=>n.e(6646).then(n.bind(n,4813)),"@site/../docs/zh-CN/source/13.best-practices/2.learn_practices.md",4813],"1d5839d9":[()=>n.e(1918).then(n.bind(n,9210)),"@site/../docs/zh-CN/source/10.permission/2.token.md",9210],"1df93b7f":[()=>Promise.all([n.e(1869),n.e(4583)]).then(n.bind(n,5579)),"@site/src/pages/index.tsx",5579],"1f391b9e":[()=>Promise.all([n.e(1869),n.e(9408),n.e(6061)]).then(n.bind(n,7973)),"@theme/MDXPage",7973],22131911:[()=>n.e(6635).then(n.bind(n,3807)),"@site/../docs/en-US/source/8.query/1.cypher.md",3807],"2602de02":[()=>n.e(5514).then(n.bind(n,3171)),"@site/../docs/en-US/source/6.utility-tools/3.backup-and-restore.md",3171],"2b0238b8":[()=>n.e(98).then(n.bind(n,9797)),"@site/../docs/zh-CN/source/9.olap&procedure/1.procedure/5.Rust-procedure.md",9797],"2b4dbedb":[()=>n.e(7870).then(n.bind(n,6784)),"@site/../docs/zh-CN/source/7.client-tools/4.tugraph-ogm.md",6784],"2d0a7bbf":[()=>n.e(8723).then(n.bind(n,8875)),"@site/../docs/zh-CN/source/5.installation&running/8.high-availability-mode.md",8875],"2f6ae0b2":[()=>n.e(5051).then(n.bind(n,4247)),"@site/../docs/zh-CN/source/10.permission/4.monitoring.md",4247],"2ffb589b":[()=>n.e(2001).then(n.bind(n,8603)),"@site/../docs/en-US/source/10.permission/4.monitoring.md",8603],"30edc32b":[()=>n.e(9063).then(n.bind(n,2611)),"@site/../docs/zh-CN/source/6.utility-tools/9.restful.md",2611],"31de403c":[()=>n.e(9088).then(n.bind(n,9194)),"@site/../docs/zh-CN/source/9.olap&procedure/2.olap/5.python-api.md",9194],"31de5598":[()=>n.e(2055).then(n.bind(n,4852)),"@site/../docs/zh-CN/source/5.installation&running/6.compile.md",4852],"3284e532":[()=>n.e(9577).then(n.bind(n,8037)),"@site/../docs/en-US/source/2.introduction/1.what-is-graph.md",8037],"34a06ef9":[()=>n.e(3873).then(n.bind(n,5517)),"@site/../docs/en-US/source/12.contributor-manual/1.contributing.md",5517],"35b5e54f":[()=>n.e(9064).then(n.bind(n,591)),"@site/../docs/zh-CN/source/2.introduction/5.characteristics/3.htap.md",591],"367d0d1d":[()=>n.e(9242).then(n.bind(n,8346)),"@site/../docs/en-US/source/9.olap&procedure/1.procedure/1.procedure.md",8346],"36a5b4e6":[()=>n.e(5017).then(n.bind(n,5478)),"@site/../docs/en-US/source/10.permission/2.token.md",5478],"36b9e001":[()=>n.e(3213).then(n.bind(n,8528)),"@site/../docs/en-US/source/7.client-tools/1.python-client.md",8528],37536724:[()=>n.e(8206).then(n.bind(n,1653)),"@site/../docs/en-US/source/2.introduction/3.what-is-tugraph.md",1653],"37590f4c":[()=>n.e(8478).then(n.bind(n,1549)),"@site/../docs/en-US/source/2.introduction/5.characteristics/1.performance-oriented.md",1549],"37a30462":[()=>n.e(689).then(n.bind(n,7302)),"@site/../docs/zh-CN/source/2.introduction/1.what-is-graph.md",7302],"388c432b":[()=>n.e(2402).then(n.bind(n,8922)),"@site/../docs/en-US/source/6.utility-tools/2.data-export.md",8922],"3904aa5b":[()=>n.e(9924).then(n.bind(n,9443)),"@site/../docs/zh-CN/source/8.query/1.cypher.md",9443],"393be207":[()=>n.e(4134).then(n.bind(n,633)),"@site/src/pages/markdown-page.md",633],"39e34d9b":[()=>n.e(7742).then(n.bind(n,7759)),"@site/../docs/en-US/source/8.query/2.gql.md",7759],"3a0e1708":[()=>n.e(5614).then(n.bind(n,1499)),"@site/../docs/zh-CN/source/2.introduction/7.functionality.md",1499],"3cecd61e":[()=>n.e(7525).then(n.t.bind(n,4487,19)),"@generated/docusaurus-plugin-content-docs/default/p/tugraph-db-zh-587.json",4487],"3f6905d4":[()=>n.e(5882).then(n.bind(n,6362)),"@site/../docs/zh-CN/source/4.user-guide/1.tugraph-browser.md",6362],"3fac061c":[()=>n.e(8054).then(n.bind(n,9479)),"@site/../docs/en-US/source/2.introduction/7.functionality.md",9479],"417a7f4f":[()=>n.e(9855).then(n.bind(n,1551)),"@site/../docs/zh-CN/source/1.guide.md",1551],"418c52d8":[()=>n.e(5932).then(n.bind(n,7928)),"@site/../docs/en-US/source/9.olap&procedure/2.olap/6.algorithms.md",7928],"4198fd89":[()=>n.e(4470).then(n.bind(n,9960)),"@site/../docs/zh-CN/source/2.introduction/2.what-is-gdbms.md",9960],"43d06d47":[()=>n.e(2953).then(n.bind(n,5340)),"@site/../docs/en-US/source/2.introduction/9.glossary.md",5340],"4930370d":[()=>n.e(6481).then(n.bind(n,279)),"@site/../docs/en-US/source/14.faq.md",279],"4e149bf8":[()=>n.e(3906).then(n.bind(n,2158)),"@site/../docs/en-US/source/2.introduction/8.scenarios.md",2158],"4ffd6b78":[()=>n.e(5218).then(n.bind(n,9546)),"@site/../docs/zh-CN/source/7.client-tools/6.bolt-console-client.md",9546],"50b94c42":[()=>n.e(7462).then(n.bind(n,2624)),"@site/../docs/en-US/source/7.client-tools/3.java-client.md",2624],"5189e784":[()=>n.e(3916).then(n.bind(n,8406)),"@site/../docs/en-US/source/7.client-tools/6.bolt-console-client.md",8406],"54287b68":[()=>n.e(8735).then(n.bind(n,5774)),"@site/../docs/zh-CN/source/5.installation&running/2.environment-mode.md",5774],"54acc636":[()=>n.e(6944).then(n.bind(n,7220)),"@site/../docs/en-US/source/7.client-tools/2.cpp-client.md",7220],"553e0098":[()=>n.e(9806).then(n.bind(n,3076)),"@site/../docs/en-US/source/3.quick-start/2.demo/2.wandering-earth.md",3076],"55a612bf":[()=>n.e(8657).then(n.bind(n,9774)),"@site/../docs/zh-CN/source/6.utility-tools/2.data-export.md",9774],"5680df66":[()=>n.e(4432).then(n.bind(n,419)),"@site/../docs/en-US/source/9.olap&procedure/2.olap/4.olap-on-disk-api.md",419],"58b10881":[()=>n.e(1998).then(n.bind(n,3887)),"@site/../docs/zh-CN/source/10.permission/3.reset_admin_password.md",3887],"596e431a":[()=>n.e(3891).then(n.bind(n,6750)),"@site/../docs/zh-CN/source/2.introduction/4.schema.md",6750],"5e48fa7f":[()=>n.e(4417).then(n.bind(n,5497)),"@site/../docs/zh-CN/source/5.installation&running/4.local-package-deployment.md",5497],"5e68b5a7":[()=>n.e(4032).then(n.bind(n,6679)),"@site/../docs/zh-CN/source/13.best-practices/5.spatial.md",6679],"5e95c892":[()=>n.e(9647).then(n.bind(n,7121)),"@theme/DocsRoot",7121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"605c3d65":[()=>n.e(7419).then(n.bind(n,6029)),"@site/../docs/zh-CN/source/11.quality/2.integration-testing.md",6029],"633b68a4":[()=>n.e(1980).then(n.bind(n,2812)),"@site/../docs/zh-CN/source/7.client-tools/7.restful-api.md",2812],"65876c74":[()=>n.e(7067).then(n.bind(n,8084)),"@site/../docs/zh-CN/source/9.olap&procedure/2.olap/6.algorithms.md",8084],"65f6f344":[()=>n.e(1929).then(n.bind(n,3253)),"@site/../docs/en-US/source/10.permission/1.privilege.md",3253],"6690cca3":[()=>n.e(730).then(n.bind(n,479)),"@site/../docs/en-US/source/5.installation&running/8.high-availability-mode.md",479],"66d55dfc":[()=>n.e(3956).then(n.bind(n,7435)),"@site/../docs/en-US/source/15.contacts.md",7435],"678c6099":[()=>n.e(3273).then(n.bind(n,4434)),"@site/../docs/zh-CN/source/2.introduction/8.scenarios.md",4434],"6cc43114":[()=>n.e(8992).then(n.bind(n,1690)),"@site/../docs/en-US/source/5.installation&running/2.environment-mode.md",1690],"6d16fd3b":[()=>n.e(2301).then(n.bind(n,553)),"@site/../docs/zh-CN/source/5.installation&running/1.environment.md",553],"6e5b21f1":[()=>n.e(4905).then(n.bind(n,9363)),"@site/../docs/en-US/source/2.introduction/5.characteristics/3.htap.md",9363],"6fe137e4":[()=>n.e(5420).then(n.bind(n,525)),"@site/../docs/en-US/source/13.best-practices/1.rdbms-to-tugraph.md",525],"7387447f":[()=>n.e(5645).then(n.bind(n,6691)),"@site/../docs/en-US/source/7.client-tools/8.rpc-api.md",6691],"74344ff3":[()=>n.e(1076).then(n.bind(n,3917)),"@site/../docs/en-US/source/6.utility-tools/6.tugraph-cli.md",3917],75625650:[()=>n.e(1701).then(n.bind(n,2548)),"@site/../docs/zh-CN/source/10.permission/5.log.md",2548],"7570a526":[()=>n.e(8552).then(n.bind(n,9225)),"@site/../docs/zh-CN/source/2.introduction/5.characteristics/1.performance-oriented.md",9225],"76bbab98":[()=>n.e(6282).then(n.bind(n,1158)),"@site/../docs/zh-CN/source/12.contributor-manual/4.corporate-cla.md",1158],"76f6288d":[()=>n.e(8718).then(n.bind(n,6594)),"@site/../docs/zh-CN/source/6.utility-tools/5.ha-cluster-management.md",6594],77278843:[()=>n.e(4371).then(n.bind(n,6099)),"@site/../docs/en-US/source/13.best-practices/5.spatial.md",6099],"7a14f772":[()=>n.e(2674).then(n.bind(n,7959)),"@site/../docs/zh-CN/source/9.olap&procedure/2.olap/4.olap-on-disk-api.md",7959],"7b1606a6":[()=>n.e(7506).then(n.bind(n,8677)),"@site/../docs/zh-CN/source/12.contributor-manual/2.community-roles.md",8677],"7c05b63b":[()=>n.e(3291).then(n.bind(n,5828)),"@site/../docs/en-US/source/2.introduction/2.what-is-gdbms.md",5828],"7c2e3ba5":[()=>n.e(2767).then(n.bind(n,4484)),"@site/../docs/zh-CN/source/3.quick-start/1.preparation.md",4484],"7c75d82b":[()=>n.e(8153).then(n.bind(n,7042)),"@site/../docs/en-US/source/12.contributor-manual/4.corporate-cla.md",7042],"7ca1a5df":[()=>n.e(9583).then(n.bind(n,4268)),"@site/../docs/en-US/source/9.olap&procedure/1.procedure/2.traversal.md",4268],"7d21d01b":[()=>n.e(9660).then(n.bind(n,6070)),"@site/../docs/en-US/source/9.olap&procedure/2.olap/5.python-api.md",6070],"7e1f0287":[()=>n.e(3499).then(n.bind(n,3799)),"@site/../docs/zh-CN/source/7.client-tools/8.rpc-api.md",3799],"7e9b634d":[()=>n.e(1355).then(n.bind(n,1502)),"@site/../docs/zh-CN/source/2.introduction/5.characteristics/2.multi-level-Interfaces.md",1502],"7f99a0c3":[()=>n.e(9503).then(n.bind(n,9904)),"@site/../docs/en-US/source/10.permission/5.log.md",9904],"8110278a":[()=>n.e(7213).then(n.bind(n,1645)),"@site/../docs/en-US/source/5.installation&running/5.cloud-deployment.md",1645],"811fe2fb":[()=>n.e(7738).then(n.bind(n,3720)),"@site/../docs/en-US/source/9.olap&procedure/3.learn/3.training.md",3720],"84903e8d":[()=>n.e(1680).then(n.bind(n,1991)),"@site/../docs/zh-CN/source/15.contacts.md",1991],"84ed95ea":[()=>n.e(4012).then(n.bind(n,4344)),"@site/../docs/zh-CN/source/3.quick-start/2.demo/5.round-the-world.md",4344],"84f7962c":[()=>n.e(3282).then(n.bind(n,7160)),"@site/../docs/en-US/source/7.client-tools/9.restful-api-legacy.md",7160],"8534c110":[()=>n.e(4892).then(n.bind(n,9339)),"@site/../docs/en-US/source/3.quick-start/2.demo/1.movie.md",9339],"8652d030":[()=>n.e(5965).then(n.bind(n,756)),"@site/../docs/en-US/source/6.utility-tools/7.tugraph-datax.md",756],"86859d92":[()=>n.e(3882).then(n.bind(n,539)),"@site/../docs/en-US/source/1.guide.md",539],"8c80cb2e":[()=>n.e(7184).then(n.bind(n,4860)),"@site/../docs/zh-CN/source/11.quality/1.unit-testing.md",4860],"8e6640c6":[()=>n.e(2817).then(n.bind(n,401)),"@site/../docs/en-US/source/9.olap&procedure/1.procedure/5.Rust-procedure.md",401],"8f17638f":[()=>n.e(178).then(n.bind(n,7682)),"@site/../docs/zh-CN/source/8.query/3.vector_index.md",7682],"8fce0df1":[()=>n.e(3590).then(n.bind(n,9658)),"@site/../docs/en-US/source/2.introduction/5.characteristics/2.multi-level-Interfaces.md",9658],90892322:[()=>n.e(9704).then(n.bind(n,1799)),"@site/../docs/zh-CN/source/7.client-tools/5.bolt-client.md",1799],"916cc991":[()=>n.e(8466).then(n.bind(n,7256)),"@site/../docs/en-US/source/7.client-tools/7.restful-api.md",7256],"91f32ff5":[()=>n.e(1591).then(n.bind(n,4364)),"@site/../docs/zh-CN/source/7.client-tools/3.java-client.md",4364],"94a49e13":[()=>n.e(7981).then(n.bind(n,5132)),"@site/../docs/zh-CN/source/7.client-tools/9.restful-api-legacy.md",5132],"94af2056":[()=>n.e(9590).then(n.bind(n,2528)),"@site/../docs/zh-CN/source/7.client-tools/2.cpp-client.md",2528],"96b3123e":[()=>n.e(6310).then(n.bind(n,7990)),"@site/../docs/zh-CN/source/9.olap&procedure/3.learn/1.tutorial.md",7990],"98bf9f97":[()=>n.e(5449).then(n.bind(n,7015)),"@site/../docs/zh-CN/source/6.utility-tools/3.backup-and-restore.md",7015],"995a136c":[()=>n.e(7378).then(n.bind(n,4810)),"@site/../docs/zh-CN/source/13.best-practices/4.selection.md",4810],"998bc29d":[()=>n.e(6751).then(n.bind(n,9942)),"@site/../docs/zh-CN/source/9.olap&procedure/1.procedure/1.procedure.md",9942],"99926a12":[()=>n.e(2594).then(n.bind(n,5440)),"@site/../docs/en-US/source/5.installation&running/6.compile.md",5440],"9c8d271c":[()=>n.e(1578).then(n.bind(n,4029)),"@site/../docs/en-US/source/12.contributor-manual/5.roadmap.md",4029],"9ccbec99":[()=>n.e(7326).then(n.bind(n,4529)),"@site/../docs/zh-CN/source/9.olap&procedure/3.learn/4.heterogeneous_graph.md",4529],"9d582788":[()=>n.e(6194).then(n.bind(n,5925)),"@site/../docs/en-US/source/9.olap&procedure/2.olap/2.olap-base-api.md",5925],"9e9ae504":[()=>n.e(7145).then(n.bind(n,8617)),"@site/../docs/zh-CN/source/13.best-practices/1.rdbms-to-tugraph.md",8617],"9f7ad7a9":[()=>n.e(6919).then(n.bind(n,1668)),"@site/../docs/en-US/source/3.quick-start/2.demo/5.round-the-world.md",1668],a13f0fc1:[()=>n.e(5892).then(n.bind(n,5569)),"@site/../docs/zh-CN/source/9.olap&procedure/2.olap/2.olap-base-api.md",5569],a30dc11a:[()=>n.e(8973).then(n.bind(n,74)),"@site/../docs/en-US/source/5.installation&running/3.docker-deployment.md",74],a4e5dd48:[()=>n.e(7454).then(n.bind(n,7299)),"@site/../docs/zh-CN/source/9.olap&procedure/2.olap/3.olap-on-db-api.md",7299],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,1723)),"@theme/DocVersionRoot",1723],a90ed467:[()=>n.e(2429).then(n.bind(n,2285)),"@site/../docs/zh-CN/source/9.olap&procedure/3.learn/2.sampling_api.md",2285],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,1377)),"@theme/DocRoot",1377],a98e52e2:[()=>n.e(4564).then(n.bind(n,678)),"@site/../docs/en-US/source/4.user-guide/1.tugraph-browser.md",678],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],adae623f:[()=>n.e(5453).then(n.bind(n,8027)),"@site/../docs/zh-CN/source/3.quick-start/2.demo/4.three-kingdoms.md",8027],afdf7fc3:[()=>n.e(1661).then(n.bind(n,4470)),"@site/../docs/zh-CN/source/5.installation&running/3.docker-deployment.md",4470],b24437eb:[()=>n.e(4028).then(n.bind(n,8356)),"@site/../docs/zh-CN/source/9.olap&procedure/3.learn/3.training.md",8356],b2b5b3d5:[()=>n.e(3172).then(n.bind(n,8129)),"@site/../docs/zh-CN/source/5.installation&running/7.tugraph-running.md",8129],b45c3470:[()=>n.e(4329).then(n.bind(n,6746)),"@site/../docs/en-US/source/13.best-practices/3.data_migration.md",6746],b7950652:[()=>n.e(9639).then(n.bind(n,6687)),"@site/../docs/en-US/source/12.contributor-manual/3.individual-cla.md",6687],b7cec5eb:[()=>n.e(5411).then(n.bind(n,9387)),"@site/../docs/en-US/source/10.permission/3.reset_admin_password.md",9387],b7dd3f88:[()=>n.e(3945).then(n.bind(n,9792)),"@site/../docs/en-US/source/9.olap&procedure/2.olap/1.tutorial.md",9792],ba4a3b78:[()=>n.e(3547).then(n.bind(n,7287)),"@site/../docs/zh-CN/source/3.quick-start/2.demo/1.movie.md",7287],ba766c72:[()=>n.e(4481).then(n.bind(n,1089)),"@site/../docs/en-US/source/11.quality/2.integration-testing.md",1089],bf83b945:[()=>n.e(1598).then(n.bind(n,2121)),"@site/../docs/zh-CN/source/12.contributor-manual/1.contributing.md",2121],c2bc9683:[()=>n.e(4919).then(n.bind(n,1476)),"@site/../docs/zh-CN/source/6.utility-tools/1.data-import.md",1476],c770adac:[()=>n.e(415).then(n.bind(n,1283)),"@site/../docs/zh-CN/source/12.contributor-manual/3.individual-cla.md",1283],c803846e:[()=>n.e(7414).then(n.bind(n,5542)),"@site/../docs/en-US/source/6.utility-tools/5.ha-cluster-management.md",5542],cae1b3cc:[()=>n.e(846).then(n.bind(n,1875)),"@site/../docs/zh-CN/source/8.query/2.gql.md",1875],cb6fe37f:[()=>n.e(499).then(n.bind(n,9248)),"@site/../docs/zh-CN/source/6.utility-tools/7.tugraph-datax.md",9248],cb8c805e:[()=>n.e(2625).then(n.bind(n,4366)),"@site/../docs/zh-CN/source/13.best-practices/3.data_migration.md",4366],cc75e535:[()=>n.e(2375).then(n.bind(n,4328)),"@site/../docs/zh-CN/source/2.introduction/9.glossary.md",4328],ccf6bcc5:[()=>n.e(3268).then(n.bind(n,3734)),"@site/../docs/en-US/source/13.best-practices/4.selection.md",3734],cd445c99:[()=>n.e(5432).then(n.bind(n,8489)),"@site/../docs/en-US/source/9.olap&procedure/3.learn/2.sampling_api.md",8489],cf75e3c6:[()=>n.e(5567).then(n.bind(n,3738)),"@site/../docs/en-US/source/6.utility-tools/8.tugraph-explorer.md",3738],d05da8ca:[()=>n.e(8815).then(n.bind(n,7193)),"@site/../docs/en-US/source/12.contributor-manual/2.community-roles.md",7193],d1d3a510:[()=>n.e(6916).then(n.bind(n,5861)),"@site/../docs/en-US/source/9.olap&procedure/3.learn/4.heterogeneous_graph.md",5861],df0c2521:[()=>n.e(6478).then(n.bind(n,4351)),"@site/../docs/zh-CN/source/4.user-guide/2.tugraph-browser-legacy.md",4351],e046dbb1:[()=>n.e(4219).then(n.bind(n,6558)),"@site/../docs/zh-CN/source/6.utility-tools/4.data-warmup.md",6558],e166abdf:[()=>n.e(214).then(n.bind(n,2536)),"@site/../docs/en-US/source/2.introduction/6.architecture.md",2536],e1aa53d6:[()=>n.e(3657).then(n.bind(n,7061)),"@site/../docs/en-US/source/5.installation&running/7.tugraph-running.md",7061],e48326fb:[()=>n.e(2351).then(n.bind(n,8936)),"@site/../docs/en-US/source/11.quality/1.unit-testing.md",8936],e523e931:[()=>n.e(1246).then(n.bind(n,2615)),"@site/../docs/en-US/source/9.olap&procedure/2.olap/3.olap-on-db-api.md",2615],eb77f7c0:[()=>n.e(8424).then(n.bind(n,2486)),"@site/../docs/zh-CN/source/6.utility-tools/8.tugraph-explorer.md",2486],ecfd9356:[()=>n.e(1128).then(n.bind(n,4229)),"@site/../docs/en-US/source/5.installation&running/1.environment.md",4229],ee6f8960:[()=>n.e(2190).then(n.bind(n,4243)),"@site/../docs/zh-CN/source/14.faq.md",4243],f01c9311:[()=>n.e(6999).then(n.bind(n,8051)),"@site/../docs/en-US/source/7.client-tools/5.bolt-client.md",8051],f0d3c377:[()=>n.e(5322).then(n.bind(n,6914)),"@site/../docs/en-US/source/6.utility-tools/4.data-warmup.md",6914],f2745ead:[()=>n.e(7455).then(n.bind(n,6417)),"@site/../docs/zh-CN/source/10.permission/1.privilege.md",6417],f5a37f2d:[()=>n.e(8321).then(n.bind(n,932)),"@site/../docs/en-US/source/7.client-tools/4.tugraph-ogm.md",932],f79a51e4:[()=>n.e(7497).then(n.t.bind(n,876,19)),"@generated/docusaurus-plugin-content-docs/en/p/tugraph-db-en-92e.json",876],f7c36d28:[()=>n.e(4803).then(n.bind(n,3841)),"@site/../docs/en-US/source/13.best-practices/2.learn_practices.md",3841],f8266f2b:[()=>n.e(1349).then(n.bind(n,2400)),"@site/../docs/en-US/source/6.utility-tools/1.data-import.md",2400],f8bd24ea:[()=>n.e(1611).then(n.bind(n,8757)),"@site/../docs/en-US/source/5.installation&running/4.local-package-deployment.md",8757],facc0445:[()=>n.e(7615).then(n.bind(n,2663)),"@site/../docs/en-US/source/3.quick-start/2.demo/4.three-kingdoms.md",2663],fb4cf3b1:[()=>n.e(182).then(n.bind(n,1472)),"@site/../docs/zh-CN/source/9.olap&procedure/1.procedure/2.traversal.md",1472],fd52913e:[()=>n.e(6510).then(n.bind(n,1361)),"@site/../docs/zh-CN/source/6.utility-tools/6.tugraph-cli.md",1361],fd689854:[()=>n.e(2435).then(n.bind(n,2914)),"@site/../docs/en-US/source/2.introduction/4.schema.md",2914]};var l=n(4848);function s(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,l.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,l.jsx)("p",{children:String(t)}),(0,l.jsx)("div",{children:(0,l.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,l.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,l.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,l.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,l.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var u=n(6921),c=n(3102);function d(e,t){if("*"===e)return a()({loading:s,loader:()=>n.e(2237).then(n.bind(n,2237)),modules:["@theme/NotFound"],webpack:()=>[2237],render(e,t){const n=e.default;return(0,l.jsx)(c.W,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});const r=o[`${e}-${t}`],d={},p=[],f=[],h=(0,u.A)(r);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),a().Map({loading:s,loader:d,modules:p,webpack:()=>f,render(t,n){const a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let i=a;const l=n.split(".");l.slice(0,-1).forEach((e=>{i=i[e]})),i[l[l.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;delete a.__context;const s=a.__props;return delete a.__props,(0,l.jsx)(c.W,{value:i,children:(0,l.jsx)(o,{...a,...s,...n})})}})}const p=[{path:"/tugraph-db/markdown-page",component:d("/tugraph-db/markdown-page","04d"),exact:!0},{path:"/tugraph-db/en",component:d("/tugraph-db/en","deb"),routes:[{path:"/tugraph-db/en",component:d("/tugraph-db/en","cbd"),routes:[{path:"/tugraph-db/en",component:d("/tugraph-db/en","314"),routes:[{path:"/tugraph-db/en/best-practices/data_migration",component:d("/tugraph-db/en/best-practices/data_migration","732"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/best-practices/learn_practices",component:d("/tugraph-db/en/best-practices/learn_practices","d28"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/best-practices/rdbms-to-tugraph",component:d("/tugraph-db/en/best-practices/rdbms-to-tugraph","2fa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/best-practices/selection",component:d("/tugraph-db/en/best-practices/selection","707"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/best-practices/spatial",component:d("/tugraph-db/en/best-practices/spatial","96d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/client-tools/bolt-client",component:d("/tugraph-db/en/client-tools/bolt-client","80b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/client-tools/bolt-console-client",component:d("/tugraph-db/en/client-tools/bolt-console-client","9fc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/client-tools/cpp-client",component:d("/tugraph-db/en/client-tools/cpp-client","bce"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/client-tools/java-client",component:d("/tugraph-db/en/client-tools/java-client","6f4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/client-tools/python-client",component:d("/tugraph-db/en/client-tools/python-client","2cf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/client-tools/restful-api",component:d("/tugraph-db/en/client-tools/restful-api","0a4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/client-tools/restful-api-legacy",component:d("/tugraph-db/en/client-tools/restful-api-legacy","460"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/client-tools/rpc-api",component:d("/tugraph-db/en/client-tools/rpc-api","cd4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/client-tools/tugraph-ogm",component:d("/tugraph-db/en/client-tools/tugraph-ogm","6da"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/contacts",component:d("/tugraph-db/en/contacts","88f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/contributor-manual/community-roles",component:d("/tugraph-db/en/contributor-manual/community-roles","a21"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/contributor-manual/contributing",component:d("/tugraph-db/en/contributor-manual/contributing","a3d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/contributor-manual/corporate-cla",component:d("/tugraph-db/en/contributor-manual/corporate-cla","d91"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/contributor-manual/individual-cla",component:d("/tugraph-db/en/contributor-manual/individual-cla","d7d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/contributor-manual/roadmap",component:d("/tugraph-db/en/contributor-manual/roadmap","8a4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/faq",component:d("/tugraph-db/en/faq","4d7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/guide",component:d("/tugraph-db/en/guide","2a7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/installation&running/cloud-deployment",component:d("/tugraph-db/en/installation&running/cloud-deployment","403"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/installation&running/compile",component:d("/tugraph-db/en/installation&running/compile","a92"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/installation&running/docker-deployment",component:d("/tugraph-db/en/installation&running/docker-deployment","51c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/installation&running/environment",component:d("/tugraph-db/en/installation&running/environment","3a8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/installation&running/environment-mode",component:d("/tugraph-db/en/installation&running/environment-mode","0b2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/installation&running/high-availability-mode",component:d("/tugraph-db/en/installation&running/high-availability-mode","71b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/installation&running/local-package-deployment",component:d("/tugraph-db/en/installation&running/local-package-deployment","e5a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/installation&running/tugraph-running",component:d("/tugraph-db/en/installation&running/tugraph-running","16e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/introduction/architecture",component:d("/tugraph-db/en/introduction/architecture","c1d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/introduction/characteristics/htap",component:d("/tugraph-db/en/introduction/characteristics/htap","af6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/introduction/characteristics/multi-level-Interfaces",component:d("/tugraph-db/en/introduction/characteristics/multi-level-Interfaces","4fe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/introduction/characteristics/performance-oriented",component:d("/tugraph-db/en/introduction/characteristics/performance-oriented","5fb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/introduction/functionality",component:d("/tugraph-db/en/introduction/functionality","b9c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/introduction/glossary",component:d("/tugraph-db/en/introduction/glossary","088"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/introduction/scenarios",component:d("/tugraph-db/en/introduction/scenarios","da0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/introduction/schema",component:d("/tugraph-db/en/introduction/schema","9db"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/introduction/what-is-gdbms",component:d("/tugraph-db/en/introduction/what-is-gdbms","d89"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/introduction/what-is-graph",component:d("/tugraph-db/en/introduction/what-is-graph","a61"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/introduction/what-is-tugraph",component:d("/tugraph-db/en/introduction/what-is-tugraph","fe0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/olap&procedure/learn/heterogeneous_graph",component:d("/tugraph-db/en/olap&procedure/learn/heterogeneous_graph","a83"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/olap&procedure/learn/sampling_api",component:d("/tugraph-db/en/olap&procedure/learn/sampling_api","076"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/olap&procedure/learn/training",component:d("/tugraph-db/en/olap&procedure/learn/training","141"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/olap&procedure/learn/tutorial",component:d("/tugraph-db/en/olap&procedure/learn/tutorial","e70"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/olap&procedure/olap/algorithms",component:d("/tugraph-db/en/olap&procedure/olap/algorithms","f51"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/olap&procedure/olap/olap-base-api",component:d("/tugraph-db/en/olap&procedure/olap/olap-base-api","02a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/olap&procedure/olap/olap-on-db-api",component:d("/tugraph-db/en/olap&procedure/olap/olap-on-db-api","522"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/olap&procedure/olap/olap-on-disk-api",component:d("/tugraph-db/en/olap&procedure/olap/olap-on-disk-api","08c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/olap&procedure/olap/python-api",component:d("/tugraph-db/en/olap&procedure/olap/python-api","808"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/olap&procedure/olap/tutorial",component:d("/tugraph-db/en/olap&procedure/olap/tutorial","09a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/olap&procedure/procedure/",component:d("/tugraph-db/en/olap&procedure/procedure/","e6e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/olap&procedure/procedure/Rust-procedure",component:d("/tugraph-db/en/olap&procedure/procedure/Rust-procedure","799"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/olap&procedure/procedure/traversal",component:d("/tugraph-db/en/olap&procedure/procedure/traversal","667"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/permission/log",component:d("/tugraph-db/en/permission/log","630"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/permission/monitoring",component:d("/tugraph-db/en/permission/monitoring","08f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/permission/privilege",component:d("/tugraph-db/en/permission/privilege","d15"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/permission/reset_admin_password",component:d("/tugraph-db/en/permission/reset_admin_password","fa3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/permission/token",component:d("/tugraph-db/en/permission/token","57b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/quality/integration-testing",component:d("/tugraph-db/en/quality/integration-testing","5d0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/quality/unit-testing",component:d("/tugraph-db/en/quality/unit-testing","27e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/query/cypher",component:d("/tugraph-db/en/query/cypher","9bd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/query/gql",component:d("/tugraph-db/en/query/gql","99b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/quick-start/demo/movie",component:d("/tugraph-db/en/quick-start/demo/movie","275"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/quick-start/demo/round-the-world",component:d("/tugraph-db/en/quick-start/demo/round-the-world","b32"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/quick-start/demo/the-three-body",component:d("/tugraph-db/en/quick-start/demo/the-three-body","38e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/quick-start/demo/three-kingdoms",component:d("/tugraph-db/en/quick-start/demo/three-kingdoms","9c1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/quick-start/demo/wandering-earth",component:d("/tugraph-db/en/quick-start/demo/wandering-earth","378"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/quick-start/preparation",component:d("/tugraph-db/en/quick-start/preparation","a0e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/user-guide/tugraph-browser",component:d("/tugraph-db/en/user-guide/tugraph-browser","49e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/user-guide/tugraph-browser-legacy",component:d("/tugraph-db/en/user-guide/tugraph-browser-legacy","3c4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/utility-tools/backup-and-restore",component:d("/tugraph-db/en/utility-tools/backup-and-restore","3a1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/utility-tools/data-export",component:d("/tugraph-db/en/utility-tools/data-export","2b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/utility-tools/data-import",component:d("/tugraph-db/en/utility-tools/data-import","f7e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/utility-tools/data-warmup",component:d("/tugraph-db/en/utility-tools/data-warmup","7db"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/utility-tools/ha-cluster-management",component:d("/tugraph-db/en/utility-tools/ha-cluster-management","907"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/utility-tools/tugraph-cli",component:d("/tugraph-db/en/utility-tools/tugraph-cli","41e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/utility-tools/tugraph-datax",component:d("/tugraph-db/en/utility-tools/tugraph-datax","c9a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/en/utility-tools/tugraph-explorer",component:d("/tugraph-db/en/utility-tools/tugraph-explorer","150"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/tugraph-db/zh",component:d("/tugraph-db/zh","4c9"),routes:[{path:"/tugraph-db/zh",component:d("/tugraph-db/zh","561"),routes:[{path:"/tugraph-db/zh",component:d("/tugraph-db/zh","791"),routes:[{path:"/tugraph-db/zh/best-practices/data_migration",component:d("/tugraph-db/zh/best-practices/data_migration","def"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/best-practices/learn_practices",component:d("/tugraph-db/zh/best-practices/learn_practices","b3a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/best-practices/rdbms-to-tugraph",component:d("/tugraph-db/zh/best-practices/rdbms-to-tugraph","c15"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/best-practices/selection",component:d("/tugraph-db/zh/best-practices/selection","dab"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/best-practices/spatial",component:d("/tugraph-db/zh/best-practices/spatial","e59"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/client-tools/bolt-client",component:d("/tugraph-db/zh/client-tools/bolt-client","dd5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/client-tools/bolt-console-client",component:d("/tugraph-db/zh/client-tools/bolt-console-client","55f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/client-tools/cpp-client",component:d("/tugraph-db/zh/client-tools/cpp-client","6ed"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/client-tools/java-client",component:d("/tugraph-db/zh/client-tools/java-client","a30"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/client-tools/python-client",component:d("/tugraph-db/zh/client-tools/python-client","9ec"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/client-tools/restful-api",component:d("/tugraph-db/zh/client-tools/restful-api","fc8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/client-tools/restful-api-legacy",component:d("/tugraph-db/zh/client-tools/restful-api-legacy","a01"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/client-tools/rpc-api",component:d("/tugraph-db/zh/client-tools/rpc-api","5f3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/client-tools/tugraph-ogm",component:d("/tugraph-db/zh/client-tools/tugraph-ogm","0e3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/contacts",component:d("/tugraph-db/zh/contacts","63d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/contributor-manual/community-roles",component:d("/tugraph-db/zh/contributor-manual/community-roles","6c6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/contributor-manual/contributing",component:d("/tugraph-db/zh/contributor-manual/contributing","594"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/contributor-manual/corporate-cla",component:d("/tugraph-db/zh/contributor-manual/corporate-cla","ade"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/contributor-manual/individual-cla",component:d("/tugraph-db/zh/contributor-manual/individual-cla","e81"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/contributor-manual/roadmap",component:d("/tugraph-db/zh/contributor-manual/roadmap","953"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/development_guide",component:d("/tugraph-db/zh/development_guide","d66"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/faq",component:d("/tugraph-db/zh/faq","255"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/guide",component:d("/tugraph-db/zh/guide","97c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/installation&running/cloud-deployment",component:d("/tugraph-db/zh/installation&running/cloud-deployment","fcc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/installation&running/compile",component:d("/tugraph-db/zh/installation&running/compile","0c6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/installation&running/docker-deployment",component:d("/tugraph-db/zh/installation&running/docker-deployment","0c8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/installation&running/environment",component:d("/tugraph-db/zh/installation&running/environment","f26"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/installation&running/environment-mode",component:d("/tugraph-db/zh/installation&running/environment-mode","ea3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/installation&running/high-availability-mode",component:d("/tugraph-db/zh/installation&running/high-availability-mode","c7a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/installation&running/local-package-deployment",component:d("/tugraph-db/zh/installation&running/local-package-deployment","67f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/installation&running/tugraph-running",component:d("/tugraph-db/zh/installation&running/tugraph-running","e8b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/introduction/architecture",component:d("/tugraph-db/zh/introduction/architecture","d5d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/introduction/characteristics/htap",component:d("/tugraph-db/zh/introduction/characteristics/htap","b74"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/introduction/characteristics/multi-level-Interfaces",component:d("/tugraph-db/zh/introduction/characteristics/multi-level-Interfaces","0e1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/introduction/characteristics/performance-oriented",component:d("/tugraph-db/zh/introduction/characteristics/performance-oriented","701"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/introduction/functionality",component:d("/tugraph-db/zh/introduction/functionality","19c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/introduction/glossary",component:d("/tugraph-db/zh/introduction/glossary","0a6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/introduction/scenarios",component:d("/tugraph-db/zh/introduction/scenarios","d94"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/introduction/schema",component:d("/tugraph-db/zh/introduction/schema","12d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/introduction/what-is-gdbms",component:d("/tugraph-db/zh/introduction/what-is-gdbms","11c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/introduction/what-is-graph",component:d("/tugraph-db/zh/introduction/what-is-graph","387"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/introduction/what-is-tugraph",component:d("/tugraph-db/zh/introduction/what-is-tugraph","e33"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/olap&procedure/learn/heterogeneous_graph",component:d("/tugraph-db/zh/olap&procedure/learn/heterogeneous_graph","996"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/olap&procedure/learn/sampling_api",component:d("/tugraph-db/zh/olap&procedure/learn/sampling_api","442"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/olap&procedure/learn/training",component:d("/tugraph-db/zh/olap&procedure/learn/training","a8f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/olap&procedure/learn/tutorial",component:d("/tugraph-db/zh/olap&procedure/learn/tutorial","ef7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/olap&procedure/olap/algorithms",component:d("/tugraph-db/zh/olap&procedure/olap/algorithms","c57"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/olap&procedure/olap/olap-base-api",component:d("/tugraph-db/zh/olap&procedure/olap/olap-base-api","07b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/olap&procedure/olap/olap-on-db-api",component:d("/tugraph-db/zh/olap&procedure/olap/olap-on-db-api","f28"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/olap&procedure/olap/olap-on-disk-api",component:d("/tugraph-db/zh/olap&procedure/olap/olap-on-disk-api","d23"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/olap&procedure/olap/python-api",component:d("/tugraph-db/zh/olap&procedure/olap/python-api","316"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/olap&procedure/olap/tutorial",component:d("/tugraph-db/zh/olap&procedure/olap/tutorial","b25"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/olap&procedure/procedure/",component:d("/tugraph-db/zh/olap&procedure/procedure/","f16"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/olap&procedure/procedure/Rust-procedure",component:d("/tugraph-db/zh/olap&procedure/procedure/Rust-procedure","5ae"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/olap&procedure/procedure/traversal",component:d("/tugraph-db/zh/olap&procedure/procedure/traversal","1b6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/permission/log",component:d("/tugraph-db/zh/permission/log","fc5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/permission/monitoring",component:d("/tugraph-db/zh/permission/monitoring","e51"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/permission/privilege",component:d("/tugraph-db/zh/permission/privilege","d68"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/permission/reset_admin_password",component:d("/tugraph-db/zh/permission/reset_admin_password","17f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/permission/token",component:d("/tugraph-db/zh/permission/token","09d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/quality/integration-testing",component:d("/tugraph-db/zh/quality/integration-testing","933"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/quality/unit-testing",component:d("/tugraph-db/zh/quality/unit-testing","954"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/query/cypher",component:d("/tugraph-db/zh/query/cypher","d08"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/query/gql",component:d("/tugraph-db/zh/query/gql","933"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/query/vector_index",component:d("/tugraph-db/zh/query/vector_index","6c8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/quick-start/demo/movie",component:d("/tugraph-db/zh/quick-start/demo/movie","88b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/quick-start/demo/round-the-world",component:d("/tugraph-db/zh/quick-start/demo/round-the-world","b9b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/quick-start/demo/the-three-body",component:d("/tugraph-db/zh/quick-start/demo/the-three-body","5fd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/quick-start/demo/three-kingdoms",component:d("/tugraph-db/zh/quick-start/demo/three-kingdoms","3e5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/quick-start/demo/wandering-earth",component:d("/tugraph-db/zh/quick-start/demo/wandering-earth","820"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/quick-start/preparation",component:d("/tugraph-db/zh/quick-start/preparation","9e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/user-guide/tugraph-browser",component:d("/tugraph-db/zh/user-guide/tugraph-browser","919"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/user-guide/tugraph-browser-legacy",component:d("/tugraph-db/zh/user-guide/tugraph-browser-legacy","308"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/utility-tools/backup-and-restore",component:d("/tugraph-db/zh/utility-tools/backup-and-restore","949"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/utility-tools/data-export",component:d("/tugraph-db/zh/utility-tools/data-export","ff5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/utility-tools/data-import",component:d("/tugraph-db/zh/utility-tools/data-import","0ac"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/utility-tools/data-warmup",component:d("/tugraph-db/zh/utility-tools/data-warmup","0c1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/utility-tools/ha-cluster-management",component:d("/tugraph-db/zh/utility-tools/ha-cluster-management","25c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/utility-tools/restful",component:d("/tugraph-db/zh/utility-tools/restful","153"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/utility-tools/tugraph-cli",component:d("/tugraph-db/zh/utility-tools/tugraph-cli","795"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/utility-tools/tugraph-datax",component:d("/tugraph-db/zh/utility-tools/tugraph-datax","692"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tugraph-db/zh/utility-tools/tugraph-explorer",component:d("/tugraph-db/zh/utility-tools/tugraph-explorer","0c2"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/tugraph-db/",component:d("/tugraph-db/","557"),exact:!0},{path:"*",component:d("*")}]},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>o,x:()=>i});var r=n(6540),a=n(4848);const o=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,a.jsx)(o.Provider,{value:n,children:t})}},7815:(e,t,n)=>{"use strict";var r=n(6540),a=n(5338),o=n(545),i=n(4625),l=n(4784),s=n(8193);const u=[n(119),n(6134),n(6294),n(1043)];var c=n(8328),d=n(6347),p=n(2831),f=n(4848);function h(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var g=n(5260),m=n(4586),b=n(6025),y=n(6342),v=n(1003),w=n(2131),k=n(4090);var S=n(440),x=n(1463);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,m.A)(),r=(0,w.o)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,f.jsxs)(g.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function E(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,m.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,m.A)(),{pathname:r}=(0,d.zy)();return e+(0,S.Ks)((0,b.Ay)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,f.jsxs)(g.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:a}),(0,f.jsx)("link",{rel:"canonical",href:a})]})}function C(){const{i18n:{currentLocale:e}}=(0,m.A)(),{metadata:t,image:n}=(0,y.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(g.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:k.w})]}),n&&(0,f.jsx)(v.be,{image:n}),(0,f.jsx)(E,{}),(0,f.jsx)(_,{}),(0,f.jsx)(x.A,{tag:"default",locale:e}),(0,f.jsx)(g.A,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const A=new Map;var T=n(6125),z=n(6988),j=n(205);function N(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const R=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,j.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),N("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function P(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.u)(c.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class L extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.A.canUseDOM?N("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),P(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(R,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.qh,{location:t,render:()=>e})})}}const O=L,D="__docusaurus-base-url-issue-banner-suggestion-container";function I(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '__docusaurus-base-url-issue-banner-container';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return A.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return A.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,f.jsx)(O,{location:e,children:H})}function V(){return(0,f.jsx)(B.A,{children:(0,f.jsx)(z.l,{children:(0,f.jsxs)(T.x,{children:[(0,f.jsxs)(h,{children:[(0,f.jsx)(U,{}),(0,f.jsx)(C,{}),(0,f.jsx)(F,{}),(0,f.jsx)(G,{})]}),(0,f.jsx)($,{})]})})})}var W=n(4054);const Q=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var K=n(6921);const Y=new Set,Z=new Set,X=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,J={prefetch:e=>{if(!(e=>!X()&&!Z.has(e)&&!Y.has(e))(e))return!1;Y.add(e);const t=(0,p.u)(c.A,e).flatMap((e=>{return t=e.route.path,Object.entries(W).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,K.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Q(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!X()&&!Z.has(e))(e)&&(Z.add(e),P(e))},ee=Object.freeze(J);function te(e){let{children:t}=e;return"hash"===l.default.future.experimental_router?(0,f.jsx)(i.I9,{children:t}):(0,f.jsx)(i.Kd,{children:t})}const ne=Boolean(!0);if(s.A.canUseDOM){window.docusaurus=ee;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(o.vd,{children:(0,f.jsx)(te,{children:(0,f.jsx)(V,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(ne)window.docusaurusRoot=a.hydrateRoot(e,t,{onRecoverableError:n});else{const r=a.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};P(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},6988:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(6540),a=n(4784);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/tugraph-db/zh","versions":[{"name":"current","label":"Next","isLast":true,"path":"/tugraph-db/zh","mainDocId":"guide","docs":[{"id":"best-practices/data_migration","path":"/tugraph-db/zh/best-practices/data_migration","sidebar":"tutorialSidebar"},{"id":"best-practices/learn_practices","path":"/tugraph-db/zh/best-practices/learn_practices","sidebar":"tutorialSidebar"},{"id":"best-practices/rdbms-to-tugraph","path":"/tugraph-db/zh/best-practices/rdbms-to-tugraph","sidebar":"tutorialSidebar"},{"id":"best-practices/selection","path":"/tugraph-db/zh/best-practices/selection","sidebar":"tutorialSidebar"},{"id":"best-practices/spatial","path":"/tugraph-db/zh/best-practices/spatial","sidebar":"tutorialSidebar"},{"id":"client-tools/bolt-client","path":"/tugraph-db/zh/client-tools/bolt-client","sidebar":"tutorialSidebar"},{"id":"client-tools/bolt-console-client","path":"/tugraph-db/zh/client-tools/bolt-console-client","sidebar":"tutorialSidebar"},{"id":"client-tools/cpp-client","path":"/tugraph-db/zh/client-tools/cpp-client","sidebar":"tutorialSidebar"},{"id":"client-tools/java-client","path":"/tugraph-db/zh/client-tools/java-client","sidebar":"tutorialSidebar"},{"id":"client-tools/python-client","path":"/tugraph-db/zh/client-tools/python-client","sidebar":"tutorialSidebar"},{"id":"client-tools/restful-api","path":"/tugraph-db/zh/client-tools/restful-api","sidebar":"tutorialSidebar"},{"id":"client-tools/restful-api-legacy","path":"/tugraph-db/zh/client-tools/restful-api-legacy","sidebar":"tutorialSidebar"},{"id":"client-tools/rpc-api","path":"/tugraph-db/zh/client-tools/rpc-api","sidebar":"tutorialSidebar"},{"id":"client-tools/tugraph-ogm","path":"/tugraph-db/zh/client-tools/tugraph-ogm","sidebar":"tutorialSidebar"},{"id":"contacts","path":"/tugraph-db/zh/contacts","sidebar":"tutorialSidebar"},{"id":"contributor-manual/community-roles","path":"/tugraph-db/zh/contributor-manual/community-roles","sidebar":"tutorialSidebar"},{"id":"contributor-manual/contributing","path":"/tugraph-db/zh/contributor-manual/contributing","sidebar":"tutorialSidebar"},{"id":"contributor-manual/corporate-cla","path":"/tugraph-db/zh/contributor-manual/corporate-cla","sidebar":"tutorialSidebar"},{"id":"contributor-manual/individual-cla","path":"/tugraph-db/zh/contributor-manual/individual-cla","sidebar":"tutorialSidebar"},{"id":"contributor-manual/roadmap","path":"/tugraph-db/zh/contributor-manual/roadmap","sidebar":"tutorialSidebar"},{"id":"development_guide","path":"/tugraph-db/zh/development_guide","sidebar":"tutorialSidebar"},{"id":"faq","path":"/tugraph-db/zh/faq","sidebar":"tutorialSidebar"},{"id":"guide","path":"/tugraph-db/zh/guide","sidebar":"tutorialSidebar"},{"id":"installation&running/cloud-deployment","path":"/tugraph-db/zh/installation&running/cloud-deployment","sidebar":"tutorialSidebar"},{"id":"installation&running/compile","path":"/tugraph-db/zh/installation&running/compile","sidebar":"tutorialSidebar"},{"id":"installation&running/docker-deployment","path":"/tugraph-db/zh/installation&running/docker-deployment","sidebar":"tutorialSidebar"},{"id":"installation&running/environment","path":"/tugraph-db/zh/installation&running/environment","sidebar":"tutorialSidebar"},{"id":"installation&running/environment-mode","path":"/tugraph-db/zh/installation&running/environment-mode","sidebar":"tutorialSidebar"},{"id":"installation&running/high-availability-mode","path":"/tugraph-db/zh/installation&running/high-availability-mode","sidebar":"tutorialSidebar"},{"id":"installation&running/local-package-deployment","path":"/tugraph-db/zh/installation&running/local-package-deployment","sidebar":"tutorialSidebar"},{"id":"installation&running/tugraph-running","path":"/tugraph-db/zh/installation&running/tugraph-running","sidebar":"tutorialSidebar"},{"id":"introduction/architecture","path":"/tugraph-db/zh/introduction/architecture","sidebar":"tutorialSidebar"},{"id":"introduction/characteristics/htap","path":"/tugraph-db/zh/introduction/characteristics/htap","sidebar":"tutorialSidebar"},{"id":"introduction/characteristics/multi-level-Interfaces","path":"/tugraph-db/zh/introduction/characteristics/multi-level-Interfaces","sidebar":"tutorialSidebar"},{"id":"introduction/characteristics/performance-oriented","path":"/tugraph-db/zh/introduction/characteristics/performance-oriented","sidebar":"tutorialSidebar"},{"id":"introduction/functionality","path":"/tugraph-db/zh/introduction/functionality","sidebar":"tutorialSidebar"},{"id":"introduction/glossary","path":"/tugraph-db/zh/introduction/glossary","sidebar":"tutorialSidebar"},{"id":"introduction/scenarios","path":"/tugraph-db/zh/introduction/scenarios","sidebar":"tutorialSidebar"},{"id":"introduction/schema","path":"/tugraph-db/zh/introduction/schema","sidebar":"tutorialSidebar"},{"id":"introduction/what-is-gdbms","path":"/tugraph-db/zh/introduction/what-is-gdbms","sidebar":"tutorialSidebar"},{"id":"introduction/what-is-graph","path":"/tugraph-db/zh/introduction/what-is-graph","sidebar":"tutorialSidebar"},{"id":"introduction/what-is-tugraph","path":"/tugraph-db/zh/introduction/what-is-tugraph","sidebar":"tutorialSidebar"},{"id":"olap&procedure/learn/heterogeneous_graph","path":"/tugraph-db/zh/olap&procedure/learn/heterogeneous_graph","sidebar":"tutorialSidebar"},{"id":"olap&procedure/learn/sampling_api","path":"/tugraph-db/zh/olap&procedure/learn/sampling_api","sidebar":"tutorialSidebar"},{"id":"olap&procedure/learn/training","path":"/tugraph-db/zh/olap&procedure/learn/training","sidebar":"tutorialSidebar"},{"id":"olap&procedure/learn/tutorial","path":"/tugraph-db/zh/olap&procedure/learn/tutorial","sidebar":"tutorialSidebar"},{"id":"olap&procedure/olap/algorithms","path":"/tugraph-db/zh/olap&procedure/olap/algorithms","sidebar":"tutorialSidebar"},{"id":"olap&procedure/olap/olap-base-api","path":"/tugraph-db/zh/olap&procedure/olap/olap-base-api","sidebar":"tutorialSidebar"},{"id":"olap&procedure/olap/olap-on-db-api","path":"/tugraph-db/zh/olap&procedure/olap/olap-on-db-api","sidebar":"tutorialSidebar"},{"id":"olap&procedure/olap/olap-on-disk-api","path":"/tugraph-db/zh/olap&procedure/olap/olap-on-disk-api","sidebar":"tutorialSidebar"},{"id":"olap&procedure/olap/python-api","path":"/tugraph-db/zh/olap&procedure/olap/python-api","sidebar":"tutorialSidebar"},{"id":"olap&procedure/olap/tutorial","path":"/tugraph-db/zh/olap&procedure/olap/tutorial","sidebar":"tutorialSidebar"},{"id":"olap&procedure/procedure/procedure","path":"/tugraph-db/zh/olap&procedure/procedure/","sidebar":"tutorialSidebar"},{"id":"olap&procedure/procedure/Rust-procedure","path":"/tugraph-db/zh/olap&procedure/procedure/Rust-procedure","sidebar":"tutorialSidebar"},{"id":"olap&procedure/procedure/traversal","path":"/tugraph-db/zh/olap&procedure/procedure/traversal","sidebar":"tutorialSidebar"},{"id":"permission/log","path":"/tugraph-db/zh/permission/log","sidebar":"tutorialSidebar"},{"id":"permission/monitoring","path":"/tugraph-db/zh/permission/monitoring","sidebar":"tutorialSidebar"},{"id":"permission/privilege","path":"/tugraph-db/zh/permission/privilege","sidebar":"tutorialSidebar"},{"id":"permission/reset_admin_password","path":"/tugraph-db/zh/permission/reset_admin_password","sidebar":"tutorialSidebar"},{"id":"permission/token","path":"/tugraph-db/zh/permission/token","sidebar":"tutorialSidebar"},{"id":"quality/integration-testing","path":"/tugraph-db/zh/quality/integration-testing","sidebar":"tutorialSidebar"},{"id":"quality/unit-testing","path":"/tugraph-db/zh/quality/unit-testing","sidebar":"tutorialSidebar"},{"id":"query/cypher","path":"/tugraph-db/zh/query/cypher","sidebar":"tutorialSidebar"},{"id":"query/gql","path":"/tugraph-db/zh/query/gql","sidebar":"tutorialSidebar"},{"id":"query/vector_index","path":"/tugraph-db/zh/query/vector_index","sidebar":"tutorialSidebar"},{"id":"quick-start/demo/movie","path":"/tugraph-db/zh/quick-start/demo/movie","sidebar":"tutorialSidebar"},{"id":"quick-start/demo/round-the-world","path":"/tugraph-db/zh/quick-start/demo/round-the-world","sidebar":"tutorialSidebar"},{"id":"quick-start/demo/the-three-body","path":"/tugraph-db/zh/quick-start/demo/the-three-body","sidebar":"tutorialSidebar"},{"id":"quick-start/demo/three-kingdoms","path":"/tugraph-db/zh/quick-start/demo/three-kingdoms","sidebar":"tutorialSidebar"},{"id":"quick-start/demo/wandering-earth","path":"/tugraph-db/zh/quick-start/demo/wandering-earth","sidebar":"tutorialSidebar"},{"id":"quick-start/preparation","path":"/tugraph-db/zh/quick-start/preparation","sidebar":"tutorialSidebar"},{"id":"user-guide/tugraph-browser","path":"/tugraph-db/zh/user-guide/tugraph-browser","sidebar":"tutorialSidebar"},{"id":"user-guide/tugraph-browser-legacy","path":"/tugraph-db/zh/user-guide/tugraph-browser-legacy","sidebar":"tutorialSidebar"},{"id":"utility-tools/backup-and-restore","path":"/tugraph-db/zh/utility-tools/backup-and-restore","sidebar":"tutorialSidebar"},{"id":"utility-tools/data-export","path":"/tugraph-db/zh/utility-tools/data-export","sidebar":"tutorialSidebar"},{"id":"utility-tools/data-import","path":"/tugraph-db/zh/utility-tools/data-import","sidebar":"tutorialSidebar"},{"id":"utility-tools/data-warmup","path":"/tugraph-db/zh/utility-tools/data-warmup","sidebar":"tutorialSidebar"},{"id":"utility-tools/ha-cluster-management","path":"/tugraph-db/zh/utility-tools/ha-cluster-management","sidebar":"tutorialSidebar"},{"id":"utility-tools/restful","path":"/tugraph-db/zh/utility-tools/restful","sidebar":"tutorialSidebar"},{"id":"utility-tools/tugraph-cli","path":"/tugraph-db/zh/utility-tools/tugraph-cli","sidebar":"tutorialSidebar"},{"id":"utility-tools/tugraph-datax","path":"/tugraph-db/zh/utility-tools/tugraph-datax","sidebar":"tutorialSidebar"},{"id":"utility-tools/tugraph-explorer","path":"/tugraph-db/zh/utility-tools/tugraph-explorer","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/tugraph-db/zh/guide","label":"guide"}}}}],"breadcrumbs":true},"en":{"path":"/tugraph-db/en","versions":[{"name":"current","label":"Next","isLast":true,"path":"/tugraph-db/en","mainDocId":"guide","docs":[{"id":"best-practices/data_migration","path":"/tugraph-db/en/best-practices/data_migration","sidebar":"tutorialSidebar"},{"id":"best-practices/learn_practices","path":"/tugraph-db/en/best-practices/learn_practices","sidebar":"tutorialSidebar"},{"id":"best-practices/rdbms-to-tugraph","path":"/tugraph-db/en/best-practices/rdbms-to-tugraph","sidebar":"tutorialSidebar"},{"id":"best-practices/selection","path":"/tugraph-db/en/best-practices/selection","sidebar":"tutorialSidebar"},{"id":"best-practices/spatial","path":"/tugraph-db/en/best-practices/spatial","sidebar":"tutorialSidebar"},{"id":"client-tools/bolt-client","path":"/tugraph-db/en/client-tools/bolt-client","sidebar":"tutorialSidebar"},{"id":"client-tools/bolt-console-client","path":"/tugraph-db/en/client-tools/bolt-console-client","sidebar":"tutorialSidebar"},{"id":"client-tools/cpp-client","path":"/tugraph-db/en/client-tools/cpp-client","sidebar":"tutorialSidebar"},{"id":"client-tools/java-client","path":"/tugraph-db/en/client-tools/java-client","sidebar":"tutorialSidebar"},{"id":"client-tools/python-client","path":"/tugraph-db/en/client-tools/python-client","sidebar":"tutorialSidebar"},{"id":"client-tools/restful-api","path":"/tugraph-db/en/client-tools/restful-api","sidebar":"tutorialSidebar"},{"id":"client-tools/restful-api-legacy","path":"/tugraph-db/en/client-tools/restful-api-legacy","sidebar":"tutorialSidebar"},{"id":"client-tools/rpc-api","path":"/tugraph-db/en/client-tools/rpc-api","sidebar":"tutorialSidebar"},{"id":"client-tools/tugraph-ogm","path":"/tugraph-db/en/client-tools/tugraph-ogm","sidebar":"tutorialSidebar"},{"id":"contacts","path":"/tugraph-db/en/contacts","sidebar":"tutorialSidebar"},{"id":"contributor-manual/community-roles","path":"/tugraph-db/en/contributor-manual/community-roles","sidebar":"tutorialSidebar"},{"id":"contributor-manual/contributing","path":"/tugraph-db/en/contributor-manual/contributing","sidebar":"tutorialSidebar"},{"id":"contributor-manual/corporate-cla","path":"/tugraph-db/en/contributor-manual/corporate-cla","sidebar":"tutorialSidebar"},{"id":"contributor-manual/individual-cla","path":"/tugraph-db/en/contributor-manual/individual-cla","sidebar":"tutorialSidebar"},{"id":"contributor-manual/roadmap","path":"/tugraph-db/en/contributor-manual/roadmap","sidebar":"tutorialSidebar"},{"id":"faq","path":"/tugraph-db/en/faq","sidebar":"tutorialSidebar"},{"id":"guide","path":"/tugraph-db/en/guide","sidebar":"tutorialSidebar"},{"id":"installation&running/cloud-deployment","path":"/tugraph-db/en/installation&running/cloud-deployment","sidebar":"tutorialSidebar"},{"id":"installation&running/compile","path":"/tugraph-db/en/installation&running/compile","sidebar":"tutorialSidebar"},{"id":"installation&running/docker-deployment","path":"/tugraph-db/en/installation&running/docker-deployment","sidebar":"tutorialSidebar"},{"id":"installation&running/environment","path":"/tugraph-db/en/installation&running/environment","sidebar":"tutorialSidebar"},{"id":"installation&running/environment-mode","path":"/tugraph-db/en/installation&running/environment-mode","sidebar":"tutorialSidebar"},{"id":"installation&running/high-availability-mode","path":"/tugraph-db/en/installation&running/high-availability-mode","sidebar":"tutorialSidebar"},{"id":"installation&running/local-package-deployment","path":"/tugraph-db/en/installation&running/local-package-deployment","sidebar":"tutorialSidebar"},{"id":"installation&running/tugraph-running","path":"/tugraph-db/en/installation&running/tugraph-running","sidebar":"tutorialSidebar"},{"id":"introduction/architecture","path":"/tugraph-db/en/introduction/architecture","sidebar":"tutorialSidebar"},{"id":"introduction/characteristics/htap","path":"/tugraph-db/en/introduction/characteristics/htap","sidebar":"tutorialSidebar"},{"id":"introduction/characteristics/multi-level-Interfaces","path":"/tugraph-db/en/introduction/characteristics/multi-level-Interfaces","sidebar":"tutorialSidebar"},{"id":"introduction/characteristics/performance-oriented","path":"/tugraph-db/en/introduction/characteristics/performance-oriented","sidebar":"tutorialSidebar"},{"id":"introduction/functionality","path":"/tugraph-db/en/introduction/functionality","sidebar":"tutorialSidebar"},{"id":"introduction/glossary","path":"/tugraph-db/en/introduction/glossary","sidebar":"tutorialSidebar"},{"id":"introduction/scenarios","path":"/tugraph-db/en/introduction/scenarios","sidebar":"tutorialSidebar"},{"id":"introduction/schema","path":"/tugraph-db/en/introduction/schema","sidebar":"tutorialSidebar"},{"id":"introduction/what-is-gdbms","path":"/tugraph-db/en/introduction/what-is-gdbms","sidebar":"tutorialSidebar"},{"id":"introduction/what-is-graph","path":"/tugraph-db/en/introduction/what-is-graph","sidebar":"tutorialSidebar"},{"id":"introduction/what-is-tugraph","path":"/tugraph-db/en/introduction/what-is-tugraph","sidebar":"tutorialSidebar"},{"id":"olap&procedure/learn/heterogeneous_graph","path":"/tugraph-db/en/olap&procedure/learn/heterogeneous_graph","sidebar":"tutorialSidebar"},{"id":"olap&procedure/learn/sampling_api","path":"/tugraph-db/en/olap&procedure/learn/sampling_api","sidebar":"tutorialSidebar"},{"id":"olap&procedure/learn/training","path":"/tugraph-db/en/olap&procedure/learn/training","sidebar":"tutorialSidebar"},{"id":"olap&procedure/learn/tutorial","path":"/tugraph-db/en/olap&procedure/learn/tutorial","sidebar":"tutorialSidebar"},{"id":"olap&procedure/olap/algorithms","path":"/tugraph-db/en/olap&procedure/olap/algorithms","sidebar":"tutorialSidebar"},{"id":"olap&procedure/olap/olap-base-api","path":"/tugraph-db/en/olap&procedure/olap/olap-base-api","sidebar":"tutorialSidebar"},{"id":"olap&procedure/olap/olap-on-db-api","path":"/tugraph-db/en/olap&procedure/olap/olap-on-db-api","sidebar":"tutorialSidebar"},{"id":"olap&procedure/olap/olap-on-disk-api","path":"/tugraph-db/en/olap&procedure/olap/olap-on-disk-api","sidebar":"tutorialSidebar"},{"id":"olap&procedure/olap/python-api","path":"/tugraph-db/en/olap&procedure/olap/python-api","sidebar":"tutorialSidebar"},{"id":"olap&procedure/olap/tutorial","path":"/tugraph-db/en/olap&procedure/olap/tutorial","sidebar":"tutorialSidebar"},{"id":"olap&procedure/procedure/procedure","path":"/tugraph-db/en/olap&procedure/procedure/","sidebar":"tutorialSidebar"},{"id":"olap&procedure/procedure/Rust-procedure","path":"/tugraph-db/en/olap&procedure/procedure/Rust-procedure","sidebar":"tutorialSidebar"},{"id":"olap&procedure/procedure/traversal","path":"/tugraph-db/en/olap&procedure/procedure/traversal","sidebar":"tutorialSidebar"},{"id":"permission/log","path":"/tugraph-db/en/permission/log","sidebar":"tutorialSidebar"},{"id":"permission/monitoring","path":"/tugraph-db/en/permission/monitoring","sidebar":"tutorialSidebar"},{"id":"permission/privilege","path":"/tugraph-db/en/permission/privilege","sidebar":"tutorialSidebar"},{"id":"permission/reset_admin_password","path":"/tugraph-db/en/permission/reset_admin_password","sidebar":"tutorialSidebar"},{"id":"permission/token","path":"/tugraph-db/en/permission/token","sidebar":"tutorialSidebar"},{"id":"quality/integration-testing","path":"/tugraph-db/en/quality/integration-testing","sidebar":"tutorialSidebar"},{"id":"quality/unit-testing","path":"/tugraph-db/en/quality/unit-testing","sidebar":"tutorialSidebar"},{"id":"query/cypher","path":"/tugraph-db/en/query/cypher","sidebar":"tutorialSidebar"},{"id":"query/gql","path":"/tugraph-db/en/query/gql","sidebar":"tutorialSidebar"},{"id":"quick-start/demo/movie","path":"/tugraph-db/en/quick-start/demo/movie","sidebar":"tutorialSidebar"},{"id":"quick-start/demo/round-the-world","path":"/tugraph-db/en/quick-start/demo/round-the-world","sidebar":"tutorialSidebar"},{"id":"quick-start/demo/the-three-body","path":"/tugraph-db/en/quick-start/demo/the-three-body","sidebar":"tutorialSidebar"},{"id":"quick-start/demo/three-kingdoms","path":"/tugraph-db/en/quick-start/demo/three-kingdoms","sidebar":"tutorialSidebar"},{"id":"quick-start/demo/wandering-earth","path":"/tugraph-db/en/quick-start/demo/wandering-earth","sidebar":"tutorialSidebar"},{"id":"quick-start/preparation","path":"/tugraph-db/en/quick-start/preparation","sidebar":"tutorialSidebar"},{"id":"user-guide/tugraph-browser","path":"/tugraph-db/en/user-guide/tugraph-browser","sidebar":"tutorialSidebar"},{"id":"user-guide/tugraph-browser-legacy","path":"/tugraph-db/en/user-guide/tugraph-browser-legacy","sidebar":"tutorialSidebar"},{"id":"utility-tools/backup-and-restore","path":"/tugraph-db/en/utility-tools/backup-and-restore","sidebar":"tutorialSidebar"},{"id":"utility-tools/data-export","path":"/tugraph-db/en/utility-tools/data-export","sidebar":"tutorialSidebar"},{"id":"utility-tools/data-import","path":"/tugraph-db/en/utility-tools/data-import","sidebar":"tutorialSidebar"},{"id":"utility-tools/data-warmup","path":"/tugraph-db/en/utility-tools/data-warmup","sidebar":"tutorialSidebar"},{"id":"utility-tools/ha-cluster-management","path":"/tugraph-db/en/utility-tools/ha-cluster-management","sidebar":"tutorialSidebar"},{"id":"utility-tools/tugraph-cli","path":"/tugraph-db/en/utility-tools/tugraph-cli","sidebar":"tutorialSidebar"},{"id":"utility-tools/tugraph-datax","path":"/tugraph-db/en/utility-tools/tugraph-datax","sidebar":"tutorialSidebar"},{"id":"utility-tools/tugraph-explorer","path":"/tugraph-db/en/utility-tools/tugraph-explorer","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/tugraph-db/en/guide","label":"guide"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(2654);const s=JSON.parse('{"docusaurusVersion":"3.5.2","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.5.2"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.5.2"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.5.2"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.5.2"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.5.2"}}}');var u=n(4848);const c={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},d=r.createContext(c);function p(e){let{children:t}=e;return(0,u.jsx)(d.Provider,{value:c,children:t})}},7489:(e,t,n)=>{"use strict";n.d(t,{A:()=>g});var r=n(6540),a=n(8193),o=n(5260),i=n(440),l=n(781),s=n(3102),u=n(4848);function c(e){let{error:t,tryAgain:n}=e;return(0,u.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,u.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,u.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,u.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,u.jsx)(s.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)(p,{children:(0,u.jsxs)(g,{fallback:()=>(0,u.jsx)(c,{error:t,tryAgain:n}),children:[(0,u.jsx)(o.A,{children:(0,u.jsx)("title",{children:"Page Error"})}),(0,u.jsx)(l.A,{children:(0,u.jsx)(c,{error:t,tryAgain:n})})]})})}const h=e=>(0,u.jsx)(f,{...e});class g extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??h)(e)}return e??null}}},8193:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);var r=n(545),a=n(4848);function o(e){return(0,a.jsx)(r.mg,{...e})}},8774:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(6540),a=n(4625),o=n(440),i=n(4586),l=n(6654),s=n(8193),u=n(3427),c=n(6025),d=n(4848);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:h,isActive:g,"data-noBrokenLinkCheck":m,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:w,baseUrl:k}=v,S=v.future.experimental_router,{withBaseUrl:x}=(0,c.hH)(),_=(0,u.A)(),E=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>E.current));const C=p||f;const A=(0,l.A)(C),T=C?.replace("pathname://","");let z=void 0!==T?(j=T,b&&(e=>e.startsWith("/"))(j)?x(j):j):void 0;var j;"hash"===S&&z?.startsWith("./")&&(z=z?.slice(1)),z&&A&&(z=(0,o.Ks)(z,{trailingSlash:w,baseUrl:k}));const N=(0,r.useRef)(!1),R=n?a.k2:a.N_,P=s.A.canUseIntersectionObserver,L=(0,r.useRef)(),O=()=>{N.current||null==z||(window.docusaurus.preload(z),N.current=!0)};(0,r.useEffect)((()=>(!P&&A&&s.A.canUseDOM&&null!=z&&window.docusaurus.prefetch(z),()=>{P&&L.current&&L.current.disconnect()})),[L,z,P,A]);const D=z?.startsWith("#")??!1,I=!y.target||"_self"===y.target,M=!z||!A||!I||D&&"hash"!==S;m||!D&&M||_.collectLink(z),y.id&&_.collectAnchor(y.id);const F={};return M?(0,d.jsx)("a",{ref:E,href:z,...C&&!A&&{target:"_blank",rel:"noopener noreferrer"},...y,...F}):(0,d.jsx)(R,{...y,onMouseEnter:O,onTouchStart:O,innerRef:e=>{E.current=e,P&&e&&A&&(L.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(L.current.unobserve(e),L.current.disconnect(),null!=z&&window.docusaurus.prefetch(z))}))})),L.current.observe(e))},to:z,...n&&{isActive:g,activeClassName:h},...F})}const f=r.forwardRef(p)},418:(e,t,n)=>{"use strict";n.d(t,{A:()=>r});const r=()=>null},1312:(e,t,n)=>{"use strict";n.d(t,{A:()=>u,T:()=>s});var r=n(6540),a=n(4848);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function l(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return o(l({message:n,id:r}),t)}function u(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=l({message:t,id:n});return(0,a.jsx)(a.Fragment,{children:o(i,r)})}},7065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},6654:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>a,z:()=>r})},6025:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>l,hH:()=>i});var r=n(6540),a=n(4586),o=n(6654);function i(){const{siteConfig:e}=(0,a.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,l=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:a=!1,absolute:i=!1}={},router:l}=e;if(!r||r.startsWith("#")||(0,o.z)(r))return r;if("hash"===l)return r.startsWith("/")?`.${r}`:`./${r}`;if(a)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const s=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+s:s}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:l}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3427:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const a=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),o=()=>(0,r.useContext)(a);function i(){return o()}},4586:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6988);function o(){return(0,r.useContext)(a.o)}},2303:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540),a=n(6125);function o(){return(0,r.useContext)(a.o)}},205:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540);const a=n(8193).A.canUseDOM?r.useLayoutEffect:r.useEffect},6921:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},3102:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>o});var r=n(6540),a=n(4848);const o=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(o),l=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,a.jsx)(o.Provider,{value:l,children:t})}},3886:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>m,g1:()=>y});var r=n(6540),a=n(4070),o=n(7065),i=n(6342),l=n(679),s=n(9532),u=n(4848);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,l.Wf)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,l.Wf)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,l.Wf)(c(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function h(){const e=(0,a.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=h();return(0,u.jsx)(f.Provider,{value:n,children:t})}function m(e){let{children:t}=e;return(0,u.jsx)(g,{children:t})}function b(){const e=(0,r.useContext)(f);if(!e)throw new s.dV("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=o.W);const t=(0,a.ht)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},609:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,t:()=>u});var r=n(6540),a=n(9532),o=n(4848);const i=Symbol("EmptyContext"),l=r.createContext(i);function s(e){let{children:t,name:n,items:a}=e;const i=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return(0,o.jsx)(l.Provider,{value:i,children:t})}function u(){const e=(0,r.useContext)(l);if(e===i)throw new a.dV("DocsSidebarProvider");return e}},4718:(e,t,n)=>{"use strict";n.d(t,{Nr:()=>p,w8:()=>g,B5:()=>x,Vd:()=>w,QB:()=>S,fW:()=>k,OF:()=>v,Y:()=>b});var r=n(6540),a=n(6347),o=n(2831),i=n(4070),l=n(9169);function s(e){return Array.from(new Set(e))}var u=n(3886),c=n(3025),d=n(609);function p(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=p(t);if(e)return e}}(e):void 0:e.href}const f=(e,t)=>void 0!==e&&(0,l.ys)(e,t),h=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?f(e.href,t):"category"===e.type&&(f(e.href,t)||h(e.items,t))}function m(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>m(e,t)));case"link":return!e.unlisted||g(e,t);default:return!0}}function b(e,t){return(0,r.useMemo)((()=>e.filter((e=>m(e,t)))),[e,t])}function y(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,l.ys)(o.href,n)||e(o.items))||"link"===o.type&&(0,l.ys)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function v(){const e=(0,d.t)(),{pathname:t}=(0,a.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function w(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,u.g1)(e),a=(0,i.r7)(e);return(0,r.useMemo)((()=>s([t,n,a].filter(Boolean))),[t,n,a])}function k(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=w(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${s(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function x(e){let{route:t}=e;const n=(0,a.zy)(),r=(0,c.r)(),i=t.routes,l=i.find((e=>(0,a.B6)(n.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?r.docsSidebars[s]:void 0;return{docElement:(0,o.v)(i),sidebarName:s,sidebarItems:u}}},3025:(e,t,n)=>{"use strict";n.d(t,{n:()=>l,r:()=>s});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function l(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(null===e)throw new a.dV("DocsVersionProvider");return e}},4070:(e,t,n)=>{"use strict";n.d(t,{zK:()=>g,vT:()=>p,Gy:()=>c,HW:()=>m,ht:()=>d,r7:()=>h,jh:()=>f});var r=n(6347),a=n(4586),o=n(7065);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},c=()=>i("docusaurus-plugin-content-docs")??u,d=e=>{try{return function(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function p(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function f(e){return d(e).versions}function h(e){const t=d(e);return l(t)}function g(e){const t=d(e),{pathname:n}=(0,r.zy)();return s(t,n)}function m(e){const t=d(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6294:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(5947),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},6134:(e,t,n)=>{"use strict";var r=n(1765),a=n(4784);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(8692)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},1107:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});n(6540);var r=n(4164),a=n(1312),o=n(6342),i=n(8774),l=n(3427);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var u=n(4848);function c(e){let{as:t,id:n,...c}=e;const d=(0,l.A)(),{navbar:{hideOnScroll:p}}=(0,o.p)();if("h1"===t||!n)return(0,u.jsx)(t,{...c,id:void 0});d.collectAnchor(n);const f=(0,a.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof c.children?c.children:n});return(0,u.jsxs)(t,{...c,className:(0,r.A)("anchor",p?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,c.className),id:n,children:[c.children,(0,u.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},3186:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var a=n(4848);function o(e){let{width:t=13.5,height:n=13.5}=e;return(0,a.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,a.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},781:(e,t,n)=>{"use strict";n.d(t,{A:()=>ft});var r=n(6540),a=n(4164),o=n(7489),i=n(1003),l=n(6347),s=n(1312),u=n(5062),c=n(4848);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,l.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,u.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const h=(0,s.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function g(e){const t=e.children??h,{containerRef:n,onClick:r}=f();return(0,c.jsx)("div",{ref:n,role:"region","aria-label":h,children:(0,c.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var m=n(7559),b=n(4090);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,c.jsx)(g,{className:y.skipToContent})}var w=n(6342),k=n(5041);function S(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:a=1.2,className:o,...i}=e;return(0,c.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,c.jsx)("g",{stroke:r,strokeWidth:a,children:(0,c.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const x={closeButton:"closeButton_CVFx"};function _(e){return(0,c.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.A)("clean-btn close",x.closeButton,e.className),children:(0,c.jsx)(S,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,c.jsx)("div",{...e,className:(0,a.A)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const A={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function T(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,k.M)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,c.jsxs)("div",{className:A.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,c.jsx)("div",{className:A.announcementBarPlaceholder}),(0,c.jsx)(C,{className:A.announcementBarContent}),o&&(0,c.jsx)(_,{onClick:n,className:A.announcementBarClose})]})}var z=n(9876),j=n(3104);var N=n(9532),R=n(5600);const P=r.createContext(null);function L(e){let{children:t}=e;const n=function(){const e=(0,z.M)(),t=(0,R.YL)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,N.ZC)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return(0,c.jsx)(P.Provider,{value:n,children:t})}function O(e){if(e.component){const t=e.component;return(0,c.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(P);if(!e)throw new N.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,R.YL)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:O(o)})),[a,o,t])}function I(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:o}=D();return(0,c.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,c.jsxs)("div",{className:(0,a.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o}),children:[(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var M=n(5293),F=n(2303);function U(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function B(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const q={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function $(e){let{className:t,buttonClassName:n,value:r,onChange:o}=e;const i=(0,F.A)(),l=(0,s.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,s.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,c.jsx)("div",{className:(0,a.A)(q.toggle,t),children:(0,c.jsxs)("button",{className:(0,a.A)("clean-btn",q.toggleButton,!i&&q.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite",children:[(0,c.jsx)(U,{className:(0,a.A)(q.toggleIcon,q.lightToggleIcon)}),(0,c.jsx)(B,{className:(0,a.A)(q.toggleIcon,q.darkToggleIcon)})]})})}const H=r.memo($),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function V(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,M.G)();return r?null:(0,c.jsx)(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var W=n(3465);function Q(){return(0,c.jsx)(W.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,z.M)();return(0,c.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,c.jsx)(S,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,c.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,c.jsx)(Q,{}),(0,c.jsx)(V,{className:"margin-right--md"}),(0,c.jsx)(K,{})]})}var Z=n(8774),X=n(6025),J=n(6654);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(3186);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:a,label:o,html:i,isDropdownLink:l,prependBaseUrlToHref:s,...u}=e;const d=(0,X.Ay)(r),p=(0,X.Ay)(t),f=(0,X.Ay)(a,{forcePrependBaseUrl:!0}),h=o&&a&&!(0,J.A)(a),g=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,c.jsxs)(c.Fragment,{children:[o,h&&(0,c.jsx)(te.A,{...l&&{width:12,height:12}})]})};return a?(0,c.jsx)(Z.A,{href:s?f:a,...u,...g}):(0,c.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...u,...g})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const o=(0,c.jsx)(ne,{className:(0,a.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,c.jsx)("li",{children:o}):o}function ae(e){let{className:t,isDropdownItem:n,...r}=e;return(0,c.jsx)("li",{className:"menu__list-item",children:(0,c.jsx)(ne,{className:(0,a.A)("menu__link",t),...r})})}function oe(e){let{mobile:t=!1,position:n,...r}=e;const a=t?ae:re;return(0,c.jsx)(a,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1422),le=n(9169),se=n(4586);const ue="dropdownNavbarItemMobile_S0Fm";function ce(e,t){return e.some((e=>function(e,t){return!!(0,le.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:o,onClick:i,...l}=e;const s=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[s]),(0,c.jsxs)("div",{ref:s,className:(0,a.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u}),children:[(0,c.jsx)(ne,{"aria-haspopup":"true","aria-expanded":u,role:"button",href:l.to?void 0:"#",className:(0,a.A)("navbar__link",o),...l,onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))},children:l.children??l.label}),(0,c.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Ee,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:o,onClick:i,...s}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,se.A)(),{pathname:t}=(0,l.zy)();return t.replace(e,"/")}(),d=ce(t,u),{collapsed:p,toggleCollapsed:f,setCollapsed:h}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&h(!d)}),[u,d,h]),(0,c.jsxs)("li",{className:(0,a.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,c.jsx)(ne,{role:"button",className:(0,a.A)(ue,"menu__link menu__link--sublist menu__link--sublist-caret",n),...s,onClick:e=>{e.preventDefault(),f()},children:s.children??s.label}),(0,c.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(Ee,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,c.jsx)(r,{...n})}var he=n(2131);function ge(e){let{width:t=20,height:n=20,...r}=e;return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const me="iconLanguage_nlXk";var be=n(418);const ye={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ve(e){let{children:t,className:n}=e;return(0,c.jsx)("div",{className:(0,a.A)(n,ye.navbarSearchContainer),children:t})}var we=n(4070),ke=n(4718);var Se=n(3886);function xe(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const _e={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:a="",...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,se.A)(),p=(0,he.o)(),{search:f,hash:h}=(0,l.zy)(),g=[...n,...u.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${h}${a}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],m=t?(0,s.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,c.jsx)(fe,{...o,mobile:t,label:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(ge,{className:me}),m]}),items:g})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,c.jsx)(ve,{className:n,children:(0,c.jsx)(be.A,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:o=!1}=e;const i=o?"li":"div";return(0,c.jsx)(i,{className:(0,a.A)({navbar__item:!r&&!o,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,ke.QB)(t,r),l=o?.path===i?.path;return null===i||i.unlisted&&!l?null:(0,c.jsx)(oe,{exact:!0,...a,isActive:()=>l||!!o?.sidebar&&o.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.zK)(r),i=(0,ke.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,c.jsx)(oe,{exact:!0,...a,isActive:()=>o?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...a}=e;const o=(0,ke.Vd)(r)[0],i=t??o.label,l=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,c.jsx)(oe,{...a,label:i,to:l})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:u,hash:d}=(0,l.zy)(),p=(0,we.zK)(n),f=(0,we.jh)(n),{savePreferredVersionName:h}=(0,Se.g1)(n),g=[...a,...f.map((function(e){const t=xe(e,p);return{label:e.label,to:`${t.path}${u}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...o],m=(0,ke.Vd)(n)[0],b=t&&g.length>1?(0,s.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):m.label,y=t&&g.length>1?void 0:xe(m,p).path;return g.length<=1?(0,c.jsx)(oe,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,c.jsx)(fe,{...i,mobile:t,label:b,to:y,items:g,isActive:r?()=>!1:void 0})}};function Ee(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=_e[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,c.jsx)(a,{...n})}function Ce(){const e=(0,z.M)(),t=(0,w.p)().navbar.items;return(0,c.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Ee,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ae(e){return(0,c.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,c.jsx)(s.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Te(){const e=0===(0,w.p)().navbar.items.length,t=D();return(0,c.jsxs)(c.Fragment,{children:[!e&&(0,c.jsx)(Ae,{onClick:()=>t.hide()}),t.content]})}function ze(){const e=(0,z.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,c.jsx)(I,{header:(0,c.jsx)(Y,{}),primaryMenu:(0,c.jsx)(Ce,{}),secondaryMenu:(0,c.jsx)(Te,{})}):null}const je={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ne(e){return(0,c.jsx)("div",{role:"presentation",...e,className:(0,a.A)("navbar-sidebar__backdrop",e.className)})}function Re(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.p)(),i=(0,z.M)(),{navbarRef:l,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,j.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,c.jsxs)("nav",{ref:l,"aria-label":(0,s.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.A)("navbar","navbar--fixed-top",n&&[je.navbarHideable,!d&&je.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,c.jsx)(Ne,{onClick:i.toggle}),(0,c.jsx)(ze,{})]})}var Pe=n(440);const Le={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Oe(e){return(0,c.jsx)("button",{type:"button",...e,children:(0,c.jsx)(s.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function De(e){let{error:t}=e;const n=(0,Pe.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{className:Le.errorBoundaryError,children:n})}class Ie extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Me="right";function Fe(e){let{width:t=30,height:n=30,className:r,...a}=e;return(0,c.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...a,children:(0,c.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Ue(){const{toggle:e,shown:t}=(0,z.M)();return(0,c.jsx)("button",{onClick:e,"aria-label":(0,s.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,c.jsx)(Fe,{})})}const Be={colorModeToggle:"colorModeToggle_DEke"};function qe(e){let{items:t}=e;return(0,c.jsx)(c.Fragment,{children:t.map(((e,t)=>(0,c.jsx)(Ie,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,c.jsx)(Ee,{...e})},t)))})}function $e(e){let{left:t,right:n}=e;return(0,c.jsxs)("div",{className:"navbar__inner",children:[(0,c.jsx)("div",{className:"navbar__items",children:t}),(0,c.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function He(){const e=(0,z.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Me)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return(0,c.jsx)($e,{left:(0,c.jsxs)(c.Fragment,{children:[!e.disabled&&(0,c.jsx)(Ue,{}),(0,c.jsx)(Q,{}),(0,c.jsx)(qe,{items:n})]}),right:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(qe,{items:r}),(0,c.jsx)(V,{className:Be.colorModeToggle}),!a&&(0,c.jsx)(ve,{children:(0,c.jsx)(be.A,{})})]})})}function Ge(){return(0,c.jsx)(Re,{children:(0,c.jsx)(He,{})})}function Ve(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,l=(0,X.Ay)(n),s=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,c.jsxs)(Z.A,{className:"footer__link-item",...r?{href:o?s:r}:{to:l},...i,children:[a,r&&!(0,J.A)(r)&&(0,c.jsx)(te.A,{})]})}function We(e){let{item:t}=e;return t.html?(0,c.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)("li",{className:"footer__item",children:(0,c.jsx)(Ve,{item:t})},t.href??t.to)}function Qe(e){let{column:t}=e;return(0,c.jsxs)("div",{className:"col footer__col",children:[(0,c.jsx)("div",{className:"footer__title",children:t.title}),(0,c.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,c.jsx)(We,{item:e},t)))})]})}function Ke(e){let{columns:t}=e;return(0,c.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,c.jsx)(Qe,{column:e},t)))})}function Ye(){return(0,c.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Ze(e){let{item:t}=e;return t.html?(0,c.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)(Ve,{item:t})}function Xe(e){let{links:t}=e;return(0,c.jsx)("div",{className:"footer__links text--center",children:(0,c.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,c.jsxs)(r.Fragment,{children:[(0,c.jsx)(Ze,{item:e}),t.length!==n+1&&(0,c.jsx)(Ye,{})]},n)))})})}function Je(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,c.jsx)(Ke,{columns:t}):(0,c.jsx)(Xe,{links:t})}var et=n(1122);const tt="footerLogoLink_BH7S";function nt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,c.jsx)(et.A,{className:(0,a.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function rt(e){let{logo:t}=e;return t.href?(0,c.jsx)(Z.A,{href:t.href,className:tt,target:t.target,children:(0,c.jsx)(nt,{logo:t})}):(0,c.jsx)(nt,{logo:t})}function at(e){let{copyright:t}=e;return(0,c.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ot(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,c.jsx)("footer",{className:(0,a.A)("footer",{"footer--dark":"dark"===t}),children:(0,c.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,c.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,c.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function it(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:a}=e;return(0,c.jsx)(ot,{style:a,links:n&&n.length>0&&(0,c.jsx)(Je,{links:n}),logo:r&&(0,c.jsx)(rt,{logo:r}),copyright:t&&(0,c.jsx)(at,{copyright:t})})}const lt=r.memo(it),st=(0,N.fM)([M.a,k.o,j.Tv,Se.VQ,i.Jx,function(e){let{children:t}=e;return(0,c.jsx)(R.y_,{children:(0,c.jsx)(z.e,{children:(0,c.jsx)(L,{children:t})})})}]);function ut(e){let{children:t}=e;return(0,c.jsx)(st,{children:t})}var ct=n(1107);function dt(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)("main",{className:"container margin-vert--xl",children:(0,c.jsx)("div",{className:"row",children:(0,c.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,c.jsx)(ct.A,{as:"h1",className:"hero__title",children:(0,c.jsx)(s.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,c.jsx)("div",{className:"margin-vert--lg",children:(0,c.jsx)(Oe,{onClick:n,className:"button button--primary shadow--lw"})}),(0,c.jsx)("hr",{}),(0,c.jsx)("div",{className:"margin-vert--md",children:(0,c.jsx)(De,{error:t})})]})})})}const pt={mainWrapper:"mainWrapper_z2l0"};function ft(e){const{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,b.J)(),(0,c.jsxs)(ut,{children:[(0,c.jsx)(i.be,{title:l,description:s}),(0,c.jsx)(v,{}),(0,c.jsx)(T,{}),(0,c.jsx)(Ge,{}),(0,c.jsx)("div",{id:d,className:(0,a.A)(m.G.wrapper.main,pt.mainWrapper,r),children:(0,c.jsx)(o.A,{fallback:e=>(0,c.jsx)(dt,{...e}),children:t})}),!n&&(0,c.jsx)(lt,{})]})}},3465:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});n(6540);var r=n(8774),a=n(6025),o=n(4586),i=n(6342),l=n(1122),s=n(4848);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.Ay)(t.src),dark:(0,a.Ay)(t.srcDark||t.src)},i=(0,s.jsx)(l.A,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,s.jsx)("div",{className:r,children:i}):i}function c(e){const{siteConfig:{title:t}}=(0,o.A)(),{navbar:{title:n,logo:l}}=(0,i.p)(),{imageClassName:c,titleClassName:d,...p}=e,f=(0,a.Ay)(l?.href||"/"),h=n?"":t,g=l?.alt??h;return(0,s.jsxs)(r.A,{to:f,...p,...l?.target&&{target:l.target},children:[l&&(0,s.jsx)(u,{logo:l,alt:g,imageClassName:c}),null!=n&&(0,s.jsx)("b",{className:d,children:n})]})}},1463:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(6540);var r=n(5260),a=n(4848);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return(0,a.jsxs)(r.A,{children:[t&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_version",content:n}),o&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:o}),i&&(0,a.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,a.jsx)("meta",{name:"docsearch:version",content:n}),o&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:o})]})}},1122:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});var r=n(6540),a=n(4164),o=n(2303),i=n(5293);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(4848);function u(e){let{className:t,children:n}=e;const u=(0,o.A)(),{colorMode:c}=(0,i.G)();return(0,s.jsx)(s.Fragment,{children:(u?"dark"===c?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.A)(t,l.themedComponent,l[`themedComponent--${e}`])});return(0,s.jsx)(r.Fragment,{children:o},e)}))})}function c(e){const{sources:t,className:n,alt:r,...a}=e;return(0,s.jsx)(u,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,s.jsx)("img",{src:t[n],alt:r,className:o,...a})}})}},1422:(e,t,n)=>{"use strict";n.d(t,{N:()=>b,u:()=>u});var r=n(6540),a=n(8193),o=n(205),i=n(3109),l=n(4848);const s="ease-in-out";function u(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const c={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?c:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??s}`,height:`${t}px`}}function l(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return p(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function h(e){if(!a.A.canUseDOM)return e?c:d}function g(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:s,disableSSRStyle:u}=e;const c=(0,r.useRef)(null);return f({collapsibleRef:c,collapsed:n,animation:o}),(0,l.jsx)(t,{ref:c,style:u?void 0:h(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(c.current,n),i?.(n))},className:s,children:a})}function m(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[s,u]=(0,r.useState)(t);return(0,o.A)((()=>{t||i(!0)}),[t]),(0,o.A)((()=>{a&&u(t)}),[a,t]),a?(0,l.jsx)(g,{...n,collapsed:s}):null}function b(e){let{lazy:t,...n}=e;const r=t?m:g;return(0,l.jsx)(r,{...n})}},5041:(e,t,n)=>{"use strict";n.d(t,{M:()=>g,o:()=>h});var r=n(6540),a=n(2303),o=n(679),i=n(9532),l=n(6342),s=n(4848);const u=(0,o.Wf)("docusaurus.announcement.dismiss"),c=(0,o.Wf)("docusaurus.announcement.id"),d=()=>"true"===u.get(),p=e=>u.set(String(e)),f=r.createContext(null);function h(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.p)(),t=(0,a.A)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&p(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,s.jsx)(f.Provider,{value:n,children:t})}function g(){const e=(0,r.useContext)(f);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},5293:(e,t,n)=>{"use strict";n.d(t,{G:()=>b,a:()=>m});var r=n(6540),a=n(8193),o=n(9532),i=n(679),l=n(6342),s=n(4848);const u=r.createContext(void 0),c="theme",d=(0,i.Wf)(c),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,h=e=>a.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),g=e=>{d.set(f(e))};function m(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.p)(),[a,o]=(0,r.useState)(h(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&g(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[a,i])}();return(0,s.jsx)(u.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(u);if(null==e)throw new o.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},9876:(e,t,n)=>{"use strict";n.d(t,{e:()=>f,M:()=>h});var r=n(6540),a=n(5600),o=n(4581),i=n(6347),l=n(9532);function s(e){!function(e){const t=(0,i.W6)(),n=(0,l._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(6342),c=n(4848);const d=r.createContext(void 0);function p(){const e=function(){const e=(0,a.YL)(),{items:t}=(0,u.p)().navbar;return 0===t.length&&!e.component}(),t=(0,o.l)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function f(e){let{children:t}=e;const n=p();return(0,c.jsx)(d.Provider,{value:n,children:t})}function h(){const e=r.useContext(d);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},5600:(e,t,n)=>{"use strict";n.d(t,{GX:()=>u,YL:()=>s,y_:()=>l});var r=n(6540),a=n(9532),o=n(4848);const i=r.createContext(null);function l(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(!e)throw new a.dV("NavbarSecondaryMenuContentProvider");return e[0]}function u(e){let{component:t,props:n}=e;const o=(0,r.useContext)(i);if(!o)throw new a.dV("NavbarSecondaryMenuContentProvider");const[,l]=o,s=(0,a.Be)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},4090:(e,t,n)=>{"use strict";n.d(t,{w:()=>a,J:()=>o});var r=n(6540);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},4581:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(6540),a=n(8193);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,l]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){l(function(e){if(!a.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?o.desktop:o.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},7559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},3109:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},1003:(e,t,n)=>{"use strict";n.d(t,{e3:()=>f,be:()=>d,Jx:()=>h});var r=n(6540),a=n(4164),o=n(5260),i=n(3102);function l(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(6025),u=n(4586);var c=n(4848);function d(e){let{title:t,description:n,keywords:r,image:a,children:i}=e;const l=function(e){const{siteConfig:t}=(0,u.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.hH)(),p=a?d(a,{absolute:!0}):void 0;return(0,c.jsxs)(o.A,{children:[t&&(0,c.jsx)("title",{children:l}),t&&(0,c.jsx)("meta",{property:"og:title",content:l}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),i]})}const p=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(p),l=(0,a.A)(i,t);return(0,c.jsxs)(p.Provider,{value:l,children:[(0,c.jsx)(o.A,{children:(0,c.jsx)("html",{className:l})}),n]})}function h(e){let{children:t}=e;const n=l(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(f,{className:(0,a.A)(r,o),children:t})}},9532:(e,t,n)=>{"use strict";n.d(t,{Be:()=>u,ZC:()=>l,_q:()=>i,dV:()=>s,fM:()=>c});var r=n(6540),a=n(205),o=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,a.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function l(e){const t=(0,r.useRef)();return(0,a.A)((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function u(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return(0,o.jsx)(o.Fragment,{children:e.reduceRight(((e,t)=>(0,o.jsx)(t,{children:e})),n)})}}},9169:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>l,ys:()=>i});var r=n(6540),a=n(8328),o=n(4586);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.A,baseUrl:e})),[e])}},3104:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>p,Tv:()=>u,gk:()=>f});var r=n(6540),a=n(8193),o=n(2303),i=(n(205),n(9532)),l=n(4848);const s=r.createContext(void 0);function u(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(s.Provider,{value:n,children:t})}function c(){const e=(0,r.useContext)(s);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const d=()=>a.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),a=(0,r.useRef)(d()),o=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},679:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>u});n(6540);const r=JSON.parse('{"N":"localStorage","M":""}'),a=r.N;function o(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function i(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){const n=`${e}${r.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const a=i(t?.persistence);return null===a?s:{get:()=>{try{return a.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=a.getItem(n);a.setItem(n,e),o({key:n,oldValue:t,newValue:e,storage:a})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=a.getItem(n);a.removeItem(n),o({key:n,oldValue:e,newValue:null,storage:a})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===a&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}},2131:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(4586),a=n(6347),o=n(440);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.A)(),{pathname:s}=(0,a.zy)(),u=(0,o.Ks)(s,{trailingSlash:n,baseUrl:e}),c=l===i?e:e.replace(`/${l}/`,"/"),d=u.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${c}`:`${c}${e}/`}(n)}${d}`}}}},5062:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),a=n(6347),o=n(9532);function i(e){const t=(0,a.zy)(),n=(0,o.ZC)(t),i=(0,o._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(4586);function a(){return(0,r.A)().siteConfig.themeConfig}},2983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=a,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),l="/"===i||i===r?i:(s=i,u=n,u?a(s):o(s));var s,u;return e.replace(i,l)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=o;const r=n(2566);function a(e){return e.endsWith("/")?e:`${e}/`}function o(e){return(0,r.removeSuffix)(e,"/")}},253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},440:(e,t,n)=>{"use strict";t.rA=t.Ks=void 0;const r=n(1635);var a=n(2983);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(a).default}});var o=n(2566);var i=n(253);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},2566:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>w,TM:()=>C,yJ:()=>f,sC:()=>T,AO:()=>p});var r=n(8168);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;p--){var f=i[p];"."===f?o(i,p):".."===f?(o(i,p),d++):d&&(o(i,p),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var h=i.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};var l=n(1561);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function f(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.A)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function h(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,g(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(4363),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var a=f(n);a&&a!==h&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),g=s(n),m=0;m{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},119:(e,t,n)=>{"use strict";n.r(t)},1043:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&f(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=p(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},6969:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},8722:(e,t,n)=>{const r=n(6969),a=n(8380),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(3157).resolve(t)],delete Prism.languages[e],n(3157)(t),o.add(e)}))}i.silent=!1,e.exports=i},9700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],p="string"==typeof u?u:u.content,f=t(r,c),h=p.indexOf(f);if(h>-1){++a;var g=p.substring(0,h),m=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(h+f.length),y=[];g&&y.push.apply(y,i([g])),y.push(m),b&&y.push.apply(y,i([b])),"string"==typeof u?l.splice.apply(l,[s,1].concat(y)):u.content=y}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(Prism)},8692:(e,t,n)=>{var r={"./":8722};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=8692},3157:(e,t,n)=>{var r={"./":8722};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=3157},8380:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function u(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in a(t,o),l[t]=!0,n[t])l[i]=!0}t(s.require,u),t(s.optional,u),t(s.modify,u)}n[r]=l,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),u=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(s);i=i.map(u),l=(l||[]).map(u);var c=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(c[t]=!0,e(t))}))}));for(var p,f=r(s),h=c;a(h);){for(var g in p={},h){var m=s[g];t(m&&m.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in c))for(var y in f(b))if(y in c){p[b]=!0;break}for(var v in h=p)c[v]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,l={},s={};function u(e){if(e in l)return l[e];s[e]=!0;var a,c=[];for(var d in t(e))d in n&&c.push(d);if(0===c.length)a=r(e);else{var p=i(c.map((function(e){var t=u(e);return delete s[e],t})));o?a=o(p,(function(){return r(e)})):r(e)}return l[e]=a}for(var c in n)u(c);var d=[];for(var p in s)d.push(l[p]);return i(d)}(f,c,t,n)}};return w}}();e.exports=t},2694:(e,t,n)=>{"use strict";var r=n(6925);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),a=n(9982);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n