首页 文章

Hyperledger Composer查询资产的参数

提问于
浏览
0

我已经定义了我的hyperledger composer模型文件;

namespace org.acme.myNetwork

asset Asset identified by assetId {
 o String assetId
 --> Owner owner
 o String assetStatus
}

participant Owner identified by ownerId {
 o String ownerId
 o String ownerName
 o String ownerStatus
}

我想查询具有assetStatus = "invalid"值的资产的所有者 . 我已经阅读了hyperledger composer query language文档,他们似乎只有个人可以查询资产或参与者的示例,但它没有显示如何查询资产或参与者的参数的示例 .

query selectAsset {
  description: "Select Asset"
  statement: SELECT org.acme.myNetwork.Asset
              WHERE assetStatus == "invalid"
 }

 query selectAssetParameter {
  description: "Select Asset Parameter"
  statement: SELECT org.acme.myNetwork.Asset.owner
              WHERE assetStatus == "invalid"
 }

上面查询的第一个示例是有效的,但写入的第二个查询会在playground中抛出此错误:

Error found! t: Namespace is not defined for type org.acme.myNetwork.Asset.owner

1 回答

  • 2

    我将您的模型粘贴到Composer Playground并收到一个错误,其中包含您的资产名称 Asset 是一个保留字 - 如果您能够使用我想知道的不同方法部署此模型来提出问题 . 我使用资产名称 Ass1 进行测试 .

    根据您的查询,您需要在where where条件下使用括号,例如 WHERE (assetStatus == "invalid")

    要回答您的问题 - 您已经针对属性(assetStatus)创建了一个查询,但结果集将始终是完整资产的列表,而不仅仅是单个属性(这与SQL选择不同) .

    您的查询将返回与'invalid'匹配的资产,并且所有者将作为资源引用返回 . 例如 "owner": "resource:org.acme.myNetwork.Owner#AA1"

    如果要获取所有者的所有属性,而不仅仅是ID,则必须编写第二个查询,或在Owner注册表上执行GET请求 . 作为替代方案,您可以使用对Ass1(资产)注册表的GET请求的过滤器,该注册表将是所有者的"resolve" .

    所以使用此过滤器: {"where":{"assetStatus":"invalid"}, "include":"resolve"} 在此 endpoints /api/Ass1 上使用GET请求您会看到以下结果:

    {
       "$class": "org.acme.myNetwork.Ass1",
        "assetId": "WILL01",
        "owner": {
          "$class": "org.acme.myNetwork.Owner",
          "ownerId": "AA1",
          "ownerName": "Albert",
          "ownerStatus": "VALID"
        },
        "assetStatus": "invalid"
      }
    

相关问题