通过概念查询一组参与者
Querying an array of participant through concepts
这是我的模型文件的样子。
participant Doctor identified by doctorID {
o String doctorID
o String contact
o String doctorName
o String description
--> Schedule schedule
}
asset Schedule identified by scheduleID{
o String scheduleID
o Day availableDays
}
concept Time{
--> Doctor[] AM00
--> Doctor[] AM01
--> Doctor[] AM02
--> Doctor[] AM03
--> Doctor[] AM04
--> Doctor[] AM05
--> Doctor[] AM06
--> Doctor[] AM07
--> Doctor[] AM08
--> Doctor[] AM09
--> Doctor[] AM10
--> Doctor[] AM11
--> Doctor[] PM00
--> Doctor[] PM01
--> Doctor[] PM02
--> Doctor[] PM03
--> Doctor[] PM04
--> Doctor[] PM05
--> Doctor[] PM06
--> Doctor[] PM07
--> Doctor[] PM08
--> Doctor[] PM09
--> Doctor[] PM10
--> Doctor[] PM11
}
concept Day{
o Time monday
o Time tuesday
o Time wednesday
o Time thursday
o Time friday
o Time saturday
o Time sunday
}
我正在尝试编写一个查询,以显示特定时间所有可用的医生。例如,如果我在星期一早上 00 点找医生,那么 AM00 的医生数组应该是 returned.
我正在尝试这样的事情
query getAvailableDoctors {
description: "Returns a list of doctors available at a specific hour"
statement:
SELECT org.acme.Doctor
FROM org.acme.Schedule
WHERE (schedule.availableDays.monday.AM00 CONTAINS('resource:org.acme.Doctor') )
}
但是当 AM00 数组中存储了事实上的医生时,所有这一切都是 return NULL。我做错了吗?或者有更好的查询方式吗?
我会建议以下 [模型、查询定义等],如下所示 - 它基于您选择 'concept' 路线的事实(您也可以使用普通数组并查询 Days/Hours,型号略有不同,但那是另一天)。您的查询(上面)将不起作用,因为您无法 'step' 通过查询定义中的对象 - 它不像 SQL 数据库(只是为了清除它)。
下面的模型提供了概念 Availability
来捕获医生的可用性矩阵,在资产 Schedule
中(因此与医生的关系)。此外,它是一系列概念,允许该计划 ID 在每一天的每小时计划。最后,一位医生(或一组医生)——可以与该附表相关联——如果它是一对一的,那么显然你只需要提供一个 'doctor' 条目。请参阅下方 schedule
的示例 JSON 数据。同样,医生(参与者)可以与一个或多个时间表有关系(或没有关系,视情况而定 - 无论如何都有选项 - 正如你在 Doctor
参与者中看到的那样,我有一个可选的schedule
(一系列计划)——在这种情况下,它会将概念数据(资产内部)存储在实际参与者记录中(然后你会查询它)——但你可能不想管理内部的计划数据参与者出于明显的原因)。注意:这只是一个建议,基于您发布的内容 - 剥橙子的方法有很多种 :-)
participant Doctor identified by doctorID {
o String doctorID
o String contact
o String doctorName
o String description
o Schedule[] schedule optional // see comment below
}
asset Schedule identified by scheduleID {
o String scheduleID
o Availability[] availability
--> Doctor[] doctor
}
concept Availability {
o WeekDay Day
o Hours Hour
}
enum WeekDay {
o MON
o TUE
o WED
o THU
o FRI
o SAT
o SUN
}
enum Hours {
o H00
o H01
o H02
o H03
o H04
o H05
o H06
o H07
o H08
o H09
o H10
o H11
o H12
o H13
o H14
o H15
o H16
o H17
o H18
o H19
o H20
o H21
o H22
o H23
}
使用该模型,您现在可以定义您的 Concept 查询。
示例 1:
query doctordoctor1 {
description: "Select all doctors available at 1st hour on MON only"
statement: SELECT org.acme.mynetwork.Schedule
WHERE ( availability CONTAINS (Day == "MON" AND Hour == "H01" ) )
}
将 return 仅附表 #4,因此医生 #1 和 #2(而不是医生 3 或 4)
示例 2:
query doctordoctor2 {
description: "Select all doctors available at 1st hour - any day"
statement: SELECT org.acme.mynetwork.Schedule
WHERE ( availability CONTAINS (Hour == "H01" ) )
}
将 return 附表 #4 和 #5 这意味着医生 #1 和 #2 - 加上 - 医生 #3 和 #4 将全部匹配。
请注意它不会 return 该查询中医生资料的详细信息请注意 - 您可以在交易中调用查询,然后获取每个医生的相关医生信息(即如果需要)医生发现,事实上存在来自 returned 查询对象(时间表)的关系。
=================== DATA =========(留在此处,但可以放入 pastebin)
{
"$class": "org.acme.mynetwork.Schedule",
"scheduleID": "4",
"availability": [
{
"$class": "org.acme.mynetwork.Availability",
"Day": "MON",
"Hour": "H01"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "MON",
"Hour": "H02"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "MON",
"Hour": "H03"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "TUE",
"Hour": "H04"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "TUE",
"Hour": "H05"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "TUE",
"Hour": "H06"
}
],
"doctor": [
"resource:org.acme.mynetwork.Doctor#1",
"resource:org.acme.mynetwork.Doctor#2"
]
}
下一项
{
"$class": "org.acme.mynetwork.Schedule",
"scheduleID": "5",
"availability": [
{
"$class": "org.acme.mynetwork.Availability",
"Day": "WED",
"Hour": "H01"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "WED",
"Hour": "H02"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "THU",
"Hour": "H03"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "FRI",
"Hour": "H04"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "SAT",
"Hour": "H05"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "SAT",
"Hour": "H06"
}
],
"doctor": [
"resource:org.acme.mynetwork.Doctor#3",
"resource:org.acme.mynetwork.Doctor#4"
]
}
==== CODE 从事务处理器调用查询 - 或者直接调用它
来自 REST API
/**
* Track the schedule
* @param {org.acme.mynetwork.doctor} doctor - the query object as a trxn
* @transaction
*/
function doctor(doctor) {
console.log('got inside doctor function');
return query('doctordoctor') //
.then(function (results) {
var schedule_asset = [];
for (var n = 0; n < results.length; n++) {
var schedule_asset = results[n];
console.log('The transaction object ' + (n+1) + ', object is ' + schedule_asset);
console.log('Schedule identifier is: ' + schedule_asset.getIdentifier());
console.log(' Doctor id is ' + schedule_asset.doctor[0].getIdentifier());
}
});
}
这是我的模型文件的样子。
participant Doctor identified by doctorID {
o String doctorID
o String contact
o String doctorName
o String description
--> Schedule schedule
}
asset Schedule identified by scheduleID{
o String scheduleID
o Day availableDays
}
concept Time{
--> Doctor[] AM00
--> Doctor[] AM01
--> Doctor[] AM02
--> Doctor[] AM03
--> Doctor[] AM04
--> Doctor[] AM05
--> Doctor[] AM06
--> Doctor[] AM07
--> Doctor[] AM08
--> Doctor[] AM09
--> Doctor[] AM10
--> Doctor[] AM11
--> Doctor[] PM00
--> Doctor[] PM01
--> Doctor[] PM02
--> Doctor[] PM03
--> Doctor[] PM04
--> Doctor[] PM05
--> Doctor[] PM06
--> Doctor[] PM07
--> Doctor[] PM08
--> Doctor[] PM09
--> Doctor[] PM10
--> Doctor[] PM11
}
concept Day{
o Time monday
o Time tuesday
o Time wednesday
o Time thursday
o Time friday
o Time saturday
o Time sunday
}
我正在尝试编写一个查询,以显示特定时间所有可用的医生。例如,如果我在星期一早上 00 点找医生,那么 AM00 的医生数组应该是 returned.
我正在尝试这样的事情
query getAvailableDoctors {
description: "Returns a list of doctors available at a specific hour"
statement:
SELECT org.acme.Doctor
FROM org.acme.Schedule
WHERE (schedule.availableDays.monday.AM00 CONTAINS('resource:org.acme.Doctor') )
}
但是当 AM00 数组中存储了事实上的医生时,所有这一切都是 return NULL。我做错了吗?或者有更好的查询方式吗?
我会建议以下 [模型、查询定义等],如下所示 - 它基于您选择 'concept' 路线的事实(您也可以使用普通数组并查询 Days/Hours,型号略有不同,但那是另一天)。您的查询(上面)将不起作用,因为您无法 'step' 通过查询定义中的对象 - 它不像 SQL 数据库(只是为了清除它)。
下面的模型提供了概念 Availability
来捕获医生的可用性矩阵,在资产 Schedule
中(因此与医生的关系)。此外,它是一系列概念,允许该计划 ID 在每一天的每小时计划。最后,一位医生(或一组医生)——可以与该附表相关联——如果它是一对一的,那么显然你只需要提供一个 'doctor' 条目。请参阅下方 schedule
的示例 JSON 数据。同样,医生(参与者)可以与一个或多个时间表有关系(或没有关系,视情况而定 - 无论如何都有选项 - 正如你在 Doctor
参与者中看到的那样,我有一个可选的schedule
(一系列计划)——在这种情况下,它会将概念数据(资产内部)存储在实际参与者记录中(然后你会查询它)——但你可能不想管理内部的计划数据参与者出于明显的原因)。注意:这只是一个建议,基于您发布的内容 - 剥橙子的方法有很多种 :-)
participant Doctor identified by doctorID {
o String doctorID
o String contact
o String doctorName
o String description
o Schedule[] schedule optional // see comment below
}
asset Schedule identified by scheduleID {
o String scheduleID
o Availability[] availability
--> Doctor[] doctor
}
concept Availability {
o WeekDay Day
o Hours Hour
}
enum WeekDay {
o MON
o TUE
o WED
o THU
o FRI
o SAT
o SUN
}
enum Hours {
o H00
o H01
o H02
o H03
o H04
o H05
o H06
o H07
o H08
o H09
o H10
o H11
o H12
o H13
o H14
o H15
o H16
o H17
o H18
o H19
o H20
o H21
o H22
o H23
}
使用该模型,您现在可以定义您的 Concept 查询。
示例 1:
query doctordoctor1 {
description: "Select all doctors available at 1st hour on MON only"
statement: SELECT org.acme.mynetwork.Schedule
WHERE ( availability CONTAINS (Day == "MON" AND Hour == "H01" ) )
}
将 return 仅附表 #4,因此医生 #1 和 #2(而不是医生 3 或 4)
示例 2:
query doctordoctor2 {
description: "Select all doctors available at 1st hour - any day"
statement: SELECT org.acme.mynetwork.Schedule
WHERE ( availability CONTAINS (Hour == "H01" ) )
}
将 return 附表 #4 和 #5 这意味着医生 #1 和 #2 - 加上 - 医生 #3 和 #4 将全部匹配。
请注意它不会 return 该查询中医生资料的详细信息请注意 - 您可以在交易中调用查询,然后获取每个医生的相关医生信息(即如果需要)医生发现,事实上存在来自 returned 查询对象(时间表)的关系。
=================== DATA =========(留在此处,但可以放入 pastebin)
{
"$class": "org.acme.mynetwork.Schedule",
"scheduleID": "4",
"availability": [
{
"$class": "org.acme.mynetwork.Availability",
"Day": "MON",
"Hour": "H01"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "MON",
"Hour": "H02"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "MON",
"Hour": "H03"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "TUE",
"Hour": "H04"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "TUE",
"Hour": "H05"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "TUE",
"Hour": "H06"
}
],
"doctor": [
"resource:org.acme.mynetwork.Doctor#1",
"resource:org.acme.mynetwork.Doctor#2"
]
}
下一项
{
"$class": "org.acme.mynetwork.Schedule",
"scheduleID": "5",
"availability": [
{
"$class": "org.acme.mynetwork.Availability",
"Day": "WED",
"Hour": "H01"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "WED",
"Hour": "H02"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "THU",
"Hour": "H03"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "FRI",
"Hour": "H04"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "SAT",
"Hour": "H05"
},
{
"$class": "org.acme.mynetwork.Availability",
"Day": "SAT",
"Hour": "H06"
}
],
"doctor": [
"resource:org.acme.mynetwork.Doctor#3",
"resource:org.acme.mynetwork.Doctor#4"
]
}
==== CODE 从事务处理器调用查询 - 或者直接调用它
来自 REST API
/**
* Track the schedule
* @param {org.acme.mynetwork.doctor} doctor - the query object as a trxn
* @transaction
*/
function doctor(doctor) {
console.log('got inside doctor function');
return query('doctordoctor') //
.then(function (results) {
var schedule_asset = [];
for (var n = 0; n < results.length; n++) {
var schedule_asset = results[n];
console.log('The transaction object ' + (n+1) + ', object is ' + schedule_asset);
console.log('Schedule identifier is: ' + schedule_asset.getIdentifier());
console.log(' Doctor id is ' + schedule_asset.doctor[0].getIdentifier());
}
});
}