كيفية كتابة استعلام SPARQL الذي يطابق حرفية السلسلة بكفاءة مع تجاهل حالة الأحرف

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

  •  11-12-2019
  •  | 
  •  

سؤال

أنا أستخدم Jena ARQ لكتابة استعلام SPARQL مقابل علم الوجود الكبير الذي تتم قراءته من Jena TDB من أجل العثور على الأنواع المرتبطة بالمفاهيم بناءً على تصنيف rdfs:

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> "aspirin" .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
}

يعمل هذا بشكل جيد جدًا وهو في الواقع سريع جدًا (أقل من ثانية واحدة).لسوء الحظ، بالنسبة لبعض المصطلحات، أحتاج إلى إجراء هذا الاستعلام بطريقة غير حساسة لحالة الأحرف.على سبيل المثال، لأن التسمية "Tylenol" هو في الأنطولوجيا، ولكن لا "tylenol", ، يظهر الاستعلام التالي فارغًا:

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> "tylenol" .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
}

يمكنني كتابة نسخة غير حساسة لحالة الأحرف من هذا الاستعلام باستخدام بناء جملة FILTER كما يلي:

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> ?term .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
 FILTER ( regex (str(?term), "tylenol", "i") )
}

ولكن الآن يستغرق الاستعلام أكثر من دقيقة لإكماله!هل هناك أي طريقة لكتابة استعلام غير حساس لحالة الأحرف بطريقة أكثر كفاءة؟

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

المحلول

السبب في أن الاستعلام باستخدام استعلام المرشح يعمل أبطأ هو بسبب؟ المصطلح غير مناسب، فهو يتطلب مسح فهرس PSO أو POS للعثور على جميع العبارات مع RDFS: تسمية المسند وتصفيةها مقابل Regex.عندما يكون ملتزما بمورد ملموسي (في مثالك الأول)، فيمكنه استخدام مؤشر OPS أو POS للمسح الضوئي عبر العبارات فقط مع RDFS: المسند التسمي ومورد الكائنات المحددة، والذي سيكون له بطاقات أقل بكثير.

الحل الشائع لهذا النوع من مشكلة البحث عن النص هو استخدام فهرس نص خارجي.في هذه الحالة، توفر Jena فهرس نص مجاني يسمى larq ، والذي يستخدملوسين لأداء البحث وينضم إلى النتائج مع بقية الاستعلام.

نصائح أخرى

من بين جميع عوامل السلسلة الممكنة التي يمكنك استخدامها في SPARQL، regex ربما يكون أغلى واحد.قد يتم تشغيل الاستعلام الخاص بك بشكل أسرع إذا تجنبت ذلك regex وأنت تستخدم UCASE أو LCASE على جانبي الاختبار بدلا من ذلك.شيء مثل:

SELECT DISTINCT ?type WHERE {
 ?x <http://www.w3.org/2000/01/rdf-schema#label> ?term .
 ?x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type .
 FILTER (lcase(str(?term)) = "tylenol")
}

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

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