在hyperledger-composer的“命名查询”中访问数组属性

时间:2018-06-20 20:46:44

标签: hyperledger-composer named-query

在我的hyperledger作曲器应用程序中,我想编写一个命名查询,以返回具有特定爱好的所有人。

“人”的模型如下:

participant Person identified by id {
  o String id
  o String firstName
  o String lastName
  o String email
  --> Hobby[] hobbies optional
}

“爱好”的模型如下:

asset Hobby identified by name {
  o String name
}

命名查询具有以下结构:

query selectPersonsByHobby {
  description: "Select all persons with a certain hobby."
  statement:
      SELECT org.comp.myapp.Person
          WHERE //don't know what to put here//
}

我不知道在“ WHERE”运算符后面添加什么以实现我想要的。

我想要类似以下的内容:

query selectPersonsByHobby {
      description: "Select all persons with a certain hobby."
      statement:
          SELECT org.comp.myapp.Person
              WHERE (hobbies.contains(_$hobby))
}

这甚至有可能吗?

1 个答案:

答案 0 :(得分:1)

简短的答案是此查询应该可以工作:

query selectConsultantsBySkill {
  description: "Select all persons with a certain hobby."
  statement:
      SELECT org.comp.myapp.Person
          WHERE (hobbies CONTAINS _$targetHobby)
}

但是请注意,由于您的兴趣爱好是 Relationships 的数组,因此targetHobby参数必须类似于resource:org.acme.Hobby#cycling。在生产场景中,您将通过UI程序“调用”查询,因此可以预先添加关系语法。

我想这只是一个测试示例,但我想知道Hobby是否需要成为恋人?如果没有的话,会更容易。

您也可以使用概念(甚至是概念中的枚举类型!)。这是带有概念的修改后的模型和查询的示例:

participant Person identified by id {
  o String id
  o String firstName
  o String lastName
  o String email
  o Interest[] passTime
}

concept Interest {
  o String name
  o String description
}


query selectConsultantsBySkill {
  description: "Select all persons with a certain hobby."
  statement:
      SELECT org.comp.myapp.Person
          WHERE (passTime CONTAINS (name == _$targetHobby ))
}