Neo4j - साइपर बनाम ग्रेमलिन क्वेरी भाषा


102

मैं नेस्ट एपीआई का उपयोग करके Neo4j के साथ विकसित करना शुरू कर रहा हूं। मैंने देखा कि जटिल प्रश्नों के प्रदर्शन के लिए दो विकल्प हैं - साइरफ (Neo4j की क्वेरी भाषा) और ग्रेमलिन (सामान्य उद्देश्य ग्राफ क्वेरी / ट्रैवर्सल भाषा)।

यहाँ मैं जानना चाहता हूँ - क्या कोई क्वेरी या ऑपरेशन है जिसे ग्रेमलिन का उपयोग करके किया जा सकता है और साइफ्रे के साथ नहीं किया जा सकता है? या ठीक इसके विपरीत?

ग्रेमलिन की तुलना में साइरफ़ मुझे बहुत अधिक स्पष्ट लगता है, और सामान्य तौर पर ऐसा लगता है कि Neo4j में लोग साइरफ के साथ जा रहे हैं। लेकिन - अगर ग्रेमलिन की तुलना में साइफ्रे सीमित है - मैं वास्तव में पहले से ही जानना चाहूंगा।


1
साइरफ एक गैर-ट्यूरिंग पूर्ण घोषणात्मक भाषा है। Gremlin Neo4j Java API पर एक फैंसी रैपर है और यह अनिवार्य है। स्पष्ट रूप से, ग्रेमलिन में वे चीजें हैं जो आप साइबरफेयर में नहीं कर सकते हैं।
प्रखर अग्रवाल

1
Apache Spark 3 में Cypher शामिल होगा, जो उस पर उनके विचार के बारे में बहुत कुछ कहता है।
वॉकर रोवे

जवाबों:


77

सामान्य क्वेरी के लिए, Cypher पर्याप्त है और संभवतः तेज है। साइफ्रे पर ग्रेमलिन का लाभ तब होता है जब आप उच्च स्तर के ट्रैवर्सिंग में पहुंच जाते हैं। ग्रेमलिन में, आप सटीक ट्रैवर्सल पैटर्न (या अपने स्वयं के एल्गोरिदम) को बेहतर ढंग से परिभाषित कर सकते हैं, जबकि साइरफ में इंजन सबसे अच्छा ट्रैवर्सिंग समाधान स्वयं खोजने की कोशिश करता है।

मैं अपनी सादगी के कारण व्यक्तिगत रूप से साइरफ का उपयोग करता हूं और आज तक, मुझे ऐसी कोई भी स्थिति नहीं मिली है जहां मुझे ग्रेमलिन का उपयोग करना पड़ा (सिवाय Gremlin graphML आयात / निर्यात कार्यों के साथ काम करने के)। मुझे उम्मीद है, हालांकि, अगर मुझे ग्रेमलिन का उपयोग करने की आवश्यकता होगी, तो भी मैं एक विशिष्ट क्वेरी के लिए ऐसा करूंगा जो मुझे नेट पर मिलेगा और फिर कभी वापस नहीं आएगा।

आप हमेशा साइफर को वास्तव में तेजी से (दिनों में) सीख सकते हैं और फिर सामान्य ग्रेमलिन (लंबे समय तक चलने वाले) के साथ जारी रख सकते हैं।


2
आपके लिए एक नया ऑनलाइन ट्यूटोरियल शुरू हो रहा है neo4j.org/learn/cypher पर आप भी जा सकते हैं।
पीटर न्यूबॉयर

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

2
मेरे लिए ग्रेमलिन ज्यादातर प्रश्नों में साइफरो की तुलना में काफी तेज था।
Joan

9
TinkerPop 3.x के रूप में , ग्रेमलिन में अनिवार्य और घोषणात्मक दोनों विशेषताएं हैं। आप इस उत्तर में बताए अनुसार सटीक ट्रैवर्सल पैटर्न को परिभाषित करने के लिए अपने ट्रैवर्सल्स लिख सकते हैं या आप जिस पैटर्न की तलाश कर रहे हैं उसे परिभाषित करने के लिए मैच स्टेप का उपयोग कर सकते हैं और इसके लिए ग्रेमलिन हल करेगा।
स्टीफन माल्ट

42

