首页 > 解决方案 > 如何使用 Grakn / Graql 对角色层次结构(以及它们之间的关系)进行建模?

问题描述

我开始使用 Grakn,我很难理解角色和关系是如何“关联”的。具体来说,我在建模角色层次结构时遇到了一些困难。

考虑一个有两个场景的虚构示例,首先假设我只有两种类型:人和对象;以及客户角色层次结构和产品角色层次结构之间的购买关系。

所以,我会有类似的东西:

类型:人

类型:对象

该关系是唯一的(购买),用于考虑层次结构中的各个级别来关联角色:

     customer level 1 --- buys --- product level 1
     customer level 2 --- buys --- product level 2
     customer level 3 --- buys --- product level 3

在第二种情况下,我将只有一个角色层次结构,客户一个,对象类型只有一个角色:产品。因此,关系将类似于:

     customer level 1 --- buys --- product
     customer level 2 --- buys --- product
     customer level 3 --- buys --- product

如何使用 Grakn (Graql) 对此类问题进行建模?如果有人能展示如何用 Graql 模拟这个(或类似的)问题,我将不胜感激。

标签: modelhierarchyrolesvaticle-typedbvaticle-typeql

解决方案


要在 Graql 中构建角色层次结构,您需要通过定义子关系来用子角色覆盖父角色。

我认为对于您的第一种情况,有两种可能的选择,具体取决于您要限制的内容:

define

buys sub relation,
  abstract,
  relates product,
  relates customer;

buys-level-1 sub buys,
  relates product-level-1 as product,
  relates customer-level-1 as customer;

buys-level-2 sub buys-level-1,
  relates product-level-2 as product-level-1,
  relates customer-level-2 as customer-level-1;

buys-level-3 sub buys-level-2,
  relates product-level-3 as product-level-2,
  relates customer-level-3 as customer-level-2;

person sub entity,
  plays customer-level-1,
  plays customer-level-2,
  plays customer-level-3;

object sub entity,
  plays product-level-1,
  plays product-level-2,
  plays product-level-3;

在这种情况下,如果您插入了一个buys-level-3关系:

insert 
$per isa person; $obj isa object;
$b(product-level-3: $obj, customer-level-3: $per) isa buys-level-3;

您将能够使用buys-level-2,buys-level-1和来匹配它buys。所以这个查询将返回我们刚刚插入的人和关系:

match $b(customer-level-1: $per) isa buys-level-1; get;

或者,您可以像这样更改限制:

buys-level-3 sub buys,
  relates product-level-3 as product,
  relates customer-level-3 as customer;

在这种情况下,match我们所做的不会返回插入的关系或人。让您想对查询/数据施加的限制在此处指导您选择最佳模型。

第二种情况很容易看到,我们有:

define

buys sub relation,
  abstract,
  relates product,
  relates customer;

buys-level-1 sub buys,
  relates product,
  relates customer-level-1 as customer;

buys-level-2 sub buys-level-1,
  relates product,
  relates customer-level-2 as customer-level-1;

buys-level-3 sub buys-level-2,
  relates product,
  relates customer-level-3 as customer-level-2;

person sub entity,
  plays customer-level-1,
  plays customer-level-2,
  plays customer-level-3;

object sub entity,
  plays product;

在任何这些场景中,您都可以通过以下方式检索所有buys关系及其角色扮演者:

match $b(customer: $per, product: $obj) isa buys; get;

推荐阅读