在 n 元关系中指定动态角色数

Specifying dynamic number of roles in n-ary relation

我知道 Grakn 允许我们指定 n 元 edges/relations。 但是,当我们事先不知道 "many" 的大小时,它们能否允许我们指定多对一关系?

例如:

如果我想将两个实体 'a' 和 'b' 连接到实体 'c',我可以这样做。 但是,如果我事先不知道要连接多少个实体怎么办 'c'。 如果我想保持这种动态怎么办? (有时将 2 个实体连接到 1 个或将 4 个实体连接到 1 个) Grakn 允许我代表那个吗?

我希望我能够清楚地描述我的问题。

请告诉我。谢谢。

在 Grakn 中,这些 many-to-one 连接(其中 "many" 是动态的)可以存储 作为 关系实例本身。

例如,假设您有一个 parent 的家庭,他们有一些 children,但我们不知道有多少,可以添加新的 children随时。

那么你会

define

name sub attribute, datatype string;
person sub entity, has name, plays parent, plays child;
parenthood sub relation, relates parent, relates child;

现在假设你已经匹配了四个人,$a、$b、$c 和 $d,那么你可以通过插入两个 parenthood 个实例来建立 2 对 1 的关系:

insert (parent: $a, child: $b) isa parenthood;
insert (parent: $a, child: $c) isa parenthood;

当你插入第三个时,它变成了 3 对 1 的关系 parenthood:

insert (parent: $a, child: $d) isa parenthood;

等等。

我认为您不一定要完全按照您描述的那样做,添加新的 角色 需要动态更改架构。可能,但您更有可能希望动态选择 角色扮演者 的数量。值得澄清的是,一个角色可以在同一个关系实例中扮演多次。

让我们以 re-use Alex Walker 的 parenthood 为例。他为每个 parenthood 关系创建了一个新的关系实例。这是一种完全有效且值得鼓励的方法。

另一种方法是让未知数量的 parents 和 children 处于同一关系中。架构保持完全相同,但您可以通过这种方式添加数据:

match [ do matching for $a, $b, $c, $d ]
insert (parent: $a, child: $b, child: $c, child: $d) isa parenthood;

这两种方法具有不同的语义。在第二种情况下,只有一个关系将 parent 连接到他们的三个 children。用单一关系建模表明角色扮演者的组合对于关系是必要的。

parenthood的情况下,3children不是先决条件,但是两个parent是拥有child的先决条件(大多数时候) :

match [ do matching for $p1, $p2, $c1 ]
insert (parent: $p1, parent: $p2, child: $c1) isa parenthood;

如果这两个 parent 有另一个 child,您有两个选择。在两个 parent 和新的 child 之间创建新关系(方法 1),或者将新的 child 添加到现有关系(方法 2)。后者你可以这样做:

match
  [ do matching for $p1, $p2, $c1, $c2 ]
  $ph(parent: $p1, parent: $p2, child: $c1) isa parenthood;
insert
  $ph(child: $c2) isa parenthood;

一个关系看起来像

$ph(parent: $p1, parent: $p2, child: $c1, child: $c2) isa parenthood;

注意使用变量 $ph 来匹配 现有 关系并向其添加角色扮演者。