在 Hyperledger Composer 中查询嵌套资产

Querying over nested assets in Hyperledger Composer

我想为我的 Hyperledger Composer 应用程序编写一个特定的查询。下面,我有 2 个资产和一个交易。 Asset1 有一个名为 contents 的字段,它是一个 Asset2 类型的数组。相关代码如下:

namespace org.acme.biznet

asset Asset1 identified by Asset1Id {
    o String Asset1Id
    --> Asset2[] contents
}

asset Asset2 identified by Asset2Id {
    o String Asset2Id
}

transaction Transact {
    --> Asset1 asset1
}

我想要 select Transact 的所有实例,其中关联的 Asset1 内部有指定的 Asset2。我来到下面的查询最接近的解决方案,但没有用。

query GetTransactionsThatHaveAsset2 {
    description: ""
    statement: 
        SELECT org.acme.biznet.Transact
            WHERE (asset1.contents CONTAINS (Asset2Id == _$propId))
}

问题是,我还在下面写了查询。

query GetAsset1sThatHaveAsset2 {
    description: ""
    statement: 
        SELECT org.acme.biznet.Asset1 
            WHERE (contents CONTAINS (Asset2Id == _$propId))
}

此查询按预期运行,但 select 超过了 Asset1。我想 select 超过 Transact。我将如何编写此查询?

不,您目前不能像您提议的那样嵌套查询,嵌套的命名查询当前未在 Composer 中实现(CouchDB 不是关系数据库,因此 Composer 查询语言目前无法将嵌套查询转换为被翻译成 CouchDB) 2) Transact 是一个事务 - 它包含您在模型中定义的关系标识符,而不是存储在相关资产中的嵌套数据。您必须定义一个查询来搜索与您传递给 trxn 的 asset1 标识符字段相匹配的所有交易 - 然后在您的代码中,您可以检查 transact.asset1.contents 是否包含 'something'(通过也进入 trxn?)使用 javascript 匹配 - 非常简单)。或者,您可以使用 REST API 过滤器(环回过滤器而不是查询),您可以在其中(形成您的应用程序代码)使用 REST 调用将交易 (Transact) 的关系解析回资产 1(及其内容)带过滤器,例如 {"where":{"asset1":"resource:org.acme.net.Asset1#1"}, "include":"resolve"} 。希望这对您有所帮助,也许它是您专门寻找的嵌套..

就我而言,我有这些资产

// Define assets
asset Product identified by productId {
    o String productId
    o String description
    o String serialNumber  
    o String modelNumber
    o String status // TRANSFERED, RECEIVED, RECLAMED
    o DateTime joinTime 
    --> Trader previousOwner 
    --> Trader currentOwner
    --> Trader newOwner
}

// Trade, moves product from to a new owner. 
transaction Trade {
  --> Product product
  --> Trader newOwner
  o String trade_type
} 

执行贸易交易结果记录:


{
 "$class": "org.sp.network.Trade",
 "product": "resource:org.sp.network.Product#123",
 "newOwner": "resource:org.sp.network.Trader#6694",
 "trade_type": "Trade",
 "transactionId": "e39a86ed4748a3ab73b5e9c023f6bb0ca025098af09b8b5b2dca8f5f7ef0db67",
 "timestamp": "2019-06-13T12:04:20.180Z"
}

要查询包含产品的所有贸易交易是

 query ProductPath{
    description: "Selete all Trade transactions for a specific ProductId"
    statement:
        SELECT org.sp.network.Trade 
          WHERE (_$productId==product)
} 

使用rest服务器:_$productId的值为resource:org.sp.network.Product#123