2012-03-15 12 views
7

के साथ पैरामीटरेटेड SPARQL क्वेरी जेना फ्रेमवर्क, जेएसपी और जावा का उपयोग करके मैं एक छोटा सा अर्थपूर्ण वेब एप्लिकेशन बनाने की कोशिश कर रहा हूं। मेरे पास एक दूरस्थ SPARQL एंडपॉइंट है और मैंने पहले से ही एक सरल क्वेरी लिखी है जो ठीक काम करती है लेकिन अब मुझे कुछ पैरामीटर का उपयोग करने की आवश्यकता है। यहां मेरा कोड अब तक है:जेना

final static String serviceEndpoint = "http://fishdelish.cs.man.ac.uk/sparql/"; 

String comNameQuery = 
     "PREFIX fd: <http://fishdelish.cs.man.ac.uk/rdf/vocab/resource/> " + 
     "SELECT ?name ?language ?type" + 
     "WHERE { ?nameID fd:comnames_ComName ?name ;" + 
     "fd:comnames_Language ?language ;" + 
     "fd:comnames_NameType ?type ." + 
     "}"; 

Query query = QueryFactory.create(comNameQuery); 
QueryExecution qe = QueryExecutionFactory.sparqlService(serviceEndpoint,query); 

try { 
    ResultSet rs = qe.execSelect(); 
    if (rs.hasNext()) { 
     System.out.println(ResultSetFormatter.asText(rs)); 
    } 
} 
catch(Exception e) { 
    System.out.println(e.getMessage()); 
} 
finally { 
    qe.close(); 
} 

मैं पैरामीटरकृत नाम का क्या करना चाहता हूं। मैं जेना के लिए नया हूं और मुझे सच में यकीन नहीं है कि SPARQL क्वेरी में पैरामीटर का उपयोग कैसे करें। अगर कोई मेरी मदद कर सकता है तो मैं इसकी सराहना करता हूं।

+0

http://answers.semanticweb.com/questions/15237/parameterized-sparql-query-with-jena – RobV

+0

@sandra पर डुप्लिकेट किया गया था क्या इनमें से कोई भी जवाब आपके लिए काम कर रहा है? अगर किसी ने किया, तो आपको इसे दूसरों को यह बताने के लिए स्वीकार करना चाहिए कि यह उपयोगी था। –

उत्तर

6

यदि आप स्थानीय चर के लिए एक निश्चित मान रखने के लिए एक चर को प्रतिबंधित करना चाहते हैं तो आप QueryFactory.create() विधि के अधिभार के साथ ऐसा कर सकते हैं जो मान प्रतिबंधों को सेट करने के लिए QuerySolutionMap लेता है। ध्यान दें कि यह आपकी क्वेरी को परिवर्तित नहीं करता है, केवल अंतिम परिणामों को प्रतिबंधित करता है, इसलिए यह वास्तव में पैरामीटरकरण नहीं है।

यदि आप वास्तव में सच पैरामीटरयुक्त प्रश्न (यानी स्थिरांक के लिए विकल्प चर) चाहते हैं तो ARQ के आपके संस्करण के आधार पर ऐसा करने के कुछ तरीके हैं।

किसी भी मौजूदा रिलीज (2.9.0 तक) का उपयोग करने का एकमात्र तरीका स्ट्रिंग कॉन्सटेनेशन है, यानी आपकी क्वेरी में नाम होने के बजाय आप केवल वही मान डालेंगे जो आप चाहते हैं उदा। "बॉब"

नवीनतम ट्रंक (2.9.1-स्नैपशॉट आगे) का उपयोग करके एक नया पैरामीटरेटेडस्परक्लस्ट्रिंग क्लास है जो इसे और अधिक उपयोगकर्ता के अनुकूल बनाता है।

ParameterizedSparqlString queryStr = new ParameterizedSparqlString(comNameQuery); 
queryStr.setLiteral("name", "Bob"); 

Query query = QueryFactory.create(queryStr.toString()); 

और इस तथ्य के बाद से ParameterizedSparqlString एक StringBuffer शैली इंटरफ़ेस है और थोड़ा करके आपकी क्वेरी बिट के निर्माण के लिए इस्तेमाल किया जा सकता और आपकी जिज्ञासा का उपसर्ग prepending की तरह उपयोगी कार्यक्षमता भी शामिल है आप अपने कोड को आसान बनाने में कर सकते हैं में।

इस नई विधि का लाभ यह है कि यह पैरामीटरयुक्त प्रश्नों का एक अधिक सामान्य तरीका प्रदान करता है जिसे अद्यतनों के साथ भी उपयोग किया जा सकता है और मौजूदा विधियों को कवर करने वाले दूरस्थ प्रश्नों की तैयारी के लिए उपयोग करने योग्य नहीं है।

+0

धन्यवाद रॉब मैं आपके सुझावों का प्रयास करूंगा। मैं क्या करना चाहता हूं कि उपयोगकर्ता से इनपुट प्राप्त करना है उदा। एक नाम और मेरी क्वेरी में इस मान को नाम? क्या कोई अन्य ढांचा है जो इस समारोह को प्रदान करता है या जेना ढांचे की तुलना में सामान्य रूप से उपयोग करना बेहतर है? – sandra

+1

आप शायद तिल के साथ एक ही काम कर सकते हैं लेकिन मुझे विवरण नहीं पता है, जो आपके लिए सबसे अच्छा ढांचा है, इस पर निर्भर करेगा कि आपको किस प्रकार की चीजें करने की ज़रूरत है। यदि आपके पास इस उत्तर से सीधे संबंधित प्रश्न नहीं हैं तो कृपया उन्हें साइट पर नए प्रश्न पूछें ताकि वे अधिक व्यापक रूप से दिखाई दे सकें – RobV

2

आप Twinkql पर देखने का प्रयास कर सकते हैं। यह एक SPARQL-to-Java मैपिंग ढांचा है। यह जेना का पिछला अंत में उपयोग करता है, लेकिन परिणामों के स्पायरक्यूएल प्रश्नों और जावा बाध्यकारी को सरल बनाने की कोशिश करता है।

यह आप एक्सएमएल में SPARQL प्रश्नों को परिभाषित करने की अनुमति देता है:

<select id="getNovel" resultMap="novelResultMap"> 
<![CDATA[ 
    SELECT ?novel ?author 
    WHERE { 
     ?novel a <http://dbpedia.org/class/yago/EnglishNovels> ; 
      <http://dbpedia.org/property/name> "#{novelName}"@en ; 
      <http://dbpedia.org/property/author> ?author . 
    } 
]]> 
</select> 

नोट #{novelName} प्लेसहोल्डर - यह वह जगह है जहाँ पैरामीटर क्वेरी के समय में पारित किया जा सकता।

इसके अलावा, परिणाम जावा बीन्स के लिए बाध्य किया जा सकता है:

<resultMap id="novelResultMap" resultClass="org.twinkql.example.Novel"> 
    <uniqueResult>novel</uniqueResult> 
    <rowMap var="novel" varType="localName" beanProperty="name" /> 
    <rowMap var="author" varType="localName" beanProperty="author"/> 
</resultMap> 

इन प्रश्नों कॉल करने के लिए, मानकों में पारित करने के लिए, आदि यह बहुत MyBatis की तरह है एक API नहीं है, लेकिन SPARQL बजाय एसक्यूएल के लिए।