سؤال

لقد قمت بإنشاء أصل فئة وهو فئة فرعية من http://schema.org/CreativeWork الأصول لديها 2 الفئات الفرعية تقول المادة والنشر

الآن أود أن يكون حالات المادة فقط أو فئة النشر.الأصول هي فئة مجردة.

عندما أطبع البيانات الوصفية للمقالة أو المنشور ، فأنا أيضا تريد طباعة نوع الأصل.في هذه الحالة سيكون مقال أو منشور.

أقوم بتشغيل الاستعلام التالي

SELECT ?id ?title ?type
WHERE
{
   ?asset rdf:type Asset ;
          somePrefix:id ?id ;
          somePrefix:title ?title ;
          rdf:type ?type .
}

الآن بدلا من نوع الطباعة كما المادة أو المنشور لكل الأصول أحصل على قيم متعددة في ردف:نوع.مثال

 id  title                    Type
 1   this is a article        CreativeWork
 1   this is a article        Asset
 1   this is a article        Article
 2   this is a publication    CreativeWork
 2   this is a publication    Asset
 2   this is a publication    Article

أريد بطريقة ما طباعة المقالة أو المنشور فقط في عمود النوع

كيف يمكنني تحقيق ذلك ?

هل كانت مفيدة؟

المحلول

كما أفهمك، فإن التسلسل الهرمي لفصلك هو:

CreativeWork
  Asset
    Article
    Publication

لديك عدد قليل من الخيارات.

الحصول لا شيء سوى المادة والنشر

أبسطها هو أن تقول أنك تريد فقط أن تأخذ في الاعتبار القيم من النوع "المقال" و"النشر"، وفي هذه الحالة يمكنك تحديد ذلك باستخدام قيم:

SELECT ?id ?title ?type
WHERE
{
   values ?type { Article Publication }
   ?asset rdf:type Asset ;
          somePrefix:id ?id ;
          somePrefix:title ?title ;
          rdf:type ?type .
}

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

الحصول كل شيء إلا العمل الإبداعي والأصول

بالطبع، يمكنك تحديد فئات فرعية أخرى لاحقًا، وقد لا ترغب في إضافة المزيد من الأنواع إلى ملف قيم حظر في كل مرة تفعل ذلك.قد تفكر ببساطة في تصفية العمل الإبداعي والأصول، ثم:

SELECT ?id ?title ?type
WHERE
{
   ?asset rdf:type Asset ;
          somePrefix:id ?id ;
          somePrefix:title ?title ;
          rdf:type ?type .
   filter ( ?type != Asset && ?type != CreativeWork )
}

يمكنك أيضًا إجراء هذا الفلتر باستخدام:

filter ( ?type NOT IN ( Asset, CreativeWork ) )

الحصول على فئات محددة فقط

هذا لا يقدم أي ضمان بشأن الفئات التي تنتمي إليها استطاع ومع ذلك، وإذا قمت لاحقًا بإضافة فئات فرعية للمقالة أو المنشور، على سبيل المثال، JournalArticle ⊑ Article، فستحصل على نتائج تتضمن كلاً من Article وJournalArticle، وقد لا ترغب في ذلك.ما قد تريده بدلاً من ذلك هو الفصل "الأكثر تحديدًا" للفرد.أي أنك تريد الفئة C للفرد بحيث لا يمتلكها الفرد آخر اكتب د ⊑ ج.(نلاحظ أن آخر هناك أهمية، منذ C ⊑ C.) تم التقاط الفكرة العامة كيفية الحصول على أقل قسم فرعي شائع في علم الوجود باستخدام SPARQL Query؟, ، إلى جانب بعض الأسئلة الأخرى، ولكن من السهل إعادة إنتاج الجزء المهم هنا:

SELECT ?id ?title ?type
WHERE
{
   ?asset rdf:type Asset ;
          somePrefix:id ?id ;
          somePrefix:title ?title ;
          rdf:type ?type .

   filter not exists {                    # Don't take ?type as a result if
      ?asset rdf:type ?subtype .          # ?asset has some other ?subtype 
      ?subtype rdfs:subClassOf* ?type .   # that is a subclass of ?type 
      filter ( ?subtype != ?type )        # (other than ?type itself).
   }
}

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

نصائح أخرى

أنت تحصل على هذا الإخراج ، لأن أصولك كلها أصول وأعمال إبداعية ، ويمكن أن تكون أيضا مقالات أو منشورات.إذا كنت ترغب فقط في طباعة الفئات الفرعية للأصل ، فيمكنك استخدام الاستعلام التالي لتقييد قيم ?type (نفس لك مع خط إضافي):

SELECT ?id ?title ?type
WHERE
{
     ?asset rdf:type Asset ;
            somePrefix:id ?id ;
            somePrefix:title ?title ;
            rdf:type ?type .
     ?type rdfs:subClassOf Asset . 
}

أين rdfs هي بادئة مساحة الاسم لـ http://www.w3.org/2000/01/rdf-schema#.
وهذا يعني أن ?type يجب أن تكون فئة فرعية من الأصول فقط.

القيد الأول (?asset rdf:type Asset) ليست هناك حاجة في الواقع ، ولكن أترك الأمر من أجل الوضوح ، لأن لديك في الاستعلام الأولي الخاص بك.يمكنك تخطي بأمان على الرغم من.

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