हमें अपने प्रश्नों में हजारों नोड्स का पता लगाना होगा। साइफर धीमा था। Neo4j टीम ने हमें बताया कि जावा एपीआई के खिलाफ सीधे हमारे एल्गोरिदम को लागू करना 100-200 गुना तेज होगा। हमने ऐसा किया और उसमें से 60 को आसानी से प्राप्त कर लिया। अब तक हमारे पास विश्वास की कमी के कारण हमारे सिस्टम में एक भी Cypher क्वेरी नहीं है। आसान साइरोप प्रश्न जावा में लिखना आसान है, जटिल प्रश्न प्रदर्शन नहीं करेंगे। समस्या यह है कि जब आपकी क्वेरी में कई स्थितियाँ होती हैं, तो यह बताने के लिए कोई रास्ता नहीं होता है कि किस क्रम में ट्रैवर्सल्स को प्रदर्शन करना है। तो आपकी साइबर क्वेरी पहले गलत दिशा में ग्राफ में जंगली जा सकती है। मैंने ग्रेमलिन के साथ बहुत कुछ नहीं किया है, लेकिन मैं सोच सकता हूं कि आपको ग्रेमलिन के साथ बहुत अधिक निष्पादन नियंत्रण मिलेगा।


जब आप कहते हैं "सीधे जावा एपीआई के खिलाफ" क्या आपका मतलब है कि Java में Neo4j एम्बेडेड है?
पावेल

2
एक स्टैंडअलोन सर्वर के रूप में स्थापित neo4j के भीतर सर्वर एक्सटेंशन का उपयोग करना।
हेनरिक

12
2018 से अपडेट - neo4j के आधुनिक संस्करणों में देशी सूचकांक प्रकारों की एक बड़ी श्रृंखला को देखते हुए, यह उत्तर काफी हद तक पुराना है; neo4j ने परफॉर्मेंस नंबर
FrobberOfBits

3
"जावा एल्गोरिदम के खिलाफ सीधे हमारे एल्गोरिथ्म को लागू करना" वास्तव में थोड़ा भ्रामक है। जाहिर है, बिंदु A से बिंदु B तक जाने का सबसे तेज़ तरीका सबसे छोटा रास्ता है। इसके लिए अतिरिक्त, विशिष्ट, जानकारी जानना आवश्यक है। निम्न स्तर पर जाना हमेशा एक मशीन योजनाकार को बेहतर बनाएगा, क्योंकि आप जानते हैं कि आप यह मान सकते हैं कि मशीन नहीं कर सकती। हालाँकि, साइप्रो आसानी से एक निम्न कार्यान्वित किए गए निम्न-स्तरीय एल्गोरिथ्म को आसानी से बेहतर बना सकता है, उपयोग करने के लिए बहुत कम ज्ञान की आवश्यकता होती है, और कार्यान्वित करने के लिए बहुत तेज़ होता है। खासकर जब से साइप्रो प्रत्येक Neo4j रिलीज के साथ बेहतर हो जाता है। (होशियार योजनाकारों)
Tezra

29

सिओफ़र पर Neo4j टीम के प्रयास वास्तव में प्रभावशाली रहे हैं, और यह एक लंबा सफर तय कर चुका है। नियो टीम आम तौर पर लोगों को इसकी ओर धकेलती है, और साइपर परिपक्व होने के कारण, ग्रेमलिन को शायद कम ध्यान मिलेगा। साइरफ एक अच्छा दीर्घकालिक विकल्प है।

कहा- ग्रेमलिन एक ग्रूवी डीएसएल है। इसके Neo4j REST एंडपॉइंट के माध्यम से इसका उपयोग करने से अंतर्निहित Neo4j जावा एपीआई के लिए पूर्ण, अनफ़िट हो जाती है। यह (एक ही श्रेणी में अन्य स्क्रिप्ट प्लगइन्स) निम्न-स्तरीय शक्ति के संदर्भ में मेल नहीं खा सकता है। इसके अलावा, आप ग्रेमलिन प्लगइन के भीतर से साइफ्रो चला सकते हैं ।

