如何为 dgraph 中的节点建模相似的命名谓词或属性?
How to model similar named predicates or attributes for nodes in dgraph?
我正在尝试使用 Dgraph 作为我的主数据库。我有一个简单的系统,它有两个域实体,即。 User
和 Product
。它们都具有某些属性,在 Dgraph 中表示为 edges/attributes。它们都有一个共同的 属性 name,即 string。如果我对两个节点使用相同的谓词 name
,那么当我使用 has
函数查找所有具有 name
边的用户时,它会产生问题。 has 函数还具有 returns Product
个具有 name
边的节点。这是不可取的。
在这种情况下,对域实体建模时正确的方法或建议是什么?我可以想到两种方法:
- 所有节点有一个共同的边
type
来唯一标识相似的节点。这里 type
的值将是 User
或 Product
。这与传统的 table/column 类比大致相似,其中 type
将 table
和 edges
表示为具有本地化为 type
属性 的上下文的列。
- 每个节点类型都有一个单独的谓词。因此,与其使用
name
,不如使用 user_name
和 product_name
. 这样的两个谓词
我相信这个问题只存在于像 Dgraph 这样的 RDF/Triplestore 数据库,而不是像 Neo4j 这样的 属性 图,因为每个节点都包含自己的属性。
好消息!在Dgraph v1.1, types were introduced.
您可以将 type User
和 Product
分配给您的实体并在查询时通过执行以下操作进行过滤:
{
q(func: type(User)) {
uid
name
}
}
v1.1 之前
为了简单起见,我会按照您在第 2 点中描述的那样分配唯一的名称。
如果您仍然希望有一个共享的 属性 标签,例如 name,按照您在第 1 点提出的建议进行操作就可以了。
查询可能如下所示:
{
q(func: has(kind)) {
pred @filter(user) {
uid
name
}
}
}
我正在尝试使用 Dgraph 作为我的主数据库。我有一个简单的系统,它有两个域实体,即。 User
和 Product
。它们都具有某些属性,在 Dgraph 中表示为 edges/attributes。它们都有一个共同的 属性 name,即 string。如果我对两个节点使用相同的谓词 name
,那么当我使用 has
函数查找所有具有 name
边的用户时,它会产生问题。 has 函数还具有 returns Product
个具有 name
边的节点。这是不可取的。
在这种情况下,对域实体建模时正确的方法或建议是什么?我可以想到两种方法:
- 所有节点有一个共同的边
type
来唯一标识相似的节点。这里type
的值将是User
或Product
。这与传统的 table/column 类比大致相似,其中type
将table
和edges
表示为具有本地化为type
属性 的上下文的列。 - 每个节点类型都有一个单独的谓词。因此,与其使用
name
,不如使用user_name
和product_name
. 这样的两个谓词
我相信这个问题只存在于像 Dgraph 这样的 RDF/Triplestore 数据库,而不是像 Neo4j 这样的 属性 图,因为每个节点都包含自己的属性。
好消息!在Dgraph v1.1, types were introduced.
您可以将 type User
和 Product
分配给您的实体并在查询时通过执行以下操作进行过滤:
{
q(func: type(User)) {
uid
name
}
}
v1.1 之前
为了简单起见,我会按照您在第 2 点中描述的那样分配唯一的名称。
如果您仍然希望有一个共享的 属性 标签,例如 name,按照您在第 1 点提出的建议进行操作就可以了。
查询可能如下所示:
{
q(func: has(kind)) {
pred @filter(user) {
uid
name
}
}
}