2012-04-16 8 views
6

मैं जेना की अनुमान क्षमताओं का उपयोग करना चाहता हूं, लेकिन जब मैं इंफमोडेल का उपयोग कर रहा हूं तो मुझे कुछ प्रदर्शन समस्याएं आ रही हैं।जेना: डेटा/प्रदर्शन समस्याओं का अनुमान कैसे लगाएं

गुण::

hasX   (Ranges(intersection): X, inverse properties: isXOf) 
|-- hasSpecialX (Ranges(intersection): X, inverse properties: isSpecialXOf) 

isXOf   (Domains(intersection): X, inverse properties: hasX) 
|--isSpecialXOf (Domains(intersection): X, inverse properties: hasSpecialX) 

इसके अलावा वहाँ एक वर्ग 'वस्तु' है:

Object hasSpecialX some X 

स्पष्ट रूप से संग्रहीत किया जाता है निम्नलिखित डेटा:

यहाँ मेरी सत्तामीमांसा का एक सरलीकृत अवलोकन दिया गया है

SomeObject a Object 
SomeX a X 
SomeObject hasSpecialX SomeX 

निम्न क्वेरी का उपयोग करके मैं यह निर्धारित करना चाहता हूं कि एक वर्ग किस उदाहरण से संबंधित है। धारणाओं के अनुसार, केवल 'SomeObject' वापस किया जाना चाहिए।

SELECT ?x WHERE { ?x :hasX :SomeX . } 

हालांकि, ds.getDefaultModel() के खिलाफ क्वेरी करने से काम नहीं करता है, क्योंकि डेटा स्पष्ट रूप से संग्रहीत नहीं है। जब मैं दूसरी ओर infModel का उपयोग कर रहा हूं, तो क्वेरी कभी खत्म नहीं होती है। सबसे लंबे समय तक मैं गर्भपात से 25 मिनट पहले इंतजार कर रहा था। (Triplestore लगभग 180 MB का आकार की है)

यह मेरा कोड है:

OntModel ont = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_MICRO_RULE_INF, null); 
ont.read("file:..." , "RDF/XML"); 

Reasoner reasoner = ReasonerRegistry.getOWLMicroReasoner(); 
reasoner = reasoner.bindSchema(ont); 

Dataset dataset = TDBFactory.createDataset(...); 
Model model = dataset.getDefaultModel(); 

InfModel infModel = ModelFactory.createInfModel(reasoner, model); 

QueryExecution qe = null; 
ResultSet rs; 

try { 
    String qry = "SELECT ?x WHERE { ?x :hasX :SomeX . }"; 
    qe = QueryExecutionFactory.create(qry, infModel); 
    rs = qe.execSelect(); 

    while(rs.hasNext()) { 
     QuerySolution sol = rs.nextSolution(); 
     System.out.println(sol.get("x")); 
    } 
} finally { 
    qe.close(); 
    infModel.close(); 
    model.close(); 
    dataset.close(); 
} 

क्या कोड के साथ गलत ऊपर है, वरना क्या कारण यह काम नहीं करता हो सकता है?

इसके अलावा, मैं जानना चाहता हूं कि क्या मैं प्रदर्शन को बढ़ा सकता हूं यदि मैं 'अनुमानित सिद्धांतों को ऑटोलॉजी के रूप में निर्यात करता हूं' (प्रोटेज द्वारा प्रदान किया गया)?

संपादित करें: मैं तब तक मैं गोली का उपयोग करने की कोशिश की है, लेकिन अभी भी मैं नहीं मिल सकता है किसी अनुमानित मॉडल, के रूप में मैं अपने अन्य प्रश्न में वर्णित है: OutOfMemoryError using Pellet as Reasoner। तो मैं और क्या कर सकता हूँ?

उत्तर

3

प्रदर्शन के संबंध में, डेटा को लागू करने से पहले अनुमान करना बेहतर है और जेना अनुमान तंत्र के साथ SPARQLs को नहीं करना चाहिए। आप पहले ही टीडीबी का उपयोग कर रहे हैं जो बड़े डेटासेट के लिए सही जेना घटक है।

यदि अनुमानित डेटा का उपयोग करके आपको सीधे अपेक्षित प्रदर्शन नहीं मिलता है तो मैं एक और स्केलेबल ट्रिपल स्टोर (4store या Virtuoso) पर जाने की अनुशंसा करता हूं।

+0

आपके उत्तर के लिए धन्यवाद! मुझे यकीन नहीं है कि 'डेटा डालने से पहले अनुमान कैसे करें'। क्या आप कृपया यह बता सकते हैं कि यह कैसे करें? – Pedro

+0

इसके लिए आप उदाहरण के लिए किसी भी तर्क, गोली का उपयोग कर सकते हैं। –

+0

मुझे लगता है कि मैं 'infModel.getDeductionsModel()' का उपयोग करके अनुमानित मॉडल तक पहुंच सकता हूं, लेकिन गणना करने में कुछ समय लगता है और उपरोक्त मेरे कोड के कारण प्रदर्शन समस्या शायद इसलिए है क्योंकि आंतरिक रूप से संपूर्ण डेटाबेस पर अनुमान लगाया जाता है। लेकिन जैसा कि मेरा ऑटोलॉजी अभी भी बदल रहा है, मैं भौतिक रूप से उसी टीडीबी में अनुमानित डेटा को स्टोर नहीं करना चाहता हूं। तो उस मामले में सबसे अच्छा अभ्यास क्या है? अनुमानित डेटा आम तौर पर एक अलग ट्रिपल स्टोर में संग्रहीत किया जाता है? – Pedro

संबंधित मुद्दे