这项工作已被 SDTH 数据模型所淘汰,可以根据 prov 概念进行查询。
该存储库涵盖了 ProvONE-SDTL 数据模型。
数据模型的目的是获取 SDTL 中表示的信息并将其转换为 ProvONE 数据模型,从而允许使用 ProvONE 语法进行查询。
目标查询:
所有这些查询都可以用 ProvONE 来重述
指定标识符方案的主要目标之一是确保更多的人类可读标识符。这对于读取查询结果尤其重要。标识符的命名约定取自链接数据模式中的Patterned URIs
部分。
一般形式是,
#camelCaseClass/{current_type_count}
。其中{current_type_count}
是特定对象的计数。
在可能且适当的情况下,每个对象都应该有一个rdfs:label
。顶级 provone:Workflow 和 provone:Execution 对象可以具有预定义的标签,因为它们代表具有特定用途的唯一节点。
脚本级别 provone:Program & provone:Execution 对象也有标签,让任何查询者知道他们正在观察类似于脚本文件的实体。
目标格式为JSON-LD; rdflib 有一个插件可以将其图形模型转换为 JSON-LD。 Turtle 仍然是最容易用肉眼解析的,因此本文档中的示例都是在 Turtle 中提供的。 examples/
目录中的示例均采用 Turtle 和 JSON-LD 格式。
由于该模型以针对数据流问题的 ProvONE 查询为中心,因此底层架构主要是 ProvONE。
ProvONE 能够表示工作流程和执行集合provone:Workflow
和provone:Exection
。它们最常用于表示一系列脚本的执行或一系列脚本的存在。请注意,这些是无序的。
每个 ProvONE 表示都将具有相似的外部结构来表示脚本集合。预期出处收集 provone:Workflow 下的每个代表脚本的节点;追溯起源收集 provone:Execution 下的每个脚本执行节点。
每个预期模型都会有一个 provone:Program 表示由 C2Metadata 解析的脚本和一个 provone:脚本所属的工作流。每个脚本级 provone: 程序都附加到 provone: 工作流。
考虑单个数据包中的两个源文件。单个provone:Workflow
对象包含表示文件的两个节点。
每个回顾模型都会有一个 provone:Execution ,表示由 C2Metadata 解析的脚本的假设执行。每个代表脚本的 provone:Execution 对象都将附加到顶级 provone:Execution
追溯起源的描述类似。然而,在这种情况下,没有特定类型来表示执行的“集合”。相反,wasPartOf 可用于表示分组。
脚本文件内的命令是使用provone:Program
和provone:Execution
对象定义的。描述这些对象之间的数据流的对象是标准的provone:Port
和provone:Entity
。
这可以重述:每个具有基类 CommandBase 的 SDTL 对象都被转换为 provone:Program 或 provone:Execution。或者:SDTL“命令”数组中的每个 JSON 对象都映射到 provone:Program 或 provone:Execution。
请注意,尽管 SDTL 可能会根据命令执行进行排序,但 ProvONE 没有可以对顺序进行编码的对象。
命令通过provone:hasSubProgram
Program 相关。以一个包含四个命令的脚本为例。这些在 ProvONE 中建模为:
预期 ProvONE 中的数据流使用provone:Port
和provone:Workflow
对象。例如,考虑代表“加载”命令的 SDTL 片段。请注意,该命令位于“commands”数组中。
"commands": [
{
"$type": "Load",
"fileName": "df.csv",
"software": "csv",
"producesDataframe": [
{
"dataframeName": "df",
],
}
}
]
从命令类型来看,很明显正在使用一个文件。该文件表示为port/1
。从producesDataFrame
我们可以推断创建了一个新端口来表示数据帧port/2
。
如果添加第二个命令(使用数据帧的命令),则provone:Channel
对象将用于连接端口对象。例如,考虑下面描述“加载”命令的 SDTL,以及使用其数据帧并生成新数据帧的命令。
"commands": [
{
"$type": "Load",
"fileName": "df.csv",
"software": "csv",
"producesDataframe": [
{
"dataframeName": "df",
],
}
},
{
"$type": "Compute",
"consumesDataframe": [
{
"dataframeName": "df",
}
"producesDataframe": [
{
"dataframeName": "df"
}
}
]
从视觉上看,
可以重复此形式以在脚本中的命令之间形成任意长的数据流链。该表单将始终使用provone:Program
类型来表示命令,并使用provone:Port
来表示文件或数据帧。
追溯起源以类似的方式工作,因为命令被表示为父脚本文件执行的子执行。
下图描绘了一个包含四个命令的脚本。
具有追溯来源的数据流比前瞻性来源的数据流涉及更多一些。
使用用于预期出处的“加载”命令 SDTL,
"commands": [
{
"$type": "Load",
"fileName": "df.csv",
"software": "csv",
"producesDataframe": [
{
"dataframeName": "df",
],
}
}
]
在下图中, entity/1
代表命令正在使用的文件。 entity/2
表示创建的数据框。
如果保留了有关数据帧的一些元数据,则上面部分中的provone:Port
和provone:Entity
对象对于其他查询可能更有用。
完整的数据框描述包含有关内部变量的信息以及源代码中数据框的名称。考虑一个加载数据框的命令,其中包含文件中的变量,
{
"$type": "Load",
"command": "Load",
"fileName": "df.csv",
"software": "csv",
"producesDataframe": [
{
"dataframeName": "df",
"variableInventory": [
"A",
"B"
]
}
],
}
数据框对象在 ProvONE 下具有以下 RDF 表示形式。请注意,根节点是 provone:Port。
数据框对象可以附加到与其关联的 provone:Port。例如,以下 SDTL 从文件加载数据帧,然后读取在新命令中使用该数据帧。
{
"$type": "Load",
"command": "Load",
"fileName": "df.csv",
"software": "csv",
"producesDataframe": [
{
"dataframeName": "df",
"variableInventory": [
"A",
"B"
]
}
]
},
{
"$type": "Compute",
"command": "Compute",
"consumesDataframe": [
{
"dataframeName": "df",
"variableInventory": [
"A",
"B"
]
}
],
"producesDataframe": [
{
"dataframeName": "df",
"variableInventory": [
"A",
"B"
]
}
]
}
请注意,在这种情况下,第二个数据帧port/4
具有与port/2
相同的属性。这并不意味着两个数据帧相同。其变量的状态可能不同。这个模型没有兴趣询问它们有何不同。
ProvONE 模型可以扩展以包含 SDTL 的其他属性。这样做可以提供有关每个命令中发生的情况的更多上下文。每个 SDTL 命令对于命令类型都有不同的元数据结构。
例如,KeepCases 命令有一个名为condition 的属性。
renames 命令有一个名为 renames 的属性。
这些都附在命令级provone:程序中,如下图
看起来provone:代表命令的程序也可以是SDTL CommandBase。这允许更无缝的混合查询,
provone:Program 又是什么 sdlt:Load?
provone: 到 sdtl:Load 类型的所有命令的端口是什么?
具有 X 属性的 sdt:Load 命令的输入 provone:Ports 是什么?
所提出的模型将 sdtl:CommandBase 对象转换为 provone:Program 对象,将数据帧表示附加到其 provone:Port 对象,并将选定的 SDTL 属性附加到 provone:Program。
该模型允许使用 ProvONE 通过脚本查询数据流。可以使用 SDTL 语言查询其他 SDTL 对象(SourceInformation、表达式等),以确定有关相关命令的更多信息。