neo4j - टिंकरपॉप ब्लूप्रिंट्स वर्टेक्स क्वेरी




orientdb titan (2)

मैं काफी समय तक टिंकरपॉप स्टैक पर शोध कर रहा हूं। मुझे लगता है कि मेरा यह अच्छा विचार है कि यह क्या कर सकता है और किस डाटाबेस में यह अच्छी तरह से काम करता है। मेरे पास अभी कुछ अलग डेटाबेस हैं जो मैं अभी सोच रहा हूं, लेकिन एक निश्चित पर फैसला नहीं किया है। इसलिए मैंने अपने कोड को इंटरफेस के लिए विशुद्ध रूप से लिखने का फैसला किया है, और अभी किसी भी कार्यान्वयन को ध्यान में नहीं रखा है। उन डेटाबेसों में से मैं देख रहा हूं, वे TransactionalGraph और KeyIndexableGraph लागू KeyIndexableGraph । मुझे लगता है कि मेरी जरूरत के लिए यह काफी अच्छा है, लेकिन मेरे पास सिर्फ एक सवाल है।

मेरे पास अलग-अलग 'कक्षाएं' हैं। ब्लूप्रिंट का उपयोग करना, मेरा मानना ​​है कि क्लास के नाम वाले प्रत्येक शीर्ष वाले क्षेत्र में फ़ील्ड होने से सबसे अच्छा प्रतिनिधित्व योग्य है। ऐसा करने से, मैं graph.getVertices("classname", "User") तरह कुछ कर सकता हूं graph.getVertices("classname", "User") और यह मुझे सभी उपयोगकर्ता कोर्टेस देगा। और क्योंकि getVertices फ़ंक्शन निर्दिष्ट करता है कि एक कार्यान्वयन को अनुक्रमित का उपयोग करना चाहिए, मुझे एक त्वरित खोज प्राप्त करने की गारंटी है (यदि मैं उस फ़ील्ड का सूचकांक)।

लेकिन हम कहते हैं कि मैं दो गुणों के आधार पर एक शीर्ष को प्राप्त करना चाहता था शिखर में className=Users और username=admin होना चाहिए उस एकल शीर्ष को खोजने के बारे में सबसे अच्छा तरीका क्या है? और क्या उन दोनों गुणों पर सूचकांक संभव है, भले ही सभी शिरकत में कोई username

एफवाईआई - मैं वर्तमान में सोच रहा हूं कि डेटाबेस, ओरिएंट डीबी, नेओ 4 जे और टाइटन हैं, लेकिन मैंने अभी तक निश्चित रूप से तय नहीं किया है। मैं अभी भी Gremlin का उपयोग करने की योजना बना रहा हूं यदि वह सभी में मदद करता है


  1. graph.getVertices() सभी पाठों के माध्यम से पुनरावृत्त होगा और उस संपत्ति वाले लोगों की तलाश करें यदि आपके पास अपने ग्राफ कार्यान्वयन में स्वत: इंडेक्स चालू नहीं है यदि आपके पास पहले से ही डेटा है और सिर्फ ऑटो-इंडेक्सर को चालू नहीं कर सकता है, तो आप का उपयोग करना चाहिए index = indexableGraph.getIndex() और उसके बाद index.get('classname', 'User')

  2. कई वस्तुओं पर एक query करना संभव है, लेकिन बिना किसी विशेष के, यह कहना मुश्किल है Neo4j वे ल्यूसीन का उपयोग करते हैं, जिसका मतलब है कि query() एक className:Users AND username:admin क्वेरी className:Users AND username:admin , जैसे className:Users AND username:admin , लेकिन मैं दूसरों के लिए बात नहीं कर सकता

उन डीबी के साथ खेलने के लिए अच्छा है, मैं व्यक्तिगत रूप से सबसे आसान होने के लिए neo4j को मिला, और जब तक आप उनके लाइसेंसिंग ढांचे को समझते हैं, तब तक आपको उन्हें इस्तेमाल करने में कोई समस्या नहीं होनी चाहिए।


"वर्ग" या "प्रकार" का उपयोग करके शिरोबिंदु का एक अच्छा तरीका उन्हें खंडित करना है करते हुए:

graph.createKeyIndex("classname",Vertex.class);
graph.getVertices("classname", "User");

एक बहुत ही सामान्य पैटर्न है और आम तौर पर एक तेजी से खोज प्राप्त करना चाहिए, यद्यपि लाखों उपयोगकर्ताओं के सूचकांक को दोहराते हुए इतने महान नहीं हो सकता है (यदि आप किसी विशेष classname को बहुत बड़े आकार में विकसित करना चाहते हैं) मुझे लगता है कि आपके प्रश्न के दूसरे भाग की ओर जाता है, दो संपत्ति देखने के लिए

सतह पर अपना उदाहरण लेना, दो तत्व लुकअप कुछ ऐसा होगा (Gremlin का प्रयोग करना):

g.V('classname',"User").has('username','admin')

इसलिए, आप एक कुंजी सूचकांक के साथ "उपयोगकर्ता" कोने के लिए कोने को संक्षिप्त करते हैं और फिर "admin" के लिए फ़िल्टर करते हैं। लेकिन, मैं इसे अलग तरीके से मॉडल करता हूं। ऐसा करना भी कम महंगा होगा:

graph.createKeyIndex("username",Vertex.class);
graph.getVertices("username", "admin");

या Gremlin में:

g.V('username','admin')

यदि आप चाहते हैं कि उपयोगकर्ता नाम पता है, तो इस मॉडल के लिए कोई बेहतर / तेज़ तरीका नहीं है। यदि आप सभी "उपयोगकर्ता" शिरोबिंदु पर पुनरावृत्त करना चाहते हैं तो आपको वास्तव में केवल classname आवश्यकता है यदि आप केवल एक (या उस username साथ ऊर्ध्वाधर का एक सेट) खोजना चाहते हैं, तो उस संपत्ति पर महत्वपूर्ण इंडेक्सिंग बेहतर तरीका है।

यहां तक ​​कि अगर मैं उस पर एक प्रमुख सूचकांक नहीं बना, मैं अभी भी एक type या सभी classname पर classname संपत्ति शामिल मुझे वैश्विक परिचालनों में मददगार लगता है, जहां मैं गति के बारे में ध्यान दे सकता हूं या नहीं, लेकिन सिर्फ एक जवाब की आवश्यकता है।