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/

突变中的空白节点,

写成 _:identifier,标识突变中的节点

下面是添加了空白节点的示例:

{
"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"添加一个新孩子。您需要查询"Kunhuta"的现有uid,并在新的集合突变上使用该 uid 来添加您的孩子。

此外,我会在名称之外使用某种形式的唯一标识符来帮助查询uid。如果你最终在你的图表中添加了另一个"Kunhuta",你怎么知道哪个是真正的父母?出于这个原因,dgraph 建议添加一个外部标识符(通常是 uuid(并在您的架构中xid调用它。

相关内容

最新更新