سؤال

لدي علم وجودي مع الكثير من الأفراد وأستخدم مسبب جينا للحصول على معلومات عنهم.هدفي هو إنشاء أفراد جدد بناءً على المعلومات المقدمة داخل تلك القواعد وتعيين خصائص لهم.ليس من الضروري تسمية الأفراد، ولكنهم بحاجة إلى نوع ويجب أن يكونوا جزءًا من بعض الخصائص.في الوقت الحالي يمكنني إنشاء أفراد مجهولين (بمساعدة ملف مشاركة القائمة البريدية)، ولكن لا أستطيع إلا أن أعطيهم نوع واحد، أو خاصية واحدة.

إليكم مثال صغير لمشكلتي؛تبدو قاعدتي كما يلي (يمكن العثور على الأنطولوجيا والنتيجة المستنتجة في الأسفل):

[اختبار 2:(؟X rdf:اكتب NS:Test1) ->
[(؟Y rdf:type NS:Test2) <- makeSkolem(?Y, ?X)]]

وهذا يعني أنه عند العثور على فرد Test1، يتم إنشاء عقدة فارغة جديدة ثم يتم إعطاء النوع Test2 لتلك العقدة.إنه يعمل بشكل جيد، لكني أريد أن أعطي هؤلاء الأفراد الجدد تصنيفًا ومؤشرًا (خاصية) إلى X (أفراد Test1).

شيء مثل ما يلي لا يعمل، نظرًا لأن "القواعد الخلفية تسمح بجملة رأس واحدة فقط".على الرغم من ذلك، كل شرط خاص به يعمل بشكل جيد تمامًا.

[اختبار 2:(؟X rdf:اكتب NS:Test1) ->
[(؟Y rdf:type NS:Test2), (?Y NS:hasClassification 'test'), <- makeSkolem(?Y, ?X)]]

هذه هي الأنطولوجية الخاصة بي:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns="file:/Test#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" > 
  <rdf:Description rdf:about="file:/Test#hasClassification">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#DatatypeProperty"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#TestProp">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#testInd">
    <rdf:type rdf:resource="file:/Test#Test1"/>
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#NamedIndividual"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#testInd2">
    <rdf:type rdf:resource="file:/Test#Test1"/>
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#NamedIndividual"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#Test1">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#Test2">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Ontology"/>
  </rdf:Description>
</rdf:RDF>

هذه هي النتيجة مع القاعدة الأولى (العقد الفارغة ذات المعرفات A0 و A1 هم الأفراد الجدد):

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns="file:/Test#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" > 
  <rdf:Description rdf:about="file:/Test#hasClassification">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#DatatypeProperty"/>
  </rdf:Description>
  <rdf:Description rdf:nodeID="A0">
    <rdf:type rdf:resource="file:/Test#Test2"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#TestProp">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#ObjectProperty"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#testInd">
    <rdf:type rdf:resource="file:/Test#Test1"/>
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#NamedIndividual"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#testInd2">
    <rdf:type rdf:resource="file:/Test#Test1"/>
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#NamedIndividual"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#Test1">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test#Test2">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
  </rdf:Description>
  <rdf:Description rdf:nodeID="A1">
    <rdf:type rdf:resource="file:/Test#Test2"/>
  </rdf:Description>
  <rdf:Description rdf:about="file:/Test">
    <rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Ontology"/>
  </rdf:Description>
</rdf:RDF>
هل كانت مفيدة؟

المحلول

أولاً، لاحظ أن قاعدتك لا تنفذ بالضبط ما قلته إنها تفعله.

[اختبار 2:(؟X rdf:اكتب NS:Test1) →
[(؟Y rdf:type NS:Test2) ← makeSkolem(?Y, ?X)]]

وهذا يعني أنه عند العثور على فرد Test1، يتم إنشاء عقدة فارغة جديدة ثم يتم إعطاء النوع Test2 لتلك العقدة.

تتطابق القاعدة عند العثور على مثيل لـ NS:Test1، وتضيف قاعدة تسلسل خلفية جديدة يمكن استخدامها عند تحديد ما إذا كان هناك شيء من النوع NS:Test2:إذا كان skolem من؟X، فهو يحتوي على هذا النوع.لا يعطي أي شيء من النوع NS:Test2 إلا إذا طلبت ذلك.(كتابة النموذج بأكمله، بطبيعة الحال، تتطلب مثل هذه الثلاثيات).

إذا وجدت أن هذا النوع من السلوك مقبول، فيمكنك ببساطة استخدام قاعدة التسلسل الأمامي التي تضيف قواعد تسلسل رجعية متعددة، على سبيل المثال:

[اختبار 2:
(؟X rdf:اكتب NS:Test1) →
[(؟Y rdf:type NS:Test2) ← makeSkolem(?Y, ?X)],
[(؟Y NS: hasClassification 'test') ← makeSkolem(?Y, ?X)]
]

أعتقد أن هذا أكثر تعقيدًا بعض الشيء مما يجب أن يكون.كائنات Skolem هي ببساطة كائنات يتم تحديدها بشكل فريد بواسطة بعض القيم الأخرى، لذا يمكنك استخدام makeSkolem في الشروط المسبقة للقاعدة بالإضافة إلى رأس القاعدة.هذا يعني أنه يمكنك القيام بذلك:

[اختبار 2:(؟X rdf:اكتب NS:Test1)، makeSkolem(?Y, ?X) →
(؟Y rdf:اكتب NS:Test2)، (؟Y rdf:اكتب NS:hasClassification 'test')]

تجدر الإشارة إلى أن makeSkolem يأخذ عددًا عشوائيًا من الوسائط.قد يكون من المفيد إضافة نوع من المؤشرات حتى لا تحصل بطريق الخطأ على نفس كائن skolem في أماكن متعددة.على سبيل المثال، إذا كان لديك شيء من هذا القبيل

[(؟ Child rdf:type :Child)، makeSkolem(؟mother, ?child) →
(؟ الأم rdf: النوع: الأم)، (؟ الطفل: لديه أم؟ أم)]

[(؟طفل rdf:النوع :طفل)، makeSkolem(؟الأب،؟الطفل) →
(؟ الأب rdf: النوع: أب)، (؟ الطفل: لديه أب؟ أب)]

فإنك في الواقع سوف تقوم بإنشاء فقط واحد skolem لكل طفل وتسميته أم الطفل وأبيه، وهو على الأرجح ليس ما تريده.بدلاً من ذلك، يمكنك القيام بشيء مثل:

[(؟طفل rdf:النوع :طفل)، makeSkolem(؟mother, ?child, 'mother') →
(؟ الأم rdf: النوع: الأم)، (؟ الطفل: لديه أم؟ أم)]

[(؟طفل rdf:النوع :طفل)، makeSkolem(؟الأب،؟الطفل، 'الأب') →
(؟ الأب rdf: النوع: أب)، (؟ الطفل: لديه أب؟ أب)]

منذ (?child, 'mother') و (?child, 'father') دائمًا ما تكون مختلفة، حيث تحصل على كائنين من skolem بدلاً من كائن واحد فقط.يمكنك استخدام شيء مثل هذا في قاعدتك للحصول على، على سبيل المثال،

[اختبار 2:(؟X rdf:اكتب NS:Test1)، makeSkolem(?Y, ?X, 'test2') →
(؟Y rdf: اكتب NS:Test2)، (؟Y NS: hasClassification 'test')]

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top