diff --git a/.github/workflows/docusaurus.yml b/.github/workflows/docusaurus.yml new file mode 100644 index 000000000..d3e7b12e2 --- /dev/null +++ b/.github/workflows/docusaurus.yml @@ -0,0 +1,45 @@ +# Build and deploy the Docusaurus documentation site. +name: "Deploy site to pages (docusaurus)" + +on: + pull_request: + push: + branches-ignore: + - asf-site + - gh-pages + +jobs: + deploy: + runs-on: ubuntu-latest + permissions: + contents: write + pages: write + id-token: write + concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: "20" + + - name: Install dependencies + run: npm install + + - name: Build Site + run: npm run build + + - name: Deploy Site + uses: peaceiris/actions-gh-pages@v3 + if: ${{ github.ref == 'refs/heads/master' }} + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + # Refer: https://github.com/marketplace/actions/github-pages-action + publish_dir: ./build + publish_branch: asf-site + keep_files: true # A simple way to keep ".asf.yaml" file + commit_message: ${{ github.event.head_commit.message }} diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml deleted file mode 100644 index 17a1e1858..000000000 --- a/.github/workflows/hugo.yml +++ /dev/null @@ -1,58 +0,0 @@ -# Sample workflow for building and deploying a Hugo site to GitHub Pages -name: "Deploy site to pages (hugo)" - -on: - pull_request: - push: - branches: ["master"] # Set a branch name to trigger deployment - -jobs: - deploy: - runs-on: ubuntu-latest - permissions: - contents: write - pages: write - id-token: write - concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - # Hugo steps - steps: - - uses: actions/checkout@v3 - with: - submodules: true # Fetch Hugo themes (true OR recursive) - fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - - - name: Setup Node - uses: actions/setup-node@v3 - with: - node-version: "16" - - - name: Setup Hugo - uses: peaceiris/actions-hugo@v2 - with: - hugo-version: '0.102.3' - extended: true - - - uses: actions/cache@v3 - with: - path: /tmp/hugo_cache - key: ${{ runner.os }}-hugomod-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-hugomod- - - - name: Check Links - run: bash dist/validate-links.sh - - - name: Build Site (minify) - run: npm i && hugo --minify - - - name: Deploy Site - uses: peaceiris/actions-gh-pages@v3 - if: ${{ github.ref == 'refs/heads/master' }} - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - # Refer: https://github.com/marketplace/actions/github-pages-action - publish_dir: ./public - publish_branch: asf-site - keep_files: true # A simple way to keep ".asf.yaml" file - commit_message: ${{ github.event.head_commit.message }} diff --git a/.gitignore b/.gitignore index 86f2983b1..2c5f92daa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ public/ +build/ +.docusaurus/ +artifacts/ resources/ node_modules/ package-lock.json @@ -6,6 +9,14 @@ package-lock.json nohup.out *.log +# Generated by scripts/prepare-docs-versions.mjs before Docusaurus build/start. +versioned_docs/ +versioned_sidebars/ +versions.json +docs-cn_versioned_docs/ +docs-cn_versioned_sidebars/ +docs-cn_versions.json + # Default ignored files /shelf/ /workspace.xml diff --git a/README.md b/README.md index 8f19005ba..19501c711 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/apache/hugegraph-doc) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) -[![Hugo](https://img.shields.io/badge/Hugo-Extended-ff4088?logo=hugo)](https://gohugo.io/) +[![Docusaurus](https://img.shields.io/badge/Docusaurus-3.x-2e8555?logo=docusaurus)](https://docusaurus.io/) --- @@ -16,7 +16,7 @@ For the HugeGraph database project, visit [apache/hugegraph](https://github.com/ Only **3 steps** to run the documentation website locally: -**Prerequisites:** [Hugo Extended](https://github.com/gohugoio/hugo/releases) v0.95+ and Node.js v16+ +**Prerequisites:** Node.js v18+ ```bash # 1. Clone repository @@ -27,13 +27,10 @@ cd hugegraph-doc npm install # 3. Start development server (auto-reload) -hugo server +npm run start ``` -Open http://localhost:1313 to preview. - -> **Troubleshooting:** If you see `TOCSS: failed to transform "scss/main.scss"`, -> install Hugo **Extended** version, not the standard version. +Open http://localhost:3000 to preview. ## Repository Structure @@ -51,14 +48,117 @@ hugegraph-doc/ │ │ └── community/ # Community pages │ └── en/ # 🇺🇸 English documentation (mirrors cn/ structure) │ -├── themes/docsy/ # 🎨 Docsy theme (git submodule) -├── assets/ # 🖼️ Custom assets (fonts, images, scss) -├── layouts/ # 📐 Hugo template overrides -├── static/ # 📁 Static files -├── config.toml # ⚙️ Site configuration +├── src/ # 🎨 Docusaurus pages, CSS, and helpers +├── static/ # 📁 Static files served from site root +├── src/data/versions.json # 🏷️ Documentation version metadata +├── scripts/ # 🔧 Content validation and version preparation +├── docusaurus.config.js # ⚙️ Site configuration +├── sidebars*.js # 🧭 Documentation sidebar configuration └── package.json # 📦 Node.js dependencies ``` +## Documentation Versions + +The source tree keeps only current documentation and version metadata. Docusaurus release snapshots are generated before `npm run start` and `npm run build` from the configured Git source refs. A version entry may set `sourceRef` to read from a Git branch or tag; when it is omitted, the current working tree is used. + +Version semantics: + +| Version | Route | Meaning | +|---------|-------|---------| +| `stable` | `/docs/`, `/cn/docs/` | Latest stable release documentation and the default navbar target | +| `current` / `next` | `/docs/next/`, `/cn/docs/next/` | Unreleased development documentation with an unreleased banner | + +Release-branch mapping is explicit: + +| Source branch | Docusaurus version / route segment | UI label | +|---------------|------------------------------------|----------| +| `release-1.5.0` | `docusaurus-1.5.0` | `1.5.0` | +| `release-1.3.0` | `docusaurus-1.3.0` | `1.3.0` | +| `release-1.2.0` | `docusaurus-1.2.0` | `1.2.0` | +| `release-1.0.0` | `docusaurus-1.0.0` | `1.0.0` | +| `release-0.11` | `docusaurus-0.11` | `0.11` | +| `release-0.10` | `docusaurus-0.10` | `0.10` | + +The source branch prefix is never shown in the UI. The archived release branches listed above were authored before this Docusaurus migration, so any import repair for those snapshots is isolated under `legacyCompatibility` in `src/data/versions.json`. That compatibility layer is only for adapting those historical branches to a previewable Docusaurus build; it is not part of the normal documentation authoring or version generation pipeline. Future Docusaurus-native release branches should keep the standard `content/{en,cn}/docs` layout and should not require those adapters. + +In the mapping table, `docusaurus-*` is a Docusaurus version name and route segment, not necessarily a Git branch. The actual content source is always the configured `sourceRef`. For example, `1.5.0` currently reads from the Git branch `release-1.5.0` and is published under the Docusaurus route segment `docusaurus-1.5.0`. + +Generate the Docusaurus version files locally: + +```bash +npm run docs:versions:prepare +``` + +This writes `versioned_docs/`, `versioned_sidebars/`, `versions.json`, `docs-cn_versioned_docs/`, `docs-cn_versioned_sidebars/`, and `docs-cn_versions.json` from the configured source refs. These files are generated build inputs and are intentionally ignored by Git. + +List configured versions: + +```bash +npm run docs:versions:list +``` + +To update a release source: + +1. Update the entry in `src/data/versions.json`, especially `label`, `docusaurusVersion`, `path`, `cnPath`, `githubTagUrl`, and `sourceRef`. +2. Make sure the source ref is fetched locally. CI uses `fetch-depth: 0`, so tags and release branches are available there. +3. Run `npm run docs:versions:prepare`, then `npm run build`. + +To freeze the current `next` documentation as a new stable release, such as `1.8.0`, first create a durable Docusaurus-native source branch from the release-ready documentation state: + +```bash +git checkout master +git pull +git checkout -b docusaurus-1.8.0 +git push origin docusaurus-1.8.0 +``` + +Then update `src/data/versions.json` on `master`: point `stable.sourceRef` to `docusaurus-1.8.0`, change the stable label to `Stable (1.8.0)`, and, if the previous stable release should remain available, add an archived `1.7.0` entry whose `sourceRef` is `docusaurus-1.7.0`. Docusaurus-native frozen branches should not need `legacyCompatibility`. + +After the version metadata is merged to `master`, the production deployment is automatic. `.github/workflows/docusaurus.yml` runs `npm run build` on `master`, generates all version snapshots from their configured `sourceRef` values, and publishes `./build` to the `asf-site` branch. `.asf.yaml` publishes the production website from `asf-site`; `asf-staging` is only for manual preview validation before the merge. + +Only archived pre-Docusaurus branches should use `legacyCompatibility` fields such as `sourcePaths`, `sourceIncludes`, `sourceOverlays`, `indexFrom`, or Markdown normalization. These fields document deliberate compatibility work for old snapshots, not guidance for new documentation. + +Do not use `latest` ambiguously in docs navigation. Use `stable` for the latest released documentation and `next` for unreleased documentation. + +## Team and User Data + +The Team page is available at `/team/` and `/cn/team/`. It is data-driven from `src/data/team.js`, currently based on public ASF roster data. Update that file when PMC or committer information changes, and include the public source used for the update. + +The user showcase is available at `/users/` and `/cn/users/`. It is data-driven from `src/data/users.js` and uses public submissions from [apache/hugegraph#1651](https://github.com/apache/hugegraph/issues/1651). Do not add company names, logos, quotes, or deployment details unless they are already public and approved. If no approved logo exists in the repository, leave the logo empty and let the page render the fallback initials. + +## Content Visibility + +The site supports these publishing states: + +| State | Front matter | Production behavior | +|-------|--------------|---------------------| +| Public | default | Appears in navigation and generated outputs | +| Draft | `draft: true` | Excluded from production builds by Docusaurus | +| Unlisted | `unlisted: true` | Built for direct URL access but hidden from navigation, listings, feeds, and indexed discovery; Docusaurus adds noindex/nofollow metadata | +| Placeholder | `placeholder: true`, `unlisted: true`, `noindex: true` | Reserves a URL with only a short safe placeholder message | +| Private | `private: true` | Fails production builds unless `ALLOW_PRIVATE_CONTENT=true` is explicitly set for a non-public preview | + +Private content is not access control. Do not put sensitive material in Markdown, MDX, static assets, generated HTML, JavaScript bundles, source maps, or JSON that will be published. Real private access must be enforced by the hosting platform, reverse proxy, authentication gateway, or a non-public preview environment. + +Production builds run: + +```bash +npm run check:content-visibility +``` + +Use this placeholder pattern when reserving a route: + +```markdown +--- +title: Upcoming Case Study +unlisted: true +noindex: true +placeholder: true +--- + +This page is reserved for an upcoming Apache HugeGraph case study. +``` + ## Contributing ### Contribution Workflow @@ -74,22 +174,26 @@ hugegraph-doc/ |-------------|-------------| | **Bilingual Updates** | Update **BOTH** `content/cn/` and `content/en/` | | **PR Screenshots** | Include **before/after screenshots** in PR | -| **Markdown** | Use Markdown with Hugo front matter | +| **Markdown** | Use Markdown with front matter | ### Detailed Guide See [contribution.md](./contribution.md) for: -- Platform-specific Hugo installation -- Docsy theme customization +- Local development setup +- Docusaurus theme customization - Translation tips ## Commands | Command | Description | |---------|-------------| -| `hugo server` | Start dev server (hot reload) | -| `hugo --minify` | Build production to `./public/` | -| `hugo server -p 8080` | Custom port | +| `npm run start` | Start dev server (hot reload) | +| `npm run build` | Build production site to `./build/` | +| `npm run serve` | Serve the production build locally | +| `npm run check:content-visibility` | Fail production-unsafe private content | +| `npm run docs:versions:prepare` | Generate Docusaurus version files from configured Git refs | +| `npm run docs:versions:list` | Print configured docs versions | +| `npm run validate` | Build, check content inventory, and run headless UI validation | --- @@ -103,7 +207,7 @@ See [contribution.md](./contribution.md) for: 只需 **3 步**即可在本地启动文档网站: -**前置条件:** [Hugo Extended](https://github.com/gohugoio/hugo/releases) v0.95+ 和 Node.js v16+ +**前置条件:** Node.js v18+ ```bash # 1. 克隆仓库 @@ -114,13 +218,10 @@ cd hugegraph-doc npm install # 3. 启动开发服务器(支持热重载) -hugo server +npm run start ``` -打开 http://localhost:1313 预览网站。 - -> **常见问题:** 如果遇到 `TOCSS: failed to transform "scss/main.scss"` 错误, -> 说明你需要安装 Hugo **Extended** 版本,而不是标准版本。 +打开 http://localhost:3000 预览网站。 ### 仓库结构 @@ -138,14 +239,84 @@ hugegraph-doc/ │ │ └── community/ # 社区页面 │ └── en/ # 🇺🇸 英文文档(与 cn/ 结构一致) │ -├── themes/docsy/ # 🎨 Docsy 主题 (git submodule) -├── assets/ # 🖼️ 自定义资源 (fonts, images, scss) -├── layouts/ # 📐 Hugo 模板覆盖 -├── static/ # 📁 静态文件 -├── config.toml # ⚙️ 站点配置 +├── src/ # 🎨 Docusaurus 页面、样式和辅助脚本 +├── static/ # 📁 站点根路径静态文件 +├── src/data/versions.json # 🏷️ 文档版本元数据 +├── scripts/ # 🔧 内容校验和版本准备脚本 +├── docusaurus.config.js # ⚙️ 站点配置 +├── sidebars*.js # 🧭 文档侧边栏配置 └── package.json # 📦 Node.js 依赖 ``` +### 文档版本 + +源码分支只保留当前文档和版本元数据。Docusaurus 需要的版本快照会在 `npm run start` 和 `npm run build` 前,从配置的 Git source ref 生成。版本条目可以通过 `sourceRef` 指向 Git 分支或标签;未设置时使用当前工作区文档。 + +| 版本 | 路由 | 含义 | +|------|------|------| +| `stable` | `/docs/`, `/cn/docs/` | 最新稳定版本文档,也是导航栏默认入口 | +| `current` / `next` | `/docs/next/`, `/cn/docs/next/` | 未发布开发中文档,并展示 unreleased 提示 | + +发布分支映射规则是显式配置的: + +| 源分支 | Docusaurus 版本 / 路由段 | UI 展示 | +|--------|--------------------------|---------| +| `release-1.5.0` | `docusaurus-1.5.0` | `1.5.0` | +| `release-1.3.0` | `docusaurus-1.3.0` | `1.3.0` | +| `release-1.2.0` | `docusaurus-1.2.0` | `1.2.0` | +| `release-1.0.0` | `docusaurus-1.0.0` | `1.0.0` | +| `release-0.11` | `docusaurus-0.11` | `0.11` | +| `release-0.10` | `docusaurus-0.10` | `0.10` | + +UI 不展示源分支的 `release-` 前缀。上表中的归档 release 分支是在这次 Docusaurus 迁移之前编写的,所以为了让这些历史快照可以被 Docusaurus 预览,相关导入修补都被限制在 `src/data/versions.json` 的 `legacyCompatibility` 下。这一层只用于适配这些旧分支,不属于正常的文档编写或版本生成流水线。未来 Docusaurus 原生的发布分支应保持标准的 `content/{en,cn}/docs` 目录,不应依赖这些适配项。 + +上表里的 `docusaurus-*` 是 Docusaurus 版本名和路由段,不一定是 Git 分支名。实际内容来源始终由配置中的 `sourceRef` 决定。例如 `1.5.0` 当前从 Git 分支 `release-1.5.0` 读取内容,并发布到 Docusaurus 路由段 `docusaurus-1.5.0`。 + +本地生成 Docusaurus 版本文件: + +```bash +npm run docs:versions:prepare +``` + +该命令会生成 `versioned_docs/`、`versioned_sidebars/`、`versions.json`、`docs-cn_versioned_docs/`、`docs-cn_versioned_sidebars/` 和 `docs-cn_versions.json`。这些是构建输入,不作为源码提交。 + +更新发布版本时,请修改 `src/data/versions.json` 中的 `label`、`docusaurusVersion`、`path`、`cnPath`、`githubTagUrl` 和 `sourceRef`。该 ref 需要已经 fetch 到本地,然后运行 `npm run docs:versions:prepare` 和 `npm run build`。 + +如果要把当前 `next` 文档固化为新的稳定版本,比如 `1.8.0`,请先从已准备发布的文档状态创建一个长期存在的 Docusaurus 原生 source branch: + +```bash +git checkout master +git pull +git checkout -b docusaurus-1.8.0 +git push origin docusaurus-1.8.0 +``` + +然后在 `master` 上更新 `src/data/versions.json`:将 `stable.sourceRef` 指向 `docusaurus-1.8.0`,将 stable label 改成 `Stable (1.8.0)`;如果旧 stable 仍需保留入口,则新增归档版本 `1.7.0`,并让它的 `sourceRef` 指向 `docusaurus-1.7.0`。这种 Docusaurus 原生固化分支不应需要 `legacyCompatibility`。 + +版本元数据合入 `master` 后,生产部署会自动完成。`.github/workflows/docusaurus.yml` 会在 `master` 上执行 `npm run build`,根据各版本配置的 `sourceRef` 生成版本快照,并把 `./build` 发布到 `asf-site` 分支。`.asf.yaml` 会从 `asf-site` 发布正式站点;`asf-staging` 只用于 merge 前的手动预览验证。 + +只有归档的 pre-Docusaurus 分支才应该使用 `legacyCompatibility` 下的 `sourcePaths`、`sourceIncludes`、`sourceOverlays`、`indexFrom` 或 Markdown normalization。这些字段用于记录旧快照的兼容目的,不是新文档的开发规范。 + +不要在导航中模糊使用 `latest`:`stable` 表示最新已发布版本,`next` 表示未发布开发中文档。 + +### 团队和用户数据 + +Team 页面位于 `/team/` 与 `/cn/team/`,数据来自 `src/data/team.js`,当前基于 ASF 公开 roster。PMC 或 committer 变化时请更新该数据文件,并保留公开来源。 + +用户案例页面位于 `/users/` 与 `/cn/users/`,数据来自 `src/data/users.js`,当前基于 [apache/hugegraph#1651](https://github.com/apache/hugegraph/issues/1651) 的公开提交。不要加入未经公开授权的公司名、Logo、引用或部署细节;如果仓库中没有已授权 Logo,则保持为空,页面会展示缩写占位。 + +### 内容可见性 + +| 状态 | Front matter | 生产行为 | +|------|--------------|----------| +| Public | 默认 | 正常出现在导航和生成内容中 | +| Draft | `draft: true` | Docusaurus 在生产构建中排除 | +| Unlisted | `unlisted: true` | 可通过直链访问,但不进入导航、列表、feed 和索引发现;Docusaurus 会添加 noindex/nofollow | +| Placeholder | `placeholder: true`, `unlisted: true`, `noindex: true` | 只保留短占位内容,用于预留 URL | +| Private | `private: true` | 生产构建失败,除非在非公开预览环境显式设置 `ALLOW_PRIVATE_CONTENT=true` | + +静态站点前端不提供真正的加密或访问控制。不要把敏感内容放进会发布的 Markdown、MDX、静态资源、HTML、JS bundle、source map 或 JSON 中;真正的私有访问必须由托管平台、反向代理、认证网关或非公开预览环境实现。 + ### 如何贡献 #### 贡献流程 @@ -161,29 +332,33 @@ hugegraph-doc/ |------|------| | **双语更新** | 修改内容时需**同时更新** `content/cn/` 和 `content/en/` | | **PR 截图** | 提交 PR 时需附上修改**前后对比截图** | -| **Markdown** | 文档使用 Markdown 格式,带 Hugo front matter | +| **Markdown** | 文档使用 Markdown 格式,带 front matter | #### 详细指南 查看 [contribution.md](./contribution.md) 了解: -- 各平台 Hugo 安装方法 -- Docsy 主题定制 +- 本地开发环境配置 +- Docusaurus 主题定制 - 翻译技巧 ### 常用命令 | 命令 | 说明 | |------|------| -| `hugo server` | 启动开发服务器(热重载) | -| `hugo --minify` | 构建生产版本到 `./public/` | -| `hugo server -p 8080` | 指定端口 | +| `npm run start` | 启动开发服务器(热重载) | +| `npm run build` | 构建生产版本到 `./build/` | +| `npm run serve` | 本地预览生产构建 | +| `npm run check:content-visibility` | 检查并阻断生产不安全的私有内容 | +| `npm run docs:versions:prepare` | 从配置的 Git ref 生成 Docusaurus 版本文件 | +| `npm run docs:versions:list` | 输出当前配置的文档版本 | +| `npm run validate` | 构建、检查内容清单并运行无头 UI 校验 | --- ## Contact & Community - **Issues:** [GitHub Issues](https://github.com/apache/hugegraph-doc/issues) -- **Mailing List:** [dev@hugegraph.apache.org](mailto:dev@hugegraph.apache.org) ([subscribe first](https://hugegraph.apache.org/docs/contribution-guidelines/subscribe/)) +- **Mailing List:** [dev@hugegraph.apache.org](mailto:dev@hugegraph.apache.org) ([subscribe first](https://hugegraph.apache.org/community/contribution-guidelines/subscribe/)) - **Slack:** [ASF Slack](https://the-asf.slack.com/archives/C059UU2FJ23) WeChat QR Code diff --git a/content/cn/blog/hugegraph-ai/agentic_graphrag.md b/content/cn/blog/hugegraph-ai/agentic_graphrag.md index a41168490..7d6cab18f 100644 --- a/content/cn/blog/hugegraph-ai/agentic_graphrag.md +++ b/content/cn/blog/hugegraph-ai/agentic_graphrag.md @@ -24,7 +24,7 @@ linkTitle: "Agentic GraphRAG:模块化架构实践" 2. Online: 当GraphRAG系统接收到用户问题时,根据图数据库捕捉到的语料库中不同实体之间的关联关系,我们可以从图数据库中抓取到上面的三句话(具体图数据库索引可能如下图所示)
- image + image
但是GraphRAG本身也存在几个问题: @@ -169,7 +169,7 @@ Agno专门设计了并行接口,我们需要在静态编译时(Python哪有 我们从官方文档中就看到
- image + image
Pydantic-Ai框架竟然不支持Task粒度的自动并行。 @@ -252,7 +252,7 @@ state = chain.invoke({"topic": "cats"} 我们相信,优秀的技术选型,不仅是功能的匹配,更是对项目未来潜力的认同。(欢迎一同见证它的成长:https://github.com/ChunelFeng/CGraph)
- image + image
## 架构设计 @@ -272,7 +272,7 @@ state = chain.invoke({"topic": "cats"} 3. 通过引入新的Node抽象,我们在重构的过程中不需要修改底层Operator的实现,减轻了重构过程中的心智负担。
- image + image
既然我们希望跨请求复用同类Workflow,那么我们就需要保证Workflow本身是无状态的,因为如果复用的Workflow还带着上一个请求的状态,用户就可能得到发生意料之外的结果。而Workflow的状态可以分为两种: @@ -295,7 +295,7 @@ state = chain.invoke({"topic": "cats"} 这样我们可以保证每次Workflow执行时这两种状态中都只包含本次请求的状态。由于WorkflowInput状态在Workflow执行结束就被重置了,我们只能从WorkflowState中有选择性地选择部分数据返回给用户。因此我们得到了一个Flow抽象应该实现的接口。
- image + image
```python @@ -410,7 +410,7 @@ class BaseNode(GNode): 现在我们可以得到整个项目的整体架构图
- image + image
1. Scheduler收到请求后,首先向PipelinePool查询是否存在对应类型的空闲Pipeline @@ -458,4 +458,4 @@ class BaseNode(GNode): 这也让我们更加坚信:一个产品或技术最终被选择,往往不只因其理念的先进,更在于它能否在复杂的现实约束下,为特定问题提供最务实的解法。 -项目暂告一段落,由衷感谢每一位并肩作战的伙伴!这段经历因你们而精彩。 \ No newline at end of file +项目暂告一段落,由衷感谢每一位并肩作战的伙伴!这段经历因你们而精彩。 diff --git a/content/cn/blog/hugegraph/toplingdb/toplingdb-configuration-yaml.md b/content/cn/blog/hugegraph/toplingdb/toplingdb-configuration-yaml.md index 33561ec42..dd658bbe2 100644 --- a/content/cn/blog/hugegraph/toplingdb/toplingdb-configuration-yaml.md +++ b/content/cn/blog/hugegraph/toplingdb/toplingdb-configuration-yaml.md @@ -176,7 +176,7 @@ DBOptions: ToplingDB YAML 引用与复用图示:
- image + image
这种机制使得配置更灵活,便于在复杂场景下组合不同组件。 diff --git a/content/cn/blog/hugegraph/toplingdb/toplingdb-quick-start.md b/content/cn/blog/hugegraph/toplingdb/toplingdb-quick-start.md index 15e293479..a73dadeb7 100644 --- a/content/cn/blog/hugegraph/toplingdb/toplingdb-quick-start.md +++ b/content/cn/blog/hugegraph/toplingdb/toplingdb-quick-start.md @@ -66,7 +66,7 @@ rocksdb.open_http=true 可视化访问Web监控页面,页面示例如下图所示:
- image + image
通过终端验证: diff --git a/content/cn/blog/site-infrastructure/codex-docusaurus-private-preview.md b/content/cn/blog/site-infrastructure/codex-docusaurus-private-preview.md new file mode 100644 index 000000000..0803be4fe --- /dev/null +++ b/content/cn/blog/site-infrastructure/codex-docusaurus-private-preview.md @@ -0,0 +1,11 @@ +--- +date: 2026-05-06 +title: "Codex Docusaurus 迁移私有预览" +linkTitle: "私有预览流程示例" +slug: /2026/05/06/codex-docusaurus-migration-private-preview +unlisted: true +noindex: true +placeholder: true +--- + +这个预留的博客 URL 用于演示安全私有预览流程,示例背景是 Codex goal 将 HugeGraph 文档仓库重构为 Docusaurus。敏感草稿不会进入静态构建;这里只应发布经过确认的公开内容。 diff --git a/content/cn/community/_index.md b/content/cn/community/_index.md index e1a40e16b..b7fd76147 100644 --- a/content/cn/community/_index.md +++ b/content/cn/community/_index.md @@ -1,8 +1,10 @@ --- -title: Community +title: 社区 +linkTitle: 社区 +weight: 1 menu: main: weight: 40 --- -查看 [项目成熟度](/community/maturity/) 评估。 +可以先查看 [贡献指南](/cn/community/contribution-guidelines/);英文版 [项目成熟度](/community/maturity/) 评估也保留供参考。 diff --git a/content/cn/community/contribution-guidelines/_index.md b/content/cn/community/contribution-guidelines/_index.md new file mode 100755 index 000000000..45c6b34c5 --- /dev/null +++ b/content/cn/community/contribution-guidelines/_index.md @@ -0,0 +1,7 @@ +--- +title: "社区贡献指南" +linkTitle: "贡献指南" +weight: 2 +aliases: + - /cn/docs/contribution-guidelines/ +--- diff --git a/content/cn/docs/CLA.md b/content/cn/community/contribution-guidelines/cla.md similarity index 98% rename from content/cn/docs/CLA.md rename to content/cn/community/contribution-guidelines/cla.md index 784a53a62..3f9a45ad2 100644 --- a/content/cn/docs/CLA.md +++ b/content/cn/community/contribution-guidelines/cla.md @@ -1,3 +1,11 @@ +--- +title: "Contributor License Agreement" +linkTitle: "CLA" +weight: 6 +aliases: + - /cn/docs/CLA/ +--- + ## Contributor Agreement ## Individual Contributor exclusive License Agreement diff --git a/content/cn/docs/contribution-guidelines/committer-guidelines.md b/content/cn/community/contribution-guidelines/committer-guidelines.md similarity index 98% rename from content/cn/docs/contribution-guidelines/committer-guidelines.md rename to content/cn/community/contribution-guidelines/committer-guidelines.md index f77129418..19cbbdaaa 100644 --- a/content/cn/docs/contribution-guidelines/committer-guidelines.md +++ b/content/cn/community/contribution-guidelines/committer-guidelines.md @@ -2,6 +2,8 @@ title: "Apache HugeGraph Committer 指南" linkTitle: "Apache HugeGraph Committer 指南" weight: 5 +aliases: + - /cn/docs/contribution-guidelines/committer-guidelines/ --- > 本文档概述了 Apache Committer 推选要求以及流程,对应的 ASF 官方文档可见:https://community.apache.org/newcommitter.html @@ -244,7 +246,7 @@ xxx 一旦邀请被接受,候选人需要完成以下事项: -- 订阅 dev@hugegraph.apache.org,具体步骤/过滤等配置请参考[文档](https://hugegraph.apache.org/docs/contribution-guidelines/subscribe/) +- 订阅 dev@hugegraph.apache.org,具体步骤/过滤等配置请参考[文档](https://hugegraph.apache.org/cn/community/contribution-guidelines/subscribe/) - 签署 [ICLA](https://www.apache.org/licenses/icla.pdf),具体步骤见下↓ ### ICLA 签署流程 diff --git a/content/cn/docs/contribution-guidelines/contribute.md b/content/cn/community/contribution-guidelines/contribute.md similarity index 94% rename from content/cn/docs/contribution-guidelines/contribute.md rename to content/cn/community/contribution-guidelines/contribute.md index 5f4407c17..818247131 100644 --- a/content/cn/docs/contribution-guidelines/contribute.md +++ b/content/cn/community/contribution-guidelines/contribute.md @@ -2,6 +2,8 @@ title: "如何参与 HugeGraph 社区" linkTitle: "如何参与 HugeGraph 社区" weight: 1 +aliases: + - /cn/docs/contribution-guidelines/contribute/ --- > TODO: translate this article to Chinese @@ -10,7 +12,7 @@ Thanks for taking the time to contribute! As an open source project, HugeGraph i The following is a contribution guide for HugeGraph: -image +image ## 1. Preparation @@ -123,14 +125,14 @@ git push origin bugfix-branch:bugfix-branch ``` Note that since GitHub requires submitting code through `username + token` (instead of using `username + password` directly), you need to create a GitHub token from https://github.com/settings/tokens: -image +image ## 4. Create a Pull Request Go to the web page of GitHub fork repo, there would be a chance to create a Pull Request after pushing to a new branch, just click button "Compare & pull request" to do it. Then edit the description for proposed changes, which can just be copied from the commit message. Note: please make sure the email address you used to submit the code is bound to the GitHub account. For how to bind the email address, please refer to https://github.com/settings/emails: -image +image ## 5. Code review diff --git a/content/cn/docs/contribution-guidelines/hugegraph-server-idea-setup.md b/content/cn/community/contribution-guidelines/hugegraph-server-idea-setup.md similarity index 96% rename from content/cn/docs/contribution-guidelines/hugegraph-server-idea-setup.md rename to content/cn/community/contribution-guidelines/hugegraph-server-idea-setup.md index 8561312e5..73e1261a6 100644 --- a/content/cn/docs/contribution-guidelines/hugegraph-server-idea-setup.md +++ b/content/cn/community/contribution-guidelines/hugegraph-server-idea-setup.md @@ -2,13 +2,15 @@ title: "在 IDEA 中配置 Server 开发环境" linkTitle: "在 IDEA 中配置 Server 开发环境" weight: 4 +aliases: + - /cn/docs/contribution-guidelines/hugegraph-server-idea-setup/ --- > 注意:下述配置仅供参考,基于[这个版本](https://github.com/apache/hugegraph/commit/a946ad1de4e8f922251a5241ffc957c33379677f),在 Linux 和 macOS 平台下进行了测试。 ### 背景 -在 [Quick Start](/docs/quickstart/hugegraph/hugegraph-server/) 部分已经介绍了使用**脚本**启停 HugeGraph-Server 的流程。下面以 Linux 平台为例, +在 [Quick Start](/cn/docs/quickstart/hugegraph/hugegraph-server/) 部分已经介绍了使用**脚本**启停 HugeGraph-Server 的流程。下面以 Linux 平台为例, 介绍使用 **IntelliJ IDEA** 运行与调试 HugeGraph-Server 的流程。 本地启动的核心与**脚本启动**是一样的: @@ -167,7 +169,7 @@ curl "http://localhost:8080/graphs/hugegraph/graph/vertices" | gunzip ##### 参考 -1. [HugeGraph-Server Quick Start](/docs/quickstart/hugegraph/hugegraph-server/) +1. [HugeGraph-Server Quick Start](/cn/docs/quickstart/hugegraph/hugegraph-server/) 2. [hugegraph-server 本地调试文档 (Win/Unix)](https://gist.github.com/imbajin/1661450f000cd62a67e46d4f1abfe82c) 3. ["package sun.misc does not exist" compilation error](https://youtrack.jetbrains.com/issue/IDEA-180033) 4. [Cannot compile: java: package sun.misc does not exist](https://youtrack.jetbrains.com/issue/IDEA-201168) diff --git a/content/cn/docs/contribution-guidelines/subscribe.md b/content/cn/community/contribution-guidelines/subscribe.md similarity index 97% rename from content/cn/docs/contribution-guidelines/subscribe.md rename to content/cn/community/contribution-guidelines/subscribe.md index 1d824f240..d475e6bbe 100644 --- a/content/cn/docs/contribution-guidelines/subscribe.md +++ b/content/cn/community/contribution-guidelines/subscribe.md @@ -2,6 +2,8 @@ title: "订阅社区邮箱" linkTitle: "订阅社区邮箱" weight: 2 +aliases: + - /cn/docs/contribution-guidelines/subscribe/ --- 按照以下步骤订阅邮件列表: diff --git a/content/cn/docs/contribution-guidelines/validate-release.md b/content/cn/community/contribution-guidelines/validate-release.md similarity index 99% rename from content/cn/docs/contribution-guidelines/validate-release.md rename to content/cn/community/contribution-guidelines/validate-release.md index 7e5032158..808a7a728 100644 --- a/content/cn/docs/contribution-guidelines/validate-release.md +++ b/content/cn/community/contribution-guidelines/validate-release.md @@ -2,6 +2,8 @@ title: "验证 Apache 发版" linkTitle: "验证 Apache 发版" weight: 3 +aliases: + - /cn/docs/contribution-guidelines/validate-release/ --- > Note: 这篇文档会持续更新。 diff --git a/content/cn/docs/_index.md b/content/cn/docs/_index.md index 82bd55a87..bae33c212 100755 --- a/content/cn/docs/_index.md +++ b/content/cn/docs/_index.md @@ -1,6 +1,6 @@ --- -title: "Documentation" -linkTitle: "Documentation" +title: "文档" +linkTitle: "文档" weight: 20 menu: main: diff --git a/content/cn/docs/changelog/_index.md b/content/cn/docs/changelog/_index.md index 41b3951bd..6b4e384e1 100644 --- a/content/cn/docs/changelog/_index.md +++ b/content/cn/docs/changelog/_index.md @@ -1,5 +1,5 @@ --- -title: "CHANGELOGS" -linkTitle: "CHANGELOGS" +title: "版本日志" +linkTitle: "版本日志" weight: 10 ---- \ No newline at end of file +--- diff --git a/content/cn/docs/clients/_index.md b/content/cn/docs/clients/_index.md index d3395c548..513bc86de 100644 --- a/content/cn/docs/clients/_index.md +++ b/content/cn/docs/clients/_index.md @@ -1,5 +1,5 @@ --- -title: "API" -linkTitle: "API" +title: "客户端与 API" +linkTitle: "客户端与 API" weight: 5 ---- \ No newline at end of file +--- diff --git a/content/cn/docs/clients/restful-api/_index.md b/content/cn/docs/clients/restful-api/_index.md index 67097fa59..16ff54de2 100644 --- a/content/cn/docs/clients/restful-api/_index.md +++ b/content/cn/docs/clients/restful-api/_index.md @@ -11,7 +11,7 @@ weight: 1 > - 默认图空间名称为 `DEFAULT`,可直接使用 > - 旧版本 doc 参考:[HugeGraph 1.5.x RESTful API](https://github.com/apache/hugegraph-doc/tree/release-1.5.0) -除了下方的文档,你还可以通过 `localhost:8080/swagger-ui/index.html` 访问 `swagger-ui` 以查看 `RESTful API`。[示例可以参考此处](/cn/docs/quickstart/hugegraph/hugegraph-server#swaggerui-example) +除了下方的文档,你还可以通过 `localhost:8080/swagger-ui/index.html` 访问 `swagger-ui` 以查看 `RESTful API`。[示例可以参考此处](/cn/docs/quickstart/hugegraph/hugegraph-server/#62-请求-server) [comment]: <> (- Graph Schema) diff --git a/content/cn/docs/clients/restful-api/auth.md b/content/cn/docs/clients/restful-api/auth.md index ffcc7b929..c27138002 100644 --- a/content/cn/docs/clients/restful-api/auth.md +++ b/content/cn/docs/clients/restful-api/auth.md @@ -1049,7 +1049,7 @@ GET http://localhost:8080/graphspaces/DEFAULT/auth/accesses/S-69:all>-88>11>S-77 ### 10.7 图空间管理员(Manager)API -**重要提示**:在使用以下 API 之前,需要先创建图空间(graphspace)。请参考 [Graphspace API](./graphspace) 创建名为 `gs1` 的图空间。文档中的示例均假设已存在名为 `gs1` 的图空间 +**重要提示**:在使用以下 API 之前,需要先创建图空间(graphspace)。请参考 [Graphspace API](/cn/docs/clients/restful-api/graphspace/) 创建名为 `gs1` 的图空间。文档中的示例均假设已存在名为 `gs1` 的图空间 1. 图空间管理员 API 用于在 graphspace 维度给用户授予/回收管理员角色,并查询当前用户或其他用户在该 graphspace 下的角色信息。角色类型可取 `SPACE`、`SPACE_MEMBER`、`ADMIN` 。 diff --git a/content/cn/docs/clients/restful-api/edgelabel.md b/content/cn/docs/clients/restful-api/edgelabel.md index 33f1ad54a..e0bf38153 100644 --- a/content/cn/docs/clients/restful-api/edgelabel.md +++ b/content/cn/docs/clients/restful-api/edgelabel.md @@ -311,4 +311,4 @@ DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/edgelab 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) diff --git a/content/cn/docs/clients/restful-api/graphs.md b/content/cn/docs/clients/restful-api/graphs.md index 560efc610..5f2d94ea5 100644 --- a/content/cn/docs/clients/restful-api/graphs.md +++ b/content/cn/docs/clients/restful-api/graphs.md @@ -175,7 +175,7 @@ POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph-xx **注意**!! 1. 在 1.7.0 版本中,动态创建图会导致 NPE 错误。该问题已在 [PR#2912](https://github.com/apache/hugegraph/pull/2912) 中修复。当前 master 版本和 1.7.0 之前的版本不受此问题影响。 -2. 1.7.0 及之前版本,如果 backend 是 hstore,必须在请求体加上 "task.scheduler_type": "distributed"。同时请确保 HugeGraph-Server 已正确配置 PD,参见 [HStore 配置](/cn/docs/quickstart/hugegraph/hugegraph-server/#511-分布式存储hstore)。 +2. 1.7.0 及之前版本,如果 backend 是 hstore,必须在请求体加上 "task.scheduler_type": "distributed"。同时请确保 HugeGraph-Server 已正确配置 PD,参见 [HStore 配置](/cn/docs/quickstart/hugegraph/hugegraph-server/#511-分布式存储-hstore)。 **RocksDB 示例:** @@ -508,4 +508,4 @@ PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/compact "local": "OK" } } -``` \ No newline at end of file +``` diff --git a/content/cn/docs/clients/restful-api/gremlin.md b/content/cn/docs/clients/restful-api/gremlin.md index 52642f56b..ccf063bec 100644 --- a/content/cn/docs/clients/restful-api/gremlin.md +++ b/content/cn/docs/clients/restful-api/gremlin.md @@ -234,7 +234,7 @@ POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/gremlin 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) **查询边** @@ -265,4 +265,4 @@ POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/gremlin 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2`(其中"2"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2`(其中"2"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) diff --git a/content/cn/docs/clients/restful-api/indexlabel.md b/content/cn/docs/clients/restful-api/indexlabel.md index 0a51d23fd..9975258f9 100644 --- a/content/cn/docs/clients/restful-api/indexlabel.md +++ b/content/cn/docs/clients/restful-api/indexlabel.md @@ -174,4 +174,4 @@ DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/indexla 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) diff --git a/content/cn/docs/clients/restful-api/rebuild.md b/content/cn/docs/clients/restful-api/rebuild.md index db6281ac6..bdde3b49e 100644 --- a/content/cn/docs/clients/restful-api/rebuild.md +++ b/content/cn/docs/clients/restful-api/rebuild.md @@ -31,7 +31,7 @@ PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/rebuild/inde 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) #### 1.6.2 VertexLabel 对应的全部索引重建 @@ -57,7 +57,7 @@ PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/rebuild/vert 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2`(其中"2"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2`(其中"2"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) #### 1.6.3 EdgeLabel 对应的全部索引重建 @@ -83,4 +83,4 @@ PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/rebuild/edge 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/3`(其中"3"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/3`(其中"3"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) diff --git a/content/cn/docs/clients/restful-api/traverser.md b/content/cn/docs/clients/restful-api/traverser.md index 3d4f210b4..efd4ec885 100644 --- a/content/cn/docs/clients/restful-api/traverser.md +++ b/content/cn/docs/clients/restful-api/traverser.md @@ -55,7 +55,7 @@ HugeGraph 支持的 Traverser API 包括: 使用方法中的例子,都是基于 TinkerPop 官网给出的图: -![tinkerpop 示例图](http://tinkerpop.apache.org/docs/3.4.0/images/tinkerpop-modern.png) +![tinkerpop 示例图](/img/docs/clients/restful-api/tinkerpop-modern.png) 数据导入程序如下: diff --git a/content/cn/docs/clients/restful-api/vertexlabel.md b/content/cn/docs/clients/restful-api/vertexlabel.md index 9d15589fb..2f8033f16 100644 --- a/content/cn/docs/clients/restful-api/vertexlabel.md +++ b/content/cn/docs/clients/restful-api/vertexlabel.md @@ -308,4 +308,4 @@ DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/vertexl 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) diff --git a/content/cn/docs/config/_index.md b/content/cn/docs/config/_index.md index ce83888d7..9686cb4e3 100644 --- a/content/cn/docs/config/_index.md +++ b/content/cn/docs/config/_index.md @@ -1,6 +1,6 @@ --- -title: "HugeGraph-Server 配置" -linkTitle: "Server 配置" +title: "配置" +linkTitle: "配置" weight: 4 --- @@ -9,4 +9,4 @@ weight: 4 - **[Server 启动指南](config-guide)** - 了解配置文件结构和基本配置方法 - **[Server 完整配置手册](config-option)** - 完整的配置选项列表和说明 - **[权限配置](config-authentication)** - 用户认证和授权配置 -- **[HTTPS 配置](config-https)** - 启用 HTTPS 安全协议 \ No newline at end of file +- **[HTTPS 配置](config-https)** - 启用 HTTPS 安全协议 diff --git a/content/cn/docs/config/config-guide.md b/content/cn/docs/config/config-guide.md index fed7ba856..0871474f2 100644 --- a/content/cn/docs/config/config-guide.md +++ b/content/cn/docs/config/config-guide.md @@ -138,7 +138,7 @@ ssl: { - graphs:GremlinServer 启动时需要打开的图,该项是一个 map 结构,key 是图的名字,value 是该图的配置文件路径; - channelizer:GremlinServer 与客户端有两种通信方式,分别是 WebSocket 和 HTTP(默认)。如果选择 WebSocket, -用户可以通过 [Gremlin-Console](../clients/gremlin-console) 快速体验 HugeGraph 的特性,但是不支持大规模数据导入, +用户可以通过 [Gremlin-Console](/cn/docs/clients/gremlin-console/) 快速体验 HugeGraph 的特性,但是不支持大规模数据导入, 推荐使用 HTTP 的通信方式,HugeGraph 的外围组件都是基于 HTTP 实现的; 默认 GremlinServer 是服务在 localhost:8182,如果需要修改,配置 host、port 即可 @@ -146,7 +146,7 @@ ssl: { - host:部署 GremlinServer 机器的机器名或 IP,目前 HugeGraphServer 不支持分布式部署,且 GremlinServer 不直接暴露给用户; - port:部署 GremlinServer 机器的端口; -同时需要在 rest-server.properties 中增加对应的配置项 gremlinserver.url=http://host:port +同时需要在 rest-server.properties 中增加对应的配置项 `gremlinserver.url=http://host:port` ### 3 rest-server.properties @@ -215,7 +215,7 @@ memory_monitor.period=2000 > 注意:gremlin-server.yaml 和 rest-server.properties 都包含 graphs 配置项,而 `init-store` 命令是根据 gremlin-server.yaml 的 graphs 下的图进行初始化的。 -> 配置项 gremlinserver.url 是 GremlinServer 为 RestServer 提供服务的 url,该配置项默认为 http://localhost:8182,如需修改,需要和 gremlin-server.yaml 中的 host 和 port 相匹配; +> 配置项 gremlinserver.url 是 GremlinServer 为 RestServer 提供服务的 url,该配置项默认为 `http://localhost:8182`,如需修改,需要和 gremlin-server.yaml 中的 host 和 port 相匹配; ### 4 hugegraph.properties diff --git a/content/cn/docs/contribution-guidelines/_index.md b/content/cn/docs/contribution-guidelines/_index.md deleted file mode 100755 index 2cdf8103d..000000000 --- a/content/cn/docs/contribution-guidelines/_index.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "Contribution Guidelines" -linkTitle: "Contribution Guidelines" -weight: 9 ---- diff --git a/content/cn/docs/guides/_index.md b/content/cn/docs/guides/_index.md index b0b4c0252..aea1d6ab0 100644 --- a/content/cn/docs/guides/_index.md +++ b/content/cn/docs/guides/_index.md @@ -1,5 +1,5 @@ --- -title: "GUIDES" -linkTitle: "GUIDES" +title: "指南" +linkTitle: "指南" weight: 6 ---- \ No newline at end of file +--- diff --git a/content/cn/docs/guides/architectural.md b/content/cn/docs/guides/architectural.md index 509686dc4..19e88a0a7 100644 --- a/content/cn/docs/guides/architectural.md +++ b/content/cn/docs/guides/architectural.md @@ -11,7 +11,7 @@ weight: 1 下面是 HugeGraph 的整体架构图:
- image + image
HugeGraph 包括三个层次的功能,分别是应用程序层、图引擎层和存储层。 diff --git a/content/cn/docs/guides/desgin-concept.md b/content/cn/docs/guides/desgin-concept.md index 3a678f096..9d17037ab 100644 --- a/content/cn/docs/guides/desgin-concept.md +++ b/content/cn/docs/guides/desgin-concept.md @@ -11,7 +11,7 @@ RDF是W3C标准,而Property Graph是工业标准,受到广大图数据库厂 HugeGraph对应的存储概念模型也是参考Property Graph而设计的,具体示例详见下图:(*此图为旧版设计已过时,请忽略它,后续更新*) -![image](/docs/images/design/PropertyGraph.png) +![image](/img/docs/design/PropertyGraph.png) 在HugeGraph内部,每个顶点 / 边由唯一的 VertexId / EdgeId 标识,属性存储在对应点 / 边内部。而顶点与顶点之间的关系 / 映射则是通过边来存储的。 @@ -24,7 +24,7 @@ HugeGraph对应的存储概念模型也是参考Property Graph而设计的,具 使用Edge Cut方式存储图时,任何一个顶点只会出现在一台机器上,而边可能分布在不同机器上,这种存储方式有可能导致边多次存储。 使用Vertex Cut方式存储图时,任何一条边只会出现在一台机器上,而每相同的一个点可能分布到不同机器上,这种存储方式可能会导致顶点多次存储。 -![image](/docs/images/design/GraphCut.png) +![image](/img/docs/design/GraphCut.png) 采用EdgeCut分区方案可以支持高性能的插入和更新操作,而VertexCut分区方案更适合静态图查询分析,因此EdgeCut适合OLTP图查询,VertexCut更适合OLAP的图查询。 HugeGraph目前采用EdgeCut的分区方案。 diff --git a/content/cn/docs/guides/toolchain-local-test.md b/content/cn/docs/guides/toolchain-local-test.md index 0aae55fe4..dfb33bdf7 100644 --- a/content/cn/docs/guides/toolchain-local-test.md +++ b/content/cn/docs/guides/toolchain-local-test.md @@ -250,7 +250,7 @@ docker compose down 各工具的测试流程:
- HugeGraph工具链测试流程图 + HugeGraph工具链测试流程图
### 4.1 hugegraph-client diff --git a/content/cn/docs/introduction/_index.md b/content/cn/docs/introduction/_index.md index a586f1081..6da63a13e 100644 --- a/content/cn/docs/introduction/_index.md +++ b/content/cn/docs/introduction/_index.md @@ -1,6 +1,6 @@ --- -title: "Introduction with HugeGraph" -linkTitle: "Introduction" +title: "HugeGraph 简介" +linkTitle: "简介" weight: 1 aliases: - /cn/docs/introduction/readme/ @@ -93,7 +93,7 @@ HugeGraph 独立的 AI 组件,连接图与大语言模型(LLM): | [Hubble](/cn/docs/quickstart/toolchain/hugegraph-hubble) | Web 可视化平台:数据建模 → 批量导入 → 在线/离线分析 一站式操作 | | [Loader](/cn/docs/quickstart/toolchain/hugegraph-loader) | 数据导入工具:支持本地文件、HDFS、MySQL 等多数据源,TXT/CSV/JSON 等格式 | | [Client](/cn/docs/quickstart/client/hugegraph-client) | 多语言 SDK:Java / Python / Go | -| [Spark-connector](/cn/docs/quickstart/toolchain/hugegraph-spark-connector) | Spark 集成:支持通过 Spark 批量读写图数据,适合大数据离线处理场景 | +| [Spark-connector](../quickstart/toolchain/hugegraph-spark-connector/) | Spark 集成:支持通过 Spark 批量读写图数据,适合大数据离线处理场景 | | [Tools](/cn/docs/quickstart/toolchain/hugegraph-tools) | 命令行运维工具:图管理、备份恢复、Gremlin 执行等 | --- @@ -141,8 +141,8 @@ docker run -itd --name=hugegraph -p 8080:8080 hugegraph/hugegraph ### 联系我们 - [GitHub Issues](https://github.com/apache/hugegraph/issues):问题反馈与功能建议(推荐) -- 邮件:[dev@hugegraph.apache.org](mailto:dev@hugegraph.apache.org)([订阅方式](/cn/docs/contribution-guidelines/subscribe/)) +- 邮件:[dev@hugegraph.apache.org](mailto:dev@hugegraph.apache.org)([订阅方式](/cn/community/contribution-guidelines/subscribe/)) - 安全问题:[security@hugegraph.apache.org](mailto:security@hugegraph.apache.org) - 微信公众号:Apache HugeGraph -微信公众号二维码 +微信公众号二维码 diff --git a/content/cn/docs/language/_index.md b/content/cn/docs/language/_index.md index eaacdd517..54a1e472b 100644 --- a/content/cn/docs/language/_index.md +++ b/content/cn/docs/language/_index.md @@ -1,5 +1,5 @@ --- -title: "QUERY LANGUAGE" -linkTitle: "QUERY LANGUAGE" +title: "查询语言" +linkTitle: "查询语言" weight: 7 ---- \ No newline at end of file +--- diff --git a/content/cn/docs/language/hugegraph-example.md b/content/cn/docs/language/hugegraph-example.md index 3bb98a4fe..caee56381 100644 --- a/content/cn/docs/language/hugegraph-example.md +++ b/content/cn/docs/language/hugegraph-example.md @@ -26,7 +26,7 @@ HugeGraph 相对于 TitanDB 而言,其主要特点如下: 本示例通过 Property Graph Model 图数据模型来描述希腊神话中各人物角色的关系(也被成为人物关系图谱),具体关系详见下图。
- image + image
diff --git a/content/cn/docs/performance/_index.md b/content/cn/docs/performance/_index.md index 90eb661c2..15383c585 100644 --- a/content/cn/docs/performance/_index.md +++ b/content/cn/docs/performance/_index.md @@ -1,5 +1,5 @@ --- -title: "PERFORMANCE" -linkTitle: "PERFORMANCE" +title: "性能" +linkTitle: "性能" weight: 8 ---- \ No newline at end of file +--- diff --git a/content/cn/docs/performance/api-performance/_index.md b/content/cn/docs/performance/api-performance/_index.md index 7fc78749a..1cc4209f3 100644 --- a/content/cn/docs/performance/api-performance/_index.md +++ b/content/cn/docs/performance/api-performance/_index.md @@ -12,8 +12,7 @@ HugeGraph API性能测试主要测试HugeGraph-Server对RESTful API请求的并 HugeGraph的每个发布版本的RESTful API的性能测试情况可以参考: -- [v0.5.6 stand-alone](/docs/performance/api-performance/hugegraph-api-0.5.6-rocksdb/) -- [v0.5.6 cluster](/docs/performance/api-performance/hugegraph-api-0.5.6-cassandra/) +- [v0.5.6 stand-alone](hugegraph-api-0.5.6-rocksdb/) +- [v0.5.6 cluster](hugegraph-api-0.5.6-cassandra/) > 即将更新,敬请期待! - diff --git a/content/cn/docs/performance/api-performance/hugegraph-api-0.4.4.md b/content/cn/docs/performance/api-performance/hugegraph-api-0.4.4.md index f0e53f7b6..2d644cee5 100644 --- a/content/cn/docs/performance/api-performance/hugegraph-api-0.4.4.md +++ b/content/cn/docs/performance/api-performance/hugegraph-api-0.4.4.md @@ -63,7 +63,7 @@ weight: 3 ###### 顶点和边的最大插入速度(高性能服务器,使用SSD存储RocksDB数据):
- image + image
@@ -75,7 +75,7 @@ weight: 3 **1\. CPU和内存对插入性能的影响(服务器都使用HDD存储RocksDB数据,批量插入)**
- image + image
@@ -88,7 +88,7 @@ weight: 3 **2\. SSD和HDD对插入性能的影响(高性能服务器,批量插入)**
- image + image
@@ -100,7 +100,7 @@ weight: 3 **3\. 不同并发线程数对插入性能的影响(普通服务器,使用HDD存储RocksDB数据)**
- image + image
@@ -123,7 +123,7 @@ weight: 3 - 服务异常标志:错误率大于0.00%
- image + image
###### 结论: diff --git a/content/cn/docs/performance/api-performance/hugegraph-api-0.5.6-cassandra.md b/content/cn/docs/performance/api-performance/hugegraph-api-0.5.6-cassandra.md index c75ba100c..6b94ab429 100644 --- a/content/cn/docs/performance/api-performance/hugegraph-api-0.5.6-cassandra.md +++ b/content/cn/docs/performance/api-performance/hugegraph-api-0.5.6-cassandra.md @@ -63,7 +63,7 @@ weight: 2 ###### 顶点的最大插入速度:
- image + image
@@ -74,7 +74,7 @@ weight: 2 ###### 边的最大插入速度
- image + image
@@ -98,7 +98,7 @@ weight: 2 ###### 顶点的单条插入
- image + image
@@ -109,7 +109,7 @@ weight: 2 ###### 边的单条插入
- image + image
@@ -133,7 +133,7 @@ weight: 2 ###### 顶点的按 id 查询
- image + image
@@ -144,7 +144,7 @@ weight: 2 ###### 边的按 id 查询
- image + image
###### 结论: diff --git a/content/cn/docs/performance/api-performance/hugegraph-api-0.5.6-rocksdb.md b/content/cn/docs/performance/api-performance/hugegraph-api-0.5.6-rocksdb.md index c921074ce..9b82daf16 100644 --- a/content/cn/docs/performance/api-performance/hugegraph-api-0.5.6-rocksdb.md +++ b/content/cn/docs/performance/api-performance/hugegraph-api-0.5.6-rocksdb.md @@ -63,7 +63,7 @@ weight: 1 ###### 顶点的最大插入速度:
- image + image
@@ -74,7 +74,7 @@ weight: 1 ###### 边的最大插入速度
- image + image
###### 结论: @@ -97,7 +97,7 @@ weight: 1 ###### 顶点的单条插入
- image + image
@@ -108,7 +108,7 @@ weight: 1 ###### 边的单条插入
- image + image
@@ -132,7 +132,7 @@ weight: 1 ###### 顶点的按 id 查询
- image + image
###### 结论: @@ -142,7 +142,7 @@ weight: 1 ###### 边的按 id 查询
- image + image
diff --git a/content/cn/docs/quickstart/_index.md b/content/cn/docs/quickstart/_index.md index 1a116113e..7dd85d16e 100644 --- a/content/cn/docs/quickstart/_index.md +++ b/content/cn/docs/quickstart/_index.md @@ -1,5 +1,5 @@ --- -title: "Quick Start" -linkTitle: "Quick Start" +title: "快速开始" +linkTitle: "快速开始" weight: 3 ---- \ No newline at end of file +--- diff --git a/content/cn/docs/quickstart/client/hugegraph-client-python.md b/content/cn/docs/quickstart/client/hugegraph-client-python.md index d904a6e9f..ceff69cd5 100644 --- a/content/cn/docs/quickstart/client/hugegraph-client-python.md +++ b/content/cn/docs/quickstart/client/hugegraph-client-python.md @@ -182,7 +182,7 @@ print(res) ## 贡献 -* 欢迎为 `hugegraph-python-client` 做出贡献。请参阅 [贡献指南](https://hugegraph.apache.org/docs/contribution-guidelines/) 获取更多信息。 +* 欢迎为 `hugegraph-python-client` 做出贡献。请参阅 [贡献指南](https://hugegraph.apache.org/cn/community/contribution-guidelines/) 获取更多信息。 * 代码格式:请在提交 PR 前运行 `./style/code_format_and_analysis.sh` 来格式化您的代码。 感谢所有已经为 `hugegraph-python-client` 做出贡献的人! diff --git a/content/cn/docs/quickstart/computing/hugegraph-computer.md b/content/cn/docs/quickstart/computing/hugegraph-computer.md index c401ff844..f9dd6da3c 100644 --- a/content/cn/docs/quickstart/computing/hugegraph-computer.md +++ b/content/cn/docs/quickstart/computing/hugegraph-computer.md @@ -65,7 +65,7 @@ mvn clean package -DskipTests #### 3.1.3 启动 master 节点 -> 您可以使用 `-c` 参数指定配置文件,更多 computer 配置请看:[Computer Config Options](/docs/quickstart/computing/hugegraph-computer-config#computer-config-options) +> 您可以使用 `-c` 参数指定配置文件,更多 computer 配置请看:[Computer Config Options](./hugegraph-computer-config.md) ```bash cd hugegraph-computer @@ -137,9 +137,9 @@ hugegraph-computer-operator-etcd-28lm67jxk5 1/1 Runnin #### 3.2.5 提交作业 -> 更多 computer crd spec 请看:[Computer CRD](/docs/quickstart/computing/hugegraph-computer-config#hugegraph-computer-crd) +> 更多 computer crd spec 请看:[Computer CRD](./hugegraph-computer-config.md) > -> 更多 Computer 配置请看:[Computer Config Options](/docs/quickstart/computing/hugegraph-computer-config#computer-config-options) +> 更多 Computer 配置请看:[Computer Config Options](./hugegraph-computer-config.md) ```yaml cat < +Apache HugeGraph WeChat QR Code diff --git a/content/cn/docs/quickstart/hugegraph-ai/hugegraph-llm.md b/content/cn/docs/quickstart/hugegraph-ai/hugegraph-llm.md index d376b3de1..128a11aad 100644 --- a/content/cn/docs/quickstart/hugegraph-ai/hugegraph-llm.md +++ b/content/cn/docs/quickstart/hugegraph-ai/hugegraph-llm.md @@ -134,7 +134,7 @@ python -m hugegraph_llm.config.generate --update - **自定义 Schema**:遵循我们[模板](https://github.com/apache/hugegraph-ai/blob/aff3bbe25fa91c3414947a196131be812c20ef11/hugegraph-llm/src/hugegraph_llm/config/config_data.py#L125)的 JSON 格式 - **HugeGraph Schema**:使用现有图实例的 Schema(例如,“hugegraph”) -![知识图谱构建器](https://hugegraph.apache.org/docs/images/gradio-kg.png) +![知识图谱构建器](/img/docs/gradio-kg.png) #### 代码构建 diff --git a/content/cn/docs/quickstart/hugegraph-ai/hugegraph-ml.md b/content/cn/docs/quickstart/hugegraph-ai/hugegraph-ml.md index baf0481f0..7d52789e7 100644 --- a/content/cn/docs/quickstart/hugegraph-ai/hugegraph-ml.md +++ b/content/cn/docs/quickstart/hugegraph-ai/hugegraph-ml.md @@ -33,7 +33,7 @@ HugeGraph-ML 将 HugeGraph 与流行的图学习库集成,支持直接在图 docker run -itd --name=hugegraph -p 8080:8080 hugegraph/hugegraph # 方案二:二进制包 -# 参见 https://hugegraph.apache.org/docs/download/download/ +# 参见 https://hugegraph.apache.org/cn/download/ ``` ### 2. 克隆并设置 diff --git a/content/cn/docs/quickstart/hugegraph-ai/quick_start.md b/content/cn/docs/quickstart/hugegraph-ai/quick_start.md index da148f7e7..a10256a6e 100644 --- a/content/cn/docs/quickstart/hugegraph-ai/quick_start.md +++ b/content/cn/docs/quickstart/hugegraph-ai/quick_start.md @@ -21,7 +21,7 @@ weight: 4 从文本构建知识图谱、分块向量和图顶点向量。 -![image](https://github.com/user-attachments/assets/f3366d46-2e31-4638-94c4-7214951ef77a) +![image](/img/docs/hugegraph-ai/quick-start/f3366d46-2e31-4638-94c4-7214951ef77a.png) ```mermaid graph TD; @@ -79,7 +79,7 @@ graph TD; 第一部分处理单个查询,第二部分同时处理多个查询。以下是第一部分的说明。 -![image](https://github.com/user-attachments/assets/33698062-e46b-4757-8b5e-93e8f10eae65) +![image](/img/docs/hugegraph-ai/quick-start/33698062-e46b-4757-8b5e-93e8f10eae65.png) ```mermaid graph TD; @@ -109,7 +109,7 @@ graph TD; - **仅图答案:** 仅使用基于图的检索(在向量数据库中查询图顶点向量和图数据库) - **图-向量答案:** 同时使用基于图和基于向量的检索 -![image](https://github.com/user-attachments/assets/26641e09-249f-4b3a-8013-16dc9383d333) +![image](/img/docs/hugegraph-ai/quick-start/26641e09-249f-4b3a-8013-16dc9383d333.png) ### 执行流程: @@ -117,7 +117,7 @@ graph TD; - 使用**关键词提取提示词**从**问题**中提取关键词。 -![image](https://github.com/user-attachments/assets/b49e269f-eaec-40b1-8d8f-9e409821d75d) +![image](/img/docs/hugegraph-ai/quick-start/b49e269f-eaec-40b1-8d8f-9e409821d75d.png) - 使用提取的关键词: - 首先,在图数据库中进行精确匹配。 @@ -141,7 +141,7 @@ graph TD; - **仅图答案** - **图-向量答案** -![image](https://github.com/user-attachments/assets/7d4496a3-d44c-4491-9463-8e93595dfa45) +![image](/img/docs/hugegraph-ai/quick-start/7d4496a3-d44c-4491-9463-8e93595dfa45.png) # 4. (处理流程)Text2Gremlin @@ -154,7 +154,7 @@ graph TD; 第一部分较为简单,因此重点介绍第二部分。 -![image](https://github.com/user-attachments/assets/fc678369-261d-49ea-a289-1ca6ade5ca55) +![image](/img/docs/hugegraph-ai/quick-start/fc678369-261d-49ea-a289-1ca6ade5ca55.png) ```mermaid graph TD; @@ -169,7 +169,7 @@ graph TD; - **自然语言查询:** 输入要转换为 Gremlin 的自然语言文本。 -![image](https://github.com/user-attachments/assets/d2a72f45-488c-4499-968b-a11816655ba0) +![image](/img/docs/hugegraph-ai/quick-start/d2a72f45-488c-4099-968b-a11816655ba0.png) - **Schema:** 输入图 schema。 @@ -183,7 +183,7 @@ graph TD; - 检索**图 schema**。 - 在向量数据库中查询示例向量,检索与输入查询相似的查询-gremlin 对(如果向量数据库中缺少示例,将自动使用**resources**文件夹中的示例进行初始化)。 -![image](https://github.com/user-attachments/assets/fd150f87-27f8-48e5-8a55-319ec039b7e0) +![image](/img/docs/hugegraph-ai/quick-start/fd150f87-27f8-48e5-8a55-319ec039b7e0.png) - 使用构建的提示词生成 Gremlin 查询。 diff --git a/content/cn/docs/quickstart/hugegraph-studio.md b/content/cn/docs/quickstart/hugegraph-studio.md index ac7c820c4..2f8160add 100644 --- a/content/cn/docs/quickstart/hugegraph-studio.md +++ b/content/cn/docs/quickstart/hugegraph-studio.md @@ -158,7 +158,7 @@ graph.schema().propertyKey("price").asInt().ifNotExist().create() 执行完成后,可以得到返回的数据,表明执行成功。如图所示
- image + image
@@ -189,7 +189,7 @@ marko.addEdge("knows", vadas, "date", "20160110") 在页面中输入语句,这样我们就创建了两个顶点一条边,点击执行,结果如下图所示
- image + image
@@ -220,7 +220,7 @@ g.V() 如下图所示
- image + image
@@ -229,14 +229,14 @@ HugeGraph-Studio不仅支持通过graph的方式展示数据,还支持表格 **表格展示形式**
- image + image
**Json展示形式**
- image + image
diff --git a/content/cn/docs/quickstart/hugegraph/hugegraph-server.md b/content/cn/docs/quickstart/hugegraph/hugegraph-server.md index 2be45ba4f..46960ef93 100644 --- a/content/cn/docs/quickstart/hugegraph/hugegraph-server.md +++ b/content/cn/docs/quickstart/hugegraph/hugegraph-server.md @@ -51,7 +51,7 @@ Core 模块是 Tinkerpop 接口的实现,Backend 模块用于管理数据存 如果使用 Docker Desktop,则可以按如下方式设置相关选项:
- image + image
@@ -147,7 +147,7 @@ tar zxf *hugegraph-*.tar.gz cd *hugegraph*/*tool* ``` -> 注:`${version}` 为版本号,最新版本号可参考 [Download 页面](/docs/download/download),或直接从 Download 页面点击链接下载 +> 注:`${version}` 为版本号,最新版本号可参考 [Download 页面](/cn/download/),或直接从 Download 页面点击链接下载 HugeGraph-Tools 的总入口脚本是 `bin/hugegraph`,用户可以使用 `help` 子命令查看其用法,这里只介绍一键部署的命令。 @@ -371,7 +371,7 @@ Connecting to HugeGraphServer (http://127.0.0.1:8080/graphs)....OK 提示的 url 与 `rest-server.properties` 中配置的 `restserver.url` 一致 -**ToplingDB (Beta)**: 作为 RocksDB 的高性能替代方案,配置方式请参考: [ToplingDB Quick Start]({{< ref path="/blog/hugegraph/toplingdb/toplingdb-quick-start.md" lang="cn">}}) +**ToplingDB (Beta)**: 作为 RocksDB 的高性能替代方案,配置方式请参考: [ToplingDB Quick Start](/cn/blog/2025/10/09/toplingdb-quick-start/) @@ -838,19 +838,19 @@ _说明_ 另外也可以通过访问 `localhost:8080/swagger-ui/index.html` 查看 API。
- image + image
在使用 Swagger UI 调试 HugeGraph 提供的 API 时,如果 HugeGraph Server 开启了鉴权模式,可以在 Swagger 页面输入鉴权信息。
- image + image
当前 HugeGraph 支持基于 Basic 和 Bearer 两种形式设置鉴权信息。
- image + image
### 7 停止 Server @@ -862,4 +862,4 @@ $bin/stop-hugegraph.sh ### 8 使用 IntelliJ IDEA 调试 Server -请参考[在 IDEA 中配置 Server 开发环境](/docs/contribution-guidelines/hugegraph-server-idea-setup) +请参考[在 IDEA 中配置 Server 开发环境](/cn/community/contribution-guidelines/hugegraph-server-idea-setup) diff --git a/content/cn/docs/quickstart/toolchain/hugegraph-hubble.md b/content/cn/docs/quickstart/toolchain/hugegraph-hubble.md index add0f97d9..01ac72dea 100644 --- a/content/cn/docs/quickstart/toolchain/hugegraph-hubble.md +++ b/content/cn/docs/quickstart/toolchain/hugegraph-hubble.md @@ -148,7 +148,7 @@ bin/start-hubble.sh -d 平台的模块使用流程如下:
- image + image
@@ -158,14 +158,14 @@ bin/start-hubble.sh -d 图管理模块下,点击【创建图】,通过填写图 ID、图名称、主机名、端口号、用户名、密码的信息,实现多图的连接。
- image + image
创建图填写内容如下:
- image + image
> **注意**:如果使用 docker 启动 `hubble`,且 `server` 和 `hubble` 位于同一宿主机,不能直接使用 `localhost/127.0.0.1` 作为主机名。如果 `hubble` 和 `server` 在同一 docker 网络下,则可以直接使用 container_name 作为主机名,端口则为 8080。或者也可以使用宿主机 ip 作为主机名,此时端口为宿主机为 server 配置的端口 @@ -174,7 +174,7 @@ bin/start-hubble.sh -d 实现图空间的信息访问,进入后,可进行图的多维查询分析、元数据管理、数据导入、算法分析等操作。
- image + image
@@ -183,7 +183,7 @@ bin/start-hubble.sh -d 2. 搜索范围:可对图名称和 ID 进行搜索。
- image + image
@@ -192,7 +192,7 @@ bin/start-hubble.sh -d 左侧导航处:
- image + image
@@ -204,14 +204,14 @@ bin/start-hubble.sh -d 列表模式:
- image + image
图模式:
- image + image
@@ -222,14 +222,14 @@ bin/start-hubble.sh -d 选择复用项:
- image + image
校验复用项:
- image + image
@@ -243,14 +243,14 @@ bin/start-hubble.sh -d 列表模式:
- image + image
图模式:
- image + image
@@ -265,7 +265,7 @@ bin/start-hubble.sh -d 2. 可进行单条删除或批量删除操作。
- image + image
@@ -276,14 +276,14 @@ bin/start-hubble.sh -d 列表模式:
- image + image
图模式:
- image + image
@@ -306,14 +306,14 @@ bin/start-hubble.sh -d 数据导入的使用流程如下:
- image + image
##### 4.3.1 模块入口 左侧导航处:
- image + image
@@ -322,7 +322,7 @@ bin/start-hubble.sh -d 2. 可创建多个导入任务,并行导入。
- image + image
@@ -331,7 +331,7 @@ bin/start-hubble.sh -d 2. 可同时上传多个文件。
- image + image
@@ -351,14 +351,14 @@ bin/start-hubble.sh -d 设置映射的填写内容:
- image + image
映射列表:
- image + image
@@ -368,7 +368,7 @@ bin/start-hubble.sh -d - 导入设置参数项如下图所示,均设置默认值,无需手动填写
- image + image
@@ -378,7 +378,7 @@ bin/start-hubble.sh -d - 若导入失败,可查看具体原因
- image + image
@@ -386,14 +386,14 @@ bin/start-hubble.sh -d ##### 4.4.1 模块入口 左侧导航处:
- image + image
##### 4.4.2 多图切换 通过左侧切换入口,灵活切换多图的操作空间
- image + image
@@ -409,19 +409,19 @@ Gremlin 查询后,下方为图结果展示区域,提供 3 种图结果展示 【图模式】
- image + image
【表格模式】
- image + image
【Json 模式】
- image + image
@@ -440,7 +440,7 @@ Gremlin 查询后,下方为图结果展示区域,提供 3 种图结果展示 双击顶点,也可展示与选中点关联的顶点。
- image + image
@@ -455,14 +455,14 @@ Gremlin 查询后,下方为图结果展示区域,提供 3 种图结果展示 入口如下:
- image + image
添加顶点内容如下:
- image + image
@@ -475,7 +475,7 @@ Gremlin 查询后,下方为图结果展示区域,提供 3 种图结果展示 2. 提供语句的收藏功能,可对常用语句进行收藏操作,方便高频语句快速调用
- image + image
@@ -483,7 +483,7 @@ Gremlin 查询后,下方为图结果展示区域,提供 3 种图结果展示 ##### 4.5.1 模块入口 左侧导航处:
- image + image
@@ -499,7 +499,7 @@ Gremlin 查询后,下方为图结果展示区域,提供 3 种图结果展示 5. 可对异步任务进行删除或批量删除操作
- image + image
@@ -513,14 +513,14 @@ Gremlin 查询后,下方为图结果展示区域,提供 3 种图结果展示 - 提供【查看】入口,可跳转到任务详情查看当前任务具体执行情况跳转到任务中心后,直接显示当前执行的任务行
- image + image
点击查看入口,跳转到任务管理列表,如下:
- image + image
@@ -536,14 +536,14 @@ Hubble 上暂未提供可视化的 OLAP 算法执行,可调用 RESTful API 进 - 在元数据建模模块中,删除元数据时,可建立删除元数据的异步任务
- image + image
- 在编辑已有的顶点/边类型操作中,新增索引时,可建立创建索引的异步任务
- image + image
@@ -551,7 +551,7 @@ Hubble 上暂未提供可视化的 OLAP 算法执行,可调用 RESTful API 进 - 确认/保存后,可跳转到任务中心查看当前任务的详情
- image + image
diff --git a/content/cn/docs/quickstart/toolchain/hugegraph-loader.md b/content/cn/docs/quickstart/toolchain/hugegraph-loader.md index 622fb8fd1..909ffa69f 100644 --- a/content/cn/docs/quickstart/toolchain/hugegraph-loader.md +++ b/content/cn/docs/quickstart/toolchain/hugegraph-loader.md @@ -132,7 +132,7 @@ mvn clean package -DskipTests "软件"有:"名字"、"售卖价格"等属性;边"认识"有:"日期"属性等。
- image + image

示例图模型

diff --git a/content/cn/docs/download/download.md b/content/cn/download/index.md similarity index 97% rename from content/cn/docs/download/download.md rename to content/cn/download/index.md index 831c22faa..460289433 100644 --- a/content/cn/docs/download/download.md +++ b/content/cn/download/index.md @@ -1,21 +1,22 @@ --- title: "下载 Apache HugeGraph" -linkTitle: "Download" +linkTitle: "下载" weight: 2 +slug: / --- > 指南: > > - 推荐使用最新版本的 HugeGraph 软件包, 运行时环境请选择 Java11 > - 验证下载版本, 请使用相应的哈希 (SHA512)、签名和 [项目签名验证 KEYS](https://downloads.apache.org/hugegraph/KEYS) -> - 检查哈希 (SHA512)、签名的说明在 [版本验证](/docs/contribution-guidelines/validate-release/) 页面, 也可参考 [ASF 验证说明](https://www.apache.org/dyn/closer.cgi#verify) +> - 检查哈希 (SHA512)、签名的说明在 [版本验证](/cn/community/contribution-guidelines/validate-release/) 页面, 也可参考 [ASF 验证说明](https://www.apache.org/dyn/closer.cgi#verify) > - 注: HugeGraph 所有组件版本号已保持一致, `client/loader/hubble/common` 等 maven 仓库版本号同理, 依赖引用可参考 [maven 示例](https://github.com/apache/hugegraph-toolchain#maven-dependencies) > - 兼容说明: HugeGraph 于 2026 年 1 月毕业后,下载路径已从 `/incubator/hugegraph` 迁移到 `/hugegraph`。历史版本的发布文件名可能仍包含 `-incubating-`。 ### 最新版本 1.7.0 - Release Date: 2025-11-28 -- [Release Notes](/docs/changelog/hugegraph-1.7.0-release-notes/) +- [Release Notes](/cn/docs/changelog/hugegraph-1.7.0-release-notes/) #### 二进制包 @@ -25,7 +26,7 @@ weight: 2 #### 源码包 -Please refer to [build from source](/docs/quickstart/hugegraph/hugegraph-server/). +Please refer to [build from source](/cn/docs/quickstart/hugegraph/hugegraph-server/). | Server | Toolchain | AI | Computer | |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -44,7 +45,7 @@ Please refer to [build from source](/docs/quickstart/hugegraph/hugegraph-server/ #### 1.5.0 - Release Date: 2024-12-10 -- [Release Notes](/docs/changelog/hugegraph-1.5.0-release-notes/) +- [Release Notes](/cn/docs/changelog/hugegraph-1.5.0-release-notes/) ##### 二进制包 @@ -54,7 +55,7 @@ Please refer to [build from source](/docs/quickstart/hugegraph/hugegraph-server/ ##### 源码包 -Please refer to [build from source](/docs/quickstart/hugegraph/hugegraph-server/). +Please refer to [build from source](/cn/docs/quickstart/hugegraph/hugegraph-server/). | Server | Toolchain | AI | Computer | |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -63,7 +64,7 @@ Please refer to [build from source](/docs/quickstart/hugegraph/hugegraph-server/ #### 1.3.0 - Release Date: 2024-04-01 -- [Release Notes](/docs/changelog/hugegraph-1.3.0-release-notes/) +- [Release Notes](/cn/docs/changelog/hugegraph-1.3.0-release-notes/) ##### 二进制包 @@ -73,7 +74,7 @@ Please refer to [build from source](/docs/quickstart/hugegraph/hugegraph-server/ ##### 源码包 -Please refer to [build from source](/docs/quickstart/hugegraph/hugegraph-server/). +Please refer to [build from source](/cn/docs/quickstart/hugegraph/hugegraph-server/). | Server | Toolchain | AI | Common | |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -83,7 +84,7 @@ Please refer to [build from source](/docs/quickstart/hugegraph/hugegraph-server/ #### 1.2.0 - Release Date: 2023-12-28 -- [Release Notes](/docs/changelog/hugegraph-1.2.0-release-notes/) +- [Release Notes](/cn/docs/changelog/hugegraph-1.2.0-release-notes/) ##### 二进制包 @@ -100,7 +101,7 @@ Please refer to [build from source](/docs/quickstart/hugegraph/hugegraph-server/ #### 1.0.0 - Release Date: 2023-02-22 -- [Release Notes](/docs/changelog/hugegraph-1.0.0-release-notes/) +- [Release Notes](/cn/docs/changelog/hugegraph-1.0.0-release-notes/) ##### 二进制包 diff --git a/content/cn/featured-background.jpg b/content/cn/featured-background.jpg deleted file mode 100644 index 8efa5cad4..000000000 Binary files a/content/cn/featured-background.jpg and /dev/null differ diff --git a/content/en/about/featured-background.jpg b/content/en/about/featured-background.jpg deleted file mode 100644 index 8efa5cad4..000000000 Binary files a/content/en/about/featured-background.jpg and /dev/null differ diff --git a/content/en/blog/hugegraph-ai/agentic_graphrag.md b/content/en/blog/hugegraph-ai/agentic_graphrag.md index 9b92437d3..59bc5403c 100644 --- a/content/en/blog/hugegraph-ai/agentic_graphrag.md +++ b/content/en/blog/hugegraph-ai/agentic_graphrag.md @@ -24,7 +24,7 @@ Therefore, GraphRAG technology was developed. A typical GraphRAG involves two st 2. Online: When the GraphRAG system receives a user question, it can capture the relationships between different entities in the knowledge base using the graph database. Consequently, we can retrieve the three sentences above (the specific graph database index might look like the following example).
- image + image
However, GraphRAG itself also presents several challenges: @@ -168,7 +168,7 @@ We inspected the latest version of the Agno source code at the time of our resea We saw from the official documentation
- image + image
Surprisingly, the Pydantic-Ai framework doesn't support automatic parallelism at the Task level. @@ -251,7 +251,7 @@ However, what truly made us decide was the project's "heartbeat". We contacted t We believe that an excellent technology selection is not only about matching functionality but also about recognizing the project's future potential. (Welcome to witness its growth together: https://github.com/ChunelFeng/CGraph)
- image + image
## Architectural Design @@ -271,7 +271,7 @@ For example, vector similarity search is a very common RAG process. However, dep 3. By introducing a new Node abstraction, we don't need to modify the implementation of the underlying Operator during the refactoring process, which reduces the mental burden during refactoring.
- image + image
Since we want to reuse the same type of Workflow across requests, we need to ensure that the Workflow itself is stateless. Because if the reused Workflow still carries the state of the previous request, users may get unexpected results. The state of the Workflow can be divided into two types: @@ -294,7 +294,7 @@ We use the `GParam` (global parameter) abstraction provided by the CGraph framew This way we can ensure that each time the Workflow is executed, these two states only contain the state of the current request. Since the WorkflowInput state is reset after Workflow execution, we can only selectively choose some data from the WorkflowState to return to the user. Therefore, we get the interface that a Flow abstraction should implement.
- image + image
```python @@ -411,7 +411,7 @@ We fully leverage the Pool abstraction provided by the underlying CGraph framewo Now we can get the overall architecture diagram of the entire project.
- image + image
1. After receiving a request, the Scheduler first queries the PipelinePool to check if there is a idle Pipeline of the corresponding type. diff --git a/content/en/blog/hugegraph/toplingdb/toplingdb-configuration-yaml.md b/content/en/blog/hugegraph/toplingdb/toplingdb-configuration-yaml.md index ff5a612bf..7619f9cb4 100644 --- a/content/en/blog/hugegraph/toplingdb/toplingdb-configuration-yaml.md +++ b/content/en/blog/hugegraph/toplingdb/toplingdb-configuration-yaml.md @@ -177,7 +177,7 @@ DBOptions: ToplingDB YAML Reference and Reuse Diagram:
- ToplingDB YAML Reference Diagram + ToplingDB YAML Reference Diagram
This mechanism makes configuration more flexible and easier to compose in complex scenarios. diff --git a/content/en/blog/hugegraph/toplingdb/toplingdb-quick-start.md b/content/en/blog/hugegraph/toplingdb/toplingdb-quick-start.md index 599be5000..b54176c8c 100644 --- a/content/en/blog/hugegraph/toplingdb/toplingdb-quick-start.md +++ b/content/en/blog/hugegraph/toplingdb/toplingdb-quick-start.md @@ -53,7 +53,7 @@ rocksdb.open_http=true Visualize the Web monitoring page. Example screenshot:
- image + image
Verify via terminal: diff --git a/content/en/blog/images/images-server/agentic-abstract.png b/content/en/blog/images/images-server/agentic-abstract.png deleted file mode 100644 index 4703cc434..000000000 Binary files a/content/en/blog/images/images-server/agentic-abstract.png and /dev/null differ diff --git a/content/en/blog/images/images-server/agentic-frame.png b/content/en/blog/images/images-server/agentic-frame.png deleted file mode 100644 index 7fddf769a..000000000 Binary files a/content/en/blog/images/images-server/agentic-frame.png and /dev/null differ diff --git a/content/en/blog/images/images-server/agentic-lifeline.svg b/content/en/blog/images/images-server/agentic-lifeline.svg deleted file mode 100644 index 010b19a97..000000000 --- a/content/en/blog/images/images-server/agentic-lifeline.svg +++ /dev/null @@ -1 +0,0 @@ -NodeWorkflow(Stateless)WorkflowState(Intermediate State)WorkflowInput(User Input State)Flow AbstractionClientNodeWorkflow(Stateless)WorkflowState(Intermediate State)WorkflowInput(User Input State)Flow AbstractionClientRequest 1 StartStatus: Filled with Request 1 dataStatus: Empty/PristineStatus: Contains resultsStatus: ClearedStatus: Retained (until next reset)Request 1 EndRequest 2 Start (Reusing same Workflow instance)Status: Filled with Request 2 dataStatus: Empty/PristineStatus: Contains resultsStatus: ClearedStatus: Retained (until next reset)Request 2 EndSend Request 1Build and inject user inputPre-execution HookReset stateStart executionExecute node logicRead user inputWrite intermediate resultsReturn execution resultExecution completedPost-execution HookClear inputSelectively extract return dataReturn Response 1Send Request 2Build and inject user inputPre-execution HookReset stateStart executionExecute node logicRead user inputWrite intermediate resultsReturn execution resultExecution completedPost-execution HookClear inputSelectively extract return dataReturn Response 2 \ No newline at end of file diff --git a/content/en/blog/images/images-server/agentic-pydantic.png b/content/en/blog/images/images-server/agentic-pydantic.png deleted file mode 100644 index 26d9c169a..000000000 Binary files a/content/en/blog/images/images-server/agentic-pydantic.png and /dev/null differ diff --git a/content/en/blog/images/images-server/agentic-scheduler.png b/content/en/blog/images/images-server/agentic-scheduler.png deleted file mode 100644 index 1b4c960e5..000000000 Binary files a/content/en/blog/images/images-server/agentic-scheduler.png and /dev/null differ diff --git a/content/en/blog/images/images-server/toplingdb-web-server.png b/content/en/blog/images/images-server/toplingdb-web-server.png deleted file mode 100644 index aa475ff32..000000000 Binary files a/content/en/blog/images/images-server/toplingdb-web-server.png and /dev/null differ diff --git a/content/en/blog/images/images-server/toplingdb-yaml-ref.png b/content/en/blog/images/images-server/toplingdb-yaml-ref.png deleted file mode 100644 index 07476def6..000000000 Binary files a/content/en/blog/images/images-server/toplingdb-yaml-ref.png and /dev/null differ diff --git a/content/en/blog/site-infrastructure/codex-docusaurus-private-preview.md b/content/en/blog/site-infrastructure/codex-docusaurus-private-preview.md new file mode 100644 index 000000000..67cfccb6b --- /dev/null +++ b/content/en/blog/site-infrastructure/codex-docusaurus-private-preview.md @@ -0,0 +1,11 @@ +--- +date: 2026-05-06 +title: "Codex Docusaurus Migration Private Preview" +linkTitle: "Private preview workflow example" +slug: /2026/05/06/codex-docusaurus-migration-private-preview +unlisted: true +noindex: true +placeholder: true +--- + +This reserved blog URL demonstrates the safe private-preview workflow for the Codex goal that refactored the HugeGraph documentation repository to Docusaurus. Sensitive draft notes are intentionally excluded from the static build; publish only a cleared public write-up here. diff --git a/content/en/community/_index.md b/content/en/community/_index.md index 1ae39a248..267bdf359 100644 --- a/content/en/community/_index.md +++ b/content/en/community/_index.md @@ -1,8 +1,10 @@ --- title: Community +linkTitle: Community +weight: 1 menu: main: weight: 40 --- -Visit the [Project Maturity]({{< relref "maturity" >}}) assessment. +Start with the [Contributor Guide](/community/contribution-guidelines/) or visit the [Project Maturity](/community/maturity/) assessment. diff --git a/content/en/community/contribution-guidelines/_index.md b/content/en/community/contribution-guidelines/_index.md new file mode 100755 index 000000000..db5260a34 --- /dev/null +++ b/content/en/community/contribution-guidelines/_index.md @@ -0,0 +1,7 @@ +--- +title: "Contributor Guide" +linkTitle: "Contributor Guide" +weight: 2 +aliases: + - /docs/contribution-guidelines/ +--- diff --git a/content/en/docs/CLA.md b/content/en/community/contribution-guidelines/cla.md similarity index 99% rename from content/en/docs/CLA.md rename to content/en/community/contribution-guidelines/cla.md index 784a53a62..9624424c0 100644 --- a/content/en/docs/CLA.md +++ b/content/en/community/contribution-guidelines/cla.md @@ -1,3 +1,11 @@ +--- +title: "Contributor License Agreement" +linkTitle: "CLA" +weight: 6 +aliases: + - /docs/CLA/ +--- + ## Contributor Agreement ## Individual Contributor exclusive License Agreement diff --git a/content/en/docs/contribution-guidelines/committer-guidelines.md b/content/en/community/contribution-guidelines/committer-guidelines.md similarity index 99% rename from content/en/docs/contribution-guidelines/committer-guidelines.md rename to content/en/community/contribution-guidelines/committer-guidelines.md index 945064e17..bc5c49ca1 100644 --- a/content/en/docs/contribution-guidelines/committer-guidelines.md +++ b/content/en/community/contribution-guidelines/committer-guidelines.md @@ -2,6 +2,8 @@ title: "Apache HugeGraph Committer Guide" linkTitle: "Apache HugeGraph Committer Guide" weight: 5 +aliases: + - /docs/contribution-guidelines/committer-guidelines/ --- > This document outlines the requirements and process for becoming an Apache Committer. The corresponding ASF official document can be found at: https://community.apache.org/newcommitter.html @@ -242,7 +244,7 @@ Of course, the candidate may also choose to decline the invitation, in which cas Once the invitation is accepted, the candidate needs to complete the following tasks: -- Subscribe to dev@hugegraph.apache.org, for specific steps/filtering configurations, please refer to the [documentation](https://hugegraph.apache.org/docs/contribution-guidelines/subscribe/) +- Subscribe to dev@hugegraph.apache.org, for specific steps/filtering configurations, please refer to the [documentation](https://hugegraph.apache.org/community/contribution-guidelines/subscribe/) - Sign the [ICLA](https://www.apache.org/licenses/icla.pdf), follow the steps below↓ ### ICLA Signing Process diff --git a/content/en/docs/contribution-guidelines/contribute.md b/content/en/community/contribution-guidelines/contribute.md similarity index 94% rename from content/en/docs/contribution-guidelines/contribute.md rename to content/en/community/contribution-guidelines/contribute.md index 8f3e96973..1859c9615 100644 --- a/content/en/docs/contribution-guidelines/contribute.md +++ b/content/en/community/contribution-guidelines/contribute.md @@ -2,13 +2,15 @@ title: "How to Contribute to HugeGraph" linkTitle: "How to Contribute to HugeGraph" weight: 1 +aliases: + - /docs/contribution-guidelines/contribute/ --- Thanks for taking the time to contribute! As an open source project, HugeGraph is looking forward to be contributed from everyone, and we are also grateful to all the contributors. The following is a contribution guide for HugeGraph: -image +image ## 1. Preparation @@ -120,14 +122,14 @@ git push origin bugfix-branch:bugfix-branch ``` Note that since GitHub requires submitting code through `username + token` (instead of using `username + password` directly), you need to create a GitHub token from https://github.com/settings/tokens: -image +image ## 4. Create a Pull Request Go to the web page of GitHub fork repo, there would be a chance to create a Pull Request after pushing to a new branch, just click button "Compare & pull request" to do it. Then edit the description for proposed changes, which can just be copied from the commit message. Note: please make sure the email address you used to submit the code is bound to the GitHub account. For how to bind the email address, please refer to https://github.com/settings/emails: -image +image ## 5. Code review diff --git a/content/en/docs/contribution-guidelines/hugegraph-server-idea-setup.md b/content/en/community/contribution-guidelines/hugegraph-server-idea-setup.md similarity index 99% rename from content/en/docs/contribution-guidelines/hugegraph-server-idea-setup.md rename to content/en/community/contribution-guidelines/hugegraph-server-idea-setup.md index 72c5a9cc2..5c9e6e1db 100644 --- a/content/en/docs/contribution-guidelines/hugegraph-server-idea-setup.md +++ b/content/en/community/contribution-guidelines/hugegraph-server-idea-setup.md @@ -2,6 +2,8 @@ title: "Setup Server in IDEA (Dev)" linkTitle: "Setup Server in IDEA" weight: 4 +aliases: + - /docs/contribution-guidelines/hugegraph-server-idea-setup/ --- > NOTE: The following configuration is for reference purposes only, and has been tested on Linux and macOS platforms based on [this version](https://github.com/apache/hugegraph/commit/a946ad1de4e8f922251a5241ffc957c33379677f). diff --git a/content/en/docs/contribution-guidelines/subscribe.md b/content/en/community/contribution-guidelines/subscribe.md similarity index 97% rename from content/en/docs/contribution-guidelines/subscribe.md rename to content/en/community/contribution-guidelines/subscribe.md index 3fd711c7c..79e0d7617 100644 --- a/content/en/docs/contribution-guidelines/subscribe.md +++ b/content/en/community/contribution-guidelines/subscribe.md @@ -2,6 +2,8 @@ title: "Subscribe Mailing Lists" linkTitle: "Subscribe Mailing Lists" weight: 2 +aliases: + - /docs/contribution-guidelines/subscribe/ --- ### Subscribe the mailing list diff --git a/content/en/docs/contribution-guidelines/validate-release.md b/content/en/community/contribution-guidelines/validate-release.md similarity index 99% rename from content/en/docs/contribution-guidelines/validate-release.md rename to content/en/community/contribution-guidelines/validate-release.md index ff6d03034..d6cb78aea 100644 --- a/content/en/docs/contribution-guidelines/validate-release.md +++ b/content/en/community/contribution-guidelines/validate-release.md @@ -2,6 +2,8 @@ title: "Validate Apache Release" linkTitle: "Validate Apache Release" weight: 3 +aliases: + - /docs/contribution-guidelines/validate-release/ --- > Note: this doc will be updated continuously. diff --git a/content/en/community/maturity.md b/content/en/community/maturity.md index 5ff25f46e..83ba113a4 100644 --- a/content/en/community/maturity.md +++ b/content/en/community/maturity.md @@ -26,7 +26,7 @@ The following table is filled according to the [Apache Maturity Model](https://c | **CD20** | Anyone can easily discover and access the project's code.                                                                                                                                                                                                     | **YES** The [official website](https://hugegraph.apache.org/) includes a link to the [GitHub repository](https://github.com/apache/hugegraph). | | **CD30** | Anyone using standard, widely-available tools, can build the code in a reproducible way.                                                                                                                                                                       | **YES**  Apache HugeGraph provides a [Quick Start](https://hugegraph.apache.org/docs/quickstart/hugegraph/hugegraph-server/) document that explains how to compile the source code. | | **CD40** | The full history of the project's code is available via a source code control system, in a way that allows anyone to recreate any released version. | **YES** The project uses Git, and anyone can view the full history of the project via commit logs and tags for each release. | -| **CD50** | The source code control system establishes the provenance of each line of code in a reliable way, based on strong authentication of the committer. When third parties contribute code, commit messages provide reliable information about the code provenance. | **YES** The project uses GitHub managed by Apache Infra, ensuring provenance of each line of code to a committer. Third-party contributions are accepted via pull requests in accordance with the [Contribution Guidelines](https://hugegraph.apache.org/docs/contribution-guidelines/).| +| **CD50** | The source code control system establishes the provenance of each line of code in a reliable way, based on strong authentication of the committer. When third parties contribute code, commit messages provide reliable information about the code provenance. | **YES** The project uses GitHub managed by Apache Infra, ensuring provenance of each line of code to a committer. Third-party contributions are accepted via pull requests in accordance with the [Contribution Guidelines](https://hugegraph.apache.org/community/contribution-guidelines/).| ### LICENSE @@ -42,7 +42,7 @@ The following table is filled according to the [Apache Maturity Model](https://c | **ID**   | **Description** | **Status** | | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | -| **RE10** | Releases consist of source code, distributed using standard and open archive formats that are expected to stay readable in the long term.                                                                                                                                       | **YES** Source releases are distributed via [dist.apache.org](https://dist.apache.org/repos/dist/release/hugegraph/) and linked from the website's [download page](https://hugegraph.apache.org/docs/download/download/). | +| **RE10** | Releases consist of source code, distributed using standard and open archive formats that are expected to stay readable in the long term.                                                                                                                                       | **YES** Source releases are distributed via [dist.apache.org](https://dist.apache.org/repos/dist/release/hugegraph/) and linked from the website's [download page](https://hugegraph.apache.org/download/). | | **RE20** | The project's PMC (Project Management Committee, see CS10) approves each software release in order to make the release an act of the Foundation.                                                                                                                                                                          | **YES** All releases are voted on by the PMC on the dev@hugegraph.apache.org mailing list. | | **RE30** | Releases are signed and/or distributed along with digests that anyone can reliably use to validate the downloaded archives.                                                                                                                                                       | **YES** All releases are signed by the release manager and distributed with checksums. The [KEYS](https://downloads.apache.org/hugegraph/KEYS) file is available for verification. | | **RE40** | The project can distribute convenience binaries alongside source code, but they are not Apache Releases, they are provided with no guarantee. | **YES** The project provides convenience binaries, but only the source code archive is an official Apache release. | @@ -63,10 +63,10 @@ The following table is filled according to the [Apache Maturity Model](https://c | **ID**   | **Description** | **Status** | | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | | **CO10** | The project has a well-known homepage that points to all the information required to operate according to this maturity model. | **YES** The [website](https://hugegraph.apache.org/) serves as the central point for project information. | -| **CO20** | The community welcomes contributions from anyone who acts in good faith and in a respectful manner, and who adds value to the project. | **YES** Apache HugeGraph has a [Contribution Guidelines](https://hugegraph.apache.org/docs/contribution-guidelines/) page and welcomes all valuable contributions. | +| **CO20** | The community welcomes contributions from anyone who acts in good faith and in a respectful manner, and who adds value to the project. | **YES** Apache HugeGraph has a [Contribution Guidelines](https://hugegraph.apache.org/community/contribution-guidelines/) page and welcomes all valuable contributions. | | **CO30** | Contributions include source code, documentation, constructive bug reports, constructive discussions, marketing and generally anything that adds value to the project. | **YES** The project values both code and non-code contributions. | | **CO40** | The community strives to be meritocratic and gives more rights and responsibilities to contributors who, over time, add value to the project. | **YES** The community follows the Apache Way and has a history of promoting active contributors to committer and PMC roles. | -| **CO50** | The project documents how contributors can earn more rights such as commit access or decision power, and applies these principles consistently. | **YES** The process for becoming a committer is outlined in the [contribution guidelines](https://hugegraph.apache.org/docs/contribution-guidelines/committer-guidelines/). | +| **CO50** | The project documents how contributors can earn more rights such as commit access or decision power, and applies these principles consistently. | **YES** The process for becoming a committer is outlined in the [contribution guidelines](https://hugegraph.apache.org/community/contribution-guidelines/committer-guidelines/). | | **CO60** | The community operates based on consensus of its members (see CS10) who have decision power. Dictators, benevolent or not, are not welcome in Apache projects. | **YES** All major decisions are made through public discussion and consensus on the mailing list. | | **CO70** | The project strives to answer user questions in a timely manner. | **YES** The community uses the dev@hugegraph.apache.org mailing list, [GitHub Issues](https://github.com/apache/hugegraph/issues), and [GitHub Discussions](https://github.com/apache/hugegraph/discussions) to provide support to users. | diff --git a/content/en/docs/changelog/_index.md b/content/en/docs/changelog/_index.md index 41b3951bd..ad7eb890a 100644 --- a/content/en/docs/changelog/_index.md +++ b/content/en/docs/changelog/_index.md @@ -1,5 +1,5 @@ --- -title: "CHANGELOGS" -linkTitle: "CHANGELOGS" +title: "Changelog" +linkTitle: "Changelog" weight: 10 ---- \ No newline at end of file +--- diff --git a/content/en/docs/clients/_index.md b/content/en/docs/clients/_index.md index d3395c548..d19af99fa 100644 --- a/content/en/docs/clients/_index.md +++ b/content/en/docs/clients/_index.md @@ -1,5 +1,5 @@ --- -title: "API" -linkTitle: "API" +title: "Clients and APIs" +linkTitle: "Clients and APIs" weight: 5 ---- \ No newline at end of file +--- diff --git a/content/en/docs/clients/restful-api/_index.md b/content/en/docs/clients/restful-api/_index.md index c5158247e..2410b6ee7 100644 --- a/content/en/docs/clients/restful-api/_index.md +++ b/content/en/docs/clients/restful-api/_index.md @@ -12,7 +12,7 @@ weight: 1 > - **Note**: Before version 1.5.0, the format of ids such as group/target was similar to -69:grant. After version 1.7.0, the id and name were consistent, such as admin [HugeGraph 1.5.x RESTful API](https://github.com/apache/hugegraph-doc/tree/release-1.5.0) -Besides the documentation below, you can also open `swagger-ui` at `localhost:8080/swagger-ui/index.html` to explore the RESTful API. [Here is an example](/docs/quickstart/hugegraph/hugegraph-server#swaggerui-example) +Besides the documentation below, you can also open `swagger-ui` at `localhost:8080/swagger-ui/index.html` to explore the RESTful API. [Here is an example](/docs/quickstart/hugegraph/hugegraph-server/#62-request-server) [comment]: <> (- Graph Schema) diff --git a/content/en/docs/clients/restful-api/auth.md b/content/en/docs/clients/restful-api/auth.md index a3af6339b..41651db35 100644 --- a/content/en/docs/clients/restful-api/auth.md +++ b/content/en/docs/clients/restful-api/auth.md @@ -1049,7 +1049,7 @@ GET http://localhost:8080/graphspaces/DEFAULT/auth/accesses/S-69:all>-88>11>S-77 ### 10.7 Graphspace Manager (Manager) API -> **Note**: Before using the following APIs, you need to create a graphspace first. For example, create a graphspace named `gs1` via the [Graphspace API](./graphspace). The examples below assume that `gs1` already exists. +> **Note**: Before using the following APIs, you need to create a graphspace first. For example, create a graphspace named `gs1` via the [Graphspace API](/docs/clients/restful-api/graphspace/). The examples below assume that `gs1` already exists. 1. The graphspace manager API is used to grant/revoke manager roles for users at the graphspace level, and to query the roles of the current user or other users in a graphspace. Supported role types include `SPACE`, `SPACE_MEMBER`, and `ADMIN`. diff --git a/content/en/docs/clients/restful-api/edgelabel.md b/content/en/docs/clients/restful-api/edgelabel.md index a452ec5e9..a8fe4df9d 100644 --- a/content/en/docs/clients/restful-api/edgelabel.md +++ b/content/en/docs/clients/restful-api/edgelabel.md @@ -311,4 +311,4 @@ DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/edgelab Note: -> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](./task). +> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](/docs/clients/restful-api/task/). diff --git a/content/en/docs/clients/restful-api/gremlin.md b/content/en/docs/clients/restful-api/gremlin.md index 3b348e7c2..4454b033a 100644 --- a/content/en/docs/clients/restful-api/gremlin.md +++ b/content/en/docs/clients/restful-api/gremlin.md @@ -230,7 +230,7 @@ Note: Note: -> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](./task). +> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](/docs/clients/restful-api/task/). **Querying edges** @@ -261,4 +261,4 @@ Note: Note: -> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2` (where "2" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](./task). +> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2` (where "2" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](/docs/clients/restful-api/task/). diff --git a/content/en/docs/clients/restful-api/indexlabel.md b/content/en/docs/clients/restful-api/indexlabel.md index d56c156a6..c419e91d6 100644 --- a/content/en/docs/clients/restful-api/indexlabel.md +++ b/content/en/docs/clients/restful-api/indexlabel.md @@ -174,4 +174,4 @@ DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/indexla Note: -> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](./task). +> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](/docs/clients/restful-api/task/). diff --git a/content/en/docs/clients/restful-api/rebuild.md b/content/en/docs/clients/restful-api/rebuild.md index ef76d6e46..6cb7d6e26 100644 --- a/content/en/docs/clients/restful-api/rebuild.md +++ b/content/en/docs/clients/restful-api/rebuild.md @@ -30,7 +30,7 @@ PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/rebuild/inde ``` Note: -> You can get the asynchronous job status by `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/${task_id}` (the task_id here should be 1). See More [AsyncJob RESTfull API](./task) +> You can get the asynchronous job status by `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/${task_id}` (the task_id here should be 1). See More [AsyncJob RESTfull API](/docs/clients/restful-api/task/) #### 1.6.2 Rebulid all Indexs of VertexLabel @@ -56,7 +56,7 @@ PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/rebuild/vert Note: -> You can get the asynchronous job status by `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/${task_id}` (the task_id here should be 2). See More [AsyncJob RESTfull API](./task) +> You can get the asynchronous job status by `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/${task_id}` (the task_id here should be 2). See More [AsyncJob RESTfull API](/docs/clients/restful-api/task/) #### 1.6.3 Rebulid all Indexs of EdgeLabel @@ -82,4 +82,4 @@ PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/rebuild/edge Note: -> You can get the asynchronous job status by `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/${task_id}` (the task_id here should be 3). See More [AsyncJob RESTfull API](./task) \ No newline at end of file +> You can get the asynchronous job status by `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/${task_id}` (the task_id here should be 3). See More [AsyncJob RESTfull API](/docs/clients/restful-api/task/) \ No newline at end of file diff --git a/content/en/docs/clients/restful-api/traverser.md b/content/en/docs/clients/restful-api/traverser.md index 1f7a1e49f..ad2420988 100644 --- a/content/en/docs/clients/restful-api/traverser.md +++ b/content/en/docs/clients/restful-api/traverser.md @@ -59,7 +59,7 @@ In the following, we provide a detailed explanation of the Traverser API: The usage examples provided in this section are based on the graph presented on the TinkerPop official website: -![tinkerpop example graph](http://tinkerpop.apache.org/docs/3.4.0/images/tinkerpop-modern.png) +![tinkerpop example graph](/img/docs/clients/restful-api/tinkerpop-modern.png) The data import program is as follows: diff --git a/content/en/docs/clients/restful-api/vertexlabel.md b/content/en/docs/clients/restful-api/vertexlabel.md index 6e6388a7d..493e3ce6f 100644 --- a/content/en/docs/clients/restful-api/vertexlabel.md +++ b/content/en/docs/clients/restful-api/vertexlabel.md @@ -308,4 +308,4 @@ DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/vertexl Note: -> You can use `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id) to query the execution status of the asynchronous task. For more information, refer to the [Asynchronous Task RESTful API](./task). +> You can use `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id) to query the execution status of the asynchronous task. For more information, refer to the [Asynchronous Task RESTful API](/docs/clients/restful-api/task/). diff --git a/content/en/docs/config/_index.md b/content/en/docs/config/_index.md index b79b5af96..1af698ba0 100644 --- a/content/en/docs/config/_index.md +++ b/content/en/docs/config/_index.md @@ -1,6 +1,6 @@ --- -title: "HugeGraph-Server Configuration" -linkTitle: "Server Config" +title: "Configuration" +linkTitle: "Configuration" weight: 4 --- @@ -9,4 +9,4 @@ This section covers HugeGraph-Server configuration, including: - **[Server Startup Guide](config-guide)** - Understand config file structure and basic setup - **[Server Complete Configuration Manual](config-option)** - Complete list of configuration options - **[Authentication Config](config-authentication)** - User authentication and authorization -- **[HTTPS Config](config-https)** - Enable HTTPS secure protocol \ No newline at end of file +- **[HTTPS Config](config-https)** - Enable HTTPS secure protocol diff --git a/content/en/docs/config/config-guide.md b/content/en/docs/config/config-guide.md index 8d5c3699b..aef5ca09f 100644 --- a/content/en/docs/config/config-guide.md +++ b/content/en/docs/config/config-guide.md @@ -137,7 +137,7 @@ ssl: { There are many configuration options mentioned above, but for now, let's focus on the following options: `channelizer` and `graphs`. - `graphs`: This option specifies the graphs that need to be opened when the GremlinServer starts. It is a map structure where the key is the name of the graph and the value is the configuration file path for that graph. -- `channelizer`: The GremlinServer supports two communication modes with clients: WebSocket and HTTP (default). If WebSocket is chosen, users can quickly experience the features of HugeGraph using [Gremlin-Console](../clients/gremlin-console), but it does not support importing large-scale data. It is recommended to use HTTP for communication, as all peripheral components of HugeGraph are implemented based on HTTP. +- `channelizer`: The GremlinServer supports two communication modes with clients: WebSocket and HTTP (default). If WebSocket is chosen, users can quickly experience the features of HugeGraph using [Gremlin-Console](/docs/clients/gremlin-console/), but it does not support importing large-scale data. It is recommended to use HTTP for communication, as all peripheral components of HugeGraph are implemented based on HTTP. By default, the GremlinServer serves at `localhost:8182`. If you need to modify it, configure the `host` and `port` settings. diff --git a/content/en/docs/contribution-guidelines/_index.md b/content/en/docs/contribution-guidelines/_index.md deleted file mode 100755 index 2cdf8103d..000000000 --- a/content/en/docs/contribution-guidelines/_index.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: "Contribution Guidelines" -linkTitle: "Contribution Guidelines" -weight: 9 ---- diff --git a/content/en/docs/guides/_index.md b/content/en/docs/guides/_index.md index b0b4c0252..72d54b5e6 100644 --- a/content/en/docs/guides/_index.md +++ b/content/en/docs/guides/_index.md @@ -1,5 +1,5 @@ --- -title: "GUIDES" -linkTitle: "GUIDES" +title: "Guides" +linkTitle: "Guides" weight: 6 ---- \ No newline at end of file +--- diff --git a/content/en/docs/guides/architectural.md b/content/en/docs/guides/architectural.md index 5dda31cff..ddbe3b46c 100644 --- a/content/en/docs/guides/architectural.md +++ b/content/en/docs/guides/architectural.md @@ -11,7 +11,7 @@ As a full-stack graph system covering **Graph Database, Graph Computing, and Gra Below is the overall architecture diagram of HugeGraph:
- image + image
HugeGraph consists of three layers of functionality: the application layer, the graph engine layer, and the storage layer. diff --git a/content/en/docs/guides/desgin-concept.md b/content/en/docs/guides/desgin-concept.md index ddbffefef..16d970674 100644 --- a/content/en/docs/guides/desgin-concept.md +++ b/content/en/docs/guides/desgin-concept.md @@ -12,7 +12,7 @@ RDF is a W3C standard, while Property Graph is an industry standard and is widel The storage concept model corresponding to HugeGraph is also designed with reference to Property Graph. For specific examples, see the figure below: ( This figure is outdated for the old version design, please ignore it and update it later ) -![image](/docs/images/design/PropertyGraph.png) +![image](/img/docs/design/PropertyGraph.png) Inside HugeGraph, each vertex/edge is identified by a unique VertexId/EdgeId, and the attributes are stored inside the corresponding vertex/edge. The relationship/mapping between vertices is stored through edges. @@ -29,7 +29,7 @@ Edge Cut method to store graphs, any vertex will only appear on one machine, whi to multiple storage of edges. When using the Vertex Cut method to store graphs, any edge will only appear on one machine, and each same point may be distributed to different machines. This storage method may result in multiple storage of vertices. -![image](/docs/images/design/GraphCut.png) +![image](/img/docs/design/GraphCut.png) The EdgeCut partition scheme can support high-performance insert and update operations, while the VertexCut partition scheme is more suitable for static graph query analysis, so EdgeCut is suitable for OLTP graph query, and VertexCut is more suitable for OLAP graph query. HugeGraph currently adopts the partition scheme of EdgeCut. diff --git a/content/en/docs/guides/toolchain-local-test.md b/content/en/docs/guides/toolchain-local-test.md index 95f6ebe04..b06c71ab8 100644 --- a/content/en/docs/guides/toolchain-local-test.md +++ b/content/en/docs/guides/toolchain-local-test.md @@ -250,7 +250,7 @@ docker compose down Test process for each tool:
- HugeGraph Toolchain Testing Process + HugeGraph Toolchain Testing Process
diff --git a/content/en/docs/images/API-perf/v0.4.4/best.png b/content/en/docs/images/API-perf/v0.4.4/best.png deleted file mode 100644 index 2aa751a88..000000000 Binary files a/content/en/docs/images/API-perf/v0.4.4/best.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.4.4/cpu-memory.png b/content/en/docs/images/API-perf/v0.4.4/cpu-memory.png deleted file mode 100644 index 05fb760dc..000000000 Binary files a/content/en/docs/images/API-perf/v0.4.4/cpu-memory.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.4.4/ssd.png b/content/en/docs/images/API-perf/v0.4.4/ssd.png deleted file mode 100644 index 46b4de1e7..000000000 Binary files a/content/en/docs/images/API-perf/v0.4.4/ssd.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.4.4/threads-batch.png b/content/en/docs/images/API-perf/v0.4.4/threads-batch.png deleted file mode 100644 index 410fdc65c..000000000 Binary files a/content/en/docs/images/API-perf/v0.4.4/threads-batch.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.4.4/threads-single.png b/content/en/docs/images/API-perf/v0.4.4/threads-single.png deleted file mode 100644 index b2a282598..000000000 Binary files a/content/en/docs/images/API-perf/v0.4.4/threads-single.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.5.6/cassandra/edge_batch.png b/content/en/docs/images/API-perf/v0.5.6/cassandra/edge_batch.png deleted file mode 100644 index a3bfb33ad..000000000 Binary files a/content/en/docs/images/API-perf/v0.5.6/cassandra/edge_batch.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.5.6/cassandra/edge_id_query.png b/content/en/docs/images/API-perf/v0.5.6/cassandra/edge_id_query.png deleted file mode 100644 index e8d9ce6c7..000000000 Binary files a/content/en/docs/images/API-perf/v0.5.6/cassandra/edge_id_query.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.5.6/cassandra/edge_single.png b/content/en/docs/images/API-perf/v0.5.6/cassandra/edge_single.png deleted file mode 100644 index 6cdf74b45..000000000 Binary files a/content/en/docs/images/API-perf/v0.5.6/cassandra/edge_single.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.5.6/cassandra/vertex_batch.png b/content/en/docs/images/API-perf/v0.5.6/cassandra/vertex_batch.png deleted file mode 100644 index e69a9e782..000000000 Binary files a/content/en/docs/images/API-perf/v0.5.6/cassandra/vertex_batch.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.5.6/cassandra/vertex_id_query.png b/content/en/docs/images/API-perf/v0.5.6/cassandra/vertex_id_query.png deleted file mode 100644 index efb4702b3..000000000 Binary files a/content/en/docs/images/API-perf/v0.5.6/cassandra/vertex_id_query.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.5.6/cassandra/vertex_single.png b/content/en/docs/images/API-perf/v0.5.6/cassandra/vertex_single.png deleted file mode 100644 index e411da21e..000000000 Binary files a/content/en/docs/images/API-perf/v0.5.6/cassandra/vertex_single.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.5.6/rocksdb/edge_batch.png b/content/en/docs/images/API-perf/v0.5.6/rocksdb/edge_batch.png deleted file mode 100644 index d1639c981..000000000 Binary files a/content/en/docs/images/API-perf/v0.5.6/rocksdb/edge_batch.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.5.6/rocksdb/edge_id_query.png b/content/en/docs/images/API-perf/v0.5.6/rocksdb/edge_id_query.png deleted file mode 100644 index bf34321c3..000000000 Binary files a/content/en/docs/images/API-perf/v0.5.6/rocksdb/edge_id_query.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.5.6/rocksdb/edge_single.png b/content/en/docs/images/API-perf/v0.5.6/rocksdb/edge_single.png deleted file mode 100644 index 67b011e39..000000000 Binary files a/content/en/docs/images/API-perf/v0.5.6/rocksdb/edge_single.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.5.6/rocksdb/vertex_batch.png b/content/en/docs/images/API-perf/v0.5.6/rocksdb/vertex_batch.png deleted file mode 100644 index ce3d54e64..000000000 Binary files a/content/en/docs/images/API-perf/v0.5.6/rocksdb/vertex_batch.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.5.6/rocksdb/vertex_id_query.png b/content/en/docs/images/API-perf/v0.5.6/rocksdb/vertex_id_query.png deleted file mode 100644 index db20de6b9..000000000 Binary files a/content/en/docs/images/API-perf/v0.5.6/rocksdb/vertex_id_query.png and /dev/null differ diff --git a/content/en/docs/images/API-perf/v0.5.6/rocksdb/vertex_single.png b/content/en/docs/images/API-perf/v0.5.6/rocksdb/vertex_single.png deleted file mode 100644 index 2378cc06e..000000000 Binary files a/content/en/docs/images/API-perf/v0.5.6/rocksdb/vertex_single.png and /dev/null differ diff --git a/content/en/docs/images/demo-graph-model.png b/content/en/docs/images/demo-graph-model.png deleted file mode 100644 index b70711253..000000000 Binary files a/content/en/docs/images/demo-graph-model.png and /dev/null differ diff --git a/content/en/docs/images/design/GraphCut.png b/content/en/docs/images/design/GraphCut.png deleted file mode 100644 index adf3852d3..000000000 Binary files a/content/en/docs/images/design/GraphCut.png and /dev/null differ diff --git a/content/en/docs/images/design/PropertyGraph.png b/content/en/docs/images/design/PropertyGraph.png deleted file mode 100644 index 12dbde1db..000000000 Binary files a/content/en/docs/images/design/PropertyGraph.png and /dev/null differ diff --git a/content/en/docs/images/design/Self-loop.png b/content/en/docs/images/design/Self-loop.png deleted file mode 100644 index 274a8b894..000000000 Binary files a/content/en/docs/images/design/Self-loop.png and /dev/null differ diff --git a/content/en/docs/images/design/architectural-component.png b/content/en/docs/images/design/architectural-component.png deleted file mode 100644 index c4e7117ba..000000000 Binary files a/content/en/docs/images/design/architectural-component.png and /dev/null differ diff --git a/content/en/docs/images/design/architectural-overview.png b/content/en/docs/images/design/architectural-overview.png deleted file mode 100644 index c6b9a8e8e..000000000 Binary files a/content/en/docs/images/design/architectural-overview.png and /dev/null differ diff --git a/content/en/docs/images/design/architectural-revised.png b/content/en/docs/images/design/architectural-revised.png deleted file mode 100644 index 2316ebf98..000000000 Binary files a/content/en/docs/images/design/architectural-revised.png and /dev/null differ diff --git a/content/en/docs/images/design1-1.png b/content/en/docs/images/design1-1.png deleted file mode 100644 index 27609f769..000000000 Binary files a/content/en/docs/images/design1-1.png and /dev/null differ diff --git a/content/en/docs/images/design1-2.png b/content/en/docs/images/design1-2.png deleted file mode 100644 index 5c56dc512..000000000 Binary files a/content/en/docs/images/design1-2.png and /dev/null differ diff --git a/content/en/docs/images/design1-3.png b/content/en/docs/images/design1-3.png deleted file mode 100644 index adf3852d3..000000000 Binary files a/content/en/docs/images/design1-3.png and /dev/null differ diff --git a/content/en/docs/images/design1-5.png b/content/en/docs/images/design1-5.png deleted file mode 100644 index c52397f10..000000000 Binary files a/content/en/docs/images/design1-5.png and /dev/null differ diff --git a/content/en/docs/images/design1-6.png b/content/en/docs/images/design1-6.png deleted file mode 100644 index e9e885d0e..000000000 Binary files a/content/en/docs/images/design1-6.png and /dev/null differ diff --git a/content/en/docs/images/design4-1.png b/content/en/docs/images/design4-1.png deleted file mode 100644 index c6b9a8e8e..000000000 Binary files a/content/en/docs/images/design4-1.png and /dev/null differ diff --git a/content/en/docs/images/design5-1.png b/content/en/docs/images/design5-1.png deleted file mode 100644 index c4e7117ba..000000000 Binary files a/content/en/docs/images/design5-1.png and /dev/null differ diff --git a/content/en/docs/images/design5-2.png b/content/en/docs/images/design5-2.png deleted file mode 100644 index 8785ce8bf..000000000 Binary files a/content/en/docs/images/design5-2.png and /dev/null differ diff --git a/content/en/docs/images/design5-3.png b/content/en/docs/images/design5-3.png deleted file mode 100644 index e7359a67b..000000000 Binary files a/content/en/docs/images/design5-3.png and /dev/null differ diff --git a/content/en/docs/images/design5-4.png b/content/en/docs/images/design5-4.png deleted file mode 100644 index 3ce551124..000000000 Binary files a/content/en/docs/images/design5-4.png and /dev/null differ diff --git a/content/en/docs/images/design5-5.png b/content/en/docs/images/design5-5.png deleted file mode 100644 index b7645b88b..000000000 Binary files a/content/en/docs/images/design5-5.png and /dev/null differ diff --git a/content/en/docs/images/favicon.ico b/content/en/docs/images/favicon.ico deleted file mode 100644 index 53f0191eb..000000000 Binary files a/content/en/docs/images/favicon.ico and /dev/null differ diff --git a/content/en/docs/images/gradio-config.png b/content/en/docs/images/gradio-config.png deleted file mode 100644 index b5a282525..000000000 Binary files a/content/en/docs/images/gradio-config.png and /dev/null differ diff --git a/content/en/docs/images/gradio-kg.png b/content/en/docs/images/gradio-kg.png deleted file mode 100644 index 825c1933b..000000000 Binary files a/content/en/docs/images/gradio-kg.png and /dev/null differ diff --git a/content/en/docs/images/gradio-rag-1.png b/content/en/docs/images/gradio-rag-1.png deleted file mode 100644 index 0a4df78c3..000000000 Binary files a/content/en/docs/images/gradio-rag-1.png and /dev/null differ diff --git a/content/en/docs/images/gradio-rag-2.png b/content/en/docs/images/gradio-rag-2.png deleted file mode 100644 index ee24cc43e..000000000 Binary files a/content/en/docs/images/gradio-rag-2.png and /dev/null differ diff --git a/content/en/docs/images/gradio-rag.png b/content/en/docs/images/gradio-rag.png deleted file mode 100644 index 855ed655f..000000000 Binary files a/content/en/docs/images/gradio-rag.png and /dev/null differ diff --git a/content/en/docs/images/graph-of-gods.png b/content/en/docs/images/graph-of-gods.png deleted file mode 100644 index 616c9f795..000000000 Binary files a/content/en/docs/images/graph-of-gods.png and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/2\345\271\263\345\217\260\344\275\277\347\224\250\346\265\201\347\250\213.png" "b/content/en/docs/images/images-hubble/2\345\271\263\345\217\260\344\275\277\347\224\250\346\265\201\347\250\213.png" deleted file mode 100644 index c2c902cdf..000000000 Binary files "a/content/en/docs/images/images-hubble/2\345\271\263\345\217\260\344\275\277\347\224\250\346\265\201\347\250\213.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\272.png" "b/content/en/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\272.png" deleted file mode 100644 index b44bd14c9..000000000 Binary files "a/content/en/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\272.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\2722.png" "b/content/en/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\2722.png" deleted file mode 100644 index 2ad9c5293..000000000 Binary files "a/content/en/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\2722.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/312\345\233\276\350\256\277\351\227\256.png" "b/content/en/docs/images/images-hubble/312\345\233\276\350\256\277\351\227\256.png" deleted file mode 100644 index 6c1b79134..000000000 Binary files "a/content/en/docs/images/images-hubble/312\345\233\276\350\256\277\351\227\256.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/313\345\233\276\347\256\241\347\220\206.png" "b/content/en/docs/images/images-hubble/313\345\233\276\347\256\241\347\220\206.png" deleted file mode 100644 index dd98d97f9..000000000 Binary files "a/content/en/docs/images/images-hubble/313\345\233\276\347\256\241\347\220\206.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/321\345\205\203\346\225\260\346\215\256\345\205\245\345\217\243.png" "b/content/en/docs/images/images-hubble/321\345\205\203\346\225\260\346\215\256\345\205\245\345\217\243.png" deleted file mode 100644 index 3004ed0de..000000000 Binary files "a/content/en/docs/images/images-hubble/321\345\205\203\346\225\260\346\215\256\345\205\245\345\217\243.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\272.png" "b/content/en/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\272.png" deleted file mode 100644 index 5da69a181..000000000 Binary files "a/content/en/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\272.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\2722.png" "b/content/en/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\2722.png" deleted file mode 100644 index 8b277fb1d..000000000 Binary files "a/content/en/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\2722.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\250.png" "b/content/en/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\250.png" deleted file mode 100644 index 634ae1361..000000000 Binary files "a/content/en/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\250.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\2502.png" "b/content/en/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\2502.png" deleted file mode 100644 index ef0054d05..000000000 Binary files "a/content/en/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\2502.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\272.png" "b/content/en/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\272.png" deleted file mode 100644 index 0a43bfd6c..000000000 Binary files "a/content/en/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\272.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\2722.png" "b/content/en/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\2722.png" deleted file mode 100644 index 339c89e3d..000000000 Binary files "a/content/en/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\2722.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/3233\351\241\266\347\202\271\345\210\240\351\231\244.png" "b/content/en/docs/images/images-hubble/3233\351\241\266\347\202\271\345\210\240\351\231\244.png" deleted file mode 100644 index 0ef343f56..000000000 Binary files "a/content/en/docs/images/images-hubble/3233\351\241\266\347\202\271\345\210\240\351\231\244.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\272.png" "b/content/en/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\272.png" deleted file mode 100644 index 545e60505..000000000 Binary files "a/content/en/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\272.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\2722.png" "b/content/en/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\2722.png" deleted file mode 100644 index ac536c889..000000000 Binary files "a/content/en/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\2722.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/331\345\257\274\345\205\245\345\205\245\345\217\243.png" "b/content/en/docs/images/images-hubble/331\345\257\274\345\205\245\345\205\245\345\217\243.png" deleted file mode 100644 index caf203f58..000000000 Binary files "a/content/en/docs/images/images-hubble/331\345\257\274\345\205\245\345\205\245\345\217\243.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/332\345\210\233\345\273\272\344\273\273\345\212\241.png" "b/content/en/docs/images/images-hubble/332\345\210\233\345\273\272\344\273\273\345\212\241.png" deleted file mode 100644 index 109aa4822..000000000 Binary files "a/content/en/docs/images/images-hubble/332\345\210\233\345\273\272\344\273\273\345\212\241.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/333\344\270\212\344\274\240\346\226\207\344\273\266.png" "b/content/en/docs/images/images-hubble/333\344\270\212\344\274\240\346\226\207\344\273\266.png" deleted file mode 100644 index ae738f97b..000000000 Binary files "a/content/en/docs/images/images-hubble/333\344\270\212\344\274\240\346\226\207\344\273\266.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\204.png" "b/content/en/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\204.png" deleted file mode 100644 index 7d5ac74ae..000000000 Binary files "a/content/en/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\204.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\2042.png" "b/content/en/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\2042.png" deleted file mode 100644 index 26d7b56e3..000000000 Binary files "a/content/en/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\2042.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/335\345\257\274\345\205\245\350\256\276\347\275\256.png" "b/content/en/docs/images/images-hubble/335\345\257\274\345\205\245\350\256\276\347\275\256.png" deleted file mode 100644 index 98913365f..000000000 Binary files "a/content/en/docs/images/images-hubble/335\345\257\274\345\205\245\350\256\276\347\275\256.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/335\345\257\274\345\205\245\350\257\246\346\203\205.png" "b/content/en/docs/images/images-hubble/335\345\257\274\345\205\245\350\257\246\346\203\205.png" deleted file mode 100644 index 1bb36aa2b..000000000 Binary files "a/content/en/docs/images/images-hubble/335\345\257\274\345\205\245\350\257\246\346\203\205.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/33\345\257\274\345\205\245\346\265\201\347\250\213.png" "b/content/en/docs/images/images-hubble/33\345\257\274\345\205\245\346\265\201\347\250\213.png" deleted file mode 100644 index 604ac3604..000000000 Binary files "a/content/en/docs/images/images-hubble/33\345\257\274\345\205\245\346\265\201\347\250\213.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/341\345\210\206\346\236\220\345\205\245\345\217\243.png" "b/content/en/docs/images/images-hubble/341\345\210\206\346\236\220\345\205\245\345\217\243.png" deleted file mode 100644 index fdaac4dc5..000000000 Binary files "a/content/en/docs/images/images-hubble/341\345\210\206\346\236\220\345\205\245\345\217\243.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/342\345\244\232\345\233\276\345\210\207\346\215\242.png" "b/content/en/docs/images/images-hubble/342\345\244\232\345\233\276\345\210\207\346\215\242.png" deleted file mode 100644 index c48146100..000000000 Binary files "a/content/en/docs/images/images-hubble/342\345\244\232\345\233\276\345\210\207\346\215\242.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-json.png" "b/content/en/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-json.png" deleted file mode 100644 index 712ffb917..000000000 Binary files "a/content/en/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-json.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\345\233\276.png" "b/content/en/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\345\233\276.png" deleted file mode 100644 index 59214e32e..000000000 Binary files "a/content/en/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\345\233\276.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\350\241\250\346\240\274.png" "b/content/en/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\350\241\250\346\240\274.png" deleted file mode 100644 index 2cdc6ad60..000000000 Binary files "a/content/en/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\350\241\250\346\240\274.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/345\345\256\232\345\210\266\350\267\257\345\276\204\346\237\245\350\257\242.png" "b/content/en/docs/images/images-hubble/345\345\256\232\345\210\266\350\267\257\345\276\204\346\237\245\350\257\242.png" deleted file mode 100644 index 0ede73226..000000000 Binary files "a/content/en/docs/images/images-hubble/345\345\256\232\345\210\266\350\267\257\345\276\204\346\237\245\350\257\242.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\271.png" "b/content/en/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\271.png" deleted file mode 100644 index 3487fb5b7..000000000 Binary files "a/content/en/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\271.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\2712.png" "b/content/en/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\2712.png" deleted file mode 100644 index 1c8fc91bc..000000000 Binary files "a/content/en/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\2712.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/347\346\224\266\350\227\217.png" "b/content/en/docs/images/images-hubble/347\346\224\266\350\227\217.png" deleted file mode 100644 index bf8ca10c6..000000000 Binary files "a/content/en/docs/images/images-hubble/347\346\224\266\350\227\217.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/351\344\273\273\345\212\241\347\256\241\347\220\206\345\205\245\345\217\243.png" "b/content/en/docs/images/images-hubble/351\344\273\273\345\212\241\347\256\241\347\220\206\345\205\245\345\217\243.png" deleted file mode 100644 index 383d72eb3..000000000 Binary files "a/content/en/docs/images/images-hubble/351\344\273\273\345\212\241\347\256\241\347\220\206\345\205\245\345\217\243.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/352\344\273\273\345\212\241\345\210\227\350\241\250.png" "b/content/en/docs/images/images-hubble/352\344\273\273\345\212\241\345\210\227\350\241\250.png" deleted file mode 100644 index 6cf016f59..000000000 Binary files "a/content/en/docs/images/images-hubble/352\344\273\273\345\212\241\345\210\227\350\241\250.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/353gremlin\344\273\273\345\212\241.png" "b/content/en/docs/images/images-hubble/353gremlin\344\273\273\345\212\241.png" deleted file mode 100644 index d260959fc..000000000 Binary files "a/content/en/docs/images/images-hubble/353gremlin\344\273\273\345\212\241.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/353gremlin\344\273\273\345\212\2412.png" "b/content/en/docs/images/images-hubble/353gremlin\344\273\273\345\212\2412.png" deleted file mode 100644 index 9bb49f462..000000000 Binary files "a/content/en/docs/images/images-hubble/353gremlin\344\273\273\345\212\2412.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/355\344\273\273\345\212\241\350\257\246\346\203\205.png" "b/content/en/docs/images/images-hubble/355\344\273\273\345\212\241\350\257\246\346\203\205.png" deleted file mode 100644 index 8d96130fe..000000000 Binary files "a/content/en/docs/images/images-hubble/355\344\273\273\345\212\241\350\257\246\346\203\205.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/355\345\210\240\351\231\244\345\205\203\346\225\260\346\215\256.png" "b/content/en/docs/images/images-hubble/355\345\210\240\351\231\244\345\205\203\346\225\260\346\215\256.png" deleted file mode 100644 index 4ec32dbc2..000000000 Binary files "a/content/en/docs/images/images-hubble/355\345\210\240\351\231\244\345\205\203\346\225\260\346\215\256.png" and /dev/null differ diff --git "a/content/en/docs/images/images-hubble/355\346\236\204\345\273\272\347\264\242\345\274\225.png" "b/content/en/docs/images/images-hubble/355\346\236\204\345\273\272\347\264\242\345\274\225.png" deleted file mode 100644 index 61d0c87e6..000000000 Binary files "a/content/en/docs/images/images-hubble/355\346\236\204\345\273\272\347\264\242\345\274\225.png" and /dev/null differ diff --git a/content/en/docs/images/images-server/31docker-option.jpg b/content/en/docs/images/images-server/31docker-option.jpg deleted file mode 100644 index 67db0fcc5..000000000 Binary files a/content/en/docs/images/images-server/31docker-option.jpg and /dev/null differ diff --git a/content/en/docs/images/images-server/swagger-ui-set-auth-example.png b/content/en/docs/images/images-server/swagger-ui-set-auth-example.png deleted file mode 100644 index 2ef357d09..000000000 Binary files a/content/en/docs/images/images-server/swagger-ui-set-auth-example.png and /dev/null differ diff --git a/content/en/docs/images/images-server/swagger-ui-where-set-auth-example.png b/content/en/docs/images/images-server/swagger-ui-where-set-auth-example.png deleted file mode 100644 index 1e13bf72b..000000000 Binary files a/content/en/docs/images/images-server/swagger-ui-where-set-auth-example.png and /dev/null differ diff --git a/content/en/docs/images/images-server/swagger-ui.png b/content/en/docs/images/images-server/swagger-ui.png deleted file mode 100644 index 87a154818..000000000 Binary files a/content/en/docs/images/images-server/swagger-ui.png and /dev/null differ diff --git a/content/en/docs/images/images-studio/add-schema.png b/content/en/docs/images/images-studio/add-schema.png deleted file mode 100644 index 9bec32e6d..000000000 Binary files a/content/en/docs/images/images-studio/add-schema.png and /dev/null differ diff --git a/content/en/docs/images/images-studio/example-2V-1E.png b/content/en/docs/images/images-studio/example-2V-1E.png deleted file mode 100644 index e9d13a68b..000000000 Binary files a/content/en/docs/images/images-studio/example-2V-1E.png and /dev/null differ diff --git a/content/en/docs/images/images-studio/home-page.png b/content/en/docs/images/images-studio/home-page.png deleted file mode 100644 index fb46571ba..000000000 Binary files a/content/en/docs/images/images-studio/home-page.png and /dev/null differ diff --git a/content/en/docs/images/images-studio/show-graph.png b/content/en/docs/images/images-studio/show-graph.png deleted file mode 100644 index a1b90ddee..000000000 Binary files a/content/en/docs/images/images-studio/show-graph.png and /dev/null differ diff --git a/content/en/docs/images/images-studio/show-json.png b/content/en/docs/images/images-studio/show-json.png deleted file mode 100644 index f82e402cb..000000000 Binary files a/content/en/docs/images/images-studio/show-json.png and /dev/null differ diff --git a/content/en/docs/images/images-studio/show-table.png b/content/en/docs/images/images-studio/show-table.png deleted file mode 100644 index 786b80456..000000000 Binary files a/content/en/docs/images/images-studio/show-table.png and /dev/null differ diff --git a/content/en/docs/images/kg-uml.png b/content/en/docs/images/kg-uml.png deleted file mode 100644 index d823e7f89..000000000 Binary files a/content/en/docs/images/kg-uml.png and /dev/null differ diff --git a/content/en/docs/images/logo.png b/content/en/docs/images/logo.png deleted file mode 100644 index 12df76ac6..000000000 Binary files a/content/en/docs/images/logo.png and /dev/null differ diff --git a/content/en/docs/images/ojdbc8.png b/content/en/docs/images/ojdbc8.png deleted file mode 100644 index b6d095d79..000000000 Binary files a/content/en/docs/images/ojdbc8.png and /dev/null differ diff --git a/content/en/docs/images/oracle-download.png b/content/en/docs/images/oracle-download.png deleted file mode 100644 index 357db40e9..000000000 Binary files a/content/en/docs/images/oracle-download.png and /dev/null differ diff --git a/content/en/docs/introduction/_index.md b/content/en/docs/introduction/_index.md index 00955a612..ebf946c21 100644 --- a/content/en/docs/introduction/_index.md +++ b/content/en/docs/introduction/_index.md @@ -1,5 +1,5 @@ --- -title: "Introduction with HugeGraph" +title: "Introduction to HugeGraph" linkTitle: "Introduction" weight: 1 aliases: @@ -90,7 +90,7 @@ A complete tool ecosystem surrounding the graph system ([toolchain repository](h | [Hubble](/docs/quickstart/toolchain/hugegraph-hubble) | Web visualization platform: one-stop operation for data modeling → batch importing → online/offline analysis. | | [Loader](/docs/quickstart/toolchain/hugegraph-loader) | Data import tool: supports multiple data sources like local files, HDFS, MySQL, and formats like TXT/CSV/JSON. | | [Client](/docs/quickstart/client/hugegraph-client) | Multi-language SDKs: Java / Python / Go. | -| [Spark-connector](/docs/quickstart/toolchain/hugegraph-spark-connector) | Spark integration: supports batch graph data read/write via Spark, suitable for big data offline processing. | +| [Spark-connector](../quickstart/toolchain/hugegraph-spark-connector/) | Spark integration: supports batch graph data read/write via Spark, suitable for big data offline processing. | | [Tools](/docs/quickstart/toolchain/hugegraph-tools) | Command-line operational tools: graph management, backup/restore, Gremlin execution, etc. | --- @@ -138,8 +138,8 @@ docker run -itd --name=hugegraph -p 8080:8080 hugegraph/hugegraph ### Contact Us - [GitHub Issues](https://github.com/apache/hugegraph/issues): Feedback on usage issues and functional requirements (Recommended) -- Email: [dev@hugegraph.apache.org](mailto:dev@hugegraph.apache.org) ([How to subscribe](/docs/contribution-guidelines/subscribe/)) +- Email: [dev@hugegraph.apache.org](mailto:dev@hugegraph.apache.org) ([How to subscribe](/community/contribution-guidelines/subscribe/)) - Security: [security@hugegraph.apache.org](mailto:security@hugegraph.apache.org) (Report security issues) - WeChat Public Account: Apache HugeGraph -WeChat QR Code +WeChat QR Code diff --git a/content/en/docs/language/_index.md b/content/en/docs/language/_index.md index eaacdd517..91a087e29 100644 --- a/content/en/docs/language/_index.md +++ b/content/en/docs/language/_index.md @@ -1,5 +1,5 @@ --- -title: "QUERY LANGUAGE" -linkTitle: "QUERY LANGUAGE" +title: "Query Language" +linkTitle: "Query Language" weight: 7 ---- \ No newline at end of file +--- diff --git a/content/en/docs/language/hugegraph-example.md b/content/en/docs/language/hugegraph-example.md index a0415029c..c173902b4 100644 --- a/content/en/docs/language/hugegraph-example.md +++ b/content/en/docs/language/hugegraph-example.md @@ -26,7 +26,7 @@ Compared to TitanDB, HugeGraph's main features are as follows: This example uses the Property Graph Model to describe the relationships between characters in Greek mythology, also known as the character relationship graph. The specific relationships are shown in the diagram below.
- image + image
diff --git a/content/en/docs/performance/_index.md b/content/en/docs/performance/_index.md index 90eb661c2..364275bcd 100644 --- a/content/en/docs/performance/_index.md +++ b/content/en/docs/performance/_index.md @@ -1,5 +1,5 @@ --- -title: "PERFORMANCE" -linkTitle: "PERFORMANCE" +title: "Performance" +linkTitle: "Performance" weight: 8 ---- \ No newline at end of file +--- diff --git a/content/en/docs/performance/api-performance/_index.md b/content/en/docs/performance/api-performance/_index.md index 5d08db000..17aaea8c5 100644 --- a/content/en/docs/performance/api-performance/_index.md +++ b/content/en/docs/performance/api-performance/_index.md @@ -12,7 +12,7 @@ The HugeGraph API performance test mainly tests HugeGraph-Server's ability to co For the performance test of the RESTful API of each release version of HugeGraph, please refer to: -- [HugeGraph API-0.5.6-RocksDB](/docs/performance/api-performance/hugegraph-api-0.5.6-rocksdb) -- [HugeGraph API-0.5.6-Cassandra](/docs/performance/api-performance/hugegraph-api-0.5.6-cassandra) +- [HugeGraph API-0.5.6-RocksDB](hugegraph-api-0.5.6-rocksdb/) +- [HugeGraph API-0.5.6-Cassandra](hugegraph-api-0.5.6-cassandra/) > Updates coming soon, stay tuned! diff --git a/content/en/docs/performance/api-performance/hugegraph-api-0.4.4.md b/content/en/docs/performance/api-performance/hugegraph-api-0.4.4.md index a3c68787b..7ec1135ef 100644 --- a/content/en/docs/performance/api-performance/hugegraph-api-0.4.4.md +++ b/content/en/docs/performance/api-performance/hugegraph-api-0.4.4.md @@ -63,7 +63,7 @@ Duration: 5 minutes ###### Maximum Insertion Speed of Vertices and Edges (High-performance server with SSD storage for RocksDB data):
- image + image
###### Conclusion: @@ -74,7 +74,7 @@ Duration: 5 minutes **1\. The Impact of CPU and Memory on Insertion Performance (Servers Using HDD Storage for RocksDB Data, Batch Insertion)**
- image + image
###### Conclusion: @@ -85,7 +85,7 @@ Duration: 5 minutes **2\. The Impact of SSD and HDD on Insertion Performance (High-performance Servers, Batch Insertion)**
- image + image
###### Conclusion: @@ -96,7 +96,7 @@ Duration: 5 minutes **3\. The Impact of Different Concurrent Thread Numbers on Insertion Performance (Ordinary Servers, HDD Storage for RocksDB Data)**
- image + image
##### Conclusion: @@ -118,7 +118,7 @@ Continuously increase the concurrency level and test the upper limit of the pres - Service exception criteria: Error rate greater than 0.00%.
- image + image
#### Conclusion: diff --git a/content/en/docs/performance/api-performance/hugegraph-api-0.5.6-cassandra.md b/content/en/docs/performance/api-performance/hugegraph-api-0.5.6-cassandra.md index a4f1e3055..26a9dbd3f 100644 --- a/content/en/docs/performance/api-performance/hugegraph-api-0.5.6-cassandra.md +++ b/content/en/docs/performance/api-performance/hugegraph-api-0.5.6-cassandra.md @@ -65,7 +65,7 @@ Duration: 5 minutes. ###### Maximum Insertion Speed of Vertices:
- image + image
###### Conclusion: @@ -75,7 +75,7 @@ Duration: 5 minutes. ###### Maximum Insertion Speed of Edges:
- image + image
###### Conclusion: @@ -98,7 +98,7 @@ Continuously increase the concurrency level to test the upper limit of the serve ###### Single Insertion of Vertices:
- image + image
###### Conclusion: @@ -108,7 +108,7 @@ Continuously increase the concurrency level to test the upper limit of the serve ###### Single Insertion of Edges:
- image + image
@@ -132,7 +132,7 @@ Continuously increase the concurrency and test the upper limit of the pressure t ###### Query by ID for vertices
- image + image
@@ -143,7 +143,7 @@ Continuously increase the concurrency and test the upper limit of the pressure t ###### Edge search by ID
- image + image
###### Conclusion: diff --git a/content/en/docs/performance/api-performance/hugegraph-api-0.5.6-rocksdb.md b/content/en/docs/performance/api-performance/hugegraph-api-0.5.6-rocksdb.md index 4251f7840..038478aed 100644 --- a/content/en/docs/performance/api-performance/hugegraph-api-0.5.6-rocksdb.md +++ b/content/en/docs/performance/api-performance/hugegraph-api-0.5.6-rocksdb.md @@ -65,7 +65,7 @@ Duration: 5 minutes ###### Maximum insertion speed for vertices:
- image + image
@@ -78,7 +78,7 @@ Duration: 5 minutes
- image + image
###### Conclusion: @@ -101,7 +101,7 @@ Stress limit testing is a process of continuously increasing the concurrency lev ###### Single vertex insertion
- image + image
@@ -112,7 +112,7 @@ Stress limit testing is a process of continuously increasing the concurrency lev ###### Single edge insertion
- image + image
@@ -136,7 +136,7 @@ Continuously increasing the concurrency level to test the upper limit of the ser ###### Querying vertices by ID
- image + image
###### Conclusion: @@ -146,7 +146,7 @@ Continuously increasing the concurrency level to test the upper limit of the ser ###### Querying edges by ID
- image + image
diff --git a/content/en/docs/quickstart/client/hugegraph-client-python.md b/content/en/docs/quickstart/client/hugegraph-client-python.md index c468a30e2..df4f83b98 100644 --- a/content/en/docs/quickstart/client/hugegraph-client-python.md +++ b/content/en/docs/quickstart/client/hugegraph-client-python.md @@ -178,7 +178,7 @@ Other info is under 🚧 (Welcome to add more docs for it, users could refer [ja ## Contributing -* Welcome to contribute to `hugegraph-python-client`. Please see the [Guidelines](https://hugegraph.apache.org/docs/contribution-guidelines/) for more information. +* Welcome to contribute to `hugegraph-python-client`. Please see the [Guidelines](https://hugegraph.apache.org/community/contribution-guidelines/) for more information. * Code format: Please run `./style/code_format_and_analysis.sh` to format your code before submitting a PR. Thank you to all the people who already contributed to `hugegraph-python-client`! diff --git a/content/en/docs/quickstart/computing/hugegraph-computer.md b/content/en/docs/quickstart/computing/hugegraph-computer.md index 92b84d454..7b3f5893d 100644 --- a/content/en/docs/quickstart/computing/hugegraph-computer.md +++ b/content/en/docs/quickstart/computing/hugegraph-computer.md @@ -94,7 +94,7 @@ algorithm.params_class=org.apache.hugegraph.computer.algorithm.centrality.pagera #### 3.1.4 Start master node -> You can use `-c` parameter specify the configuration file, more computer config please see:[Computer Config Options](/docs/quickstart/computing/hugegraph-computer-config#computer-config-options) +> You can use `-c` parameter specify the configuration file, more computer config please see:[Computer Config Options](./hugegraph-computer-config.md) ```bash cd hugegraph-computer @@ -168,9 +168,9 @@ hugegraph-computer-operator-etcd-28lm67jxk5 1/1 Runnin #### 3.2.5 Submit a job -> More computer crd please see: [Computer CRD](/docs/quickstart/computing/hugegraph-computer-config#hugegraph-computer-crd) +> More computer crd please see: [Computer CRD](./hugegraph-computer-config.md) > -> More computer config please see: [Computer Config Options](/docs/quickstart/computing/hugegraph-computer-config#computer-config-options) +> More computer config please see: [Computer Config Options](./hugegraph-computer-config.md) **Basic Example:** diff --git a/content/en/docs/quickstart/hugegraph-ai/_index.md b/content/en/docs/quickstart/hugegraph-ai/_index.md index 26eb46322..d7a0f2eaa 100644 --- a/content/en/docs/quickstart/hugegraph-ai/_index.md +++ b/content/en/docs/quickstart/hugegraph-ai/_index.md @@ -161,7 +161,7 @@ Python client for HugeGraph operations: ## 🤝 Contributing -We welcome contributions! Please see our [contribution guidelines](https://hugegraph.apache.org/docs/contribution-guidelines/) for details. +We welcome contributions! Please see our [contribution guidelines](https://hugegraph.apache.org/community/contribution-guidelines/) for details. **Development Setup:** - Use [GitHub Desktop](https://desktop.github.com/) for easier PR management @@ -177,7 +177,7 @@ hugegraph-ai is licensed under [Apache 2.0 License](https://github.com/apache/hu ## 📞 Contact Us - **GitHub Issues**: [Report bugs or request features](https://github.com/apache/hugegraph-ai/issues) (fastest response) -- **Email**: [dev@hugegraph.apache.org](mailto:dev@hugegraph.apache.org) ([subscription required](https://hugegraph.apache.org/docs/contribution-guidelines/subscribe/)) +- **Email**: [dev@hugegraph.apache.org](mailto:dev@hugegraph.apache.org) ([subscription required](https://hugegraph.apache.org/community/contribution-guidelines/subscribe/)) - **WeChat**: Follow "Apache HugeGraph" on WeChat -Apache HugeGraph WeChat QR Code +Apache HugeGraph WeChat QR Code diff --git a/content/en/docs/quickstart/hugegraph-ai/hugegraph-llm.md b/content/en/docs/quickstart/hugegraph-ai/hugegraph-llm.md index 509bb98be..8240db500 100644 --- a/content/en/docs/quickstart/hugegraph-ai/hugegraph-llm.md +++ b/content/en/docs/quickstart/hugegraph-ai/hugegraph-llm.md @@ -136,7 +136,7 @@ Use the Gradio interface for visual knowledge graph building: - **Custom Schema**: JSON format following our [template](https://github.com/apache/hugegraph-ai/blob/aff3bbe25fa91c3414947a196131be812c20ef11/hugegraph-llm/src/hugegraph_llm/config/config_data.py#L125) - **HugeGraph Schema**: Use existing graph instance schema (e.g., "hugegraph") -![Knowledge Graph Builder](https://hugegraph.apache.org/docs/images/gradio-kg.png) +![Knowledge Graph Builder](/img/docs/gradio-kg.png) #### Programmatic Construction diff --git a/content/en/docs/quickstart/hugegraph-ai/hugegraph-ml.md b/content/en/docs/quickstart/hugegraph-ai/hugegraph-ml.md index 86aae8d24..5a954538e 100644 --- a/content/en/docs/quickstart/hugegraph-ai/hugegraph-ml.md +++ b/content/en/docs/quickstart/hugegraph-ai/hugegraph-ml.md @@ -33,7 +33,7 @@ HugeGraph-ML integrates HugeGraph with popular graph learning libraries, enablin docker run -itd --name=hugegraph -p 8080:8080 hugegraph/hugegraph # Option 2: Binary packages -# See https://hugegraph.apache.org/docs/download/download/ +# See https://hugegraph.apache.org/download/ ``` ### 2. Clone and Setup diff --git a/content/en/docs/quickstart/hugegraph-ai/quick_start.md b/content/en/docs/quickstart/hugegraph-ai/quick_start.md index 04852db52..f5adeacf4 100644 --- a/content/en/docs/quickstart/hugegraph-ai/quick_start.md +++ b/content/en/docs/quickstart/hugegraph-ai/quick_start.md @@ -21,7 +21,7 @@ weight: 4 Construct a knowledge graph, chunk vector, and graph vid vector from the text. -![image](https://github.com/user-attachments/assets/f3366d46-2e31-4638-94c4-7214951ef77a) +![image](/img/docs/hugegraph-ai/quick-start/f3366d46-2e31-4638-94c4-7214951ef77a.png) ```mermaid graph TD; @@ -81,7 +81,7 @@ This module consists of two parts: The first part handles single queries, while the second part handles multiple queries at once. Below is an explanation of the first part. -![image](https://github.com/user-attachments/assets/33698062-e46b-4757-8b5e-93e8f10eae65) +![image](/img/docs/hugegraph-ai/quick-start/33698062-e46b-4757-8b5e-93e8f10eae65.png) ```mermaid @@ -114,7 +114,7 @@ graph TD; - **Graph-only Answer:** Uses only graph-based retrieval (queries graph vid vectors in the vector database and the graph database) - **Graph-Vector Answer:** Uses both graph-based and vector-based retrieval -![image](https://github.com/user-attachments/assets/26641e09-249f-4b3a-8013-16dc9383d333) +![image](/img/docs/hugegraph-ai/quick-start/26641e09-249f-4b3a-8013-16dc9383d333.png) ### Execution Flow: @@ -122,7 +122,7 @@ graph TD; - Extract keywords from the **question** using the **Keywords Extraction Prompt**. -![image](https://github.com/user-attachments/assets/b49e269f-eaec-40b1-8d8f-9e409821d75d) +![image](/img/docs/hugegraph-ai/quick-start/b49e269f-eaec-40b1-8d8f-9e409821d75d.png) - Use the extracted keywords to: @@ -151,7 +151,7 @@ graph TD; - **Graph-only Answer** - **Graph-Vector Answer** -![image](https://github.com/user-attachments/assets/7d4496a3-d44c-4491-9463-8e93595dfa45) +![image](/img/docs/hugegraph-ai/quick-start/7d4496a3-d44c-4491-9463-8e93595dfa45.png) # 4. (Processing Flow) Text2Gremlin @@ -164,7 +164,7 @@ This module consists of two parts: The first part is straightforward, so the focus is on the second part. -![image](https://github.com/user-attachments/assets/fc678369-261d-49ea-a289-1ca6ade5ca55) +![image](/img/docs/hugegraph-ai/quick-start/fc678369-261d-49ea-a289-1ca6ade5ca55.png) ```mermaid @@ -180,7 +180,7 @@ graph TD; - **Natural Language** **Query**: Input the natural language text to be converted into Gremlin. -![image](https://github.com/user-attachments/assets/d2a72f45-488c-4099-968b-a11816655ba0) +![image](/img/docs/hugegraph-ai/quick-start/d2a72f45-488c-4099-968b-a11816655ba0.png) - **Schema:** Input the graph schema. @@ -199,7 +199,7 @@ graph TD; - Retrieve the **graph schema**. - Query the vector database for example vectors, retrieving query-gremlin pairs similar to the input query (if the vector database lacks examples, it automatically initializes with examples from the **resources** folder). -![image](https://github.com/user-attachments/assets/fd150f87-27f8-48e5-8a55-319ec039b7e0) +![image](/img/docs/hugegraph-ai/quick-start/fd150f87-27f8-48e5-8a55-319ec039b7e0.png) - Generate the Gremlin query using the constructed prompt. diff --git a/content/en/docs/quickstart/hugegraph-studio.md b/content/en/docs/quickstart/hugegraph-studio.md index 864b5589f..f632474eb 100644 --- a/content/en/docs/quickstart/hugegraph-studio.md +++ b/content/en/docs/quickstart/hugegraph-studio.md @@ -158,7 +158,7 @@ graph.schema().propertyKey("price").asInt().ifNotExist().create() 执行完成后,可以得到返回的数据,表明执行成功。如图所示
- image + image
@@ -189,7 +189,7 @@ marko.addEdge("knows", vadas, "date", "20160110") 在页面中输入语句,这样我们就创建了两个顶点一条边,点击执行,结果如下图所示
- image + image
@@ -220,7 +220,7 @@ g.V() 如下图所示
- image + image
@@ -229,14 +229,14 @@ HugeGraph-Studio不仅支持通过graph的方式展示数据,还支持表格 **表格展示形式**
- image + image
**Json展示形式**
- image + image
diff --git a/content/en/docs/quickstart/hugegraph/hugegraph-server.md b/content/en/docs/quickstart/hugegraph/hugegraph-server.md index 4197acbbb..5c916f508 100644 --- a/content/en/docs/quickstart/hugegraph/hugegraph-server.md +++ b/content/en/docs/quickstart/hugegraph/hugegraph-server.md @@ -49,7 +49,7 @@ Optional: If you use Docker Desktop, you can set the options as follows:
- image + image
> **Note**: The Docker Compose files use bridge networking (`hg-net`) and work on Linux and Mac (Docker Desktop). For the 3-node distributed cluster on Mac (Docker Desktop), allocate at least **12 GB** of memory (Settings → Resources → Memory). On Linux, Docker uses host memory directly. @@ -164,7 +164,7 @@ tar zxf *hugegraph-*.tar.gz cd *hugegraph*/*tool* ``` -> note: `${version}` is the version, The latest version can refer to [Download Page](/docs/download/download), or click the link to download directly from the Download page +> note: `${version}` is the version, The latest version can refer to [Download Page](/download/), or click the link to download directly from the Download page The general entry script for HugeGraph-Tools is `bin/hugegraph`, Users can use the `help` command to view its usage, here only the commands for one-click deployment are introduced. @@ -406,7 +406,7 @@ Starting HugeGraphServer... Connecting to HugeGraphServer (http://127.0.0.1:8080/graphs)....OK ``` -**ToplingDB (Beta)**: As a high-performance alternative to RocksDB, please refer to the configuration guide: [ToplingDB Quick Start]({{< ref path="/blog/hugegraph/toplingdb/toplingdb-quick-start.md" lang="en">}}) +**ToplingDB (Beta)**: As a high-performance alternative to RocksDB, please refer to the configuration guide: [ToplingDB Quick Start](/blog/2025/10/09/toplingdb-quick-start/) @@ -850,19 +850,19 @@ For the detailed API, please refer to [RESTful-API](/docs/clients/restful-api) You can also visit `localhost:8080/swagger-ui/index.html` to check the API.
- image + image
When using Swagger UI to debug the API provided by HugeGraph, if HugeGraph Server turns on authentication mode, you can enter authentication information on the Swagger page.
- image + image
Currently, HugeGraph supports setting authentication information in two forms: Basic and Bearer.
- image + image
### 7 Stop Server @@ -874,4 +874,4 @@ $bin/stop-hugegraph.sh ### 8 Debug Server with IntelliJ IDEA -Please refer to [Setup Server in IDEA](/docs/contribution-guidelines/hugegraph-server-idea-setup) +Please refer to [Setup Server in IDEA](/community/contribution-guidelines/hugegraph-server-idea-setup) diff --git a/content/en/docs/quickstart/toolchain/hugegraph-hubble.md b/content/en/docs/quickstart/toolchain/hugegraph-hubble.md index 8d04d5e96..e56a22057 100644 --- a/content/en/docs/quickstart/toolchain/hugegraph-hubble.md +++ b/content/en/docs/quickstart/toolchain/hugegraph-hubble.md @@ -157,7 +157,7 @@ bin/start-hubble.sh -d The module usage process of the platform is as follows:
- image + image
@@ -167,14 +167,14 @@ The module usage process of the platform is as follows: Under the graph management module, click [Create graph], and realize the connection of multiple graphs by filling in the graph ID, graph name, host name, port number, username, and password information.
- image + image
Create graph by filling in the content as follows:
- image + image
> **Special Note**: If you are starting `hubble` with Docker, and `hubble` and the server are on the same host. When configuring the hostname for the graph on the Hubble web page, please do not directly set it to `localhost/127.0.0.1`. If `hubble` and `server` is in the same docker network, we **recommend** using the `container_name` (in our example, it is `graph`) as the hostname, and `8080` as the port. Or you can use the **host IP** as the hostname, and the port is configured by the host for the server. @@ -183,7 +183,7 @@ Create graph by filling in the content as follows: Realize the information access to the graph space. After entering, you can perform operations such as multidimensional query analysis, metadata management, data import, and algorithm analysis of the graph.
- image + image
@@ -192,7 +192,7 @@ Realize the information access to the graph space. After entering, you can perfo 2. Search range: You can search for the graph name and ID.
- image + image
@@ -201,7 +201,7 @@ Realize the information access to the graph space. After entering, you can perfo Left navigation:
- image + image
@@ -213,14 +213,14 @@ Left navigation: List mode:
- image + image
Graph mode:
- image + image
@@ -231,14 +231,14 @@ Graph mode: Select reuse items:
- image + image
Check reuse items:
- image + image
@@ -252,14 +252,14 @@ Check reuse items: List mode:
- image + image
Graph mode:
- image + image
###### 4.2.3.2 Reuse @@ -272,7 +272,7 @@ Graph mode: 2. You can delete a single item or delete it in batches.
- image + image
@@ -283,14 +283,14 @@ Graph mode: List mode:
- image + image
Graph mode:
- image + image
@@ -313,14 +313,14 @@ Displays vertex and edge indices for vertex types and edge types. The usage process of data import is as follows:
- image + image
##### 4.3.1 Module entrance Left navigation:
- image + image
@@ -329,7 +329,7 @@ Left navigation: 2. Multiple import tasks can be created and imported in parallel.
- image + image
@@ -338,7 +338,7 @@ Left navigation: 2. Multiple files can be uploaded at the same time.
- image + image
@@ -358,14 +358,14 @@ Left navigation: Fill in the settings map:
- image + image
Mapping list:
- image + image
@@ -375,7 +375,7 @@ Before importing, you need to fill in the import setting parameters. After filli - The import setting parameter items are as shown in the figure below, all set the default value, no need to fill in manually
- image + image
@@ -385,7 +385,7 @@ Before importing, you need to fill in the import setting parameters. After filli - If the import fails, you can view the specific reason
- image + image
@@ -393,14 +393,14 @@ Before importing, you need to fill in the import setting parameters. After filli ##### 4.4.1 Module entry Left navigation:
- image + image
##### 4.4.2 Multi-graphs switching By switching the entrance on the left, flexibly switch the operation space of multiple graphs
- image + image
@@ -415,19 +415,19 @@ Support zoom, center, full screen, export and other operations. 【Picture Mode】
- image + image
【Table mode】
- image + image
【Json mode】
- image + image
@@ -446,7 +446,7 @@ Right-click a vertex, and the menu entry of the vertex appears, which can be dis Double-clicking a vertex also displays the vertex associated with the selected point.
- image + image
@@ -461,14 +461,14 @@ Complete the addition of vertices by selecting or filling in the vertex type, ID The entry is as follows:
- image + image
Add the vertex content as follows:
- image + image
@@ -481,7 +481,7 @@ Right-click a vertex in the graph result to add the outgoing or incoming edge of 2. Provides the function of collecting sentences, which can be used to collect frequently used sentences, which is convenient for fast calling of high-frequency sentences.
- image + image
@@ -489,7 +489,7 @@ Right-click a vertex in the graph result to add the outgoing or incoming edge of ##### 4.5.1 Module entry Left navigation:
- image + image
@@ -505,7 +505,7 @@ Left navigation: 5. Asynchronous tasks can be deleted or deleted in batches
- image + image
@@ -519,14 +519,14 @@ Left navigation: - Provide [View] entry, you can jump to the task details to view the specific execution of the current task After jumping to the task center, the currently executing task line will be displayed directly
- image + image
Click to view the entry to jump to the task management list, as follows:
- image + image
@@ -542,13 +542,13 @@ There is no visual OLAP algorithm execution on Hubble. You can call the RESTful - In the metadata modeling module, when deleting metadata, an asynchronous task for deleting metadata can be created
- image + image
- When editing an existing vertex/edge type operation, when adding an index, an asynchronous task of creating an index can be created
- image + image
@@ -556,7 +556,7 @@ There is no visual OLAP algorithm execution on Hubble. You can call the RESTful - After confirming/saving, you can jump to the task center to view the details of the current task
- image + image
diff --git a/content/en/docs/quickstart/toolchain/hugegraph-loader.md b/content/en/docs/quickstart/toolchain/hugegraph-loader.md index a079db847..59e723d0b 100644 --- a/content/en/docs/quickstart/toolchain/hugegraph-loader.md +++ b/content/en/docs/quickstart/toolchain/hugegraph-loader.md @@ -118,7 +118,7 @@ For example, if you want to create a graph with two types of vertices and two ty "Software" includes: "name", "sale price" and other attributes; side "knowledge" includes: "date" attribute and so on.
- image + image

graph model example

diff --git a/content/en/docs/download/download.md b/content/en/download/index.md similarity index 99% rename from content/en/docs/download/download.md rename to content/en/download/index.md index a23907c5c..a5e128fb9 100644 --- a/content/en/docs/download/download.md +++ b/content/en/download/index.md @@ -2,6 +2,7 @@ title: "Download Apache HugeGraph" linkTitle: "Download" weight: 2 +slug: / --- @@ -9,7 +10,7 @@ weight: 2 > > - It is recommended to use the latest version of the HugeGraph software package. Please select Java11 for the runtime environment. > - To verify downloads, use the corresponding hash (SHA512), signature, and [Project Signature Verification KEYS](https://downloads.apache.org/hugegraph/KEYS). -> - Instructions for checking hash (SHA512) and signatures are on the [Validate Release](/docs/contribution-guidelines/validate-release) page, and you can also refer to [ASF official instructions](https://www.apache.org/dyn/closer.cgi#verify). +> - Instructions for checking hash (SHA512) and signatures are on the [Validate Release](/community/contribution-guidelines/validate-release/) page, and you can also refer to [ASF official instructions](https://www.apache.org/dyn/closer.cgi#verify). > - Note: The version numbers of all components of HugeGraph have been kept consistent, and the version numbers of Maven repositories such as `client/loader/hubble/common` are the same. You can refer to these for dependency references [maven example](https://github.com/apache/hugegraph-toolchain#maven-dependencies). > - Compatibility note: after HugeGraph graduated in January 2026, download paths moved from `/incubator/hugegraph` to `/hugegraph`. Historical release file names may still include `-incubating-`. diff --git a/content/en/featured-background.jpg b/content/en/featured-background.jpg deleted file mode 100644 index 8efa5cad4..000000000 Binary files a/content/en/featured-background.jpg and /dev/null differ diff --git a/docusaurus.config.js b/docusaurus.config.js new file mode 100644 index 000000000..8cc8c034d --- /dev/null +++ b/docusaurus.config.js @@ -0,0 +1,337 @@ +const hugoFrontMatter = require('./src/markdown/frontMatter'); +const docsVersions = require('./src/data/versions.json'); + +const apacheLinks = [ + {label: 'Foundation', href: 'https://www.apache.org/'}, + {label: 'License', href: 'https://www.apache.org/licenses/'}, + {label: 'Events', href: 'https://www.apache.org/events/current-event.html'}, + {label: 'Privacy', href: 'https://privacy.apache.org/policies/privacy-policy-public.html'}, + {label: 'Security', href: 'https://www.apache.org/security/'}, + {label: 'Sponsorship', href: 'https://www.apache.org/foundation/sponsorship.html'}, + {label: 'Thanks', href: 'https://www.apache.org/foundation/thanks.html'}, + {label: 'Code of Conduct', href: 'https://www.apache.org/foundation/policies/conduct.html'}, +]; + +const docsExclude = ['**/_*/**', '**/SUMMARY.md', '**/*.test.{js,jsx,ts,tsx}', '**/__tests__/**']; + +const currentDocsVersion = docsVersions.find((version) => version.status === 'next'); +const releaseDocsVersions = docsVersions.filter((version) => version.status !== 'next'); + +function docsRoutePath(version) { + if (version.id === 'stable') { + return ''; + } + return version.docusaurusVersion || version.id; +} + +function docsVersionConfig(version) { + return { + label: version.label, + path: docsRoutePath(version), + banner: version.status === 'archived' ? 'unmaintained' : 'none', + badge: true, + }; +} + +const docsVersionOptions = { + lastVersion: 'stable', + includeCurrentVersion: true, + versions: Object.fromEntries([ + [ + 'current', + { + label: currentDocsVersion.label, + path: 'next', + banner: 'unreleased', + badge: true, + noIndex: true, + }, + ], + ...releaseDocsVersions.map((version) => [version.docusaurusVersion || version.id, docsVersionConfig(version)]), + ]), +}; + +const docsCnVersionOptions = { + ...docsVersionOptions, +}; + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: 'Apache HugeGraph', + tagline: 'A full-stack graph database ecosystem for OLTP, OLAP, and AI', + favicon: 'img/hugegraph-logo.svg', + + url: 'https://hugegraph.apache.org', + baseUrl: '/', + organizationName: 'apache', + projectName: 'hugegraph-doc', + trailingSlash: true, + + onBrokenLinks: 'throw', + onBrokenAnchors: 'throw', + onDuplicateRoutes: 'throw', + + markdown: { + format: 'md', + mermaid: true, + parseFrontMatter: hugoFrontMatter, + hooks: { + onBrokenMarkdownLinks: 'throw', + onBrokenMarkdownImages: 'throw', + }, + }, + + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + + presets: [ + [ + 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + path: 'content/en/docs', + routeBasePath: 'docs', + sidebarPath: require.resolve('./sidebars.js'), + exclude: docsExclude, + editUrl: 'https://github.com/apache/hugegraph-doc/edit/master/', + showLastUpdateAuthor: false, + showLastUpdateTime: false, + ...docsVersionOptions, + }, + blog: { + path: 'content/en/blog', + routeBasePath: 'blog', + include: ['**/*.md', '**/*.mdx'], + exclude: ['**/_index.md'], + blogSidebarTitle: 'All posts', + blogSidebarCount: 'ALL', + showReadingTime: true, + onUntruncatedBlogPosts: 'ignore', + editUrl: 'https://github.com/apache/hugegraph-doc/edit/master/', + }, + pages: { + path: 'src/pages', + }, + theme: { + customCss: require.resolve('./src/css/custom.css'), + }, + }), + ], + ], + + plugins: [ + [ + '@docusaurus/plugin-content-docs', + { + id: 'docs-cn', + path: 'content/cn/docs', + routeBasePath: 'cn/docs', + sidebarPath: require.resolve('./sidebars-cn.js'), + exclude: docsExclude, + editUrl: 'https://github.com/apache/hugegraph-doc/edit/master/', + showLastUpdateAuthor: false, + showLastUpdateTime: false, + ...docsCnVersionOptions, + }, + ], + [ + '@docusaurus/plugin-content-docs', + { + id: 'community', + path: 'content/en/community', + routeBasePath: 'community', + sidebarPath: require.resolve('./sidebars-community.js'), + exclude: docsExclude, + editUrl: 'https://github.com/apache/hugegraph-doc/edit/master/', + showLastUpdateAuthor: false, + showLastUpdateTime: false, + }, + ], + [ + '@docusaurus/plugin-content-docs', + { + id: 'community-cn', + path: 'content/cn/community', + routeBasePath: 'cn/community', + sidebarPath: require.resolve('./sidebars-community-cn.js'), + exclude: docsExclude, + editUrl: 'https://github.com/apache/hugegraph-doc/edit/master/', + showLastUpdateAuthor: false, + showLastUpdateTime: false, + }, + ], + [ + '@docusaurus/plugin-content-pages', + { + id: 'download', + path: 'content/en/download', + routeBasePath: 'download', + include: ['**/*.md', '**/*.mdx'], + editUrl: 'https://github.com/apache/hugegraph-doc/edit/master/', + }, + ], + [ + '@docusaurus/plugin-content-pages', + { + id: 'download-cn', + path: 'content/cn/download', + routeBasePath: 'cn/download', + include: ['**/*.md', '**/*.mdx'], + editUrl: 'https://github.com/apache/hugegraph-doc/edit/master/', + }, + ], + [ + '@docusaurus/plugin-content-blog', + { + id: 'blog-cn', + path: 'content/cn/blog', + routeBasePath: 'cn/blog', + include: ['**/*.md', '**/*.mdx'], + exclude: ['**/_index.md'], + blogSidebarTitle: '所有文章', + blogSidebarCount: 'ALL', + showReadingTime: true, + onUntruncatedBlogPosts: 'ignore', + editUrl: 'https://github.com/apache/hugegraph-doc/edit/master/', + }, + ], + ], + + themes: ['@docusaurus/theme-mermaid'], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + colorMode: { + defaultMode: 'light', + respectPrefersColorScheme: true, + }, + navbar: { + title: 'Apache HugeGraph', + logo: { + alt: 'Apache HugeGraph logo', + src: 'img/hugegraph-logo.svg', + }, + items: [ + { + type: 'custom-documentationDropdown', + position: 'left', + }, + { + type: 'custom-localeAwareLink', + enTo: '/blog/', + cnTo: '/cn/blog/', + label: 'Blog', + cnLabel: '博客', + activeBasePath: '/blog/', + cnActiveBasePath: '/cn/blog/', + position: 'left', + }, + { + type: 'custom-localeAwareLink', + enTo: '/community/', + cnTo: '/cn/community/', + label: 'Community', + cnLabel: '社区', + activeBasePath: '/community/', + cnActiveBasePath: '/cn/community/', + position: 'left', + }, + { + type: 'custom-localeAwareLink', + enTo: '/team/', + cnTo: '/cn/team/', + label: 'Team', + cnLabel: '团队', + activeBasePath: '/team/', + cnActiveBasePath: '/cn/team/', + position: 'left', + }, + { + type: 'custom-localeAwareLink', + enTo: '/users/', + cnTo: '/cn/users/', + label: 'Users', + cnLabel: '用户', + activeBasePath: '/users/', + cnActiveBasePath: '/cn/users/', + position: 'left', + }, + { + type: 'custom-localeAwareLink', + enTo: '/download/', + cnTo: '/cn/download/', + label: 'Download', + cnLabel: '下载', + activeBasePath: '/download/', + cnActiveBasePath: '/cn/download/', + position: 'left', + }, + { + label: 'ASF', + position: 'right', + items: apacheLinks, + }, + { + type: 'custom-languageSwitcher', + label: 'Language', + position: 'right', + className: 'navbar-language-dropdown', + }, + { + href: 'https://github.com/apache/hugegraph', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + logo: { + alt: 'Apache Software Foundation logo', + src: 'img/apache-logo.svg', + href: 'https://www.apache.org/', + width: 180, + }, + links: [ + { + title: 'Project', + items: [ + {label: 'Documentation', to: '/docs/'}, + {label: 'Download', to: '/download/'}, + {label: 'Team', to: '/team/'}, + {label: 'Users', to: '/users/'}, + {label: 'GitHub', href: 'https://github.com/apache/hugegraph'}, + {label: 'Issue Tracker', href: 'https://github.com/apache/hugegraph/issues'}, + ], + }, + { + title: 'Community', + items: [ + {label: 'Community', to: '/community/'}, + {label: 'Contributor Guide', to: '/community/contribution-guidelines/'}, + {label: 'Mailing List', href: 'mailto:dev@hugegraph.apache.org'}, + {label: 'ASF Slack', href: 'https://the-asf.slack.com/archives/C059UU2FJ23'}, + ], + }, + { + title: 'ASF', + items: apacheLinks, + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} The Apache Software Foundation. Licensed under the Apache License, Version 2.0. Apache HugeGraph, HugeGraph, Apache, and related logos are trademarks of The Apache Software Foundation.`, + }, + prism: { + additionalLanguages: ['bash', 'java', 'json', 'python', 'yaml'], + }, + tableOfContents: { + minHeadingLevel: 2, + maxHeadingLevel: 4, + }, + }), +}; + +module.exports = config; diff --git a/netlify.toml b/netlify.toml index 0e94ebabd..2aaab7d68 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,3 +1,6 @@ [build] +command = "npm run build" +publish = "build" + [build.environment] -HUGO_VERSION = "0.88.1" +NODE_VERSION = "20" diff --git a/package.json b/package.json index 4b5628153..08e73588e 100644 --- a/package.json +++ b/package.json @@ -1,27 +1,45 @@ { - "name": "tech-doc-hugo", - "version": "0.0.1", - "description": "Hugo theme for technical documentation.", - "main": "none.js", + "name": "apache-hugegraph-doc", + "version": "0.0.0", + "private": true, + "description": "Apache HugeGraph documentation website built with Docusaurus.", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "start": "npm run docs:versions:prepare && docusaurus start --host 0.0.0.0", + "build": "npm run docs:versions:prepare && npm run check:content-visibility && DOCUSAURUS_SSR_CONCURRENCY=1 DOCUSAURUS_SSG_WORKER_THREAD_COUNT=1 TERSER_PARALLEL=false NODE_OPTIONS=--max-old-space-size=8192 docusaurus build", + "serve": "docusaurus serve --host 0.0.0.0", + "clear": "docusaurus clear", + "docs:version": "node scripts/version-docs.mjs", + "docs:versions:prepare": "node scripts/prepare-docs-versions.mjs", + "docs:versions:list": "node scripts/list-docs-versions.mjs", + "check:content-visibility": "node scripts/check-content-visibility.mjs", + "playwright:install": "playwright install chromium", + "validate:content": "node scripts/validate-content-inventory.js", + "validate:build": "npm run build && node scripts/validate-build.js && npm run validate:content", + "validate:ui": "node scripts/validate-ui.js", + "validate": "npm run validate:build && npm run validate:ui" }, "repository": { "type": "git", - "url": "git+https://github.com/google/docsy-example.git" + "url": "git+https://github.com/apache/hugegraph-doc.git" }, - "author": "", - "license": "ISC", + "license": "Apache-2.0", "bugs": { - "url": "https://github.com/google/docsy-example/issues" - }, - "homepage": "https://github.com/google/docsy-example#readme", - "devDependencies": { - "autoprefixer": "^10.4.0", - "postcss": "^8.3.7", - "postcss-cli": "^9.0.2" + "url": "https://github.com/apache/hugegraph-doc/issues" }, + "homepage": "https://hugegraph.apache.org/", "dependencies": { - "mermaid": "^10.9.5" + "@docusaurus/core": "3.10.1", + "@docusaurus/preset-classic": "3.10.1", + "@docusaurus/theme-mermaid": "3.10.1", + "@mermaid-js/layout-elk": "0.1.9", + "@mdx-js/react": "3.1.1", + "clsx": "2.1.1", + "mermaid": "11.10.1", + "prism-react-renderer": "2.4.1", + "react": "18.3.1", + "react-dom": "18.3.1" + }, + "devDependencies": { + "@playwright/test": "^1.52.0" } } diff --git a/scripts/check-content-visibility.mjs b/scripts/check-content-visibility.mjs new file mode 100644 index 000000000..3d1d2ed9a --- /dev/null +++ b/scripts/check-content-visibility.mjs @@ -0,0 +1,132 @@ +#!/usr/bin/env node +import fs from 'node:fs'; +import path from 'node:path'; +import {fileURLToPath} from 'node:url'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const allowPrivateContent = process.env.ALLOW_PRIVATE_CONTENT === 'true'; +const scanRoots = [ + 'content', + 'src/pages', + 'versioned_docs', + 'docs-cn_versioned_docs', +]; + +function walk(dir) { + if (!fs.existsSync(dir)) { + return []; + } + + const entries = fs.readdirSync(dir, {withFileTypes: true}); + return entries.flatMap((entry) => { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + return walk(fullPath); + } + return /\.(md|mdx)$/i.test(entry.name) ? [fullPath] : []; + }); +} + +function parseScalar(value) { + const trimmed = value.trim().replace(/^['"]|['"]$/g, ''); + if (trimmed === 'true') { + return true; + } + if (trimmed === 'false') { + return false; + } + return trimmed; +} + +function parseFrontMatter(filePath) { + const text = fs.readFileSync(filePath, 'utf8'); + if (!text.startsWith('---\n')) { + return {frontMatter: {}, body: text}; + } + + const end = text.indexOf('\n---', 4); + if (end === -1) { + return {frontMatter: {}, body: text}; + } + + const frontMatter = {}; + for (const line of text.slice(4, end).split('\n')) { + const match = line.match(/^([A-Za-z_][A-Za-z0-9_-]*):\s*(.*)$/); + if (match) { + frontMatter[match[1]] = parseScalar(match[2]); + } + } + + return { + frontMatter, + body: text.slice(end + '\n---'.length).trim(), + }; +} + +function plainBody(body) { + return body + .replace(//g, '') + .replace(/```[\s\S]*?```/g, '') + .replace(/\s+/g, ' ') + .trim(); +} + +const files = scanRoots.flatMap((root) => walk(path.join(repoRoot, root))); +const errors = []; +let privateCount = 0; +let draftCount = 0; +let unlistedCount = 0; +let placeholderCount = 0; + +for (const filePath of files) { + const relPath = path.relative(repoRoot, filePath); + const {frontMatter, body} = parseFrontMatter(filePath); + + if (frontMatter.private === true) { + privateCount += 1; + if (!allowPrivateContent) { + errors.push(`${relPath}: private: true content cannot be shipped in a production build.`); + } + } + + if (frontMatter.draft === true) { + draftCount += 1; + } + if (frontMatter.unlisted === true) { + unlistedCount += 1; + } + + if (frontMatter.placeholder === true) { + placeholderCount += 1; + const bodyText = plainBody(body); + if (frontMatter.private === true) { + errors.push(`${relPath}: placeholder content must not also be private.`); + } + if (frontMatter.draft === true) { + errors.push(`${relPath}: placeholder content reserves a route, so it must not also be draft.`); + } + if (frontMatter.unlisted !== true) { + errors.push(`${relPath}: placeholder content must explicitly set unlisted: true.`); + } + if (frontMatter.noindex !== true) { + errors.push(`${relPath}: placeholder content must explicitly set noindex: true.`); + } + if (bodyText.length > 600) { + errors.push(`${relPath}: placeholder body must stay short and must not contain unfinished private content.`); + } + } +} + +if (errors.length > 0) { + console.error('Content visibility check failed:'); + for (const error of errors) { + console.error(`- ${error}`); + } + console.error(''); + console.error('Set ALLOW_PRIVATE_CONTENT=true only for a non-public, access-controlled preview build.'); + process.exit(1); +} + +console.log( + `Content visibility OK: scanned ${files.length} Markdown/MDX files; private=${privateCount}, draft=${draftCount}, unlisted=${unlistedCount}, placeholder=${placeholderCount}.`, +); diff --git a/scripts/list-docs-versions.mjs b/scripts/list-docs-versions.mjs new file mode 100644 index 000000000..9e709da80 --- /dev/null +++ b/scripts/list-docs-versions.mjs @@ -0,0 +1,43 @@ +#!/usr/bin/env node +import fs from 'node:fs'; +import path from 'node:path'; +import {fileURLToPath} from 'node:url'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); + +function readJson(relPath) { + return JSON.parse(fs.readFileSync(path.join(repoRoot, relPath), 'utf8')); +} + +const metadata = readJson('src/data/versions.json'); +const releaseVersions = metadata + .filter((version) => version.status !== 'next') + .map((version) => version.docusaurusVersion || version.id); + +console.log('HugeGraph documentation versions'); +console.log(''); +for (const version of metadata) { + const docusaurusVersion = version.docusaurusVersion || version.id; + console.log(`- ${version.label} [${version.status}]`); + console.log(` Docusaurus version: ${docusaurusVersion}`); + console.log(` EN: ${version.path}`); + console.log(` CN: ${version.cnPath}`); + if (version.releaseDate) { + console.log(` Released: ${version.releaseDate}`); + } + if (version.githubTagUrl) { + console.log(` Source URL: ${version.githubTagUrl}`); + } + if (version.sourceRef) { + console.log(` Source ref: ${version.sourceRef}`); + } + if (version.sourceRef && docusaurusVersion !== version.sourceRef) { + console.log(` Mapping: ${version.sourceRef} -> ${docusaurusVersion} -> ${version.label}`); + } + if (version.legacyCompatibility?.enabled) { + console.log(' Legacy compatibility: enabled for archived-branch import only'); + } +} +console.log(''); +console.log(`Generated Docusaurus release versions: ${releaseVersions.join(', ') || '(none)'}`); +console.log('Run npm run docs:versions:prepare to regenerate Docusaurus version files from the configured source refs.'); diff --git a/scripts/prepare-docs-versions.mjs b/scripts/prepare-docs-versions.mjs new file mode 100644 index 000000000..07e6404c1 --- /dev/null +++ b/scripts/prepare-docs-versions.mjs @@ -0,0 +1,490 @@ +#!/usr/bin/env node +import {spawnSync} from 'node:child_process'; +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {createRequire} from 'node:module'; + +const require = createRequire(import.meta.url); +const {buildSidebar} = require('../src/sidebars/buildSidebars'); + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const metadataPath = path.join(repoRoot, 'src/data/versions.json'); +const versions = JSON.parse(fs.readFileSync(metadataPath, 'utf8')); + +const generatedPaths = [ + 'versioned_docs', + 'versioned_sidebars', + 'versions.json', + 'docs-cn_versioned_docs', + 'docs-cn_versioned_sidebars', + 'docs-cn_versions.json', +]; + +const localeTargets = { + en: { + docsDir: 'versioned_docs', + sidebarsDir: 'versioned_sidebars', + versionsFile: 'versions.json', + sourcePath: 'content/en/docs', + }, + cn: { + docsDir: 'docs-cn_versioned_docs', + sidebarsDir: 'docs-cn_versioned_sidebars', + versionsFile: 'docs-cn_versions.json', + sourcePath: 'content/cn/docs', + }, +}; + +const legacyRouteAliases = new Map([['clients/hugegraph-api', 'clients/restful-api']]); + +function log(message) { + console.log(`[docs:versions] ${message}`); +} + +function run(command, args, options = {}) { + const result = spawnSync(command, args, { + cwd: repoRoot, + encoding: options.encoding ?? 'utf8', + input: options.input, + maxBuffer: 1024 * 1024 * 200, + stdio: options.stdio, + }); + if (result.status !== 0) { + const output = [result.stdout, result.stderr].filter(Boolean).join('\n').trim(); + throw new Error(`${command} ${args.join(' ')} failed${output ? `:\n${output}` : ''}`); + } + return result; +} + +function gitRefExists(ref) { + const result = spawnSync('git', ['cat-file', '-e', `${ref}^{tree}`], { + cwd: repoRoot, + stdio: 'ignore', + }); + return result.status === 0; +} + +function resolveGitRef(ref) { + if (gitRefExists(ref)) { + return ref; + } + + const remoteRef = `origin/${ref}`; + if (gitRefExists(remoteRef)) { + return remoteRef; + } + + return null; +} + +function cleanGeneratedPaths() { + for (const relPath of generatedPaths) { + fs.rmSync(path.join(repoRoot, relPath), {force: true, recursive: true}); + } +} + +function ensureDir(dir) { + fs.mkdirSync(dir, {recursive: true}); +} + +function archivePaths(sourceRelPath, sourceIncludes) { + if (!Array.isArray(sourceIncludes) || sourceIncludes.length === 0) { + return [sourceRelPath]; + } + + if (sourceRelPath === '.' || sourceRelPath === '') { + return sourceIncludes; + } + + return sourceIncludes.map((includePath) => path.posix.join(sourceRelPath.split(path.sep).join('/'), includePath)); +} + +function copyFromWorkingTree(sourceRelPath, destinationDir) { + const sourcePath = path.join(repoRoot, sourceRelPath); + if (!fs.existsSync(sourcePath)) { + throw new Error(`Missing source docs directory: ${sourceRelPath}`); + } + fs.cpSync(sourcePath, destinationDir, {recursive: true}); +} + +function copyFromGitRef(ref, sourceRelPath, destinationDir, sourceIncludes) { + const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'hugegraph-docs-version-')); + try { + const archive = run('git', ['archive', '--format=tar', ref, '--', ...archivePaths(sourceRelPath, sourceIncludes)], { + encoding: 'buffer', + }); + run('tar', ['-xf', '-', '-C', tempDir], { + input: archive.stdout, + stdio: ['pipe', 'ignore', 'pipe'], + }); + const extractedPath = path.join(tempDir, sourceRelPath); + if (!fs.existsSync(extractedPath)) { + throw new Error(`Ref ${ref} does not contain ${sourceRelPath}`); + } + fs.cpSync(extractedPath, destinationDir, {recursive: true}); + } finally { + fs.rmSync(tempDir, {force: true, recursive: true}); + } +} + +function copyOverlayFromGitRef(ref, overlay, destinationDir) { + const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'hugegraph-docs-version-overlay-')); + try { + const archive = run('git', ['archive', '--format=tar', ref, '--', overlay.sourcePath], { + encoding: 'buffer', + }); + run('tar', ['-xf', '-', '-C', tempDir], { + input: archive.stdout, + stdio: ['pipe', 'ignore', 'pipe'], + }); + const extractedPath = path.join(tempDir, overlay.sourcePath); + if (!fs.existsSync(extractedPath)) { + throw new Error(`Ref ${ref} does not contain overlay source ${overlay.sourcePath}`); + } + const targetPath = path.join(destinationDir, overlay.targetPath); + fs.rmSync(targetPath, {force: true, recursive: true}); + fs.cpSync(extractedPath, targetPath, {recursive: true}); + } finally { + fs.rmSync(tempDir, {force: true, recursive: true}); + } +} + +function copyOverlayFromWorkingTree(overlay, destinationDir) { + const sourcePath = path.join(repoRoot, overlay.sourcePath); + if (!fs.existsSync(sourcePath)) { + throw new Error(`Missing overlay source docs directory: ${overlay.sourcePath}`); + } + const targetPath = path.join(destinationDir, overlay.targetPath); + fs.rmSync(targetPath, {force: true, recursive: true}); + fs.cpSync(sourcePath, targetPath, {recursive: true}); +} + +function copySourceOverlays(legacyCompatibility, locale, destinationDir, resolvedSourceRef) { + const overlays = legacyCompatibility?.sourceOverlays?.[locale] || []; + for (const overlay of overlays) { + if (resolvedSourceRef) { + copyOverlayFromGitRef(resolvedSourceRef, overlay, destinationDir); + log(`${locale}: applied overlay ${overlay.sourcePath} -> ${overlay.targetPath}`); + } else { + copyOverlayFromWorkingTree(overlay, destinationDir); + log(`${locale}: applied working tree overlay ${overlay.sourcePath} -> ${overlay.targetPath}`); + } + } +} + +function prepareIndex(destinationDir, indexFrom) { + if (!indexFrom) { + return; + } + + const sourcePath = path.join(destinationDir, indexFrom); + if (!fs.existsSync(sourcePath)) { + throw new Error(`Configured index source does not exist: ${indexFrom}`); + } + + fs.copyFileSync(sourcePath, path.join(destinationDir, '_index.md')); + fs.rmSync(sourcePath, {force: true}); +} + +function walkMarkdownFiles(dir) { + const entries = fs.readdirSync(dir, {withFileTypes: true}); + return entries.flatMap((entry) => { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + return walkMarkdownFiles(fullPath); + } + return /\.mdx?$/i.test(entry.name) ? [fullPath] : []; + }); +} + +function stripMarkdownExtension(filePath) { + return filePath.replace(/\.mdx?$/i, ''); +} + +function stripRoute(value) { + return value.replace(/^\/+|\/+$/g, ''); +} + +function routeFromMarkdownFile(filePath, destinationDir) { + const relPath = path.relative(destinationDir, stripMarkdownExtension(filePath)).split(path.sep).join('/'); + if (relPath === '_index') { + return ''; + } + const route = relPath.endsWith('/_index') ? relPath.slice(0, -'/_index'.length) : relPath; + return stripRoute(route); +} + +function buildDocRouteIndex(destinationDir) { + const routes = new Map(); + const basenameRoutes = new Map(); + + for (const filePath of walkMarkdownFiles(destinationDir)) { + const normalizedRoute = routeFromMarkdownFile(filePath, destinationDir); + const key = normalizedRoute.toLowerCase(); + routes.set(key, normalizedRoute); + + const parentRoute = path.posix.dirname(normalizedRoute); + if (path.posix.basename(parentRoute) === path.posix.basename(normalizedRoute)) { + routes.set(normalizedRoute.toLowerCase(), parentRoute); + } + + const basename = path.posix.basename(normalizedRoute).toLowerCase(); + const existing = basenameRoutes.get(basename); + basenameRoutes.set(basename, existing && existing !== normalizedRoute ? null : normalizedRoute); + } + + return {basenameRoutes, routes}; +} + +function relativeLocalImageUrl(filePath, destinationDir, url) { + const localImagePath = url.replace(/^\/(?:docs\/)?images\//, 'images/'); + const imagePath = path.join(destinationDir, localImagePath); + let relativePath = path.relative(path.dirname(filePath), imagePath).split(path.sep).join('/'); + if (!relativePath.startsWith('.')) { + relativePath = `./${relativePath}`; + } + return relativePath; +} + +function splitUrl(url) { + const match = url.match(/^([^?#]*)([^#]*)(#.*)?$/); + return { + pathname: match?.[1] || url, + search: match?.[2] || '', + hash: match?.[3] || '', + }; +} + +function routeBase(locale, versionId) { + const base = locale === 'cn' ? '/cn/docs' : '/docs'; + return versionId === 'stable' ? base : `${base}/${versionId}`; +} + +function normalizeLegacyDocsRelPath(pathname) { + let normalized = pathname.replace(/^\/dcos\//, '/docs/'); + normalized = normalized.replace(/\.(?:html|mdx?)\/?$/i, ''); + + const versionedDocsMatch = normalized.match(/^\/(?:cn\/)?docs\/docusaurus-[^/]+\/?(.*)$/); + if (versionedDocsMatch) { + return versionedDocsMatch[1]; + } + + for (const prefix of ['/en/docs/', '/cn/docs/', '/docs/']) { + if (normalized.startsWith(prefix)) { + return normalized.slice(prefix.length); + } + } + + const legacyRootMatch = normalized.match(/^\/(changelog|clients|config|download|guides|language|performance|quickstart)\/?(.*)$/); + if (legacyRootMatch) { + return [legacyRootMatch[1], legacyRootMatch[2]].filter(Boolean).join('/'); + } + + return null; +} + +function resolveDocsRelPath(relPath, docRouteIndex) { + const normalized = stripRoute(relPath); + const alias = legacyRouteAliases.get(normalized.toLowerCase()); + if (alias && docRouteIndex.routes.has(alias)) { + return alias; + } + + const byFullPath = docRouteIndex.routes.get(normalized.toLowerCase()); + if (byFullPath) { + return byFullPath; + } + + const basename = path.posix.basename(normalized).toLowerCase(); + const byBasename = docRouteIndex.basenameRoutes.get(basename); + if (byBasename) { + return byBasename; + } + + return normalized; +} + +function normalizeLegacyLinkUrl(url, context) { + if ( + !url || + url.startsWith('http://') || + url.startsWith('https://') || + url.startsWith('mailto:') || + url.startsWith('pathname://') + ) { + return url; + } + + if (url.startsWith('#')) { + return context.dropInternalAnchors + ? `${routeBase(context.locale, context.versionId)}${context.currentRoute ? `/${context.currentRoute}` : ''}` + : url; + } + + if (url === './hugegraph-style.xml') { + return null; + } + + const {hash, pathname, search} = splitUrl(url); + const targetHash = context.dropInternalAnchors ? '' : hash; + const relPath = normalizeLegacyDocsRelPath(pathname); + if (relPath === null) { + return url; + } + + const resolvedRelPath = resolveDocsRelPath(relPath, context.docRouteIndex); + if (resolvedRelPath === 'download' && !context.docRouteIndex.routes.has('download')) { + const downloadBase = context.locale === 'cn' ? '/cn/download' : '/download'; + return `${downloadBase}${search}${targetHash}`; + } + return `${routeBase(context.locale, context.versionId)}/${resolvedRelPath}${search}${targetHash}`; +} + +function normalizeMarkdownLinks(text, context) { + let normalized = text.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g, (match, label, url) => { + const normalizedUrl = normalizeLegacyLinkUrl(url, context); + return normalizedUrl === null ? label : `[${label}](${normalizedUrl})`; + }); + normalized = normalized.replace(/(]*\bhref=["'])([^"']+)(["'])/g, (match, prefix, url, suffix) => { + const normalizedUrl = normalizeLegacyLinkUrl(url, context); + return normalizedUrl === null ? match : `${prefix}${normalizedUrl}${suffix}`; + }); + return normalized; +} + +function normalizeLegacyMarkdownLine(line) { + if (line.includes('`')) { + return line; + } + return line + .replace(/http:\/\/host:port/g, '`http://host:port`') + .replace(/https?:\/\/[A-Za-z0-9.-]+:\d+(?=[,;、。])/g, (url) => `\`${url}\``); +} + +function normalizeGeneratedFrontMatter(text) { + return text.replace(/^---\n([\s\S]*?)\n---/, (match, frontMatter) => { + const normalizedFrontMatter = frontMatter + .split('\n') + .filter((line) => !/^draft:\s*true\s*$/i.test(line.trim())) + .join('\n'); + return `---\n${normalizedFrontMatter}\n---`; + }); +} + +// Compatibility adapter for archived pre-Docusaurus release branches only. +function normalizeGeneratedMarkdown(destinationDir, context) { + const docRouteIndex = buildDocRouteIndex(destinationDir); + const normalizeContext = {...context, docRouteIndex}; + + for (const filePath of walkMarkdownFiles(destinationDir)) { + let inFence = false; + const fileContext = { + ...normalizeContext, + currentRoute: routeFromMarkdownFile(filePath, destinationDir), + dropInternalAnchors: true, + }; + let text = normalizeGeneratedFrontMatter(fs.readFileSync(filePath, 'utf8')); + text = text + .split('\n') + .map((line) => { + if (/^\s*```/.test(line)) { + inFence = !inFence; + return line; + } + return inFence ? line : normalizeLegacyMarkdownLine(line); + }) + .join('\n'); + + text = text.replace(/(!\[[^\]]*\]\()\/(?:docs\/)?images\/([^)]+)(\))/g, (_, prefix, imagePath, suffix) => { + return `${prefix}${relativeLocalImageUrl(filePath, destinationDir, `/images/${imagePath}`)}${suffix}`; + }); + text = text.replace(/(]*\bsrc=["'])\/(?:docs\/)?images\/([^"']+)(["'])/g, (_, prefix, imagePath, suffix) => { + return `${prefix}${relativeLocalImageUrl(filePath, destinationDir, `/images/${imagePath}`)}${suffix}`; + }); + text = normalizeMarkdownLinks(text, fileContext); + + fs.writeFileSync(filePath, text); + } +} + +function sourceRefFor(version) { + if (version.id === 'stable' && process.env.DOCS_STABLE_REF) { + return process.env.DOCS_STABLE_REF; + } + return version.sourceRef || null; +} + +function legacyCompatibilityFor(version) { + return version.legacyCompatibility?.enabled === true ? version.legacyCompatibility : null; +} + +function assertNoTopLevelLegacyOptions(version) { + const legacyOnlyFields = ['sourcePaths', 'sourceIncludes', 'sourceOverlays', 'indexFrom']; + for (const field of legacyOnlyFields) { + if (version[field] !== undefined) { + throw new Error( + `${version.id}: ${field} is a legacy compatibility option. Put it under legacyCompatibility and set legacyCompatibility.enabled=true.`, + ); + } + } +} + +function prepareVersion(version, locale, target) { + assertNoTopLevelLegacyOptions(version); + + const legacyCompatibility = legacyCompatibilityFor(version); + const versionId = version.docusaurusVersion || version.id; + const sourceRef = sourceRefFor(version); + const sourcePath = legacyCompatibility?.sourcePaths?.[locale] || target.sourcePath; + const sourceIncludes = legacyCompatibility?.sourceIncludes; + const destinationDir = path.join(repoRoot, target.docsDir, `version-${versionId}`); + let resolvedSourceRef = null; + + ensureDir(destinationDir); + if (sourceRef) { + resolvedSourceRef = resolveGitRef(sourceRef); + if (!resolvedSourceRef) { + throw new Error( + `Configured docs source ref "${sourceRef}" is not available locally. Fetch tags/branches first, or override with DOCS_STABLE_REF.`, + ); + } + copyFromGitRef(resolvedSourceRef, sourcePath, destinationDir, sourceIncludes); + log(`${locale}: generated ${versionId} from ${resolvedSourceRef}:${sourcePath}`); + } else { + copyFromWorkingTree(sourcePath, destinationDir); + log(`${locale}: generated ${versionId} from working tree ${sourcePath}`); + } + copySourceOverlays(legacyCompatibility, locale, destinationDir, resolvedSourceRef); + prepareIndex(destinationDir, legacyCompatibility?.indexFrom); + if (legacyCompatibility?.normalizeMarkdown) { + normalizeGeneratedMarkdown(destinationDir, {locale, versionId}); + log(`${locale}: applied legacy compatibility normalization for ${versionId}`); + } + + const sidebarsDir = path.join(repoRoot, target.sidebarsDir); + ensureDir(sidebarsDir); + const sidebarsPath = path.join(sidebarsDir, `version-${versionId}-sidebars.json`); + const sidebar = { + docsSidebar: buildSidebar(path.relative(repoRoot, destinationDir)), + }; + fs.writeFileSync(sidebarsPath, `${JSON.stringify(sidebar, null, 2)}\n`); +} + +cleanGeneratedPaths(); + +const releaseVersions = versions.filter((version) => version.status !== 'next'); +const releaseIds = releaseVersions.map((version) => version.docusaurusVersion || version.id); + +for (const [locale, target] of Object.entries(localeTargets)) { + ensureDir(path.join(repoRoot, target.docsDir)); + ensureDir(path.join(repoRoot, target.sidebarsDir)); + fs.writeFileSync(path.join(repoRoot, target.versionsFile), `${JSON.stringify(releaseIds, null, 2)}\n`); + + for (const version of releaseVersions) { + prepareVersion(version, locale, target); + } +} + +log(`prepared ${releaseIds.length} release version(s): ${releaseIds.join(', ') || 'none'}`); diff --git a/scripts/validate-build.js b/scripts/validate-build.js new file mode 100644 index 000000000..dd2f6995e --- /dev/null +++ b/scripts/validate-build.js @@ -0,0 +1,55 @@ +#!/usr/bin/env node +const fs = require('fs'); +const path = require('path'); + +const repoRoot = path.resolve(__dirname, '..'); +const buildDir = path.join(repoRoot, 'build'); + +const expectedPages = [ + ['homepage', 'index.html', 'Apache HugeGraph'], + ['docs landing', 'docs/index.html', 'Apache HugeGraph Documentation'], + ['next docs landing', 'docs/next/index.html', 'This is unreleased documentation'], + ['English deep docs page', 'docs/quickstart/hugegraph/hugegraph-server/index.html', 'HugeGraph-Server'], + ['Chinese docs landing', 'cn/docs/index.html', 'Apache HugeGraph 文档'], + ['Chinese next docs landing', 'cn/docs/next/index.html', 'noindex, nofollow'], + ['Chinese deep docs page', 'cn/docs/quickstart/hugegraph/hugegraph-server/index.html', 'HugeGraph-Server'], + ['English blog', 'blog/index.html', 'Blog'], + ['Chinese blog', 'cn/blog/index.html', 'Blog'], + ['community', 'community/index.html', 'Community'], + ['community maturity', 'community/maturity/index.html', 'Apache Maturity Model'], + ['team page', 'team/index.html', 'Apache HugeGraph Team'], + ['Chinese team page', 'cn/team/index.html', 'Apache HugeGraph 团队'], + ['users page', 'users/index.html', 'HugeGraph User Showcase'], + ['Chinese users page', 'cn/users/index.html', 'HugeGraph 用户案例'], +]; + +for (const [label, relPath, text] of expectedPages) { + const file = path.join(buildDir, relPath); + if (!fs.existsSync(file)) { + throw new Error(`Missing ${label}: ${relPath}`); + } + const html = fs.readFileSync(file, 'utf8'); + if (!html.includes(text)) { + throw new Error(`Expected ${label} to contain "${text}"`); + } +} + +const homepage = fs.readFileSync(path.join(buildDir, 'index.html'), 'utf8'); +for (const label of ['Foundation', 'License', 'Events', 'Privacy', 'Security', 'Sponsorship', 'Thanks', 'Code of Conduct']) { + if (!homepage.includes(label)) { + throw new Error(`Homepage is missing ASF menu label: ${label}`); + } +} + +const docsLanding = fs.readFileSync(path.join(buildDir, 'docs/index.html'), 'utf8'); +for (const label of ['Documentation', 'next', 'Stable (1.7.0)']) { + if (!docsLanding.includes(label)) { + throw new Error(`Docs landing is missing version selector label: ${label}`); + } +} + +if (fs.existsSync(path.join(buildDir, 'docs/v1.3.0/index.html'))) { + throw new Error('Historical v1.3.0 docs route should not be generated for this preview.'); +} + +console.log(`Build content OK: ${expectedPages.length} representative pages found.`); diff --git a/scripts/validate-content-inventory.js b/scripts/validate-content-inventory.js new file mode 100644 index 000000000..1969aa6fb --- /dev/null +++ b/scripts/validate-content-inventory.js @@ -0,0 +1,40 @@ +#!/usr/bin/env node +const fs = require('fs'); +const path = require('path'); +const {execFileSync} = require('child_process'); + +const repoRoot = path.resolve(__dirname, '..'); +const artifactDir = path.join(repoRoot, 'artifacts', 'validation'); + +function gitFiles() { + return execFileSync('git', ['ls-files', '*.md', '*.mdx'], { + cwd: repoRoot, + encoding: 'utf8', + }) + .trim() + .split('\n') + .filter(Boolean) + .sort(); +} + +function exists(relPath) { + return fs.existsSync(path.join(repoRoot, relPath)); +} + +fs.mkdirSync(artifactDir, {recursive: true}); + +const before = gitFiles(); +const missing = before.filter((file) => !exists(file)); + +const after = before.filter(exists); +fs.writeFileSync(path.join(artifactDir, 'md-inventory-before.txt'), `${before.join('\n')}\n`); +fs.writeFileSync(path.join(artifactDir, 'md-inventory-after.txt'), `${after.join('\n')}\n`); +fs.writeFileSync(path.join(artifactDir, 'md-inventory-missing.json'), `${JSON.stringify(missing, null, 2)}\n`); + +if (missing.length > 0) { + console.error(`Missing Markdown/MDX files:\n${missing.join('\n')}`); + process.exit(1); +} + +console.log(`Markdown inventory OK: ${before.length} original tracked .md/.mdx files still exist.`); +console.log(`Inventory artifacts: ${path.relative(repoRoot, artifactDir)}`); diff --git a/scripts/validate-ui.js b/scripts/validate-ui.js new file mode 100644 index 000000000..aa7c282bd --- /dev/null +++ b/scripts/validate-ui.js @@ -0,0 +1,215 @@ +#!/usr/bin/env node +const fs = require('fs'); +const path = require('path'); +const {spawn, spawnSync} = require('child_process'); +const {chromium} = require('playwright'); + +const repoRoot = path.resolve(__dirname, '..'); +const buildDir = path.join(repoRoot, 'build'); +const artifactDir = path.join(repoRoot, 'artifacts', 'playwright'); +const port = Number(process.env.DOCUSAURUS_TEST_PORT || 4173); +const baseUrl = `http://127.0.0.1:${port}`; + +function ensureBuild() { + if (fs.existsSync(path.join(buildDir, 'index.html'))) { + return; + } + const result = spawnSync('npm', ['run', 'build'], {cwd: repoRoot, stdio: 'inherit'}); + if (result.status !== 0) { + process.exit(result.status || 1); + } +} + +async function waitForServer(server) { + const deadline = Date.now() + 30000; + while (Date.now() < deadline) { + if (server.exitCode !== null) { + throw new Error(`Docusaurus server exited with code ${server.exitCode}`); + } + try { + const response = await fetch(baseUrl); + if (response.ok) { + return; + } + } catch { + await new Promise((resolve) => setTimeout(resolve, 250)); + } + } + throw new Error('Timed out waiting for Docusaurus test server'); +} + +async function expectVisible(locator, label) { + try { + await locator.first().waitFor({state: 'visible', timeout: 5000}); + } catch { + throw new Error(`${label} is not visible`); + } +} + +async function assertShell(page) { + await page.goto(`${baseUrl}/`, {waitUntil: 'networkidle'}); + await expectVisible(page.locator('nav.navbar'), 'top navigation'); + + const asfDropdown = page.locator('.navbar__item.dropdown', {hasText: 'ASF'}).first(); + await asfDropdown.hover(); + await page.waitForTimeout(200); + const asfText = await asfDropdown.textContent(); + for (const label of ['Foundation', 'License', 'Events', 'Privacy', 'Security', 'Sponsorship', 'Thanks', 'Code of Conduct']) { + if (!asfText.includes(label)) { + throw new Error(`ASF dropdown is missing ${label}`); + } + } + + const footer = page.locator('footer.footer'); + await footer.scrollIntoViewIfNeeded(); + await expectVisible(footer.locator('img[alt*="Apache Software Foundation"]'), 'Apache/ASF footer logo'); + const footerText = await footer.textContent(); + for (const text of ['Copyright', 'Apache License, Version 2.0', 'trademarks', 'The Apache Software Foundation']) { + if (!footerText.includes(text)) { + throw new Error(`Footer is missing "${text}"`); + } + } +} + +async function assertDocs(page) { + await page.goto(`${baseUrl}/docs/`, {waitUntil: 'networkidle'}); + const navbar = page.locator('nav.navbar'); + const navbarText = await navbar.textContent(); + for (const label of ['Documentation', 'Next', 'Stable (1.7.0)', '1.5.0', '1.3.0', '1.2.0', '1.0.0', '0.11', '0.10']) { + if (!navbarText.includes(label)) { + throw new Error(`Docs navbar is missing version label ${label}`); + } + } + + await page.goto(`${baseUrl}/docs/quickstart/hugegraph/hugegraph-server/`, {waitUntil: 'networkidle'}); + const sidebar = page.locator('aside.theme-doc-sidebar-container'); + await expectVisible(sidebar, 'docs sidebar'); + const quickStart = sidebar.getByText('Quick Start').first(); + await expectVisible(quickStart, 'docs sidebar Quick Start item'); + + await page.goto(`${baseUrl}/docs/next/`, {waitUntil: 'networkidle'}); + await expectVisible(page.getByText('This is unreleased documentation'), 'next docs unreleased banner'); +} + +async function assertDocumentationDropdown(page) { + await page.setViewportSize({width: 1440, height: 900}); + await page.goto(`${baseUrl}/docs/`, {waitUntil: 'networkidle'}); + + const dropdown = page.locator('.documentationDropdown').first(); + const button = dropdown.locator('button').first(); + const menu = dropdown.locator('.documentationDropdown__menu').first(); + const nextItem = dropdown.getByRole('menuitem', {name: 'Next'}); + + await button.hover(); + await expectVisible(nextItem, 'Documentation dropdown Next item'); + + const buttonBox = await button.boundingBox(); + const nextItemBox = await nextItem.boundingBox(); + if (!buttonBox || !nextItemBox) { + throw new Error('Documentation dropdown bounding boxes are unavailable'); + } + + await page.mouse.move(buttonBox.x + buttonBox.width / 2, buttonBox.y + buttonBox.height - 1); + await page.mouse.move(nextItemBox.x + nextItemBox.width / 2, nextItemBox.y + nextItemBox.height / 2, {steps: 8}); + await page.waitForTimeout(240); + await expectVisible(nextItem, 'Documentation dropdown remains open while moving into menu'); + + await button.click(); + await page.mouse.move(20, 240); + await page.waitForTimeout(240); + await expectVisible(nextItem, 'Documentation dropdown remains open after click'); + + await page.mouse.click(20, 240); + await menu.waitFor({state: 'hidden', timeout: 2000}); +} + +async function assertCommunityPages(page) { + await page.goto(`${baseUrl}/team/`, {waitUntil: 'networkidle'}); + await expectVisible(page.getByRole('heading', {name: 'Apache HugeGraph Team'}), 'team page heading'); + await expectVisible(page.getByText('PMC Members').first(), 'team page PMC section'); + + await page.goto(`${baseUrl}/users/`, {waitUntil: 'networkidle'}); + await expectVisible(page.getByRole('heading', {name: 'HugeGraph User Showcase'}), 'users page heading'); + await expectVisible(page.getByText('Baidu').first(), 'users page case card'); +} + +async function assertMobileMenu(page) { + await page.setViewportSize({width: 390, height: 844}); + await page.goto(`${baseUrl}/`, {waitUntil: 'networkidle'}); + await page.locator('.navbar__toggle').click(); + const sidebar = page.locator('.navbar-sidebar'); + await expectVisible(sidebar, 'mobile navbar sidebar'); + const text = await sidebar.textContent(); + for (const label of ['Documentation', 'Blog', 'Community', 'Team', 'Users', 'ASF']) { + if (!text.includes(label)) { + throw new Error(`Mobile menu is missing ${label}`); + } + } +} + +async function captureScreenshots(page) { + fs.mkdirSync(artifactDir, {recursive: true}); + const viewports = [ + ['desktop', {width: 1440, height: 900}], + ['mobile', {width: 390, height: 844}], + ]; + const pages = [ + ['homepage', '/'], + ['docs-landing', '/docs/'], + ['deep-docs', '/docs/quickstart/hugegraph/hugegraph-server/'], + ['team', '/team/'], + ['users', '/users/'], + ]; + + for (const [viewportName, viewport] of viewports) { + await page.setViewportSize(viewport); + for (const [name, route] of pages) { + await page.goto(`${baseUrl}${route}`, {waitUntil: 'networkidle'}); + await page.screenshot({ + path: path.join(artifactDir, `${name}-${viewportName}.png`), + fullPage: false, + }); + } + + await page.goto(`${baseUrl}/`, {waitUntil: 'networkidle'}); + await page.locator('footer.footer').scrollIntoViewIfNeeded(); + await page.screenshot({ + path: path.join(artifactDir, `footer-${viewportName}.png`), + fullPage: false, + }); + } +} + +async function main() { + ensureBuild(); + + const bin = path.join(repoRoot, 'node_modules', '.bin', 'docusaurus'); + const server = spawn(bin, ['serve', '--host', '127.0.0.1', '--port', String(port)], { + cwd: repoRoot, + stdio: ['ignore', 'pipe', 'pipe'], + }); + server.stdout.on('data', (data) => process.stdout.write(data)); + server.stderr.on('data', (data) => process.stderr.write(data)); + + try { + await waitForServer(server); + const browser = await chromium.launch(); + const page = await browser.newPage({viewport: {width: 1440, height: 900}}); + await assertShell(page); + await assertDocs(page); + await assertDocumentationDropdown(page); + await assertCommunityPages(page); + await assertMobileMenu(page); + await captureScreenshots(page); + await browser.close(); + } finally { + server.kill('SIGTERM'); + } + + console.log(`UI validation OK. Screenshots: ${path.relative(repoRoot, artifactDir)}`); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/scripts/version-docs.mjs b/scripts/version-docs.mjs new file mode 100644 index 000000000..40b1642d0 --- /dev/null +++ b/scripts/version-docs.mjs @@ -0,0 +1,11 @@ +#!/usr/bin/env node + +console.error('This repository generates Docusaurus version snapshots from Git refs instead of committing them.'); +console.error(''); +console.error('To add or refresh a documentation version:'); +console.error('1. Update src/data/versions.json with the version id, label, routes, and sourceRef.'); +console.error('2. Run npm run docs:versions:prepare.'); +console.error('3. Run npm run build to verify the generated output.'); +console.error(''); +console.error('The generated versioned_docs and docs-cn_versioned_docs directories are intentionally ignored by Git.'); +process.exit(1); diff --git a/sidebars-cn.js b/sidebars-cn.js new file mode 100644 index 000000000..aa3880177 --- /dev/null +++ b/sidebars-cn.js @@ -0,0 +1,5 @@ +const {buildSidebar} = require('./src/sidebars/buildSidebars'); + +module.exports = { + docsSidebar: buildSidebar('content/cn/docs'), +}; diff --git a/sidebars-community-cn.js b/sidebars-community-cn.js new file mode 100644 index 000000000..4186b9c3a --- /dev/null +++ b/sidebars-community-cn.js @@ -0,0 +1,5 @@ +const {buildSidebar} = require('./src/sidebars/buildSidebars'); + +module.exports = { + docsSidebar: buildSidebar('content/cn/community'), +}; diff --git a/sidebars-community.js b/sidebars-community.js new file mode 100644 index 000000000..c011961b7 --- /dev/null +++ b/sidebars-community.js @@ -0,0 +1,5 @@ +const {buildSidebar} = require('./src/sidebars/buildSidebars'); + +module.exports = { + docsSidebar: buildSidebar('content/en/community'), +}; diff --git a/sidebars.js b/sidebars.js new file mode 100644 index 000000000..2164934e5 --- /dev/null +++ b/sidebars.js @@ -0,0 +1,5 @@ +const {buildSidebar} = require('./src/sidebars/buildSidebars'); + +module.exports = { + docsSidebar: buildSidebar('content/en/docs'), +}; diff --git a/src/components/DocumentationDropdownNavbarItem/index.js b/src/components/DocumentationDropdownNavbarItem/index.js new file mode 100644 index 000000000..7b76fa32d --- /dev/null +++ b/src/components/DocumentationDropdownNavbarItem/index.js @@ -0,0 +1,152 @@ +import React from 'react'; +import {useLocation} from '@docusaurus/router'; +import Link from '@docusaurus/Link'; +import versionsMetadata from '@site/src/data/versions.json'; + +const versions = versionsMetadata.map((version) => ({ + label: version.label, + enTo: version.path, + cnTo: version.cnPath, +})); + +function isChinesePath(pathname) { + return pathname === '/cn' || pathname.startsWith('/cn/'); +} + +function isDocsPath(pathname) { + return pathname === '/docs' || pathname.startsWith('/docs/') || pathname === '/cn/docs' || pathname.startsWith('/cn/docs/'); +} + +function focusMenuItem(menuRef, offset) { + const links = Array.from(menuRef.current?.querySelectorAll('a') || []); + if (links.length === 0) { + return; + } + const currentIndex = links.indexOf(document.activeElement); + const nextIndex = currentIndex === -1 ? 0 : (currentIndex + offset + links.length) % links.length; + links[nextIndex].focus(); +} + +export default function DocumentationDropdownNavbarItem() { + const {pathname} = useLocation(); + const isChinese = isChinesePath(pathname); + const [open, setOpen] = React.useState(false); + const [clickOpen, setClickOpen] = React.useState(false); + const rootRef = React.useRef(null); + const menuRef = React.useRef(null); + const closeTimerRef = React.useRef(null); + + const clearCloseTimer = React.useCallback(() => { + if (closeTimerRef.current) { + window.clearTimeout(closeTimerRef.current); + closeTimerRef.current = null; + } + }, []); + + const closeMenu = React.useCallback(() => { + clearCloseTimer(); + setOpen(false); + setClickOpen(false); + }, [clearCloseTimer]); + + const openMenu = React.useCallback(() => { + clearCloseTimer(); + setOpen(true); + }, [clearCloseTimer]); + + const scheduleCloseMenu = React.useCallback(() => { + clearCloseTimer(); + closeTimerRef.current = window.setTimeout(() => { + setOpen(false); + closeTimerRef.current = null; + }, 180); + }, [clearCloseTimer]); + + React.useEffect(() => { + function closeOnOutsideClick(event) { + if (!rootRef.current?.contains(event.target)) { + closeMenu(); + } + } + + document.addEventListener('mousedown', closeOnOutsideClick); + return () => document.removeEventListener('mousedown', closeOnOutsideClick); + }, [closeMenu]); + + React.useEffect(() => clearCloseTimer, [clearCloseTimer]); + + function onButtonKeyDown(event) { + if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') { + event.preventDefault(); + openMenu(); + window.requestAnimationFrame(() => focusMenuItem(menuRef, 1)); + } + if (event.key === 'Escape') { + closeMenu(); + } + } + + function onMenuKeyDown(event) { + if (event.key === 'Escape') { + closeMenu(); + rootRef.current?.querySelector('button')?.focus(); + } + if (event.key === 'ArrowDown') { + event.preventDefault(); + focusMenuItem(menuRef, 1); + } + if (event.key === 'ArrowUp') { + event.preventDefault(); + focusMenuItem(menuRef, -1); + } + } + + return ( +
{ + if (!clickOpen) { + scheduleCloseMenu(); + } + }} + onFocus={openMenu}> + +
    + {versions.map((version) => ( +
  • + + {version.label} + +
  • + ))} +
+
+ ); +} diff --git a/src/components/LanguageSwitcherNavbarItem/index.js b/src/components/LanguageSwitcherNavbarItem/index.js new file mode 100644 index 000000000..ac888c970 --- /dev/null +++ b/src/components/LanguageSwitcherNavbarItem/index.js @@ -0,0 +1,147 @@ +import React from 'react'; +import {useLocation} from '@docusaurus/router'; +import {useAllDocsData} from '@docusaurus/plugin-content-docs/client'; +import DropdownNavbarItem from '@theme/NavbarItem/DropdownNavbarItem'; + +const cnPrefixes = ['/cn/docs/', '/cn/blog/', '/cn/community/', '/cn/team/', '/cn/users/', '/cn/download/']; +const enPrefixes = ['/docs/', '/blog/', '/community/', '/team/', '/users/', '/download/']; +const enToCnFallbacks = new Map([ + ['/community/maturity/', '/cn/community/'], +]); + +function appendSuffix(pathname, suffix) { + return `${pathname}${suffix}`; +} + +function matchesPrefix(pathname, prefix) { + return pathname === prefix.slice(0, -1) || pathname.startsWith(prefix); +} + +function normalizeLookupPath(pathname) { + return pathname.endsWith('/') ? pathname : `${pathname}/`; +} + +function normalizeRoutePath(pathname) { + const normalized = pathname.replace(/\/+$/, ''); + return normalized || '/'; +} + +function isNotFoundPath(pathname) { + return pathname === '/404' || pathname === '/404.html' || pathname === '/404/'; +} + +function isDocsPath(pathname) { + return pathname === '/docs' || pathname.startsWith('/docs/') || pathname === '/cn/docs' || pathname.startsWith('/cn/docs/'); +} + +function collectDocsPaths(allDocsData) { + const paths = new Set(); + for (const pluginData of Object.values(allDocsData)) { + for (const version of pluginData.versions || []) { + paths.add(normalizeRoutePath(version.path)); + for (const doc of version.docs || []) { + paths.add(normalizeRoutePath(doc.path)); + } + } + } + return paths; +} + +function docsRootFor(pathname) { + const match = pathname.match(/^\/(cn\/)?docs(\/(?:next|docusaurus-[^/]+))?/); + if (!match) { + return pathname.startsWith('/cn/') ? '/cn/docs/' : '/docs/'; + } + return `/${match[1] || ''}docs${match[2] || ''}/`; +} + +function fallbackForMissingDocsPath(pathname) { + const docsRoot = docsRootFor(pathname); + if (pathname.includes('/changelog/')) { + return `${docsRoot}changelog/`; + } + return docsRoot; +} + +function resolveDocsTarget(pathname, docsPaths) { + if (!isDocsPath(pathname) || docsPaths.has(normalizeRoutePath(pathname))) { + return pathname; + } + + const fallback = fallbackForMissingDocsPath(pathname); + return docsPaths.has(normalizeRoutePath(fallback)) ? fallback : docsRootFor(pathname); +} + +function toEnglish(pathname) { + if (isNotFoundPath(pathname)) { + return '/'; + } + + if (pathname === '/cn' || pathname === '/cn/') { + return '/'; + } + + const matchedPrefix = cnPrefixes.find((prefix) => matchesPrefix(pathname, prefix)); + if (matchedPrefix) { + const englishPrefix = matchedPrefix.replace('/cn', ''); + if (pathname === matchedPrefix.slice(0, -1)) { + return englishPrefix.slice(0, -1); + } + return pathname.replace(matchedPrefix, englishPrefix); + } + + return pathname.startsWith('/cn/') ? pathname.replace(/^\/cn/, '') : pathname; +} + +function toChinese(pathname) { + if (isNotFoundPath(pathname)) { + return '/cn/'; + } + + if (pathname === '/') { + return '/cn/'; + } + + if (pathname === '/cn' || pathname.startsWith('/cn/')) { + return pathname; + } + + const fallback = enToCnFallbacks.get(normalizeLookupPath(pathname)); + if (fallback) { + return fallback; + } + + const matchedPrefix = enPrefixes.find((prefix) => matchesPrefix(pathname, prefix)); + if (matchedPrefix) { + return `/cn${pathname}`; + } + + return '/cn/'; +} + +export default function LanguageSwitcherNavbarItem(props) { + const location = useLocation(); + const allDocsData = useAllDocsData(); + const docsPaths = React.useMemo(() => collectDocsPaths(allDocsData), [allDocsData]); + const suffix = `${location.search}${location.hash}`; + const isChinese = location.pathname === '/cn/' || location.pathname.startsWith('/cn/'); + const englishPath = resolveDocsTarget(toEnglish(location.pathname), docsPaths); + const chinesePath = resolveDocsTarget(toChinese(location.pathname), docsPaths); + + return ( + + ); +} diff --git a/src/components/LocaleAwareNavbarItem/index.js b/src/components/LocaleAwareNavbarItem/index.js new file mode 100644 index 000000000..67b1b04dd --- /dev/null +++ b/src/components/LocaleAwareNavbarItem/index.js @@ -0,0 +1,29 @@ +import React from 'react'; +import {useLocation} from '@docusaurus/router'; +import DefaultNavbarItem from '@theme/NavbarItem/DefaultNavbarItem'; + +function isChinesePath(pathname) { + return pathname === '/cn' || pathname.startsWith('/cn/'); +} + +export default function LocaleAwareNavbarItem({ + enTo, + cnTo, + cnLabel, + cnActiveBasePath, + label, + activeBasePath, + ...props +}) { + const {pathname} = useLocation(); + const isChinese = isChinesePath(pathname); + + return ( + + ); +} diff --git a/src/components/TeamPage/index.js b/src/components/TeamPage/index.js new file mode 100644 index 000000000..eb62eef57 --- /dev/null +++ b/src/components/TeamPage/index.js @@ -0,0 +1,151 @@ +import React from 'react'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import {contributorLinks, teamMembers, teamSources} from '@site/src/data/team'; + +const copy = { + en: { + title: 'Apache HugeGraph Team', + description: 'Project members, committers, and contributor entry points for Apache HugeGraph.', + eyebrow: 'Community', + heading: 'Apache HugeGraph Team', + lead: 'HugeGraph is maintained by an Apache project community. This page is generated from local data sourced from public ASF roster information.', + pmc: 'PMC Members', + committers: 'Committers', + contributors: 'Contributors', + mapTitle: 'Contributor Map', + mapLead: 'The community is represented here by responsibility groups instead of a heavy runtime map library.', + sources: 'Data Sources', + addNote: 'New contributors are added through the Apache community process. Start with the contribution guide and GitHub contributor history.', + profile: 'Apache profile', + homepage: 'Homepage', + }, + cn: { + title: 'Apache HugeGraph 团队', + description: 'Apache HugeGraph 的项目成员、Committer 和贡献入口。', + eyebrow: '社区', + heading: 'Apache HugeGraph 团队', + lead: 'HugeGraph 由 Apache 项目社区维护。本页面使用来自 ASF 公开 roster 的本地数据生成。', + pmc: 'PMC 成员', + committers: 'Committers', + contributors: '贡献者', + mapTitle: '贡献者地图', + mapLead: '这里用职责分组呈现社区分布,避免引入较重的运行时地图依赖。', + sources: '数据来源', + addNote: '新的贡献者通过 Apache 社区流程加入。可以从贡献指南和 GitHub 贡献历史开始。', + profile: 'Apache 资料', + homepage: '主页', + }, +}; + +function initials(name) { + return name + .split(/\s+/) + .map((part) => part[0]) + .join('') + .slice(0, 2) + .toUpperCase(); +} + +function apacheProfile(apacheId) { + return `https://people.apache.org/committer-index.html#${apacheId}`; +} + +function MemberCard({member, strings}) { + return ( + + ); +} + +function MemberSection({title, members, strings}) { + return ( +
+
+
+

{title}

+
+
+ {members.map((member) => ( + + ))} +
+
+
+ ); +} + +export default function TeamPage({locale = 'en'}) { + const strings = copy[locale]; + const pmcMembers = teamMembers.filter((member) => member.groups.includes('pmc')); + const committers = teamMembers.filter((member) => !member.groups.includes('pmc')); + const contributorStats = [ + {label: strings.pmc, value: pmcMembers.length}, + {label: strings.committers, value: teamMembers.length}, + {label: strings.contributors, value: 'GitHub'}, + ]; + + return ( + +
+
+

{strings.eyebrow}

+

{strings.heading}

+

{strings.lead}

+
+
+
+
+
+
+

{strings.mapTitle}

+

{strings.mapLead}

+
+
+ {contributorStats.map((item) => ( +
+ {item.value} + {item.label} +
+ ))} +
+
+
+ + +
+
+
+

{strings.contributors}

+

{strings.addNote}

+
+
+ {contributorLinks.map((link) => ( + + {link.label} + + ))} +
+

{strings.sources}

+ +
+
+
+
+ ); +} diff --git a/src/components/UsersPage/index.js b/src/components/UsersPage/index.js new file mode 100644 index 000000000..5187a277c --- /dev/null +++ b/src/components/UsersPage/index.js @@ -0,0 +1,131 @@ +import React from 'react'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import {userCaseIssue, userCases} from '@site/src/data/users'; + +const copy = { + en: { + title: 'Apache HugeGraph Users', + description: 'Public HugeGraph user cases shared by the community.', + eyebrow: 'Users', + heading: 'HugeGraph User Showcase', + lead: 'These cases come from public HugeGraph community submissions. Logos are intentionally omitted unless separately approved and available in the repository.', + submit: 'Submit a user case', + industry: 'Industry', + storage: 'Storage', + graphSize: 'Graph size', + website: 'Website', + source: 'Source', + noLogo: 'No logo', + }, + cn: { + title: 'Apache HugeGraph 用户案例', + description: '来自社区公开提交的 HugeGraph 用户案例。', + eyebrow: '用户', + heading: 'HugeGraph 用户案例', + lead: '这些案例来自 HugeGraph 社区公开提交。除非仓库中已有明确授权的素材,本页不展示公司 Logo。', + submit: '提交用户案例', + industry: '行业', + storage: '存储后端', + graphSize: '图规模', + website: '官网', + source: '来源', + noLogo: '无 Logo', + }, +}; + +function groupByIndustry(cases) { + return cases.reduce((groups, item) => { + const industry = item.industry || 'Other'; + if (!groups.has(industry)) { + groups.set(industry, []); + } + groups.get(industry).push(item); + return groups; + }, new Map()); +} + +function logoFallback(name) { + return name + .split(/\s+/) + .map((part) => part[0]) + .join('') + .slice(0, 2) + .toUpperCase(); +} + +function UserCaseCard({item, strings, locale}) { + return ( +
+
{logoFallback(item.organization)}
+
+

{item.organization}

+

{locale === 'cn' ? item.scenarioCn || item.scenario : item.scenario}

+
+
+
{strings.industry}
+
{item.industry}
+
+ {item.storageBackend && ( +
+
{strings.storage}
+
{item.storageBackend}
+
+ )} + {item.graphSize && ( +
+
{strings.graphSize}
+
{item.graphSize}
+
+ )} +
+
+ {item.websiteUrl && {strings.website}} + {strings.source} +
+
+
+ ); +} + +export default function UsersPage({locale = 'en'}) { + const strings = copy[locale]; + const groupedCases = Array.from(groupByIndustry(userCases).entries()); + + return ( + +
+
+

{strings.eyebrow}

+

{strings.heading}

+

{strings.lead}

+ + {strings.submit} + +
+
+
+ {groupedCases.map(([industry, cases], index) => ( +
+
+
+

{strings.industry}

+

{industry}

+
+
+ {cases.map((item) => ( + + ))} +
+
+
+ ))} +
+
+ ); +} diff --git a/src/css/custom.css b/src/css/custom.css new file mode 100644 index 000000000..ca3fead9e --- /dev/null +++ b/src/css/custom.css @@ -0,0 +1,585 @@ +:root { + --ifm-color-primary: #b32025; + --ifm-color-primary-dark: #9f1c21; + --ifm-color-primary-darker: #8f191d; + --ifm-color-primary-darkest: #751418; + --ifm-color-primary-light: #c83b3f; + --ifm-color-primary-lighter: #d15256; + --ifm-color-primary-lightest: #df7477; + --ifm-font-family-base: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + --ifm-heading-font-family: var(--ifm-font-family-base); + --ifm-navbar-height: 4rem; + --ifm-global-radius: 8px; + --hugegraph-ink: #18212f; + --hugegraph-muted: #5f6877; + --hugegraph-border: #dfe4ec; + --hugegraph-band: #f6f8fb; + --hugegraph-accent: #117a8b; +} + +html[data-theme='dark'] { + --ifm-color-primary: #ff7a7e; + --ifm-background-color: #111827; + --ifm-navbar-background-color: #101723; + --hugegraph-ink: #f8fafc; + --hugegraph-muted: #c7ced8; + --hugegraph-border: #2b3545; + --hugegraph-band: #151f2c; +} + +.navbar { + border-bottom: 1px solid var(--hugegraph-border); + box-shadow: none; +} + +.navbar__brand { + font-weight: 700; +} + +.navbar__logo { + height: 2rem; + width: 2rem; +} + +.navbar__item.dropdown > .navbar__link::after { + margin-left: 0.4rem; +} + +.documentationDropdown { + align-items: center; + display: flex; + position: relative; +} + +.documentationDropdown::after { + content: ''; + height: 0.3rem; + left: 0; + position: absolute; + right: 0; + top: 100%; +} + +.documentationDropdown__button { + align-items: center; + background: transparent; + border: 0; + color: var(--ifm-navbar-link-color); + cursor: pointer; + display: inline-flex; + font: inherit; + gap: 0.28rem; + height: 100%; + padding: var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal); +} + +.documentationDropdown__button:hover, +.documentationDropdown__button:focus { + color: var(--ifm-navbar-link-hover-color); + outline: none; +} + +.documentationDropdown__button:focus-visible { + outline: 2px solid var(--ifm-color-primary); + outline-offset: 2px; +} + +.documentationDropdown__chevron { + border-bottom: 1.5px solid currentColor; + border-right: 1.5px solid currentColor; + height: 0.34rem; + margin-top: -0.16rem; + transform: rotate(45deg); + width: 0.34rem; +} + +.documentationDropdown__menu { + background: #ffffff; + border: 1px solid rgba(24, 33, 47, 0.08); + border-radius: 6px; + box-shadow: 0 10px 24px rgba(24, 33, 47, 0.14); + display: none; + left: 50%; + list-style: none; + margin: 0; + min-width: 132px; + padding: 0.28rem; + position: absolute; + top: calc(100% + 0.18rem); + transform: translateX(-50%); + z-index: var(--ifm-z-index-dropdown); +} + +.documentationDropdown__menu--open { + display: block; +} + +.documentationDropdown__item { + border-radius: 4px; + color: #18212f; + display: block; + font-size: 0.9rem; + font-weight: 600; + line-height: 1.2; + min-height: 2rem; + padding: 0.45rem 0.58rem; + text-decoration: none; +} + +.documentationDropdown__item:hover, +.documentationDropdown__item:focus { + background: #f3f5f8; + color: var(--ifm-color-primary); + outline: none; + text-decoration: none; +} + +.hugegraphHero { + align-items: center; + background-image: url('/img/featured-background.jpg'); + background-position: center; + background-size: cover; + color: #ffffff; + display: flex; + min-height: min(690px, 72vh); + overflow: hidden; + position: relative; +} + +.hugegraphHero__overlay { + background: rgba(11, 18, 29, 0.72); + inset: 0; + position: absolute; +} + +.hugegraphHero__content { + margin: 0 auto; + max-width: 1180px; + padding: 5rem 1.5rem 4rem; + position: relative; + width: 100%; +} + +.hugegraphHero h1 { + color: #ffffff; + font-size: 5.25rem; + letter-spacing: 0; + line-height: 1; + margin: 0 0 1.25rem; +} + +.hugegraphHero__lead { + color: #e8edf5; + font-size: 1.35rem; + line-height: 1.6; + max-width: 780px; +} + +.hugegraphHero__actions { + display: flex; + flex-wrap: wrap; + gap: 0.8rem; + margin-top: 2rem; +} + +.hugegraphHero .button--secondary { + --ifm-button-background-color: rgba(255, 255, 255, 0.12); + --ifm-button-border-color: rgba(255, 255, 255, 0.75); + --ifm-button-color: #ffffff; + color: #ffffff; +} + +.apacheEyebrow { + color: var(--ifm-color-primary); + font-size: 0.78rem; + font-weight: 700; + letter-spacing: 0; + margin-bottom: 0.65rem; + text-transform: uppercase; +} + +.hugegraphHero .apacheEyebrow { + color: #ffb5b8; +} + +.siteBand { + padding: 4.5rem 0; +} + +.siteBand--light { + background: var(--hugegraph-band); +} + +.sectionHeading { + margin-bottom: 2rem; + max-width: 760px; +} + +.sectionHeading h2, +.ecosystemLayout h2 { + color: var(--hugegraph-ink); + font-size: 2.65rem; + letter-spacing: 0; + line-height: 1.1; + margin: 0; +} + +.sectionHeading p, +.ecosystemLayout p { + color: var(--hugegraph-muted); +} + +.highlightGrid { + display: grid; + gap: 1rem; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.productCard { + background: var(--ifm-background-surface-color); + border: 1px solid var(--hugegraph-border); + border-radius: 8px; + min-height: 230px; + padding: 1.5rem; +} + +.productCard h3 { + color: var(--hugegraph-ink); + font-size: 1.3rem; + letter-spacing: 0; +} + +.productCard p { + color: var(--hugegraph-muted); + line-height: 1.65; +} + +.productCard a { + font-weight: 700; +} + +.ecosystemLayout { + align-items: center; + display: grid; + gap: 3rem; + grid-template-columns: minmax(0, 0.9fr) minmax(320px, 1.1fr); +} + +.ecosystemMap { + border: 1px solid var(--hugegraph-border); + border-radius: 8px; + display: grid; + gap: 1px; + grid-template-columns: repeat(2, minmax(0, 1fr)); + overflow: hidden; +} + +.ecosystemNode { + background: var(--ifm-background-surface-color); + min-height: 150px; + padding: 1.25rem; +} + +.ecosystemNode strong, +.ecosystemNode span { + display: block; +} + +.ecosystemNode strong { + color: var(--hugegraph-ink); + font-size: 1.2rem; + margin-bottom: 0.6rem; +} + +.ecosystemNode span { + color: var(--hugegraph-muted); + line-height: 1.55; +} + +.ecosystemNode--5 { + grid-column: 1 / -1; +} + +.theme-doc-sidebar-container { + border-right-color: var(--hugegraph-border) !important; +} + +.theme-doc-sidebar-item-category-level-1 > .menu__list-item-collapsible .menu__link { + font-weight: 700; +} + +.markdown h1, +.markdown h2, +.markdown h3 { + letter-spacing: 0; +} + +.markdown table { + display: table; + width: 100%; +} + +.markdown img { + border: 1px solid var(--hugegraph-border); + border-radius: 8px; + max-width: 100%; +} + +.subpageHero { + background: var(--hugegraph-band); + border-bottom: 1px solid var(--hugegraph-border); + padding: 4rem 0 3.25rem; +} + +.subpageHero h1 { + color: var(--hugegraph-ink); + font-size: 3.5rem; + letter-spacing: 0; + line-height: 1.05; + margin: 0 0 1rem; +} + +.subpageHero p:not(.apacheEyebrow) { + color: var(--hugegraph-muted); + font-size: 1.15rem; + line-height: 1.65; + max-width: 840px; +} + +.statGrid, +.directoryGrid, +.showcaseGrid, +.linkGrid { + display: grid; + gap: 1rem; +} + +.statGrid { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.statCard, +.directoryCard, +.showcaseCard, +.linkCard { + background: var(--ifm-background-surface-color); + border: 1px solid var(--hugegraph-border); + border-radius: 8px; +} + +.statCard { + padding: 1.5rem; +} + +.statCard strong, +.statCard span { + display: block; +} + +.statCard strong { + color: var(--ifm-color-primary); + font-size: 2.2rem; + line-height: 1; + margin-bottom: 0.5rem; +} + +.statCard span { + color: var(--hugegraph-muted); + font-weight: 700; +} + +.directoryGrid { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.directoryCard, +.showcaseCard { + display: flex; + gap: 1rem; + padding: 1.25rem; +} + +.directoryCard h3, +.showcaseCard h3 { + color: var(--hugegraph-ink); + font-size: 1.15rem; + letter-spacing: 0; + margin: 0 0 0.35rem; +} + +.directoryCard p, +.showcaseCard p { + color: var(--hugegraph-muted); + line-height: 1.6; + margin-bottom: 0.75rem; +} + +.directoryAvatar, +.showcaseLogo { + align-items: center; + background: color-mix(in srgb, var(--ifm-color-primary) 12%, var(--ifm-background-surface-color)); + border: 1px solid color-mix(in srgb, var(--ifm-color-primary) 35%, var(--hugegraph-border)); + border-radius: 8px; + color: var(--ifm-color-primary); + display: flex; + flex: 0 0 auto; + font-weight: 800; + height: 3rem; + justify-content: center; + width: 3rem; +} + +.inlineLinks { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; + font-weight: 700; +} + +.showcaseGrid { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.metadataList { + display: grid; + gap: 0.7rem; + grid-template-columns: repeat(3, minmax(0, 1fr)); + margin: 1rem 0; +} + +.metadataList div { + min-width: 0; +} + +.metadataList dt { + color: var(--hugegraph-muted); + font-size: 0.78rem; + font-weight: 700; + text-transform: uppercase; +} + +.metadataList dd { + color: var(--hugegraph-ink); + margin: 0.2rem 0 0; +} + +.linkGrid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + margin-bottom: 2rem; +} + +.linkCard { + color: var(--hugegraph-ink); + display: block; + font-weight: 800; + padding: 1.2rem; +} + +.linkCard:hover { + color: var(--ifm-color-primary); + text-decoration: none; +} + +.footer { + background: #14171f; +} + +.footer__logo { + background: #ffffff; + border-radius: 8px; + max-width: 180px; + padding: 0.5rem; +} + +.footer__copyright { + color: #d7dce5; + font-size: 0.74rem; + line-height: 1.45; + margin: 1.5rem auto 0; + max-width: 880px; +} + +@media (max-width: 996px) { + .hugegraphHero { + min-height: 68vh; + } + + .hugegraphHero h1 { + font-size: 4rem; + } + + .hugegraphHero__lead { + font-size: 1.2rem; + } + + .sectionHeading h2, + .ecosystemLayout h2 { + font-size: 2.2rem; + } + + .highlightGrid, + .ecosystemLayout, + .statGrid, + .directoryGrid, + .showcaseGrid, + .linkGrid { + grid-template-columns: 1fr; + } + + .ecosystemMap { + grid-template-columns: 1fr; + } + + .documentationDropdown { + align-items: stretch; + display: block; + width: 100%; + } + + .documentationDropdown::after { + display: none; + } + + .documentationDropdown__button { + justify-content: space-between; + width: 100%; + } + + .documentationDropdown__menu { + box-shadow: none; + left: auto; + margin: 0.2rem 0 0; + position: static; + transform: none; + width: 100%; + } + + .ecosystemNode--5 { + grid-column: auto; + } +} + +@media (max-width: 480px) { + .hugegraphHero__content { + padding: 4rem 1rem 3rem; + } + + .hugegraphHero h1 { + font-size: 3rem; + } + + .siteBand { + padding: 3rem 0; + } + + .productCard, + .ecosystemNode, + .directoryCard, + .showcaseCard { + min-height: auto; + } + + .metadataList { + grid-template-columns: 1fr; + } +} diff --git a/src/data/team.js b/src/data/team.js new file mode 100644 index 000000000..dac78a26d --- /dev/null +++ b/src/data/team.js @@ -0,0 +1,54 @@ +export const teamSources = [ + { + label: 'ASF Committee Info', + url: 'https://whimsy.apache.org/public/committee-info.json', + }, + { + label: 'ASF LDAP Project Roster', + url: 'https://whimsy.apache.org/public/public_ldap_projects.json', + }, + { + label: 'ASF Public People Data', + url: 'https://whimsy.apache.org/public/public_ldap_people.json', + }, +]; + +export const teamMembers = [ + {name: 'Jermy Li', apacheId: 'jermy', role: 'PMC Chair', groups: ['pmc', 'committer']}, + {name: 'Xiangdong Huang', apacheId: 'hxd', role: 'PMC Member', groups: ['pmc', 'committer']}, + {name: 'Imba Jin', apacheId: 'jin', role: 'PMC Member', groups: ['pmc', 'committer'], homepage: 'https://imbajin.com'}, + {name: 'Lidong Dai', apacheId: 'lidongdai', role: 'PMC Member', groups: ['pmc', 'committer']}, + {name: 'NingRui Li', apacheId: 'linary', role: 'PMC Member', groups: ['pmc', 'committer']}, + {name: 'Yu Li', apacheId: 'liyu', role: 'PMC Member', groups: ['pmc', 'committer'], homepage: 'https://www.linkedin.com/in/carp84'}, + {name: 'Simon', apacheId: 'ming', role: 'PMC Member', groups: ['pmc', 'committer']}, + {name: 'Willem Ning Jiang', apacheId: 'ningjiang', role: 'PMC Member', groups: ['pmc', 'committer'], homepage: 'https://willemjiang.github.io'}, + {name: 'Juan Pan', apacheId: 'panjuan', role: 'PMC Member', groups: ['pmc', 'committer']}, + {name: 'Yan Zhang', apacheId: 'vaughn', role: 'PMC Member', groups: ['pmc', 'committer']}, + {name: 'Yuchen Ding', apacheId: 'vgalaxies', role: 'PMC Member', groups: ['pmc', 'committer']}, + {name: 'Cong Zhao', apacheId: 'zhaocong', role: 'PMC Member', groups: ['pmc', 'committer'], homepage: 'https://github.com/coderzc'}, + {name: 'Shoujing Guo', apacheId: 'guoshoujing', role: 'Committer', groups: ['committer']}, + {name: 'Jason', apacheId: 'jsong010123', role: 'Committer', groups: ['committer']}, + {name: 'Lei Zou', apacheId: 'leizou', role: 'Committer', groups: ['committer']}, + {name: 'Xiao Liu', apacheId: 'liuxiaocs', role: 'Committer', groups: ['committer']}, + {name: 'Junzhi Peng', apacheId: 'pengjunzhi', role: 'Committer', groups: ['committer'], homepage: 'https://www.pengzna.top/'}, + {name: 'Zhe Wang', apacheId: 'spica', role: 'Committer', groups: ['committer']}, + {name: 'Kaiyichen Wei', apacheId: 'vichayturen', role: 'Committer', groups: ['committer']}, + {name: 'Jing Wang', apacheId: 'wangjing', role: 'Committer', groups: ['committer']}, + {name: 'Jacky Yang', apacheId: 'yangjiaqi', role: 'Committer', groups: ['committer']}, + {name: 'Yi Zhang', apacheId: 'zhangyi89817', role: 'Committer', groups: ['committer']}, +]; + +export const contributorLinks = [ + { + label: 'HugeGraph contributors', + url: 'https://github.com/apache/hugegraph/graphs/contributors', + }, + { + label: 'Documentation contributors', + url: 'https://github.com/apache/hugegraph-doc/graphs/contributors', + }, + { + label: 'Contribution guide', + url: '/community/contribution-guidelines/', + }, +]; diff --git a/src/data/users.js b/src/data/users.js new file mode 100644 index 000000000..94d28fdb8 --- /dev/null +++ b/src/data/users.js @@ -0,0 +1,134 @@ +export const userCaseIssue = { + label: 'apache/hugegraph#1651', + url: 'https://github.com/apache/hugegraph/issues/1651', +}; + +export const userCases = [ + { + organization: 'Baidu', + industry: 'Knowledge Graph', + scenario: 'Ten-billion-scale knowledge graph for group discovery, data lineage, tracing, ad recall, and ad relevance.', + scenarioCn: '用于团伙发现、数据溯源与追踪、广告召回和相关性的百亿级知识图谱。', + graphSize: 'Ten-billion-scale vertices and edges', + storageBackend: 'RocksDB', + region: 'China', + publicApproved: true, + sourceUrl: 'https://github.com/apache/hugegraph/issues/1651', + }, + { + organization: 'iFLYTEK', + industry: 'Knowledge Q&A', + scenario: 'Common knowledge graph management platform supporting Knowledge Q&A in automotive, customer service, and related fields.', + scenarioCn: '通用知识图谱管理系统,支撑汽车、客服等领域的知识问答。', + storageBackend: 'RocksDB, HBase', + region: 'China', + publicApproved: true, + sourceUrl: 'https://github.com/apache/hugegraph/issues/1651', + }, + { + organization: 'Huya', + industry: 'Application Metadata', + scenario: 'Application metadata graph for relationships among people, applications, and resources, with further AI and big data analysis.', + scenarioCn: '千万级应用元数据系统,梳理人、应用和资源之间的复杂关系,并支持 AI 与大数据分析。', + graphSize: 'Ten-million-scale application metadata', + storageBackend: 'MySQL, RocksDB', + region: 'China', + publicApproved: true, + sourceUrl: 'https://github.com/apache/hugegraph/issues/1651', + }, + { + organization: 'Huolala', + industry: 'Risk Control', + scenario: 'Graph storage and modeling for anti-fraud, anti-cheating, and black-market risk analysis.', + scenarioCn: '面向反欺诈、反作弊、黑产破解等风控场景的图数据存储和建模分析。', + storageBackend: 'HBase', + region: 'China', + publicApproved: true, + sourceUrl: 'https://github.com/apache/hugegraph/issues/1651', + }, + { + organization: 'MYbank', + industry: 'Banking Infrastructure', + scenario: 'Hundred-million-scale knowledge graph from banking data centers to application call chains for asset governance and risk discovery.', + scenarioCn: '从银行数据中心到应用链路的亿级知识图谱,用于资产治理、架构演进和调用风险挖掘。', + graphSize: 'Hundred-million-scale graph', + storageBackend: 'RocksDB', + region: 'China', + publicApproved: true, + sourceUrl: 'https://github.com/apache/hugegraph/issues/1651', + }, + { + organization: 'Aiqicha', + websiteUrl: 'https://aiqicha.baidu.com/', + industry: 'Enterprise Relationship Graph', + scenario: 'Enterprise and person relationship graph powering relation search, enterprise relationship maps, and group relationship maps.', + scenarioCn: '构建企业、自然人的人企和企企关系图谱,支撑查关系、企业关系图谱和集团关系图谱等功能。', + graphSize: 'Hundred-million-scale vertices and edges, tens of millions of daily updates', + storageBackend: 'RocksDB', + region: 'China', + publicApproved: true, + sourceUrl: 'https://github.com/apache/hugegraph/issues/1651', + }, + { + organization: 'NetEase Games', + industry: 'Games and Social Graphs', + scenario: 'Knowledge graph Q&A, in-game fraud detection, and public social-media forwarding-path analysis.', + scenarioCn: '用于知识图谱问答、游戏内欺诈检测,以及公共社交媒体传播路径分析。', + storageBackend: 'RocksDB, HBase', + region: 'China', + publicApproved: true, + sourceUrl: 'https://github.com/apache/hugegraph/issues/1651', + }, + { + organization: 'Boya Chain', + websiteUrl: 'https://www.boyachain.cn/', + industry: 'Cybersecurity', + scenario: 'Blockchain-based threat intelligence sharing platform for network-resource relationship graphs and incident tracing.', + scenarioCn: '基于区块链的威胁情报共享服务平台,用于网络资源关系图谱、事件分析和溯源追踪。', + storageBackend: 'MySQL, RocksDB', + region: 'China', + publicApproved: true, + sourceUrl: 'https://github.com/apache/hugegraph/issues/1651', + }, + { + organization: 'Baidu Infrastructure', + industry: 'Network Infrastructure', + scenario: 'Data center network infrastructure graph for topology path computation, fault localization, and network management.', + scenarioCn: '用于数据中心网络基础设施管理、端到端拓扑路径计算、故障定位和云网融合分析。', + storageBackend: 'Cassandra', + region: 'China', + publicApproved: true, + sourceUrl: 'https://github.com/apache/hugegraph/issues/1651', + }, + { + organization: 'EnCDATA', + websiteUrl: 'https://www.encdata.cn/', + industry: 'Public Safety', + scenario: 'Smart policing graph analysis and data-lineage analysis for data governance platforms.', + scenarioCn: '面向智慧警务的人员、车辆关系分析,以及数据治理平台中的数据血缘分析。', + storageBackend: 'HBase', + region: 'China', + publicApproved: true, + sourceUrl: 'https://github.com/apache/hugegraph/issues/1651', + }, + { + organization: 'Baidu Baike', + industry: 'Knowledge Graph', + scenario: 'General encyclopedia graph covering emperor genealogy, vertical film entries, and relationships among film characters.', + scenarioCn: '百科通用图谱,覆盖帝王族谱、影视剧垂类词条和影视剧角色关系等场景。', + storageBackend: 'Not specified', + region: 'China', + publicApproved: true, + sourceUrl: 'https://github.com/apache/hugegraph/issues/1651', + }, + { + organization: 'Baidu Code Analysis', + industry: 'Code Intelligence', + scenario: 'White-box code analysis based on function call-chain relationships.', + scenarioCn: '基于函数调用链关系的代码白盒分析。', + storageBackend: 'MySQL', + region: 'China', + publicApproved: true, + sourceUrl: 'https://github.com/apache/hugegraph/issues/1651', + }, +]; diff --git a/src/data/versions.json b/src/data/versions.json new file mode 100644 index 000000000..fc48e4b05 --- /dev/null +++ b/src/data/versions.json @@ -0,0 +1,169 @@ +[ + { + "id": "current", + "docusaurusVersion": "current", + "label": "Next", + "path": "/docs/next/", + "cnPath": "/cn/docs/next/", + "status": "next", + "releaseDate": null, + "githubTagUrl": null, + "notes": "Current unreleased documentation. It is intentionally served under /docs/next/ and marked noindex." + }, + { + "id": "stable", + "docusaurusVersion": "stable", + "label": "Stable (1.7.0)", + "path": "/docs/", + "cnPath": "/cn/docs/", + "status": "stable", + "releaseDate": "2025-11-16", + "githubTagUrl": "https://github.com/apache/hugegraph-doc/tree/docusaurus-1.7.0", + "sourceRef": "docusaurus-1.7.0", + "notes": "Default documentation route for most users." + }, + { + "id": "1.5.0", + "docusaurusVersion": "docusaurus-1.5.0", + "label": "1.5.0", + "path": "/docs/docusaurus-1.5.0/", + "cnPath": "/cn/docs/docusaurus-1.5.0/", + "status": "archived", + "releaseDate": null, + "githubTagUrl": "https://github.com/apache/hugegraph-doc/tree/release-1.5.0", + "sourceRef": "release-1.5.0", + "legacyCompatibility": { + "enabled": true, + "normalizeMarkdown": true, + "reason": "Compatibility-only import for the archived release branch; this is not part of the normal Docusaurus authoring pipeline." + }, + "notes": "Source branch release-1.5.0 maps to Docusaurus version docusaurus-1.5.0." + }, + { + "id": "1.3.0", + "docusaurusVersion": "docusaurus-1.3.0", + "label": "1.3.0", + "path": "/docs/docusaurus-1.3.0/", + "cnPath": "/cn/docs/docusaurus-1.3.0/", + "status": "archived", + "releaseDate": null, + "githubTagUrl": "https://github.com/apache/hugegraph-doc/tree/release-1.3.0", + "sourceRef": "release-1.3.0", + "legacyCompatibility": { + "enabled": true, + "normalizeMarkdown": true, + "reason": "Compatibility-only import for the archived release branch; this is not part of the normal Docusaurus authoring pipeline." + }, + "notes": "Source branch release-1.3.0 maps to Docusaurus version docusaurus-1.3.0." + }, + { + "id": "1.2.0", + "docusaurusVersion": "docusaurus-1.2.0", + "label": "1.2.0", + "path": "/docs/docusaurus-1.2.0/", + "cnPath": "/cn/docs/docusaurus-1.2.0/", + "status": "archived", + "releaseDate": null, + "githubTagUrl": "https://github.com/apache/hugegraph-doc/tree/release-1.2.0", + "sourceRef": "release-1.2.0", + "legacyCompatibility": { + "enabled": true, + "normalizeMarkdown": true, + "reason": "Compatibility-only import for the archived release branch; this is not part of the normal Docusaurus authoring pipeline." + }, + "notes": "Source branch release-1.2.0 maps to Docusaurus version docusaurus-1.2.0." + }, + { + "id": "1.0.0", + "docusaurusVersion": "docusaurus-1.0.0", + "label": "1.0.0", + "path": "/docs/docusaurus-1.0.0/", + "cnPath": "/cn/docs/docusaurus-1.0.0/", + "status": "archived", + "releaseDate": null, + "githubTagUrl": "https://github.com/apache/hugegraph-doc/tree/release-1.0.0", + "sourceRef": "release-1.0.0", + "legacyCompatibility": { + "enabled": true, + "normalizeMarkdown": true, + "sourceOverlays": { + "cn": [ + { + "sourcePath": "content/cn/contribution-guidelines", + "targetPath": "contribution-guidelines" + } + ] + }, + "reason": "Compatibility-only import for the archived release branch; this is not part of the normal Docusaurus authoring pipeline." + }, + "notes": "Source branch release-1.0.0 maps to Docusaurus version docusaurus-1.0.0." + }, + { + "id": "0.11", + "docusaurusVersion": "docusaurus-0.11", + "label": "0.11", + "path": "/docs/docusaurus-0.11/", + "cnPath": "/cn/docs/docusaurus-0.11/", + "status": "archived", + "releaseDate": null, + "githubTagUrl": "https://github.com/apache/hugegraph-doc/tree/release-0.11", + "sourceRef": "release-0.11", + "legacyCompatibility": { + "enabled": true, + "normalizeMarkdown": true, + "sourcePaths": { + "en": ".", + "cn": "." + }, + "sourceIncludes": [ + "README.md", + "changelog", + "clients", + "config", + "download.md", + "guides", + "images", + "language", + "performance", + "quickstart" + ], + "indexFrom": "README.md", + "reason": "Compatibility-only import for the archived pre-content-layout branch; this is not part of the normal Docusaurus authoring pipeline." + }, + "notes": "Source branch release-0.11 maps to Docusaurus version docusaurus-0.11." + }, + { + "id": "0.10", + "docusaurusVersion": "docusaurus-0.10", + "label": "0.10", + "path": "/docs/docusaurus-0.10/", + "cnPath": "/cn/docs/docusaurus-0.10/", + "status": "archived", + "releaseDate": null, + "githubTagUrl": "https://github.com/apache/hugegraph-doc/tree/release-0.10", + "sourceRef": "release-0.10", + "legacyCompatibility": { + "enabled": true, + "normalizeMarkdown": true, + "sourcePaths": { + "en": ".", + "cn": "." + }, + "sourceIncludes": [ + "README.md", + "changelog", + "clients", + "config", + "download.md", + "guides", + "images", + "language", + "performance", + "quickstart" + ], + "indexFrom": "README.md", + "reason": "Compatibility-only import for the archived pre-content-layout branch; this is not part of the normal Docusaurus authoring pipeline." + }, + "notes": "Source branch release-0.10 maps to Docusaurus version docusaurus-0.10." + } +] diff --git a/src/markdown/frontMatter.js b/src/markdown/frontMatter.js new file mode 100644 index 000000000..5913190b5 --- /dev/null +++ b/src/markdown/frontMatter.js @@ -0,0 +1,90 @@ +const path = require('path'); +const {DEFAULT_PARSE_FRONT_MATTER} = require('@docusaurus/utils'); + +function indexSlug(filePath) { + if (path.basename(filePath) !== '_index.md') { + return undefined; + } + + const normalized = filePath.split(path.sep).join('/'); + const match = normalized.match( + /(?:content\/(?:en|cn)\/(?:docs|community)|(?:versioned_docs|docs-cn_versioned_docs)\/version-[^/]+)\/(.*)_index\.md$/, + ); + if (!match) { + return undefined; + } + + const slug = match[1].replace(/\/$/, ''); + return slug ? `/${slug}` : '/'; +} + +function slugify(value) { + return String(value) + .trim() + .toLowerCase() + .replace(/&/g, ' and ') + .replace(/[^a-z0-9\u4e00-\u9fa5]+/g, '-') + .replace(/^-+|-+$/g, ''); +} + +function blogSlug(filePath, frontMatter) { + const normalized = filePath.split(path.sep).join('/'); + if (!normalized.includes('/content/en/blog/') && !normalized.includes('/content/cn/blog/')) { + return undefined; + } + if (!frontMatter.date) { + return undefined; + } + + const date = + frontMatter.date instanceof Date + ? frontMatter.date.toISOString().slice(0, 10) + : String(frontMatter.date).slice(0, 10); + const match = date.match(/^(\d{4})-(\d{2})-(\d{2})$/); + if (!match) { + return undefined; + } + + const [, year, month, day] = match; + const fallback = path.basename(filePath).replace(/\.mdx?$/i, ''); + return `/${year}/${month}/${day}/${slugify(frontMatter.title || fallback)}`; +} + +function applyPlaceholderDefaults(frontMatter) { + if (frontMatter.placeholder !== true) { + return; + } + + if (frontMatter.unlisted === undefined) { + frontMatter.unlisted = true; + } + if (frontMatter.noindex === undefined) { + frontMatter.noindex = true; + } + if (frontMatter.description === undefined) { + frontMatter.description = 'Reserved route for upcoming Apache HugeGraph content.'; + } +} + +module.exports = async function parseHugoFrontMatter(args) { + const parsed = await DEFAULT_PARSE_FRONT_MATTER(args); + parsed.frontMatter = parsed.frontMatter || {}; + const slug = indexSlug(args.filePath); + + if (slug && parsed.frontMatter.slug === undefined) { + parsed.frontMatter.slug = slug; + } + + const postSlug = blogSlug(args.filePath, parsed.frontMatter); + if (postSlug && parsed.frontMatter.slug === undefined) { + parsed.frontMatter.slug = postSlug; + } + + if (parsed.frontMatter.linkTitle && parsed.frontMatter.sidebar_label === undefined) { + parsed.frontMatter.sidebar_label = parsed.frontMatter.linkTitle; + } + + applyPlaceholderDefaults(parsed.frontMatter); + + return parsed; +}; diff --git a/src/pages/cn/docs/download/download.js b/src/pages/cn/docs/download/download.js new file mode 100644 index 000000000..de15f8d88 --- /dev/null +++ b/src/pages/cn/docs/download/download.js @@ -0,0 +1,6 @@ +import React from 'react'; +import {Redirect} from '@docusaurus/router'; + +export default function DownloadRedirect() { + return ; +} diff --git a/src/pages/cn/index.js b/src/pages/cn/index.js new file mode 100644 index 000000000..1a3f28646 --- /dev/null +++ b/src/pages/cn/index.js @@ -0,0 +1,115 @@ +import React from 'react'; +import clsx from 'clsx'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; + +const highlights = [ + { + title: '图数据库', + text: '面向 OLTP 场景的图存储与实时遍历,支持 REST、Gremlin 和 Cypher 访问。', + link: '/cn/docs/quickstart/hugegraph/hugegraph-server/', + }, + { + title: '图计算', + text: '通过 HugeGraph Computer 与 Vermeer 处理大规模图分析任务。', + link: '/cn/docs/quickstart/computing/hugegraph-computer/', + }, + { + title: '图智能', + text: 'GraphRAG、知识图谱构建以及图机器学习组件。', + link: '/cn/docs/quickstart/hugegraph-ai/', + }, +]; + +const components = [ + ['Server', '在线图查询核心引擎'], + ['Store / PD', '分布式存储与元数据调度'], + ['Toolchain', 'Loader、Hubble、客户端与运维工具'], + ['Computer', '分布式图分析与批处理'], + ['AI', 'LLM、RAG 与图机器学习集成'], +]; + +function HomepageHeader() { + return ( +
+
+
+

Apache Software Foundation Project

+

Apache HugeGraph

+

+ 面向实时图查询、大规模图分析和 AI 应用的全栈图数据库生态系统。 +

+
+ + 阅读文档 + + + 下载 + +
+
+
+ ); +} + +function Highlights() { + return ( +
+
+
+

文档入口

+

从你需要的技术栈开始

+
+
+ {highlights.map((item) => ( +
+

{item.title}

+

{item.text}

+ 打开指南 +
+ ))} +
+
+
+ ); +} + +function Ecosystem() { + return ( +
+
+
+

HugeGraph 生态

+

覆盖完整项目族的一站式文档

+

+ 新站点保留 HugeGraph Server、Store、PD、Toolchain、Computer 与 AI + 文档,并提供中英文导航。 +

+ + 社区 + +
+
+ {components.map(([name, text], index) => ( +
+ {name} + {text} +
+ ))} +
+
+
+ ); +} + +export default function HomeCn() { + return ( + + +
+ + +
+
+ ); +} diff --git a/src/pages/cn/team/index.js b/src/pages/cn/team/index.js new file mode 100644 index 000000000..7915f0ce0 --- /dev/null +++ b/src/pages/cn/team/index.js @@ -0,0 +1,6 @@ +import React from 'react'; +import TeamPage from '@site/src/components/TeamPage'; + +export default function TeamCn() { + return ; +} diff --git a/src/pages/cn/users/index.js b/src/pages/cn/users/index.js new file mode 100644 index 000000000..423f9ff8b --- /dev/null +++ b/src/pages/cn/users/index.js @@ -0,0 +1,6 @@ +import React from 'react'; +import UsersPage from '@site/src/components/UsersPage'; + +export default function UsersCn() { + return ; +} diff --git a/src/pages/docs/download/download.js b/src/pages/docs/download/download.js new file mode 100644 index 000000000..d0664a87f --- /dev/null +++ b/src/pages/docs/download/download.js @@ -0,0 +1,6 @@ +import React from 'react'; +import {Redirect} from '@docusaurus/router'; + +export default function DownloadRedirect() { + return ; +} diff --git a/src/pages/index.js b/src/pages/index.js new file mode 100644 index 000000000..451a55a44 --- /dev/null +++ b/src/pages/index.js @@ -0,0 +1,118 @@ +import React from 'react'; +import clsx from 'clsx'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; + +const highlights = [ + { + title: 'Graph Database', + text: 'OLTP graph storage and real-time traversal with REST, Gremlin, and Cypher access paths.', + link: '/docs/quickstart/hugegraph/hugegraph-server/', + }, + { + title: 'Graph Computing', + text: 'OLAP processing for large graphs through HugeGraph Computer and Vermeer.', + link: '/docs/quickstart/computing/hugegraph-computer/', + }, + { + title: 'Graph AI', + text: 'GraphRAG, knowledge graph construction, and graph machine learning components.', + link: '/docs/quickstart/hugegraph-ai/', + }, +]; + +const components = [ + ['Server', 'Core graph engine for online graph queries'], + ['Store / PD', 'Distributed storage and placement metadata'], + ['Toolchain', 'Loader, Hubble, clients, and operational tools'], + ['Computer', 'Distributed graph analytics and batch processing'], + ['AI', 'LLM, RAG, and graph ML integrations'], +]; + +function HomepageHeader() { + return ( +
+
+
+

Apache Software Foundation Project

+

Apache HugeGraph

+

+ A full-stack graph database ecosystem for real-time graph queries, + large-scale graph analytics, and AI applications. +

+
+ + Read Documentation + + + Download + +
+
+
+ ); +} + +function Highlights() { + return ( +
+
+
+

Documentation Entry Points

+

Start from the part of the stack you need

+
+
+ {highlights.map((item) => ( +
+

{item.title}

+

{item.text}

+ Open guide +
+ ))} +
+
+
+ ); +} + +function Ecosystem() { + return ( +
+
+
+

HugeGraph Ecosystem

+

One documentation home for the full project family

+

+ The site keeps the existing HugeGraph Server, Store, PD, Toolchain, + Computer, and AI documentation together with bilingual navigation. +

+ + Community + +
+
+ {components.map(([name, text], index) => ( +
+ {name} + {text} +
+ ))} +
+
+
+ ); +} + +export default function Home() { + return ( + + +
+ + +
+
+ ); +} diff --git a/src/pages/team/index.js b/src/pages/team/index.js new file mode 100644 index 000000000..a3808fcb1 --- /dev/null +++ b/src/pages/team/index.js @@ -0,0 +1,6 @@ +import React from 'react'; +import TeamPage from '@site/src/components/TeamPage'; + +export default function Team() { + return ; +} diff --git a/src/pages/users/index.js b/src/pages/users/index.js new file mode 100644 index 000000000..e38d5bf7a --- /dev/null +++ b/src/pages/users/index.js @@ -0,0 +1,6 @@ +import React from 'react'; +import UsersPage from '@site/src/components/UsersPage'; + +export default function Users() { + return ; +} diff --git a/src/sidebars/buildSidebars.js b/src/sidebars/buildSidebars.js new file mode 100644 index 000000000..c6ee1d6ce --- /dev/null +++ b/src/sidebars/buildSidebars.js @@ -0,0 +1,144 @@ +const fs = require('fs'); +const path = require('path'); + +const SKIP_DIRS = new Set(['images', 'scripts', 'styles']); +const SKIP_FILES = new Set(['SUMMARY.md']); + +const SECTION_ORDER = [ + 'introduction', + 'quickstart', + 'config', + 'clients', + 'guides', + 'language', + 'performance', + 'changelog', + 'contribution-guidelines', +]; + +function readFrontMatter(filePath) { + const text = fs.readFileSync(filePath, 'utf8'); + const match = text.match(/^---\n([\s\S]*?)\n---/); + if (!match) { + return {}; + } + + const data = {}; + for (const line of match[1].split('\n')) { + const item = line.match(/^([A-Za-z_][A-Za-z0-9_]*):\s*(.*)$/); + if (!item) { + continue; + } + data[item[1]] = item[2].replace(/^['"]|['"]$/g, ''); + } + return data; +} + +function labelFromPath(filePath, fallback) { + const fm = readFrontMatter(filePath); + return fm.linkTitle || fm.title || fallback; +} + +function weight(filePath, name) { + const fm = fs.existsSync(filePath) ? readFrontMatter(filePath) : {}; + if (fm.weight !== undefined && !Number.isNaN(Number(fm.weight))) { + return Number(fm.weight); + } + const sectionIndex = SECTION_ORDER.indexOf(name); + return sectionIndex === -1 ? 1000 : sectionIndex; +} + +function stripExtension(fileName) { + return fileName.replace(/\.mdx?$/i, ''); +} + +function docId(relPath) { + return stripExtension(relPath).split(path.sep).join('/'); +} + +function titleCase(value) { + return value + .replace(/[-_]+/g, ' ') + .replace(/\b\w/g, (char) => char.toUpperCase()); +} + +function sortEntries(baseDir, relDir, entries) { + return entries.sort((a, b) => { + const aPath = path.join(baseDir, relDir, a.name, a.isDirectory() ? '_index.md' : ''); + const bPath = path.join(baseDir, relDir, b.name, b.isDirectory() ? '_index.md' : ''); + const aWeight = weight(a.isDirectory() ? aPath : path.join(baseDir, relDir, a.name), stripExtension(a.name)); + const bWeight = weight(b.isDirectory() ? bPath : path.join(baseDir, relDir, b.name), stripExtension(b.name)); + if (aWeight !== bWeight) { + return aWeight - bWeight; + } + return a.name.localeCompare(b.name); + }); +} + +function buildDirectory(baseDir, relDir = '') { + const dir = path.join(baseDir, relDir); + const entries = fs.readdirSync(dir, {withFileTypes: true}); + + const files = sortEntries( + baseDir, + relDir, + entries.filter( + (entry) => + entry.isFile() && + /\.mdx?$/i.test(entry.name) && + entry.name !== '_index.md' && + !SKIP_FILES.has(entry.name), + ), + ).map((entry) => ({ + type: 'doc', + id: docId(path.join(relDir, entry.name)), + label: labelFromPath(path.join(baseDir, relDir, entry.name), titleCase(stripExtension(entry.name))), + })); + + const dirs = sortEntries( + baseDir, + relDir, + entries.filter((entry) => entry.isDirectory() && !SKIP_DIRS.has(entry.name)), + ).map((entry) => buildCategory(baseDir, path.join(relDir, entry.name))); + + return [...dirs, ...files]; +} + +function buildCategory(baseDir, relDir) { + const indexFile = path.join(baseDir, relDir, '_index.md'); + const label = fs.existsSync(indexFile) + ? labelFromPath(indexFile, titleCase(path.basename(relDir))) + : titleCase(path.basename(relDir)); + const category = { + type: 'category', + label, + collapsible: true, + collapsed: true, + items: buildDirectory(baseDir, relDir), + }; + + if (fs.existsSync(indexFile)) { + category.link = { + type: 'doc', + id: docId(path.join(relDir, '_index.md')), + }; + } + + return category; +} + +function buildSidebar(baseDir) { + const items = []; + const rootIndex = path.join(baseDir, '_index.md'); + if (fs.existsSync(rootIndex)) { + items.push({ + type: 'doc', + id: '_index', + label: labelFromPath(rootIndex, 'Documentation'), + }); + } + items.push(...buildDirectory(baseDir)); + return items; +} + +module.exports = {buildSidebar}; diff --git a/src/theme/NavbarItem/ComponentTypes.js b/src/theme/NavbarItem/ComponentTypes.js new file mode 100644 index 000000000..70abb027d --- /dev/null +++ b/src/theme/NavbarItem/ComponentTypes.js @@ -0,0 +1,11 @@ +import ComponentTypes from '@theme-original/NavbarItem/ComponentTypes'; +import DocumentationDropdownNavbarItem from '@site/src/components/DocumentationDropdownNavbarItem'; +import LanguageSwitcherNavbarItem from '@site/src/components/LanguageSwitcherNavbarItem'; +import LocaleAwareNavbarItem from '@site/src/components/LocaleAwareNavbarItem'; + +export default { + ...ComponentTypes, + 'custom-documentationDropdown': DocumentationDropdownNavbarItem, + 'custom-languageSwitcher': LanguageSwitcherNavbarItem, + 'custom-localeAwareLink': LocaleAwareNavbarItem, +}; diff --git a/static/img/apache-logo.svg b/static/img/apache-logo.svg new file mode 100644 index 000000000..f1084dfb3 --- /dev/null +++ b/static/img/apache-logo.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/content/cn/blog/images/images-server/agentic-abstract.png b/static/img/blog/images-server/agentic-abstract.png similarity index 100% rename from content/cn/blog/images/images-server/agentic-abstract.png rename to static/img/blog/images-server/agentic-abstract.png diff --git a/content/cn/blog/images/images-server/agentic-background.png b/static/img/blog/images-server/agentic-background-cn.png similarity index 100% rename from content/cn/blog/images/images-server/agentic-background.png rename to static/img/blog/images-server/agentic-background-cn.png diff --git a/content/en/blog/images/images-server/agentic-background.png b/static/img/blog/images-server/agentic-background.png similarity index 100% rename from content/en/blog/images/images-server/agentic-background.png rename to static/img/blog/images-server/agentic-background.png diff --git a/content/cn/blog/images/images-server/agentic-frame.png b/static/img/blog/images-server/agentic-frame.png similarity index 100% rename from content/cn/blog/images/images-server/agentic-frame.png rename to static/img/blog/images-server/agentic-frame.png diff --git a/content/cn/blog/images/images-server/agentic-lifeline.svg b/static/img/blog/images-server/agentic-lifeline.svg similarity index 100% rename from content/cn/blog/images/images-server/agentic-lifeline.svg rename to static/img/blog/images-server/agentic-lifeline.svg diff --git a/content/cn/blog/images/images-server/agentic-pydantic.png b/static/img/blog/images-server/agentic-pydantic.png similarity index 100% rename from content/cn/blog/images/images-server/agentic-pydantic.png rename to static/img/blog/images-server/agentic-pydantic.png diff --git a/content/cn/blog/images/images-server/agentic-scheduler.png b/static/img/blog/images-server/agentic-scheduler.png similarity index 100% rename from content/cn/blog/images/images-server/agentic-scheduler.png rename to static/img/blog/images-server/agentic-scheduler.png diff --git a/content/cn/blog/images/images-server/toplingdb-web-server.png b/static/img/blog/images-server/toplingdb-web-server.png similarity index 100% rename from content/cn/blog/images/images-server/toplingdb-web-server.png rename to static/img/blog/images-server/toplingdb-web-server.png diff --git a/content/cn/blog/images/images-server/toplingdb-yaml-ref.png b/static/img/blog/images-server/toplingdb-yaml-ref.png similarity index 100% rename from content/cn/blog/images/images-server/toplingdb-yaml-ref.png rename to static/img/blog/images-server/toplingdb-yaml-ref.png diff --git a/content/cn/docs/images/API-perf/v0.4.4/best.png b/static/img/docs/API-perf/v0.4.4/best.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.4.4/best.png rename to static/img/docs/API-perf/v0.4.4/best.png diff --git a/content/cn/docs/images/API-perf/v0.4.4/cpu-memory.png b/static/img/docs/API-perf/v0.4.4/cpu-memory.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.4.4/cpu-memory.png rename to static/img/docs/API-perf/v0.4.4/cpu-memory.png diff --git a/content/cn/docs/images/API-perf/v0.4.4/ssd.png b/static/img/docs/API-perf/v0.4.4/ssd.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.4.4/ssd.png rename to static/img/docs/API-perf/v0.4.4/ssd.png diff --git a/content/cn/docs/images/API-perf/v0.4.4/threads-batch.png b/static/img/docs/API-perf/v0.4.4/threads-batch.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.4.4/threads-batch.png rename to static/img/docs/API-perf/v0.4.4/threads-batch.png diff --git a/content/cn/docs/images/API-perf/v0.4.4/threads-single.png b/static/img/docs/API-perf/v0.4.4/threads-single.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.4.4/threads-single.png rename to static/img/docs/API-perf/v0.4.4/threads-single.png diff --git a/content/cn/docs/images/API-perf/v0.5.6/cassandra/edge_batch.png b/static/img/docs/API-perf/v0.5.6/cassandra/edge_batch.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.5.6/cassandra/edge_batch.png rename to static/img/docs/API-perf/v0.5.6/cassandra/edge_batch.png diff --git a/content/cn/docs/images/API-perf/v0.5.6/cassandra/edge_id_query.png b/static/img/docs/API-perf/v0.5.6/cassandra/edge_id_query.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.5.6/cassandra/edge_id_query.png rename to static/img/docs/API-perf/v0.5.6/cassandra/edge_id_query.png diff --git a/content/cn/docs/images/API-perf/v0.5.6/cassandra/edge_single.png b/static/img/docs/API-perf/v0.5.6/cassandra/edge_single.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.5.6/cassandra/edge_single.png rename to static/img/docs/API-perf/v0.5.6/cassandra/edge_single.png diff --git a/content/cn/docs/images/API-perf/v0.5.6/cassandra/vertex_batch.png b/static/img/docs/API-perf/v0.5.6/cassandra/vertex_batch.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.5.6/cassandra/vertex_batch.png rename to static/img/docs/API-perf/v0.5.6/cassandra/vertex_batch.png diff --git a/content/cn/docs/images/API-perf/v0.5.6/cassandra/vertex_id_query.png b/static/img/docs/API-perf/v0.5.6/cassandra/vertex_id_query.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.5.6/cassandra/vertex_id_query.png rename to static/img/docs/API-perf/v0.5.6/cassandra/vertex_id_query.png diff --git a/content/cn/docs/images/API-perf/v0.5.6/cassandra/vertex_single.png b/static/img/docs/API-perf/v0.5.6/cassandra/vertex_single.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.5.6/cassandra/vertex_single.png rename to static/img/docs/API-perf/v0.5.6/cassandra/vertex_single.png diff --git a/content/cn/docs/images/API-perf/v0.5.6/rocksdb/edge_batch.png b/static/img/docs/API-perf/v0.5.6/rocksdb/edge_batch.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.5.6/rocksdb/edge_batch.png rename to static/img/docs/API-perf/v0.5.6/rocksdb/edge_batch.png diff --git a/content/cn/docs/images/API-perf/v0.5.6/rocksdb/edge_id_query.png b/static/img/docs/API-perf/v0.5.6/rocksdb/edge_id_query.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.5.6/rocksdb/edge_id_query.png rename to static/img/docs/API-perf/v0.5.6/rocksdb/edge_id_query.png diff --git a/content/cn/docs/images/API-perf/v0.5.6/rocksdb/edge_single.png b/static/img/docs/API-perf/v0.5.6/rocksdb/edge_single.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.5.6/rocksdb/edge_single.png rename to static/img/docs/API-perf/v0.5.6/rocksdb/edge_single.png diff --git a/content/cn/docs/images/API-perf/v0.5.6/rocksdb/vertex_batch.png b/static/img/docs/API-perf/v0.5.6/rocksdb/vertex_batch.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.5.6/rocksdb/vertex_batch.png rename to static/img/docs/API-perf/v0.5.6/rocksdb/vertex_batch.png diff --git a/content/cn/docs/images/API-perf/v0.5.6/rocksdb/vertex_id_query.png b/static/img/docs/API-perf/v0.5.6/rocksdb/vertex_id_query.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.5.6/rocksdb/vertex_id_query.png rename to static/img/docs/API-perf/v0.5.6/rocksdb/vertex_id_query.png diff --git a/content/cn/docs/images/API-perf/v0.5.6/rocksdb/vertex_single.png b/static/img/docs/API-perf/v0.5.6/rocksdb/vertex_single.png similarity index 100% rename from content/cn/docs/images/API-perf/v0.5.6/rocksdb/vertex_single.png rename to static/img/docs/API-perf/v0.5.6/rocksdb/vertex_single.png diff --git a/static/img/docs/clients/restful-api/tinkerpop-modern.png b/static/img/docs/clients/restful-api/tinkerpop-modern.png new file mode 100644 index 000000000..b101292a6 Binary files /dev/null and b/static/img/docs/clients/restful-api/tinkerpop-modern.png differ diff --git a/content/cn/docs/images/toolchain-test-mermaid-1.png b/static/img/docs/cn/toolchain-test-mermaid-1.png similarity index 100% rename from content/cn/docs/images/toolchain-test-mermaid-1.png rename to static/img/docs/cn/toolchain-test-mermaid-1.png diff --git a/content/cn/docs/images/toolchain-test-mermaid-2.png b/static/img/docs/cn/toolchain-test-mermaid-2.png similarity index 100% rename from content/cn/docs/images/toolchain-test-mermaid-2.png rename to static/img/docs/cn/toolchain-test-mermaid-2.png diff --git a/static/img/docs/community/contribution-guide/contribution-flow.png b/static/img/docs/community/contribution-guide/contribution-flow.png new file mode 100644 index 000000000..e2fb9ccde Binary files /dev/null and b/static/img/docs/community/contribution-guide/contribution-flow.png differ diff --git a/static/img/docs/community/contribution-guide/github-email.png b/static/img/docs/community/contribution-guide/github-email.png new file mode 100644 index 000000000..0af2793af Binary files /dev/null and b/static/img/docs/community/contribution-guide/github-email.png differ diff --git a/static/img/docs/community/contribution-guide/github-token.png b/static/img/docs/community/contribution-guide/github-token.png new file mode 100644 index 000000000..0e8a56527 Binary files /dev/null and b/static/img/docs/community/contribution-guide/github-token.png differ diff --git a/content/cn/docs/images/demo-graph-model.png b/static/img/docs/demo-graph-model.png similarity index 100% rename from content/cn/docs/images/demo-graph-model.png rename to static/img/docs/demo-graph-model.png diff --git a/content/cn/docs/images/design/GraphCut.png b/static/img/docs/design/GraphCut.png similarity index 100% rename from content/cn/docs/images/design/GraphCut.png rename to static/img/docs/design/GraphCut.png diff --git a/content/cn/docs/images/design/PropertyGraph.png b/static/img/docs/design/PropertyGraph.png similarity index 100% rename from content/cn/docs/images/design/PropertyGraph.png rename to static/img/docs/design/PropertyGraph.png diff --git a/content/cn/docs/images/design/Self-loop.png b/static/img/docs/design/Self-loop.png similarity index 100% rename from content/cn/docs/images/design/Self-loop.png rename to static/img/docs/design/Self-loop.png diff --git a/content/cn/docs/images/design/architectural-component.png b/static/img/docs/design/architectural-component.png similarity index 100% rename from content/cn/docs/images/design/architectural-component.png rename to static/img/docs/design/architectural-component.png diff --git a/content/cn/docs/images/design/architectural-overview.png b/static/img/docs/design/architectural-overview.png similarity index 100% rename from content/cn/docs/images/design/architectural-overview.png rename to static/img/docs/design/architectural-overview.png diff --git a/content/cn/docs/images/design/architectural-revised.png b/static/img/docs/design/architectural-revised.png similarity index 100% rename from content/cn/docs/images/design/architectural-revised.png rename to static/img/docs/design/architectural-revised.png diff --git a/content/cn/docs/images/design1-1.png b/static/img/docs/design1-1.png similarity index 100% rename from content/cn/docs/images/design1-1.png rename to static/img/docs/design1-1.png diff --git a/content/cn/docs/images/design1-2.png b/static/img/docs/design1-2.png similarity index 100% rename from content/cn/docs/images/design1-2.png rename to static/img/docs/design1-2.png diff --git a/content/cn/docs/images/design1-3.png b/static/img/docs/design1-3.png similarity index 100% rename from content/cn/docs/images/design1-3.png rename to static/img/docs/design1-3.png diff --git a/content/cn/docs/images/design1-5.png b/static/img/docs/design1-5.png similarity index 100% rename from content/cn/docs/images/design1-5.png rename to static/img/docs/design1-5.png diff --git a/content/cn/docs/images/design1-6.png b/static/img/docs/design1-6.png similarity index 100% rename from content/cn/docs/images/design1-6.png rename to static/img/docs/design1-6.png diff --git a/content/cn/docs/images/design4-1.png b/static/img/docs/design4-1.png similarity index 100% rename from content/cn/docs/images/design4-1.png rename to static/img/docs/design4-1.png diff --git a/content/cn/docs/images/design5-1.png b/static/img/docs/design5-1.png similarity index 100% rename from content/cn/docs/images/design5-1.png rename to static/img/docs/design5-1.png diff --git a/content/cn/docs/images/design5-2.png b/static/img/docs/design5-2.png similarity index 100% rename from content/cn/docs/images/design5-2.png rename to static/img/docs/design5-2.png diff --git a/content/cn/docs/images/design5-3.png b/static/img/docs/design5-3.png similarity index 100% rename from content/cn/docs/images/design5-3.png rename to static/img/docs/design5-3.png diff --git a/content/cn/docs/images/design5-4.png b/static/img/docs/design5-4.png similarity index 100% rename from content/cn/docs/images/design5-4.png rename to static/img/docs/design5-4.png diff --git a/content/cn/docs/images/design5-5.png b/static/img/docs/design5-5.png similarity index 100% rename from content/cn/docs/images/design5-5.png rename to static/img/docs/design5-5.png diff --git a/content/cn/docs/images/favicon.ico b/static/img/docs/favicon.ico similarity index 100% rename from content/cn/docs/images/favicon.ico rename to static/img/docs/favicon.ico diff --git a/content/cn/docs/images/gradio-config.png b/static/img/docs/gradio-config.png similarity index 100% rename from content/cn/docs/images/gradio-config.png rename to static/img/docs/gradio-config.png diff --git a/content/cn/docs/images/gradio-kg.png b/static/img/docs/gradio-kg.png similarity index 100% rename from content/cn/docs/images/gradio-kg.png rename to static/img/docs/gradio-kg.png diff --git a/content/cn/docs/images/gradio-rag-1.png b/static/img/docs/gradio-rag-1.png similarity index 100% rename from content/cn/docs/images/gradio-rag-1.png rename to static/img/docs/gradio-rag-1.png diff --git a/content/cn/docs/images/gradio-rag-2.png b/static/img/docs/gradio-rag-2.png similarity index 100% rename from content/cn/docs/images/gradio-rag-2.png rename to static/img/docs/gradio-rag-2.png diff --git a/content/cn/docs/images/gradio-rag.png b/static/img/docs/gradio-rag.png similarity index 100% rename from content/cn/docs/images/gradio-rag.png rename to static/img/docs/gradio-rag.png diff --git a/content/cn/docs/images/graph-of-gods.png b/static/img/docs/graph-of-gods.png similarity index 100% rename from content/cn/docs/images/graph-of-gods.png rename to static/img/docs/graph-of-gods.png diff --git a/static/img/docs/hugegraph-ai/quick-start/26641e09-249f-4b3a-8013-16dc9383d333.png b/static/img/docs/hugegraph-ai/quick-start/26641e09-249f-4b3a-8013-16dc9383d333.png new file mode 100644 index 000000000..e1e93396d Binary files /dev/null and b/static/img/docs/hugegraph-ai/quick-start/26641e09-249f-4b3a-8013-16dc9383d333.png differ diff --git a/static/img/docs/hugegraph-ai/quick-start/33698062-e46b-4757-8b5e-93e8f10eae65.png b/static/img/docs/hugegraph-ai/quick-start/33698062-e46b-4757-8b5e-93e8f10eae65.png new file mode 100644 index 000000000..c39f780f3 Binary files /dev/null and b/static/img/docs/hugegraph-ai/quick-start/33698062-e46b-4757-8b5e-93e8f10eae65.png differ diff --git a/static/img/docs/hugegraph-ai/quick-start/7d4496a3-d44c-4491-9463-8e93595dfa45.png b/static/img/docs/hugegraph-ai/quick-start/7d4496a3-d44c-4491-9463-8e93595dfa45.png new file mode 100644 index 000000000..1e7eca192 Binary files /dev/null and b/static/img/docs/hugegraph-ai/quick-start/7d4496a3-d44c-4491-9463-8e93595dfa45.png differ diff --git a/static/img/docs/hugegraph-ai/quick-start/b49e269f-eaec-40b1-8d8f-9e409821d75d.png b/static/img/docs/hugegraph-ai/quick-start/b49e269f-eaec-40b1-8d8f-9e409821d75d.png new file mode 100644 index 000000000..c41e33dc3 Binary files /dev/null and b/static/img/docs/hugegraph-ai/quick-start/b49e269f-eaec-40b1-8d8f-9e409821d75d.png differ diff --git a/static/img/docs/hugegraph-ai/quick-start/d2a72f45-488c-4099-968b-a11816655ba0.png b/static/img/docs/hugegraph-ai/quick-start/d2a72f45-488c-4099-968b-a11816655ba0.png new file mode 100644 index 000000000..0af002749 Binary files /dev/null and b/static/img/docs/hugegraph-ai/quick-start/d2a72f45-488c-4099-968b-a11816655ba0.png differ diff --git a/static/img/docs/hugegraph-ai/quick-start/f3366d46-2e31-4638-94c4-7214951ef77a.png b/static/img/docs/hugegraph-ai/quick-start/f3366d46-2e31-4638-94c4-7214951ef77a.png new file mode 100644 index 000000000..045d4887d Binary files /dev/null and b/static/img/docs/hugegraph-ai/quick-start/f3366d46-2e31-4638-94c4-7214951ef77a.png differ diff --git a/static/img/docs/hugegraph-ai/quick-start/fc678369-261d-49ea-a289-1ca6ade5ca55.png b/static/img/docs/hugegraph-ai/quick-start/fc678369-261d-49ea-a289-1ca6ade5ca55.png new file mode 100644 index 000000000..2418630fb Binary files /dev/null and b/static/img/docs/hugegraph-ai/quick-start/fc678369-261d-49ea-a289-1ca6ade5ca55.png differ diff --git a/static/img/docs/hugegraph-ai/quick-start/fd150f87-27f8-48e5-8a55-319ec039b7e0.png b/static/img/docs/hugegraph-ai/quick-start/fd150f87-27f8-48e5-8a55-319ec039b7e0.png new file mode 100644 index 000000000..600a23f91 Binary files /dev/null and b/static/img/docs/hugegraph-ai/quick-start/fd150f87-27f8-48e5-8a55-319ec039b7e0.png differ diff --git "a/content/cn/docs/images/images-hubble/2\345\271\263\345\217\260\344\275\277\347\224\250\346\265\201\347\250\213.png" "b/static/img/docs/images-hubble/2\345\271\263\345\217\260\344\275\277\347\224\250\346\265\201\347\250\213.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/2\345\271\263\345\217\260\344\275\277\347\224\250\346\265\201\347\250\213.png" rename to "static/img/docs/images-hubble/2\345\271\263\345\217\260\344\275\277\347\224\250\346\265\201\347\250\213.png" diff --git "a/content/cn/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\272.png" "b/static/img/docs/images-hubble/311\345\233\276\345\210\233\345\273\272.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\272.png" rename to "static/img/docs/images-hubble/311\345\233\276\345\210\233\345\273\272.png" diff --git "a/content/cn/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\2722.png" "b/static/img/docs/images-hubble/311\345\233\276\345\210\233\345\273\2722.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\2722.png" rename to "static/img/docs/images-hubble/311\345\233\276\345\210\233\345\273\2722.png" diff --git "a/content/cn/docs/images/images-hubble/312\345\233\276\350\256\277\351\227\256.png" "b/static/img/docs/images-hubble/312\345\233\276\350\256\277\351\227\256.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/312\345\233\276\350\256\277\351\227\256.png" rename to "static/img/docs/images-hubble/312\345\233\276\350\256\277\351\227\256.png" diff --git "a/content/cn/docs/images/images-hubble/313\345\233\276\347\256\241\347\220\206.png" "b/static/img/docs/images-hubble/313\345\233\276\347\256\241\347\220\206.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/313\345\233\276\347\256\241\347\220\206.png" rename to "static/img/docs/images-hubble/313\345\233\276\347\256\241\347\220\206.png" diff --git "a/content/cn/docs/images/images-hubble/321\345\205\203\346\225\260\346\215\256\345\205\245\345\217\243.png" "b/static/img/docs/images-hubble/321\345\205\203\346\225\260\346\215\256\345\205\245\345\217\243.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/321\345\205\203\346\225\260\346\215\256\345\205\245\345\217\243.png" rename to "static/img/docs/images-hubble/321\345\205\203\346\225\260\346\215\256\345\205\245\345\217\243.png" diff --git "a/content/cn/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\272.png" "b/static/img/docs/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\272.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\272.png" rename to "static/img/docs/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\272.png" diff --git "a/content/cn/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\2722.png" "b/static/img/docs/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\2722.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\2722.png" rename to "static/img/docs/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\2722.png" diff --git "a/content/cn/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\250.png" "b/static/img/docs/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\250.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\250.png" rename to "static/img/docs/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\250.png" diff --git "a/content/cn/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\2502.png" "b/static/img/docs/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\2502.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\2502.png" rename to "static/img/docs/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\2502.png" diff --git "a/content/cn/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\272.png" "b/static/img/docs/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\272.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\272.png" rename to "static/img/docs/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\272.png" diff --git "a/content/cn/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\2722.png" "b/static/img/docs/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\2722.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\2722.png" rename to "static/img/docs/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\2722.png" diff --git "a/content/cn/docs/images/images-hubble/3233\351\241\266\347\202\271\345\210\240\351\231\244.png" "b/static/img/docs/images-hubble/3233\351\241\266\347\202\271\345\210\240\351\231\244.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/3233\351\241\266\347\202\271\345\210\240\351\231\244.png" rename to "static/img/docs/images-hubble/3233\351\241\266\347\202\271\345\210\240\351\231\244.png" diff --git "a/content/cn/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\272.png" "b/static/img/docs/images-hubble/3241\350\276\271\345\210\233\345\273\272.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\272.png" rename to "static/img/docs/images-hubble/3241\350\276\271\345\210\233\345\273\272.png" diff --git "a/content/cn/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\2722.png" "b/static/img/docs/images-hubble/3241\350\276\271\345\210\233\345\273\2722.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\2722.png" rename to "static/img/docs/images-hubble/3241\350\276\271\345\210\233\345\273\2722.png" diff --git "a/content/cn/docs/images/images-hubble/331\345\257\274\345\205\245\345\205\245\345\217\243.png" "b/static/img/docs/images-hubble/331\345\257\274\345\205\245\345\205\245\345\217\243.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/331\345\257\274\345\205\245\345\205\245\345\217\243.png" rename to "static/img/docs/images-hubble/331\345\257\274\345\205\245\345\205\245\345\217\243.png" diff --git "a/content/cn/docs/images/images-hubble/332\345\210\233\345\273\272\344\273\273\345\212\241.png" "b/static/img/docs/images-hubble/332\345\210\233\345\273\272\344\273\273\345\212\241.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/332\345\210\233\345\273\272\344\273\273\345\212\241.png" rename to "static/img/docs/images-hubble/332\345\210\233\345\273\272\344\273\273\345\212\241.png" diff --git "a/content/cn/docs/images/images-hubble/333\344\270\212\344\274\240\346\226\207\344\273\266.png" "b/static/img/docs/images-hubble/333\344\270\212\344\274\240\346\226\207\344\273\266.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/333\344\270\212\344\274\240\346\226\207\344\273\266.png" rename to "static/img/docs/images-hubble/333\344\270\212\344\274\240\346\226\207\344\273\266.png" diff --git "a/content/cn/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\204.png" "b/static/img/docs/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\204.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\204.png" rename to "static/img/docs/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\204.png" diff --git "a/content/cn/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\2042.png" "b/static/img/docs/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\2042.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\2042.png" rename to "static/img/docs/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\2042.png" diff --git "a/content/cn/docs/images/images-hubble/335\345\257\274\345\205\245\350\256\276\347\275\256.png" "b/static/img/docs/images-hubble/335\345\257\274\345\205\245\350\256\276\347\275\256.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/335\345\257\274\345\205\245\350\256\276\347\275\256.png" rename to "static/img/docs/images-hubble/335\345\257\274\345\205\245\350\256\276\347\275\256.png" diff --git "a/content/cn/docs/images/images-hubble/335\345\257\274\345\205\245\350\257\246\346\203\205.png" "b/static/img/docs/images-hubble/335\345\257\274\345\205\245\350\257\246\346\203\205.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/335\345\257\274\345\205\245\350\257\246\346\203\205.png" rename to "static/img/docs/images-hubble/335\345\257\274\345\205\245\350\257\246\346\203\205.png" diff --git "a/content/cn/docs/images/images-hubble/33\345\257\274\345\205\245\346\265\201\347\250\213.png" "b/static/img/docs/images-hubble/33\345\257\274\345\205\245\346\265\201\347\250\213.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/33\345\257\274\345\205\245\346\265\201\347\250\213.png" rename to "static/img/docs/images-hubble/33\345\257\274\345\205\245\346\265\201\347\250\213.png" diff --git "a/content/cn/docs/images/images-hubble/341\345\210\206\346\236\220\345\205\245\345\217\243.png" "b/static/img/docs/images-hubble/341\345\210\206\346\236\220\345\205\245\345\217\243.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/341\345\210\206\346\236\220\345\205\245\345\217\243.png" rename to "static/img/docs/images-hubble/341\345\210\206\346\236\220\345\205\245\345\217\243.png" diff --git "a/content/cn/docs/images/images-hubble/342\345\244\232\345\233\276\345\210\207\346\215\242.png" "b/static/img/docs/images-hubble/342\345\244\232\345\233\276\345\210\207\346\215\242.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/342\345\244\232\345\233\276\345\210\207\346\215\242.png" rename to "static/img/docs/images-hubble/342\345\244\232\345\233\276\345\210\207\346\215\242.png" diff --git "a/content/cn/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-json.png" "b/static/img/docs/images-hubble/343\345\233\276\345\210\206\346\236\220-json.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-json.png" rename to "static/img/docs/images-hubble/343\345\233\276\345\210\206\346\236\220-json.png" diff --git "a/content/cn/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\345\233\276.png" "b/static/img/docs/images-hubble/343\345\233\276\345\210\206\346\236\220-\345\233\276.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\345\233\276.png" rename to "static/img/docs/images-hubble/343\345\233\276\345\210\206\346\236\220-\345\233\276.png" diff --git "a/content/cn/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\350\241\250\346\240\274.png" "b/static/img/docs/images-hubble/343\345\233\276\345\210\206\346\236\220-\350\241\250\346\240\274.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\350\241\250\346\240\274.png" rename to "static/img/docs/images-hubble/343\345\233\276\345\210\206\346\236\220-\350\241\250\346\240\274.png" diff --git "a/content/cn/docs/images/images-hubble/345\345\256\232\345\210\266\350\267\257\345\276\204\346\237\245\350\257\242.png" "b/static/img/docs/images-hubble/345\345\256\232\345\210\266\350\267\257\345\276\204\346\237\245\350\257\242.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/345\345\256\232\345\210\266\350\267\257\345\276\204\346\237\245\350\257\242.png" rename to "static/img/docs/images-hubble/345\345\256\232\345\210\266\350\267\257\345\276\204\346\237\245\350\257\242.png" diff --git "a/content/cn/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\271.png" "b/static/img/docs/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\271.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\271.png" rename to "static/img/docs/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\271.png" diff --git "a/content/cn/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\2712.png" "b/static/img/docs/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\2712.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\2712.png" rename to "static/img/docs/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\2712.png" diff --git "a/content/cn/docs/images/images-hubble/347\346\224\266\350\227\217.png" "b/static/img/docs/images-hubble/347\346\224\266\350\227\217.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/347\346\224\266\350\227\217.png" rename to "static/img/docs/images-hubble/347\346\224\266\350\227\217.png" diff --git "a/content/cn/docs/images/images-hubble/351\344\273\273\345\212\241\347\256\241\347\220\206\345\205\245\345\217\243.png" "b/static/img/docs/images-hubble/351\344\273\273\345\212\241\347\256\241\347\220\206\345\205\245\345\217\243.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/351\344\273\273\345\212\241\347\256\241\347\220\206\345\205\245\345\217\243.png" rename to "static/img/docs/images-hubble/351\344\273\273\345\212\241\347\256\241\347\220\206\345\205\245\345\217\243.png" diff --git "a/content/cn/docs/images/images-hubble/352\344\273\273\345\212\241\345\210\227\350\241\250.png" "b/static/img/docs/images-hubble/352\344\273\273\345\212\241\345\210\227\350\241\250.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/352\344\273\273\345\212\241\345\210\227\350\241\250.png" rename to "static/img/docs/images-hubble/352\344\273\273\345\212\241\345\210\227\350\241\250.png" diff --git "a/content/cn/docs/images/images-hubble/353gremlin\344\273\273\345\212\241.png" "b/static/img/docs/images-hubble/353gremlin\344\273\273\345\212\241.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/353gremlin\344\273\273\345\212\241.png" rename to "static/img/docs/images-hubble/353gremlin\344\273\273\345\212\241.png" diff --git "a/content/cn/docs/images/images-hubble/353gremlin\344\273\273\345\212\2412.png" "b/static/img/docs/images-hubble/353gremlin\344\273\273\345\212\2412.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/353gremlin\344\273\273\345\212\2412.png" rename to "static/img/docs/images-hubble/353gremlin\344\273\273\345\212\2412.png" diff --git "a/content/cn/docs/images/images-hubble/355\344\273\273\345\212\241\350\257\246\346\203\205.png" "b/static/img/docs/images-hubble/355\344\273\273\345\212\241\350\257\246\346\203\205.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/355\344\273\273\345\212\241\350\257\246\346\203\205.png" rename to "static/img/docs/images-hubble/355\344\273\273\345\212\241\350\257\246\346\203\205.png" diff --git "a/content/cn/docs/images/images-hubble/355\345\210\240\351\231\244\345\205\203\346\225\260\346\215\256.png" "b/static/img/docs/images-hubble/355\345\210\240\351\231\244\345\205\203\346\225\260\346\215\256.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/355\345\210\240\351\231\244\345\205\203\346\225\260\346\215\256.png" rename to "static/img/docs/images-hubble/355\345\210\240\351\231\244\345\205\203\346\225\260\346\215\256.png" diff --git "a/content/cn/docs/images/images-hubble/355\346\236\204\345\273\272\347\264\242\345\274\225.png" "b/static/img/docs/images-hubble/355\346\236\204\345\273\272\347\264\242\345\274\225.png" similarity index 100% rename from "content/cn/docs/images/images-hubble/355\346\236\204\345\273\272\347\264\242\345\274\225.png" rename to "static/img/docs/images-hubble/355\346\236\204\345\273\272\347\264\242\345\274\225.png" diff --git a/content/cn/docs/images/images-server/31docker-option.jpg b/static/img/docs/images-server/31docker-option.jpg similarity index 100% rename from content/cn/docs/images/images-server/31docker-option.jpg rename to static/img/docs/images-server/31docker-option.jpg diff --git a/content/cn/docs/images/images-server/swagger-ui-set-auth-example.png b/static/img/docs/images-server/swagger-ui-set-auth-example.png similarity index 100% rename from content/cn/docs/images/images-server/swagger-ui-set-auth-example.png rename to static/img/docs/images-server/swagger-ui-set-auth-example.png diff --git a/content/cn/docs/images/images-server/swagger-ui-where-set-auth-example.png b/static/img/docs/images-server/swagger-ui-where-set-auth-example.png similarity index 100% rename from content/cn/docs/images/images-server/swagger-ui-where-set-auth-example.png rename to static/img/docs/images-server/swagger-ui-where-set-auth-example.png diff --git a/content/cn/docs/images/images-server/swagger-ui.png b/static/img/docs/images-server/swagger-ui.png similarity index 100% rename from content/cn/docs/images/images-server/swagger-ui.png rename to static/img/docs/images-server/swagger-ui.png diff --git a/content/cn/docs/images/images-studio/add-schema.png b/static/img/docs/images-studio/add-schema.png similarity index 100% rename from content/cn/docs/images/images-studio/add-schema.png rename to static/img/docs/images-studio/add-schema.png diff --git a/content/cn/docs/images/images-studio/example-2V-1E.png b/static/img/docs/images-studio/example-2V-1E.png similarity index 100% rename from content/cn/docs/images/images-studio/example-2V-1E.png rename to static/img/docs/images-studio/example-2V-1E.png diff --git a/content/cn/docs/images/images-studio/home-page.png b/static/img/docs/images-studio/home-page.png similarity index 100% rename from content/cn/docs/images/images-studio/home-page.png rename to static/img/docs/images-studio/home-page.png diff --git a/content/cn/docs/images/images-studio/show-graph.png b/static/img/docs/images-studio/show-graph.png similarity index 100% rename from content/cn/docs/images/images-studio/show-graph.png rename to static/img/docs/images-studio/show-graph.png diff --git a/content/cn/docs/images/images-studio/show-json.png b/static/img/docs/images-studio/show-json.png similarity index 100% rename from content/cn/docs/images/images-studio/show-json.png rename to static/img/docs/images-studio/show-json.png diff --git a/content/cn/docs/images/images-studio/show-table.png b/static/img/docs/images-studio/show-table.png similarity index 100% rename from content/cn/docs/images/images-studio/show-table.png rename to static/img/docs/images-studio/show-table.png diff --git a/content/cn/docs/images/kg-uml.png b/static/img/docs/kg-uml.png similarity index 100% rename from content/cn/docs/images/kg-uml.png rename to static/img/docs/kg-uml.png diff --git a/content/cn/docs/images/logo.png b/static/img/docs/logo.png similarity index 100% rename from content/cn/docs/images/logo.png rename to static/img/docs/logo.png diff --git a/content/cn/docs/images/ojdbc8.png b/static/img/docs/ojdbc8.png similarity index 100% rename from content/cn/docs/images/ojdbc8.png rename to static/img/docs/ojdbc8.png diff --git a/content/cn/docs/images/oracle-download.png b/static/img/docs/oracle-download.png similarity index 100% rename from content/cn/docs/images/oracle-download.png rename to static/img/docs/oracle-download.png diff --git a/content/en/docs/images/toolchain-test-mermaid-1.png b/static/img/docs/toolchain-test-mermaid-1.png similarity index 100% rename from content/en/docs/images/toolchain-test-mermaid-1.png rename to static/img/docs/toolchain-test-mermaid-1.png diff --git a/content/en/docs/images/toolchain-test-mermaid-2.png b/static/img/docs/toolchain-test-mermaid-2.png similarity index 100% rename from content/en/docs/images/toolchain-test-mermaid-2.png rename to static/img/docs/toolchain-test-mermaid-2.png diff --git a/static/img/docs/wechat.png b/static/img/docs/wechat.png new file mode 100644 index 000000000..dff07dba6 Binary files /dev/null and b/static/img/docs/wechat.png differ diff --git a/content/cn/about/featured-background.jpg b/static/img/featured-background.jpg similarity index 100% rename from content/cn/about/featured-background.jpg rename to static/img/featured-background.jpg diff --git a/static/img/hugegraph-logo.svg b/static/img/hugegraph-logo.svg new file mode 100644 index 000000000..a59ddad3e --- /dev/null +++ b/static/img/hugegraph-logo.svg @@ -0,0 +1 @@ +logo \ No newline at end of file