查询Hyperledger Composer中的嵌套资源

时间:2018-04-03 23:01:36

标签: hyperledger 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
}

我想选择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))
}

此查询的行为符合预期,但它选择Asset1。我想选择Transact。我该如何撰写此查询?

2 个答案:

答案 0 :(得分:2)

不,你现在无法像你提议的那样嵌套查询,嵌套的命名查询当前没有在Composer中实现(CouchDB不是关系数据库,因此Composer查询语言无法翻译目前要翻译的嵌套查询to CouchDB)2)Transact是一个事务 - 它包含您在模型中定义的关系标识符,而不是存储在相关资产中的嵌套数据。您必须定义一个查询,搜索与您传递给trxn的asset1标识符字段匹配的所有事务 - 然后在您的代码中,您可以检查transact.asset1.contents包含'某事'(传入trxn也是?)使用javascript匹配 - 相当简单)。或者,您可以使用REST API过滤器(环回过滤器而不是查询),其中(形成您的应用程序代码)您可以使用带有过滤器的REST调用来解析事务(Transact)与asset1(及其内容)之间的关系,例如{ {1}}。希望这会有所帮助,也许它的嵌套你只是在寻找..

答案 1 :(得分:0)

就我而言,我拥有这些资产

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

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

enter image description here