किसी भी तरह से, वहाँ एक अपग्रेड पथ है जहाँ आप दोनों सीखते हैं। मैं उस एक के साथ जाऊंगा जो आपको उठाता है और तेजी से दौड़ता है। में मेरी परियोजनाओं , मैं आम तौर पर दुष्टात्मा का उपयोग और उसके बाद साइफर (दुष्टात्मा के भीतर से हो या नहीं) फोन जब मैं सारणीबद्ध परिणाम या अर्थपूर्ण पैटर्न की जरूरत matching- दोनों दुष्टात्मा डीएसएल में एक दर्द कर रहे हैं।


20

मैंने शुरू में ग्रेमलिन का उपयोग शुरू किया। हालांकि, उस समय, आरईएसटी इंटरफ़ेस थोड़ा अस्थिर था, इसलिए मैंने साइफ्रे पर स्विच किया। यह Neo4j के लिए बहुत बेहतर समर्थन है। हालाँकि, कुछ प्रकार के प्रश्न हैं जो केवल साइरोप के साथ संभव नहीं हैं, या जहां साइरफ आपको ग्रेमलिन के साथ जिस तरह से अनुकूलित कर सकते हैं वह काफी अनुकूलित नहीं कर सकता है।

ग्रेमलिन ग्रूवी पर बनाया गया है, इसलिए आप वास्तव में इसे 'जावा' कोड को निष्पादित करने के लिए Neo4j प्राप्त करने के लिए एक सामान्य तरीके के रूप में उपयोग कर सकते हैं और सर्वर से विभिन्न कार्यों को निष्पादित कर सकते हैं, HTTP को REST इंटरफ़ेस से हिट किए बिना। दूसरों के बीच, ग्रेमलिन आपको डेटा को संशोधित करने देगा।

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


1
सिओफ़र के पास Neo4j 1.7 के रूप में प्रश्नों को अपडेट करने के लिए समर्थन है, देखें docs.neo4j.org/chunked/snapshot/cypher-query-lang.html
पीटर

3
ध्यान दें कि TinkerPop में REST इंटरफ़ेस दूर जा रहा है। 3. उपयोगकर्ताओं को Gremlin Gremlin Server के तार भेजने की उम्मीद की जाएगी (जो मूल रूप से Rexster है, इसका नाम बदला गया है और बेहतर है)।
jbmusso

10

ग्रेमलिन प्रश्नों को प्रोग्रामेटिक रूप से जेनरेट किया जा सकता है। (देखें http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects जो मेरा मतलब है यह जानने के लिए।) यह साइरफिक के साथ कुछ अधिक पेचीदा लगता है।


@MattLuongo: 1, मैं neo4django, 2 के बारे में नहीं जानता था, यह सभी मामलों में लागू नहीं है (उदाहरण भाषा पायथन नहीं है) 3, यह वैसा ही नहीं है यदि आप प्रोग्राम को स्वयं लिखते हैं या आप लाइब्रेरी बनाने के लिए लाइब्रेरी का उपयोग करते हैं आपके लिए प्रोग्रामेटिक रूप से क्वेरी करें। इस संबंध में neo4django को Cypher और Gremlin का वैकल्पिक समाधान माना जा सकता है।
टोटम

3
ओह, निश्चित रूप से मुझे उम्मीद नहीं है कि neo4django तुरंत लागू होगा; यह एक उदाहरण था, जैसे SQL कीमिया आपके उत्तर में थी। लेकिन यह सच नहीं है कि साइरफ उत्पन्न करना अधिक कठिन है। साइफर और ग्रेमलिन क्वेरी भाषाओं के रूप में अलग-अलग तरीके अपनाते हैं, लेकिन मैं यह नहीं देखता कि साइप्रोम प्रोग्रामेटिक रूप से उत्पन्न करने के लिए कितना कठिन है ...
मैट लूंगो

8

साइफोर केवल सरल प्रश्नों के लिए काम करता है। जब आप अपने ग्राफ ट्रैवर्सल्स में जटिल व्यावसायिक तर्क को शामिल करना शुरू करते हैं तो यह निषेधात्मक रूप से धीमा हो जाता है या पूरी तरह से काम करना बंद कर देता है।

Neo4J स्पष्ट रूप से जानता है कि साइफर यह काटने नहीं है, क्योंकि वे भी APOC प्रक्रियाओं जो एक वैकल्पिक मार्ग विस्तारक (शामिल प्रदान करते हैं apoc.path.expand, apoc.path.subgraphAll, आदि)।

