وسباركل النفي:كل foaf:العوامل التي لا foaf:الأشخاص

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

  •  06-07-2019
  •  | 
  •  

سؤال

أنا أحاول أن أكتب وسباركل الاستعلام التي ينبغي أن تعطيني كل 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 . })
}

مثال حي الروابط:

  1. الاستعلام الحل

  2. تعريف الاستعلام

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