قيم متعددة الحصول على المطبوعة ل ردف: نوع
سؤال
لقد قمت بإنشاء أصل فئة وهو فئة فرعية من 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
) ليست هناك حاجة في الواقع ، ولكن أترك الأمر من أجل الوضوح ، لأن لديك في الاستعلام الأولي الخاص بك.يمكنك تخطي بأمان على الرغم من.