ग्रेमलिन सीखना कठिन है, लेकिन यह साइफर और एपीओसी की तुलना में अधिक शक्तिशाली है। आप किसी भी तर्क को लागू कर सकते हैं जिसे आप ग्रेमलिन में सोच सकते हैं।

मैं वास्तव में चाहता हूं कि Neo4J एक टॉगल ग्रेमलिन सर्वर के साथ भेज दिया जाए (चारों ओर पढ़ने से, यह मामला हुआ करता था)। आप ग्रेमलिन को एक जीवित Neo4J उदाहरण के खिलाफ चला सकते हैं, लेकिन इसमें बहुत सारे हुप्स के माध्यम से कूदना शामिल है। मेरी आशा है कि चूंकि Neo4J के प्रतियोगी Gremlin को एक विकल्प के रूप में अनुमति दे रहे हैं, Neo4J सूट का पालन करेगा।


1
neo4j दुनिया में सबसे लोकप्रिय ग्राफ डीबी है, मुझे लगता है कि एक कारण हो सकता है कि उन्होंने अभी तक ग्रेमलिन को क्यों नहीं अपनाया है।
लुक एरोन

1
चूंकि आप उन कारणों को साझा नहीं करते हैं, इसलिए मैं आपकी टिप्पणी का कोई मूल्य नहीं देख सकता
user1302130

4

साइफर ग्राफ डेटाबेस को क्वेरी करने के लिए एक घोषणात्मक क्वेरी भाषा है। शब्द घोषणात्मक महत्वपूर्ण है क्योंकि प्रोग्रामिंग जैसे प्रतिमानों की तुलना में प्रोग्रामिंग का एक अलग तरीका है।

साइप्रिक और एसक्यूएल जैसी डिक्लेक्टिव क्वेरी भाषा में हम अंतर्निहित इंजन को बताते हैं कि हमें कौन सा डेटा लाना है और हम यह नहीं निर्दिष्ट करते हैं कि हम कैसे डेटा प्राप्त करना चाहते हैं।

साइफर में एक उपयोगकर्ता MATCH क्लॉज में रुचि के एक उप ग्राफ को परिभाषित करता है। फिर अंतर्निहित इंजन ग्राफ़ डेटाबेस में उप ग्राफ़ की समान घटनाओं की खोज के लिए एक पैटर्न मिलान एल्गोरिथ्म चलाता है।

Gremlin दोनों घोषणात्मक और अनिवार्य विशेषताएं हैं। यह एक ग्राफ ट्रैवर्सल भाषा है, जहाँ उपयोगकर्ता को यह स्पष्ट निर्देश देना होता है कि ग्राफ को कैसे नेविगेट किया जाए।

इस मामले में इन भाषाओं के बीच का अंतर यह है कि साइफ्रे में हम एक ग्राफ डेटाबेस में किसी भी दो दिए गए नोड्स के बीच पथ खोजने के लिए क्लेन स्टार ऑपरेटर का उपयोग कर सकते हैं। हालांकि ग्रेमलिन में हमें ऐसे सभी रास्तों को स्पष्ट रूप से परिभाषित करना होगा। लेकिन हम ग्राफ डेटाबेस में ऐसे स्पष्ट रास्तों की कई घटनाओं को खोजने के लिए ग्रेमलिन में एक दोहराने ऑपरेटर का उपयोग कर सकते हैं। हालांकि, साइरफोर में संभव नहीं स्पष्ट संरचनाओं पर पुनरावृत्तियां करना।


3

यदि आप ग्रेमलिन का उपयोग करते हैं, तो यह आपको अलग-अलग ग्राफ़ डेटाबेस में माइग्रेट करने की अनुमति देता है, चूंकि अधिकांश ग्राफ़ डेटाबेस ग्रेमलिन ट्रैवर्सल का समर्थन करते हैं, इसका अच्छा विचार ग्रेमलिन चुना गया।


2

लंबा उत्तर छोटा: ट्रैवर्सल के लिए क्वेरी और ग्रेमलिन के लिए साइफ्रो का उपयोग करें। आप स्वयं प्रतिक्रिया समय देखेंगे।


उसको कैसे करे ?
ऑप्टिमस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.