Composer 中的 ThingWorx 模型定义 > 数据存储 > 值流 > 使用 QueryPropertyHistory 服务
使用 QueryPropertyHistory 服务
QueryPropertyHistory 服务能够查询给定时间范围内给定源事物的每个属性 (必须是已记录的属性) 值的值流。该服务针对每个属性调用 ValueStream.queryValueStreamEntries,然后将这些值全部放入结果集中。
QueryPropertyHistory 通过以下方法返回创建的数据集:查询事物上每个已记录的属性,然后将各个数据集组合成一个大数据集。将为单个数据集中的每个时间戳创建“行”。如果存在具有该时间戳的已记录值,则会将其输入到数据集的行中。如果没有任何已记录值,则使用该属性最后一个已记录值。如果没有任何已记录属性,则该条目为空。该组合器处理将根据时间戳移除给定属性的重复项。
要获取给定属性的实际已记录值,必须使用 QueryPropertyHistory 服务 (例如,QueryIntegerPropertyHistory)。您可以确认数据实际上已随这些服务一起清除。要了解该服务的工作原理,请参阅以下几个示例情景。
示例情景
情景 1:我指定了 3 行,但 QueryPropertyHistory 返回了 9 行
值流用于记录三个属性。每个属性已经有三个单独的条目。因此,输入的数据点总数为 9。
如果将 maxItems 参数设置为 3 时针对此值流调用 QueryPropertyHistory,则会返回 9 行数据。QueryPropertyHistory 会对每个单独的属性执行三次查询,因为已将 maxItems 设置为 3。由于每个属性有 3 个数据条目,所以可能会返回最大数量 9 行。
情景 2:我知道此时间戳有数据,但是收到的信息表为空
如果您不想使用在将值输入到值流时 ThingWorx 所自动生成的数据,则可以从 Edge 设备上记录自己的自定义时间戳,但应考虑以下行为。
如果尝试查询此自定义时间戳列而不是使用 setPropertyVTQ,则可能会发生什么情况?
QueryPropertyHistory 服务将发送到事物正在使用的值流,并获取基于 startDateendDateoldestFirstmaxRows 参数的初始结果集。
如果将 startDateendDate 留空,这意味着您不会查询自动生成的时间戳属性,查询将从值流中最近添加的属性值或最早的属性值中获取 maxRows (例如,500)。这是由 oldestFirst 布尔型参数决定的。如果将 oldestFirst 设置为 false,则返回的结果集将包含每个属性最近输入的 500 个属性值。所以,如果有三个属性,每个属性记录了超过 500 个值,则初始数据集将包含 1500 行。
后处理时会发生什么情况?
还剩下一个参数没有用到,那就是 query 参数。此参数将在后处理中使用。这意味着,在对值流的初始查询完成之后,返回的初始结果集将应用 query 参数进行筛选,并仅返回所需的数据。
问题?
如果您已确定要查询所创建的自定义时间戳属性,但是返回的第一个结果集不包含您在查询中查找的时间,则会找不到任何内容,且会返回空的信息表。
解决方法
为完全避免此问题,可使用 setPropertyVTQ 服务将您自己的时间戳值输入到值流。这将覆盖自动生成的时间戳值,其中这些值表示将值输入到值流的确切时间。然后可以使用 startDateendDate 参数而不是 query 参数来查询日期,且不会发生针对时间戳查询而产生的数据丢失风险。