1

假设我有一个类似https://graphql.dgraph.io/docs/quick-start/的快速入门的数据库

IE

type Product {
    productID: ID!
    name: String @search(by: [term])
    reviews: [Review] @hasInverse(field: about)
}

type Customer {
    custID: ID!
    name: String @search(by: [hash, regexp])
    reviews: [Review] @hasInverse(field: by)
}

type Review {
    id: ID!
    about: Product! @hasInverse(field: reviews)
    by: Customer! @hasInverse(field: reviews)
    comment: String @search(by: [fulltext])
    rating: Int @search
}

现在我想导入数百万个条目,因此想使用批量加载程序。我的数据集是一个充满.json文件的错误文件夹。

据我所见,我应该能够运行类似的命令 dgraph bulk -f folderOfJsonFiles -s goldendata.schema --map_shards=4 --reduce_shards=2 --http localhost:8000 --zero=localhost:5080

但是要运行我的服务器,我使用的是dgraph/standalone:graphql运行的图像docker run -v $(pwd):/dgraph -p 9000:9000 -it dgraph/standalone:graphql

现在如何开始批量导入?

1: 我应该在 docker 容器本身内运行命令(并共享包含我所有.json文件的卷(文件夹))还是在我的主机上安装 dgraph 并dgraph bulk从主机运行命令?

2:文件的格式应该是什么.json

3: bulk loader 是否支持空白节点(id 不支持_:0x1234)?

[编辑]

  • bulk loader 似乎不支持 graphql 架构,应该先将架构转换为 rdf。为此,我在导入 graphql 架构后立即导出了架构和数据curl 'localhost:8080/admin/export?format=json'
4

1 回答 1

0

这里有几点要理解:

  • 批量加载程序不是实时加载程序的离线版本。它是一个工具,目的是为 Dgraph Alpha(s) 服务器准备数据。
  • 散装装载机,似乎只能装载三倍
  • 批量加载器可以加载模式和文件,但这不是 graphql 模式,graphql 模式必须稍后分开加载。

所以回答这个问题:

  • 启动 dgraph graphql 服务器以docker run -v $(pwd)/dgraph:/dgraph -p 8000:8000 -p 9000:9000 -p 8080:8080 -p 9080:9080 -p 5080:5080 -it dgraph/standalone:graphql供您参考,此图像启动/tmp/run.sh将自行运行的脚本dgraph-ratel & dgraph zero & dgraph alpha --lru_mb $lru_mb & dgraph graphql(其中 lru_mb 是您为 dgraph alpha 提供的内存)。保留容器的 id 以供以后在docker ps丢失时使用。

  • 除非您有 + 5 百万个条目(或没有时间),否则请尝试使用实时加载程序。如果您在使用实时加载程序时遇到问题,例如:在数十万个条目(在我的情况下为 300k)之后它变得非常慢,这很可能是因为您的 alpha 没有足够的内存。在我的例子中,我不得不调整 docker 为引擎提供 16Gb 的内存,脚本为$lru_mb变量提供了主机内存的三分之一。

  • 使用实时加载器导入全套数据后,您可以使用 导出数据docker exec -it yourDockerContainerId curl localhost:8080/admin/export?format=json,导出将生成 2 个文件,例如:对应于您的条目g01.json.gz及其g01.schema.gz架构(不是 graphql 架构)。

  • 要导入这 2 个文件g01.json.gzg01.schema.gz返回到您的 dgraph graphql 实例,您需要将它们转换为组的“p”目录输出。据我了解,“p”目录包含 Dgraph Alpha 的所有数据。如果删除它,则会丢失数据,如果将其替换为另一组,则将使用刚刚复制的数据替换/恢复数据。Bulk loader 不是 dgraph 的一个实例,它只是生成那些“p”目录输出的工具。我已经成功地在容器中运行它。跑吧docker exec -it yourDockerContainerId dgraph bulk -f export/pathTo/g01.json.gz -s export/pathTo/g01.schema.gz --map_shards=1 --reduce_shards=1 --http localhost:8001 --zero=localhost:5080。老实说,我不明白http localhost:8001这个命令中参数的目的。如果批量加载程序成功运行,它会创建一个out/0/p文件夹,其中包含您可以在 Dgraph Alpha 中使用的数据。停止你的 docker 容器docker stop yourDockerContainerId然后将您当前的 Dgraph Alphap文件夹替换为批量加载程序生成的文件夹。(重新)启动您的 docker 容器,您应该拥有导入的数据。(也许垃圾 w 和 zw 文件夹也是如此,我不知道它们的用途)。

  • 数据已导入,但您将收到一条警告,提示您没有 graphql 架构。好的,让我们导入我们的架构(假设您在 path 有它dgraph/schemas/schema.graphqlschema=$(cat dgraph/schemas/schema.graphql | tr '\\n' ' ');jq -n --arg schema \"$schema\" '{ query: \"mutation addSchema($sch: String!) { addSchema(input: { schema: $sch }) { schema { schema } } }\", variables: { sch: $schema }}' | curl -X POST -H \"Content-Type: application/json\" http://localhost:9000/admin -d @-这可能需要几分钟,因为图形可能必须根据您的 graphql 架构的索引规则(通常与@search装饰器相关)来索引您的数据

你已经完成了......</p>

现在,我还没有完全回答这个问题,因为我们要导入的数据是我们刚刚导出的数据(也是我们使用实时加载程序实际导入的数据)。所以不幸的是,bulk loader 不能像 live loader 那样导入好的数据,你必须用三元组喂他。因此,您必须准备要使用该格式的批量加载程序加载的数据。为了在这次谈话中帮助你,我建议

  • 运行 dgraph graphql 服务器docker run -v $(pwd)/dgraph:/dgraph -p 8000:8000 -p 9000:9000 -p 8080:8080 -p 9080:9080 -p 5080:5080 -it dgraph/standalone:graphql

  • 导入 graphql 架构(假设架构位于 path dgraph/schemas/schema.graphqlschema=$(cat dgraph/schemas/schema.graphql | tr '\\n' ' ');jq -n --arg schema \"$schema\" '{ query: \"mutation addSchema($sch: String!) { addSchema(input: { schema: $sch }) { schema { schema } } }\", variables: { sch: $schema }}' | curl -X POST -H \"Content-Type: application/json\" http://localhost:9000/admin -d @-

  • 使用 graphql 客户端创建一个或两个基本/模板条目。您可以安装Altair chrome 扩展,连接到http://localhost:9000/graphql然后添加一些数据,例如:

mutation {
  addCustomer(input:{name:"Toto"}){
    name
  }
}

您还可以使用文件和实时加载程序

  • 然后导出你的小模板数据docker exec -it yourDockerContainerId curl localhost:8080/admin/export?format=json

  • 打开g01.json.gz,您将找到批量加载程序期望提供的数据的示例。

空白身份证怎么办?我不确定,但由于批量加载程序正在对 id 进行 2 级映射,我可以想象你可以提供你的 id,这些将在以后转换为 dgraph id。

于 2019-11-16T20:47:39.643 回答