如何为 dgraph 中的节点建模相似的命名谓词或属性?

How to model similar named predicates or attributes for nodes in dgraph?

我正在尝试使用 Dgraph 作为我的主数据库。我有一个简单的系统,它有两个域实体,即。 UserProduct。它们都具有某些属性,在 Dgraph 中表示为 edges/attributes。它们都有一个共同的 属性 name,即 string。如果我对两个节点使用相同的谓词 name,那么当我使用 has 函数查找所有具有 name 边的用户时,它会产生问题。 has 函数还具有 returns Product 个具有 name 边的节点。这是不可取的。

在这种情况下,对域实体建模时正确的方法或建议是什么?我可以想到两种方法:

  1. 所有节点有一个共同的边type来唯一标识相似的节点。这里 type 的值将是 UserProduct。这与传统的 table/column 类比大致相似,其中 typetableedges 表示为具有本地化为 type 属性 的上下文的列。
  2. 每个节点类型都有一个单独的谓词。因此,与其使用 name,不如使用 user_nameproduct_name.
  3. 这样的两个谓词

我相信这个问题只存在于像 Dgraph 这样的 RDF/Triplestore 数据库,而不是像 Neo4j 这样的 属性 图,因为每个节点都包含自己的属性。

好消息!在Dgraph v1.1, types were introduced.

您可以将 type UserProduct 分配给您的实体并在查询时通过执行以下操作进行过滤:

{
  q(func: type(User)) {
    uid
    name
  }
}

v1.1 之前

为了简单起见,我会按照您在第 2 点中描述的那样分配唯一的名称。

如果您仍然希望有一个共享的 属性 标签,例如 name,按照您在第 1 点提出的建议进行操作就可以了。

查询可能如下所示:

{
  q(func: has(kind)) {
    pred @filter(user) {
      uid
      name
    }
  }
}