通过概念查询一组参与者

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()); 


           }

      });  

}