首页 > 解决方案 > 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

解决方案


因此,如果您要向图中添加新节点并希望使用新边将它们相互连接,您可以使用空白节点来执行此操作。

来自 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在您的架构中调用它。


推荐阅读