وسباركل النفي:كل foaf:العوامل التي لا foaf:الأشخاص
سؤال
أنا أحاول أن أكتب وسباركل الاستعلام التي ينبغي أن تعطيني كل foaf:Agents
التي لا foaf:Persons
.
لا أرى وسيلة لتطبيق هذا اختياري/ملزمة بناء أن هذه المشكلة لأن كل خصائص مثل rdfs:subClassOf
و rdf:type
هي متعدية و انعكاسية.
حاولت هذه:
SELECT * WHERE {
?x rdf:type foaf:Agent
OPTIONAL { ?y rdf:type foaf:Person }
FILTER ( !BOUND(?y) ) }
لكن قوات الدفاع الرواندية:نوع يبدو أن تكون متعدية ، على الأقل مع جينا/أساسا/SDB.
المحلول
والسبب هذا لا يعمل لأن لديك اثنين من الارتباطات متغير منفصلة (?x
و?y
) التي لا علاقة لها في الاستعلام الخاص بك. حتى ?x
يجب أن تكون ملزمة لتظهر في مجموعة النتائج (وهو ما تريد)، ولكن إذا ?y
هو غير منضم، لم تكن قد تعلمت شيئا جديدا عن ?x
.
تحديث: في استعلام مثالي، سيكون هناك حاجة ل?y
على الإطلاق؛ هل يمكن أن اختبار edegs الواردة / الصادرة من ?x
مباشرة. هذا أمر صعب (من المستحيل؟) للقيام في SPARQL 1.0 عندما تريد معرفة ما اذا كان لا ميزة موجود على متغير معين ملزمة. ومع ذلك، فإن SPARQL 1.1 تقديم الدعم للنفي:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?agent
WHERE
{
?agent rdf:type foaf:Agent .
FILTER NOT EXISTS { ?agent rdf:type foaf:Person . }
}
نهج وKingsley Idehen في (باستخدام طرف ثالث ملحقات SPARQL) من شأنه أن يساعد على حل المشكلة على المدى القصير.
نصائح أخرى
لقيام بذلك في SPARQL 1.0، عليك أن تكتب:
SELECT * WHERE {
?x rdf:type foaf:Agent
OPTIONAL { ?y rdf:type foaf:Person . FILTER (?x = ?y) . }
FILTER ( !BOUND(?y) )
}
وفيل M يقول ، سوف SPARQL 1.1 إدخال الجملة جديدة لجعل هذا أكثر وضوحا بكثير في الكتابة.
وهنا (مشروع) SPARQL 1.1 المواصفات للنفي: HTTP: // شبكة الاتصالات العالمية. w3.org/TR/sparql11-query/#negation
وعن طريق الموهوب SPARQL الامتدادات نقطة النهاية للتحقق http://lod.openlinksw.com/sparql (اللد سحابة التخزين المؤقت مثيل)
اقتباس فقرة>SELECT distinct ?x ?o
WHERE {
?x a foaf:Agent .
?x ?p ?o.
filter (!bif:exists ((select (1) where { ?x a foaf:Person } )))
}
limit 10
DESCRIBE ?x
WHERE {
?x a foaf:Agent .
filter (!bif:exists ((select (1) where { ?x a foaf:Person } )))
}
limit 200
التالية الآن يعمل مجاملة من وسباركل 1.1:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT DISTINCT COUNT(?agent)
WHERE
{
?agent rdf:type foaf:Agent .
FILTER (NOT EXISTS { ?agent rdf:type foaf:Person . })
}
مثال حي الروابط: