model - 如何使用 Grakn / Graql 对角色层次结构(以及它们之间的关系)进行建模?
问题描述
我开始使用 Grakn,我很难理解角色和关系是如何“关联”的。具体来说,我在建模角色层次结构时遇到了一些困难。
考虑一个有两个场景的虚构示例,首先假设我只有两种类型:人和对象;以及客户角色层次结构和产品角色层次结构之间的购买关系。
所以,我会有类似的东西:
类型:人
- 角色:客户级别 1
- 角色:客户级别2(子客户级别1)
角色:客户3级(子客户2级)
...
类型:对象
- 角色:产品级别1
- 角色:产品级别2(子产品级别1)
- 角色:产品级别3(子产品级别2)...
该关系是唯一的(购买),用于考虑层次结构中的各个级别来关联角色:
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 模拟这个(或类似的)问题,我将不胜感激。
解决方案
要在 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;
推荐阅读
- javascript - 神秘的 CSP 违规
- php - 检查自用户上次访问以来数据是否对用户来说是新的
- sql - SQL Server:升级后的数据库兼容性级别
- javascript - 将 .filter() 链接到函数中以加载本地 JSON 数据
- python - 如何注释 Django QuerySet 聚合带注释的子查询
- javascript - iframe 未在按钮单击时加载
- php - 如何使用外键自定义 Auth::user() 列?拉拉维尔
- assembly - 使用十六进制在汇编代码中编写指令
- javascript - 悬停时的下拉菜单
- maven - 在不创建插件的情况下构建自定义 Maven 生命周期