2015-10-26 4 views
13

मैं दो संस्थाओं, जीन और गुणसूत्र के बीच के रिश्ते को परिभाषित कर रहा हूँ, मैं क्या सोचता सरल और सामान्य तरीके से है में, CSV के डेटा आयात करने के बाद:neo4j चेतावनी क्यों देता है: "यह क्वेरी डिस्कनेक्ट पैटर्न के बीच एक कार्टेशियन उत्पाद बनाता है"?

MATCH (g:Gene),(c:Chromosome) 
WHERE g.chromosomeID = c.chromosomeID 
CREATE (g)-[:PART_OF]->(c); 

फिर भी, जब मैं बहुत neo4j करते हैं, (ब्राउज़र यूआई) शिकायतें:

यह क्वेरी डिस्कनेक्ट किए गए पैटर्न के बीच एक कार्टशियन उत्पाद बनाती है। यदि किसी क्वेरी के किसी हिस्से में एकाधिक डिस्कनेक्ट किए गए पैटर्न होते हैं, तो यह उन सभी भागों के बीच एक कार्टशियन उत्पाद का निर्माण करेगा। यह बड़ी मात्रा में डेटा उत्पन्न कर सकता है और क्वेरी प्रोसेसिंग धीमा कर सकता है। कभी-कभी इरादे से, अक्सर इस क्वेरी को सुधारने के लिए संभव हो सकता है जो इस क्रॉस उत्पाद के उपयोग से बचाता है, शायद अलग-अलग हिस्सों के बीच संबंध जोड़कर या वैकल्पिक मिलान का उपयोग करके (पहचानकर्ता है: (सी))।

मुझे नहीं पता कि समस्या क्या है। गुणसूत्र एक बहुत सीधी विदेशी कुंजी है।

+0

क्या आप किसी विशेष मैच और उनकी आईडी का उदाहरण दे सकते हैं? मैं आपके द्वारा बनाए जा रहे रिश्तों को देखने की कोशिश कर रहा हूं। – jgloves

+0

इसके अलावा, क्या आपके पास अन्य प्रकार के रिश्ते हैं [: PART_OF]? – jgloves

+0

यह सिर्फ एक चेतावनी है, और आपके मामले में ऐसा करने के लिए कुछ भी नहीं है (इन नोड्स के बीच संबंधों की कमी के कारण, और यह वही है जो आप इस क्वेरी में बनाते हैं!)। उपयोगकर्ता को सूचित करने के लिए neo4j ब्राउज़र में चेतावनियां 2.3 में जोड़ दी गई हैं, जब वह शायद खराब क्वेरी (यानी खराब प्रदर्शन के साथ) करते हैं। – logisima

उत्तर

20

ब्राउज़र आपको बता रहा है कि:

  1. यह हर Gene उदाहरण और हर Chromosome उदाहरण के बीच तुलना करने से आपकी क्वेरी से निपटने है यहाँ एक और सवाल कुछ संकेत देकर कैसे कार्तीय उत्पादों का अनुकूलन है। यदि आपके डीबी में G जीन और C क्रोमोसोम हैं, तो क्वेरी की जटिलता O(GC) है। उदाहरण के लिए, यदि हम मानव जीनोम के साथ काम कर रहे हैं, तो 46 गुणसूत्र और शायद 25000 जीन हैं, इसलिए डीबी को 1150000 तुलना करना होगा।
  2. आप अपनी क्वेरी को बदलकर जटिलता (और प्रदर्शन) को बेहतर बनाने में सक्षम हो सकते हैं। उदाहरण के लिए, यदि :Gene(chromosomeID) पर, और क्वेरी को बदल दिया ताकि हम प्रारंभिक रूप से छोटी सी कार्डिनिटी (46 गुणसूत्र) के साथ नोड पर मेल खा सकें, हम केवल O(G) (या 25000) "तुलना" करेंगे - और उन तुलनाओं की तुलना होगी वास्तव में त्वरित सूचकांक लुकअप हो! यह दृष्टिकोण बहुत तेज़ होना चाहिए।

    एक बार जब हम सूचकांक बनाया है, हम इस क्वेरी का उपयोग कर सकते हैं:

    MATCH (c:Chromosome) 
    WITH c 
    MATCH (g:Gene) 
    WHERE g.chromosomeID = c.chromosomeID 
    CREATE (g)-[:PART_OF]->(c); 
    

    यह पहली बार निष्पादित करने के लिए पहले MATCH खंड मजबूर करने के लिए एक WITH खंड का उपयोग करता है, कार्तीय उत्पाद से परहेज। दूसरा MATCH (और WHERE) खंड पहले MATCH खंड के परिणाम का उपयोग करता है और सूचकांक प्रत्येक गुणसूत्र के सटीक जीन को तुरंत प्राप्त करने के लिए करता है।

+0

धन्यवाद! मैं समझ गया! मेरे पास प्राथमिक कुंजी और विदेशी कुंजी दोनों चीजों को गति देने के लिए सभी आईडी पर इंडेक्स हैं, और पॉलीपेप्टाइड पर प्रोटीनमैच जैसे कुछ बड़े बड़े एक्स बड़े प्रश्न हैं, इसलिए आपके द्वारा सुझाए गए दो-चरण मैच में उन मामलों में भारी मदद मिलेगी। –

+0

रिकॉर्ड के लिए, यह समाधान था, और व्यापक रूप से क्वेरी को बढ़ा दिया। मुझे लगता है कि मैं PostgreSQL जैसे डीबी में स्वचालित क्वेरी अनुकूलन द्वारा खराब कर रहा हूं; ऐसा लगता है कि neo4j में थोड़ा और सावधान रहना चाहिए। –

3

चूंकि logisima टिप्पणियों में उल्लेख करता है, यह सिर्फ एक चेतावनी है। एक कार्टशियन उत्पाद मिलान करना धीमा है। आपके मामले में यह ठीक होना चाहिए क्योंकि आप पहले से जुड़े Gene और Chromosome नोड्स को कनेक्ट करना चाहते हैं और आप कार्टेशियन उत्पाद का आकार जानते हैं। बहुत सारे गुणसूत्र और जीन की एक छोटी संख्या नहीं है। यदि आप MATCH उदा। प्रोटीन पर जीन सवाल उड़ सकता है।

मैं चेतावनी अन्य समस्याग्रस्त क्वेरीज़ के लिए करना है लगता है:

  • अगर आप MATCH एक कार्तीय उत्पाद लेकिन आप अगर वहाँ एक रिश्ता है आप इस्तेमाल कर सकते हैं OPTIONAL MATCH
  • अगर आप MATCH करना चाहते हैं पता नहीं है दोनों एक Gene और एक Chromosome किसी भी रिश्ते के बिना, आप क्वेरी

मामले में आपकी क्वेरी बहुत समय लगता है या खत्म नहीं करता है, विभाजित करना चाहिए How to optimize Neo4j Cypher queries with multiple node matches (Cartesian Product)

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