dgraph - Dgraph:在没有事先了解uid的情况下创建边缘
问题描述
我正在尝试使用 dgraph,到目前为止,我最大的困难是在两个对象之间创建一个边缘,而无需事先了解它们的 uid(用于批量加载)。示例 - 让我们有两种类型 - 父节点和子节点,唯一的区别是子节点始终是叶节点,因此架构可能类似于
<name>: string .
<age>: int .
<children>: [uid] .
type Parent {
name
age
children
}
type Child {
name
age
}
现在我想插入三个节点——两个父节点和一个子节点——并在它们之间创建一条边,所有这些都使用一个查询,而无需事先查询 uid。我想象这样的事情:
{
"set": [
{
"name": "Kunhuta",
"age": 38,
"dgraph.type": "Parent"
},
{
"name": "Vendelin",
"age": 41,
"dgraph.type": "Parent"
},
{
"name": "Ferko",
"age": 14,
"dgraph.type": "Child",
"Parent": [
{
"name": "Kunhuta"
},
{
"name": "Vendelin"
}
]
}
]
}
(假设名称是唯一的类型标识符)
是否有可能在 dgraph 中以某种方式这样做?
解决方案
因此,如果您要向图中添加新节点并希望使用新边将它们相互连接,您可以使用空白节点来执行此操作。
来自 dgraph 文档:https ://dgraph.io/docs/v1.0.8/mutations/
突变中的空白节点,写成_:标识符,标识突变中的节点
这是添加了空白节点的示例:
{
"set": [
{
"uid": "_:kunhuta",
"name": "Kunhuta",
"age": 38,
"dgraph.type": "Parent"
},
{
"uid": "_:vendelin",
"name": "Vendelin",
"age": 41,
"dgraph.type": "Parent"
},
{
"uid": "_:ferko",
"name": "Ferko",
"age": 14,
"dgraph.type": "Child",
"Parent": [
{
"uid": "_:kunhuta",
"name": "Kunhuta"
},
{
"uid": "_:vendelin",
"name": "Vendelin"
}
]
}
]
}
当您想要将新节点连接到图中的现有节点时,事情会变得更加困难。例如,假设您提交了上述突变,然后您想向“Kunhuta”添加一个新孩子。您需要查询现有uid
的“Kunhuta”并在新的集合突变上使用该 uid 来添加您的孩子。
此外,我会在名称之外使用某种形式的唯一标识符来帮助查询uid
. 如果你最终在你的图表中添加了另一个“Kunhuta”,你怎么知道哪个是真正的父母?出于这个原因,dgraph 建议添加一个外部标识符(通常是 uuid)并xid
在您的架构中调用它。
推荐阅读
- junit4 - 在 rest api 中测试内部服务器错误
- apache-spark - Are memory-persisted RDD unpersisted at the end of a Spark streaming micro-batch?
- delphi - Delphi中的不规则形状
- tensorflow - 如何在 tf.get_variable 中使用正则化参数?
- sql - 可以在 Impala 中一次删除多个视图吗
- javascript - 在导航之前,在回调中更改链接的 href onclick 或在链接导航之前等待解决的承诺
- javascript - 为什么导航选项卡和选项卡窗格不起作用?
- maven - 避免在 GitLab CI 中重复运行 maven 阶段
- qt - 我的 Dialog 类如何知道 MainWindow 的哪个元素调用了它
- excel - 将三个变量添加到脚本字典问题 VBA