在 hyperledger-composer 中访问 "named query" 中的数组 属性

Accessing array property in "named query" in hyperledger-composer

在我的 hyperledger composer 应用程序中,我想编写一个命名查询,returns 所有有特定爱好的人。

"Person" 的模型如下:

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

"Hobby" 的模型如下:

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))
}

这可能吗?

简短的回答是这个查询应该有效:

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 。在生产场景中,您将是 'calling' 来自 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 ))
}