لقد تم إهمال هذا العمل من خلال نموذج بيانات SDTH، والذي يمكن الاستعلام عنه من حيث المفاهيم.
يمر هذا المستودع عبر نموذج بيانات 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. لا تزال السلحفاة هي الأسهل في التحليل بالعين المجردة، لذا فإن الأمثلة الموجودة في هذا المستند متوفرة في السلحفاة. الأمثلة الموجودة في الدليل examples/
موجودة باللغتين Turtle وJSON-LD.
نظرًا لأن النموذج يتمحور حول استعلامات ProvONE التي تستهدف أسئلة حول تدفق البيانات، فإن البنية الأساسية هي في الغالب ProvONE.
يتمتع ProvONE بالقدرة على تمثيل سير العمل ومجموعات عمليات التنفيذ، provone:Workflow
& provone:Exection
. تُستخدم هذه بشكل شائع لتمثيل تنفيذ سلسلة من البرامج النصية، أو وجود سلسلة. لاحظ أن هذه غير مرتبة.
سيكون لكل تمثيل ProvONE بنية خارجية مماثلة لتمثيل مجموعة البرامج النصية. يجمع المصدر المحتمل كل عقدة تمثل البرنامج النصي تحت بروفون: سير العمل؛ يجمع المصدر بأثر رجعي كل عقدة تنفيذ البرنامج النصي تحت بروفون: التنفيذ.
سيكون لكل نموذج محتمل provone:Program الذي يمثل البرنامج النصي الذي تم تحليله بواسطة C2Metadata وprovone:Workflow الذي ينتمي إليه البرنامج النصي. كل بروفون على مستوى البرنامج النصي: يتم إرفاق البرنامج بسير العمل.
خذ بعين الاعتبار ملفين مصدريين في حزمة بيانات واحدة. يحتوي كائن provone:Workflow
واحد على كلا العقدتين اللتين تمثلان الملف.
سيكون لكل نموذج بأثر رجعي provone:Execution الذي يمثل التنفيذ الافتراضي للبرنامج النصي الذي تم تحليله بواسطة C2Metadata. سيتم إرفاق كل كائن provone:Execution الذي يمثل برنامجًا نصيًا بالمستوى الأعلى provone:Execution
يتم وصف المصدر بأثر رجعي بالمثل. ومع ذلك، في هذه الحالة، لا يوجد نوع محدد للإشارة إلى "مجموعة" من عمليات الإعدام. بدلاً من ذلك، يمكن استخدام WasPartOf للدلالة على التجميع.
يتم تعريف الأوامر داخل ملف البرنامج النصي باستخدام كائنات provone:Program
و provone:Execution
. الكائنات التي تصف تدفق البيانات بين هذه الكائنات هي provone:Port
القياسي و provone:Entity
.
يمكن إعادة صياغة ذلك: تتم ترجمة كل كائن SDTL له فئة CommandBase الأساسية إلى provone:Program أو provone:Execution. بدلاً من ذلك: يتم تعيين كل كائن كائن JSON موجود في صفيف "أوامر" SDTL إلى provone:Program أو provone:Execution.
لاحظ أنه على الرغم من أنه قد يتم طلب SDTL فيما يتعلق بتنفيذ الأمر، إلا أن ProvONE لا يحتوي على كائن يمكنه تشفير الطلب.
ترتبط الأوامر بـ provone على مستوى البرنامج النصي:Program عبر provone:hasSubProgram
. خذ على سبيل المثال برنامجًا نصيًا يحتوي على أربعة أوامر بداخله. تم تصميمها في ProvONE على النحو التالي:
استخدم تدفق البيانات في ProvONE المحتمل provone:Port
و provone:Workflow
. على سبيل المثال، خذ بعين الاعتبار مقتطف SDTL هذا الذي يمثل أمر "تحميل". لاحظ أن الأمر موجود في مصفوفة "الأوامر".
"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"
]
}
],
}
يحتوي كائن إطار البيانات على تمثيل RDF التالي ضمن ProvONE. لاحظ أن العقدة الجذرية هي provone:Port.
يمكن إرفاق كائنات إطار البيانات بمنفذ provone: المنفذ المرتبط به. خذ على سبيل المثال، 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 على خاصية تسمىالحالة.
يحتوي أمر إعادة التسمية على خاصية تسمى إعادة التسمية.
يتم إرفاق كل هذه العناصر ببرنامج provone على مستوى الأوامر، الموضح أدناه
يبدو أن البرنامج الذي يمثل أمرًا يمكن أن يكون أيضًا SDTL CommandBase. وهذا يسمح باستعلامات مختلطة أكثر سلاسة،
ما هو provone:البرنامج الذي يعد أيضًا sdlt:Load؟
ما هي المنافذ: المنافذ لجميع الأوامر من النوع sdtl:تحميل؟
ما هي منافذ الإدخال: المنافذ إلى الأمر sdt:Load مع خاصية X؟
يقوم النموذج المقترح بتحويل كائنات sdtl:CommandBase إلى كائنات provone:Program، وإرفاق تمثيل إطار البيانات بكائنات provone:Port الخاصة به، وإرفاق خصائص SDTL المحددة إلى provone:Program.
يسمح هذا النموذج بالاستعلام عن تدفق البيانات من خلال البرنامج النصي باستخدام ProvONE. يمكن الاستعلام عن كائنات SDTL الإضافية (SourceInformation، والتعبير، وما إلى ذلك) باستخدام لغة SDTL لتحديد مزيد من المعلومات حول الأمر المعني.