2011-08-08 9 views
23

के बीच अंतर मैं जेना इंजन के साथ काम करना शुरू कर रहा हूं और मुझे लगता है कि मुझे अर्थशास्त्र के बारे में समझ में आया है। हालांकि मैं अलग अलग तरीकों को समझने जेना और ARQ में ट्रिपल का एक समूह का प्रतिनिधित्व करने के लिए एक मुश्किल समय हो रही है:जेना/एआरक्यू: मॉडल, ग्राफ और डेटासेट

  • पहली बात जब शुरू करते ही आप ठोकर Model है और प्रलेखन RDF रेखांकन के लिए अपने Jenas नाम का कहना है ।
  • लेकिन वहाँ भी Graph जो आवश्यक उपकरण जब मैं मॉडल का एक संघ क्वेरी करना चाहते हैं लग रहा था है, लेकिन यह है, हालांकि एक एक Model
  • से बाहर Graph प्राप्त कर सकते हैं Model के साथ एक आम इंटरफेस साझा करने के लिए प्रतीत नहीं होता
  • फिर ARQ में DataSet है, जो कि किसी प्रकार के ट्रिपल का संग्रह भी प्रतीत होता है।

निश्चित रूप से, कुछ एपीआई में चारों ओर देखकर, मुझे किसी एक तरह से दूसरे में परिवर्तित करने के तरीके मिलते हैं। हालांकि मुझे संदेह है कि एक ही चीज़ के लिए 3 अलग-अलग इंटरफेस से अधिक है।

तो सवाल यह है कि इन तीनों के बीच महत्वपूर्ण डिजाइन अंतर क्या हैं? मुझे कब उपयोग करना चाहिए? विशेष रूप से: जब मैं ट्रिपल के अलग-अलग हिस्सों को पकड़ना चाहता हूं लेकिन उन्हें एक बड़े समूह (संघ) के रूप में पूछता हूं, तो इनमें से कौन सा डेटास्ट्रक्चर का उपयोग करना चाहिए (और क्यों)? इसके अलावा, क्या मैं किसी एक से दूसरे में "कनवर्ट" करते समय कुछ भी "ढीला" करता हूं (उदाहरण के लिए model.getGraph() में model से कुछ तरीके से कम जानकारी होती है)?

उत्तर

18

जेना एक API में, एप्लिकेशन डेवलपर के लिए सिस्टम डेवलपर्स के लिए, इस तरह के भंडारण इंजन बनाने लोग, reasoners आदि

DataSet, Model, Statement, Resource और Literal के रूप में विभाजित किया गया है, और एक एसपीआई एपीआई इंटरफेस कर रहे हैं और प्रदान करते हैं आवेदन डेवलपर्स के लिए कई सुविधाएं।

DataSetGraph, Graph, Triple, Node एसपीआई इंटरफेस हैं। वे लागू करने के लिए सुंदर स्पार्टन और सरल हैं (जैसा कि आप उम्मीद करेंगे कि आपको चीजों को लागू करना है)।

एपीआई संचालन की विस्तृत विविधता एसपीआई कॉल को हल करती है। उदाहरण देने के लिए Model interface में चार अलग-अलग contains विधियां हैं। एक कॉल में आंतरिक रूप से प्रत्येक के परिणाम:

Graph#contains(Node, Node, Node) 

ऐसे

रूप
graph.contains(nodeS, nodeP, nodeO); // model.contains(s, p, o) or model.contains(statement) 
graph.contains(nodeS, nodeP, Node.ANY); // model.contains(s, p) 

Model साथ, जानकारी को खोने और के बारे में अपने प्रश्न के संबंध में Graph आप नहीं (जहाँ तक मुझे याद है) है। अधिक दिलचस्प मामला Resource बनाम Node है। Resources पता है कि वे किस मॉडल से संबंधित हैं, इसलिए आप (api में) resource.addProperty(...) लिख सकते हैं जो अंततः Graph#add बन जाता है। Node में ऐसी कोई सुविधा नहीं है, और यह किसी विशेष Graph से संबद्ध नहीं है। इसलिए Resource#asNode हानिकारक है।

अंत:

जब मैं ट्रिपल की अलग-अलग गुच्छों पकड़ लेकिन उनमें एक बड़ा गुच्छा (संघ) के रूप में क्वेरी, इन datastructures की जो मैं इस्तेमाल करना चाहिए (और क्यों) करना चाहते हैं?

आप स्पष्ट रूप से एक सामान्य उपयोगकर्ता हैं, इसलिए आप एपीआई चाहते हैं। आप ट्रिपल स्टोर करना चाहते हैं, इसलिए Model का उपयोग करें। अब आप एक संघ के रूप में मॉडल क्वेरी करना चाहते हैं: आप कर सकते थे:

  • Model#union() सब कुछ है, जो एक नए मॉडल में सभी ट्रिपल कॉपी कर देंगे।
  • ModelFactory.createUnion() सबकुछ, जो एक गतिशील संघ (यानी कोई प्रतिलिपि नहीं) बनाएगा।
  • अपने मॉडल को टीडीबी या एसडीबी डेटासेट स्टोर में नामित मॉडल के रूप में स्टोर करें, और unionDefaultGraph विकल्प का उपयोग करें।

इनमें से अंतिम मॉडल बड़ी संख्या में मॉडल और बड़े मॉडल के लिए सबसे अच्छा काम करता है, लेकिन स्थापित करने में थोड़ा और शामिल है।

+0

यह बहुत स्पष्ट किया गया है, मैंने मॉडलफैक्टरी को अनदेखा कर दिया है .createUnion() अब तक, धन्यवाद :) – Droggl

+1

इस भेद के बारे में थोड़ा और अधिक: http://willware.blogspot.com/2010/02/jena-node-versus-rdfnode.html –

+0

यह भी ध्यान देने योग्य है कि न तो ट्रिपल न ही नोड (या क्वाड) वास्तविक इंटरफेस हैं, लेकिन कक्षाएं हैं। – Ruben

12

संक्षिप्त उत्तर: Model सिर्फ एक स्टेटलेस रैपर है जिसमें Graph के आसपास कई सुविधा विधियां हैं। ModelFactory.createModelForGraph(Graph) एक मॉडल में एक ग्राफ लपेटता है। Model.getGraph() लपेटा ग्राफ प्राप्त करता है।

अधिकांश एप्लिकेशन प्रोग्रामर Model का उपयोग करेंगे। व्यक्तिगत रूप से मैं Graph का उपयोग करना पसंद करता हूं क्योंकि यह आसान है। मुझे Model कक्षा पर सभी क्रॉफ्ट को याद करने में परेशानी है।

Dataset कई Model एस का संग्रह है: एक "डिफ़ॉल्ट मॉडल" और शून्य या अधिक "नामित मॉडल"। यह SPARQL में "आरडीएफ डेटासेट" की धारणा से मेल खाता है। (तकनीकी रूप से बोलते हुए, SPARQL "आरडीएफ ग्राफ्स" के लिए एक क्वेरी भाषा नहीं है, लेकिन "आरडीएफ डेटासेट्स" के लिए जो आरडीएफ ग्राफ्स के साथ-साथ एक डिफ़ॉल्ट ग्राफ का संग्रह भी हो सकता है।)

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