2012-10-30 34 views
5

में "सुपरनोड्स" मैं एक ऐसा एप्लीकेशन विकसित कर रहा हूं जो ग्राफ डेटाबेस (Titan) के साथ अच्छी तरह से काम कर सके, सिवाय इसके कि इसमें कई किनारों के साथ शीर्षकों के साथ समस्याएं हैं, यानी supernodesटाइटन

टाइटन के लेखकों से ब्लॉग पोस्ट पर अंक के ऊपर सुपरनोड लिंक, समस्या को हल करने का एक तरीका बताते हुए। समाधान किनारों पर फ़िल्टर करके शिखर की संख्या को कम करने लगता है।

दुर्भाग्य से मैं groupCount किनारों या शिखर के गुणों को देखना चाहता हूं। उदाहरण के लिए मेरे पास 1 मिलियन उपयोगकर्ता हैं और प्रत्येक उपयोगकर्ता एक देश से संबंधित है। मैं प्रत्येक देश में उपयोगकर्ताओं की संख्या को काम करने के लिए तेज़ groupCount कैसे कर सकता हूं?

क्या मैं अब तक इस विस्तृत ग्रूवी लिपि में दिखाया जा सकता है की कोशिश की है: (टाइटन एक "सभी" नोड्स देखने नहीं होने की खातिर)

g = TitanFactory.open('titan.properties') // Cassandra 
r = new Random(100) 
people = 1e6 

def newKey(g, name, type) { 
    return g 
     .makeType() 
     .name(name) 
     .simple() 
     .functional() 
     .indexed() 
     .dataType(type) 
     .makePropertyKey() 
} 

def newLabel(g, name, key) { 
    return g 
     .makeType() 
     .name(name) 
     .primaryKey(key) 
     .makeEdgeLabel() 
} 

country = newKey(g, 'country', String.class) 
newLabel(g, 'lives', country) 

g.stopTransaction(SUCCESS) 

root = g.addVertex() 
countries = ['AU', 'US', 'CN', 'NZ', 'UK', 'PL', 'RU', 'NL', 'FR', 'SP', 'IT'] 

(1..people).each { 
    country = countries[(r.nextFloat() * countries.size()).toInteger()] 
    g.startTransaction() 
    person = g.addVertex([name: 'John the #' + it]) 
    g.addEdge(g.getVertex(root.id), person, 'lives', [country: country]) 
    g.stopTransaction(SUCCESS) 
} 

t0 = new Date().time 

m = [:]  
root = g.getVertex(root.id) 
root.outE('lives').country.groupCount(m).iterate() 

t1 = new Date().time 

println "groupCount seconds: " + ((t1 - t0)/1000) 

मूल रूप से एक रूट नोड, कई से जुड़ा हुआ person किनारों के माध्यम से country संपत्ति है। जब मैं समूह मिल() को 1 मिलियन शिखर पर चलाता हूं, तो इसमें एक मिनट लगते हैं।

मुझे एहसास है कि टाइटन शायद प्रत्येक किनारे पर फिर से चल रहा है और गणना एकत्र कर रहा है, लेकिन क्या टाइटन या किसी अन्य ग्राफ डेटाबेस में यह तेजी से चलाने का कोई तरीका है? क्या इंडेक्स की गणना की जा सकती है, इसलिए इसे पार करना नहीं है? क्या मेरी अनुक्रमणिका सही है?

उत्तर

8

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

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

g.V.country.groupCount.cap... 

HTH, मथायस