我已经定义了我的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
答案 0 :(得分:2)
我将您的模型粘贴到Composer Playground并收到错误,其中包含您的资产名称Asset
是一个保留字 - 如果您能够使用我希望知道的其他方法来部署此模型一个问题。我使用资产名Ass1
进行测试。
根据您的查询,您需要在where where条件下使用括号,例如WHERE (assetStatus == "invalid")
要回答您的问题 - 您已针对属性(assetStatus)创建了一个查询,但结果集将始终是完整资产的列表,而不仅仅是单个属性(这与SQL select)。
您的查询将返回与“无效”匹配的资产,并且所有者将作为资源引用返回。例如"owner": "resource:org.acme.myNetwork.Owner#AA1"
如果要获取所有者的所有属性,而不仅仅是ID,则必须编写第二个查询,或在Owner注册表上执行GET请求。作为替代方案,您可以在对Ass1(资产)注册表的GET请求中使用过滤器,这将解决"解析"主人。
因此,使用GET请求在此端点{"where":{"assetStatus":"invalid"}, "include":"resolve"}
上使用此过滤器:/api/Ass1
,您会看到以下结果:
{
"$class": "org.acme.myNetwork.Ass1",
"assetId": "WILL01",
"owner": {
"$class": "org.acme.myNetwork.Owner",
"ownerId": "AA1",
"ownerName": "Albert",
"ownerStatus": "VALID"
},
"assetStatus": "invalid"
}