1

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

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

  1. 所有节点都有一条共同边type,以唯一标识相似节点。这里的值typeUserProduct。这大致类似于传统的表/列类比,其中将和type表示为具有本地化属性的上下文的列。tableedgestype
  2. 每个节点类型都有一个单独的谓词。因此,与其拥有name,不如更喜欢两个谓词user_nameproduct_name

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

4

1 回答 1

1

好消息!在Dgraph v1.1中,引入了类型。

您可以通过执行以下操作在查询时为您的实体分配类型 User和过滤器:Product

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

v1.1之前

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

如果您仍然希望拥有像name这样的共享属性标签,那么按照您在第 1 点提出的建议就可以了。

查询可能如下所示:

{
  q(func: has(kind)) {
    pred @filter(user) {
      uid
      name
    }
  }
}
于 2019-09-23T09:05:24.310 回答