SPARQL سؤال، حدد كل شيء ما عدا الأشياء التي تطابق؟

StackOverflow https://stackoverflow.com/questions/375589

  •  22-08-2019
  •  | 
  •  

سؤال

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

وأود أن يكون لديك:

<bob> <spouse> <alice>
<bob> <likes> <red>
<alice> <likes> <red>
<carl> <spouse> <dorothy>
<carl> <likes> <blue>
<dorothy> <likes> <yellow>
<eric> <spouse> <fannie>
<eric> <likes> <black>

ما الاستعلام الذي يختار كارل واريك، ولكن ليس بوب؟ نقاط المكافأة إذا يمكنك اختيار اللون الأزرق والأسود في نفس الاستعلام. أن اختيار بوب يكون ببساطة:

select ?husband ?color where {?husband <spouse> ?wife . ?husband <likes> ?color . ?wife <likes> ?color}

ما أنا أبحث عنه هو:

select ?husband ?color where {?husband <spouse> ?wife . ?husband <likes> ?color . NOT (?wife <likes> ?color)}

ولكن من الواضح أن هذا غير صحيح. فما هو الصحيح؟

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

المحلول

وإجابة واحدة صحيحة وجدت من خلال مصادر أخرى هو شيء من هذا القبيل:

select ?husband ?color where {?husband <spouse> ?wife . ?husband <likes> ?color . OPTIONAL {?wife <likes> ?wifecolor FILTER (?wifecolor = ?color)} FILTER (!BOUND(?wifecolor))}

وعلى الأقل يعمل لاريك، لكنني لم اختبار كارل.

نصائح أخرى

وهناك طريقة أسهل وأكثر طبيعية للقيام بذلك في SPARQL 1.1 (لكنه يعادل الحل الاختياري / الالتزام):

SELECT ?husband ?color 
WHERE {
    ?husband <spouse> ?wife .
    ?husband <likes> ?color .
    FILTER NOT EXISTS {?wife <likes> ?color}
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top