在 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
我想为我的 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