如何在graql中定义传递关系

Jak*_*ubM 5 vaticle-typeql vaticle-typedb

我的模型由有项目的组织和有项目的组织组成。这些存储桶可以共享给同一组织中的其他项目。我定义了项目共享规则,这意味着当第一个与另一个共享存储桶时,两个项目处于这种关系。

    define

    organization sub entity,
        plays organizationRole,
        key identifier;

    project sub entity,
        plays projectRole,
        plays projectSourceRole, 
        plays projectTargetRole,
        plays transitiveProjectSourceRole,
        plays transitiveProjectTargetRole,
        key identifier;

    bucket sub entity,
        plays bucketRole,
        plays sharedBucketSourceRole,
        plays sharedBucketTargetRole,
        key identifier;


    organizationToProject sub relation,
        relates organizationRole,
        relates projectRole;

    projectToBucket sub relation,
        relates projectRole,
        relates bucketRole;

    sharedBucket sub relation,
        relates sharedBucketSourceRole,
        relates sharedBucketTargetRole;

    projectSharing sub relation,
        relates projectSourceRole,
        relates projectTargetRole;

    project-sharing sub rule, 
      when { 
        (projectRole: $ps, bucketRole: $bs) isa projectToBucket; 
        (projectRole: $pt, bucketRole: $bt) isa projectToBucket;
        (sharedBucketSourceRole: $bs, sharedBucketTargetRole: $bt) isa sharedBucket;
        $ps != $pt;
      }, then { 
        (projectSourceRole: $ps, projectTargetRole: $pt) isa projectSharing; 
      };
Run Code Online (Sandbox Code Playgroud)

工作正常。(看到在此处输入图片说明

但是我想为传递关系定义一个规则(根据我在文档中找到的一些祖先示例),所以我添加了架构:

    transitiveProjectSharing sub relation,
        relates transitiveProjectSourceRole,
        relates transitiveProjectTargetRole;

    transitive-project-sharing sub rule,
      when {
        (projectSourceRole: $a, projectTargetRole: $b) isa projectSharing;
        (projectSourceRole: $b, projectTargetRole: $c) isa projectSharing; 
      }, then {
        (transitiveProjectSourceRole: $a, transitiveProjectTargetRole: $c) isa transitiveProjectSharing;
      };
Run Code Online (Sandbox Code Playgroud)

它什么也找不到(但是有几个可传递的,请参见 在此处输入图片说明

有人会建议错误在哪里吗?

Jak*_*ubM 6

我从 Grakn.ai Slack 得到了一个提示。传递性应该在projectSharing角色本身上定义,额外transitiveProjectSharing的不是必需的。所以定义应该是:

transitive-project-sharing sub rule,
  when {
    (projectSourceRole: $a, projectTargetRole: $b) isa projectSharing;
    (projectSourceRole: $b, projectTargetRole: $c) isa projectSharing; 
  }, then {
    (projectSourceRole: $a, projectTargetRole: $c) isa projectSharing; 
  };

Run Code Online (Sandbox Code Playgroud)

并且查询运行良好: 在此处输入图片说明