देखते हुए हमारे पास निम्न नियो 4j स्कीमा है (सरलीकृत लेकिन यह महत्वपूर्ण बिंदु दिखाता है)। दो प्रकार के नोड NODE
और VERSION
हैं। VERSION
एस NODE
से VERSION_OF
संबंधों के माध्यम से जुड़े हुए हैं। VERSION
नोड्स में दो गुण from
और until
हैं जो वैधता टाइमपैन को इंगित करते हैं - असीमित को इंगित करने के लिए या तो दोनों NULL
(Neo4j शर्तों में nonexistent) हो सकते हैं। NODE
एस HAS_CHILD
रिश्ते के माध्यम से जोड़ा जा सकता है। दोबारा इन रिश्तों में दो गुण from
और until
हैं जो वैधता समय सीमा को दर्शाते हैं - असीमित को इंगित करने के लिए या तो दोनों NULL
(Neo4j शर्तों में nonexistent) हो सकते हैं।नियो 4j साइफर क्वेरी नोड्स को खोजने के लिए जो बहुत धीमी नहीं हैं
संपादित: VERSION
नोड्स और HAS_CHILD
संबंधों पर वैधता दिनांक स्वतंत्र हैं (भले ही उदाहरण संयोग से पता चलता उन्हें गठबंधन जा रहा है)।
उदाहरण दो NODE
रों एक और बी को दर्शाता है। एक दो VERSION
रों AV1 6/30/17 तक और AV2 से 7/1/17 जबकि बी केवल एक संस्करण BV1 कि असीमित है शुरू कर दिया है। बी से HAS_CHILD
संबंध 6/30/17 तक रिश्ते से जुड़ा हुआ है।
अब चुनौती उन सभी नोड्स के लिए ग्राफ से पूछना है जो बच्चे (जो रूट नोड्स हैं) समय पर एक विशिष्ट पल पर नहीं हैं। ऊपर दिए गए उदाहरण को देखते हुए, क्वेरी को बी वापस करना चाहिए यदि क्वेरी दिनांक उदा। 6/1/17, लेकिन यह बी और ए वापस करना चाहिए यदि क्वेरी दिनांक उदा। 8/1/17 (क्योंकि एबी का कोई बच्चा 7/1/17 के रूप में नहीं है)।
वर्तमान क्वेरी आज मोटे तौर पर यह है कि एक के समान है:
MATCH (n1:NODE)
OPTIONAL MATCH (n1)<-[c]-(n2:NODE), (n2)<-[:VERSION_OF]-(nv2:ITEM_VERSION)
WHERE (c.from <= {date} <= c.until)
AND (nv2.from <= {date} <= nv2.until)
WITH n1 WHERE c IS NULL
MATCH (n1)<-[:VERSION_OF]-(nv1:ITEM_VERSION)
WHERE nv1.from <= {date} <= nv1.until
RETURN n1, nv1
ORDER BY toLower(nv1.title) ASC
SKIP 0 LIMIT 15
इस क्वेरी सामान्य रूप में अपेक्षाकृत ठीक काम करता है, लेकिन यह नरक के रूप में धीमी गति से हो रही है जब बड़े डेटा सेट (वास्तविक उत्पादन डेटासेट की तुलना में) पर इस्तेमाल शुरू होता है। 20-30k NODE
एस (और VERSION
एस की संख्या से दोगुना) के साथ (असली) क्वेरी मैक ओएस एक्स पर चल रहे एक छोटे डॉकर कंटेनर पर लगभग 500-700 एमएस लेती है) जो स्वीकार्य है। लेकिन 1.5 एम NODE
एस (और VERSION
एस की संख्या से दोगुना) के साथ (वास्तविक) क्वेरी एक नंगे धातु सर्वर पर 1 मिनट से थोड़ा अधिक समय लेती है (नियो 4j से कुछ और नहीं चलती)। यह वास्तव में स्वीकार्य नहीं है।
क्या हमारे पास इस क्वेरी को ट्यून करने का कोई विकल्प है? क्या NODE
के संस्करण को संभालने के बेहतर तरीके हैं (जो मुझे संदेह है कि यहां प्रदर्शन समस्या है) या रिश्तों की वैधता? मुझे पता है कि संबंध गुणों को अनुक्रमित नहीं किया जा सकता है, इसलिए इन रिश्तों की वैधता को संभालने के लिए एक बेहतर स्कीमा हो सकती है।
कोई भी मदद या यहां तक कि थोड़ी सी भी संकेत की सराहना की जाती है। answer from Michael Hunger के बाद
संपादित करें:
जड़ नोड्स का प्रतिशत:
वर्तमान उदाहरण डेटा सेट (1.5 नोड्स) परिणाम सेट 2k के बारे में अधिक पंक्तियां हैं साथ। यह 1% से कम है। पहले
MATCH
मेंITEM_VERSION
नोड:हम प्रयोग कर रहे हैं
ITEM_VERSION
nv2
परिणामITEM
नोड्स दी गई तारीख पर अन्यITEM
नोड्स कोई संबंध नहीं है कि करने के लिए सेट फिल्टर करने के लिए। इसका मतलब है कि या तो कोई संबंध मौजूद नहीं होना चाहिए जो दी गई तारीख के लिए मान्य है या कनेक्ट किए गए आइटम मेंITEM_VERSION
नहीं होना चाहिए जो दी गई तिथि के लिए मान्य है। मैं इस वर्णन करने के लिए कोशिश कर रहा हूँ:// date 6/1/17 // n1 returned because relationship not valid (nv1 ...)->(n1)-[X_HAS_CHILD ...6/30/17]->(n2)<-(nv2 ...) // n1 not returned because relationship and connected item n2 valid (nv1 ...)->(n1)-[X_HAS_CHILD ...]->(n2)<-(nv2 ...) // n1 returned because connected item n2 not valid even though relationship is valid (nv1 ...)->(n1)-[X_HAS_CHILD ...]->(n2)<-(nv2 ...6/30/17)
संबंध-प्रकार का कोई उपयोग:
समस्या यहां है कि सॉफ्टवेयर उपयोगकर्ता परिभाषित स्कीमा सुविधाओं और
ITEM
नोड्स कस्टम संबंध-प्रकार से जुड़े हुए हैं है । चूंकि हमारे रिश्ते पर कई प्रकार/लेबल नहीं हो सकते हैं, इस तरह के रिश्तों के लिए एकमात्र आम विशेषता यह है कि वे सभीX_
से शुरू होते हैं। यहां सरलीकृत उदाहरण से बाहर रखा गया है। भविष्यवाणीtype(r) STARTS WITH 'X_'
के साथ खोज रहे हैं यहां मदद करें?
वहाँ एक के बीच कोई सहसंबंध है: संस्करण नोड से और तारीखें जब तक है, और से और HAS_CHILD रिश्तों पर दिनांक तक? अगर वे संरेखित, यह बेहतर हो सकता है रिश्ते प्रासंगिक हो करने के लिए: संस्करण नोड्स। – InverseFalcon
@InverseFalcon सं रिश्ते और नोड्स पर "संस्करण" स्वतंत्र है। शायद उदाहरण यह स्पष्ट करने के लिए सबसे अच्छा नहीं है क्योंकि ** एवी 1 ** के लिए संस्करण वैधता संयोग से 'HAS_CHILD' संबंध के समान है। लेकिन ये मनमानी तिथियां हो सकती हैं। –
यदि आप जानते हैं कि आप कौन से रिला-प्रकार खोजना चाहते हैं तो आप उन्हें सभी को स्पष्ट रूप से सूचीबद्ध कर सकते हैं, जैसे- - [: X_FOO |: X_BAR *] -> ' –