2015-12-10 8 views
7

मैं एसीएल Graph Operation और Graphs पढ़ रहा हूं, और SQL-Traverse के उपयोग के मामले के लिए कोई ठोस उदाहरण और प्रदर्शन स्पष्टीकरण नहीं मिला है।ArangoDB में, पूछताछ करेगा, फिल्टर के साथ, पड़ोसी से ओ (एन) में किया जाना चाहिए?

उदाहरण के लिए:

अगर मैं एक संग्रह है उपयोगकर्ता, जो संग्रह करने के लिए एक कंपनी संबंध कंपनी

है संग्रह कंपनी को संग्रह स्थान संबंध स्थान है;

संग्रह स्थान या तो एक शहर, देश या क्षेत्र है, और संबंध शहर, देश, क्षेत्र ही करना पड़ता है।

अब, मैं जर्मनी या यूरोपीय संघ में कंपनियों के सभी उपयोगकर्ताओं से पूछताछ करना चाहता हूं।

SELECT from Users where Users.company.location.city.country.name="Germany"; 
SELECT from Users where Users.company.location.city.parent.name="Germany"; 

या

SELECT from Users where Users.company.location.city.country.region.name="europe"; 
SELECT from Users where Users.company.location.city.parent.parent.name="europe"; 

यह मानते हुए कि Location.name अनुक्रमणित है, मैं ऊपर दो प्रश्न हैं कर सकते हैं हे (एन), साथ n दस्तावेजों की संख्या होने के साथ मार डाला स्थान (ओ (1) ग्राफ ट्रैवर्सल के लिए, ओ (एन) इंडेक्स स्कैनिंग के लिए)?

बेशक

, मैं सिर्फ regionName या COUNTRYNAME सीधे कंपनी में बचा सकता है, के रूप में इन शहरों और देशों के विपरीत में ... अन्य स्थानों, शायद नहीं बदलेगा, यूरोपीय संघ में हैं, लेकिन क्या हुआ अगर ... आप जानते हैं कि मेरा क्या मतलब है (मजाक कर रहा है, अगर मेरे पास अन्य उपयोग के मामले हैं जो निरंतर अद्यतन की आवश्यकता है)

उत्तर

4

मैं इस using the ArangoDB 2.8 Traversals को समझाऊंगा।

हम इन संग्रहों arangosh का उपयोग कर अपने शेमा मैच के लिए बनाएँ:

db._create("countries") 
db.countries.save({_key:"Germany", name: "Germany"}) 
db.countries.save({_key:"France", name: "France"}) 
db.countries.ensureHashIndex("name") 

db._create("cities") 
db.cities.save({_key: "Munich"}) 
db.cities.save({_key: "Toulouse") 

db._create("company") 
db.company.save({_key: "Siemens"}) 
db.company.save({_key: "Airbus"}) 

db._create("employees") 
db.employees.save({lname: "Kraxlhuber", cname: "Xaver", _key: "user1"}) 
db.employees.save({lname: "Heilmann", cname: "Vroni", _key: "user2"}) 
db.employees.save({lname: "Leroy", cname: "Marcel", _key: "user3"}) 

db._createEdgeCollection("CityInCountry") 
db._createEdgeCollection("CompanyIsInCity") 
db._createEdgeCollection("WorksAtCompany") 


db.CityInCountry.save("cities/Munich", "countries/Germany", {label: "beautiful South near the mountains"}) 
db.CityInCountry.save("cities/Toulouse", "countries/France", {label: "crowded city at the mediteranian Sea"}) 

db.CompanyIsInCity.save("company/Siemens", "cities/Munich", {label: "darfs ebbes gscheits sein? Oder..."}) 
db.CompanyIsInCity.save("company/Airbus", "cities/Toulouse", {label: "Big planes Ltd."}) 


db.WorksAtCompany.save("employees/user1", "company/Siemens", {employeeOfMonth: true}) 
db.WorksAtCompany.save("employees/user2", "company/Siemens", {veryDiligent: true}) 
db.WorksAtCompany.save("employees/user3", "company/Eurocopter", {veryDiligent: true}) 

AQL में हम चारों ओर इस क्वेरी अन्य तरीके से लिखते थे। हम अनुक्रमित विशेषता name पर निरंतर समय FILTER से शुरू करते हैं और वहां से हमारे ट्रैवर्सल शुरू करते हैं। वजह हम देश "जर्मनी" के लिए फ़िल्टर: अब है कि हम अपने अच्छी तरह से फ़िल्टर्ड शुरू नोड है

db._explain("FOR country IN countries FILTER country.name == 'Germany' RETURN country ") 
Query string: 
FOR country IN countries FILTER country.name == 'Germany' RETURN country 

Execution plan: 
Id NodeType  Est. Comment 
    1 SingletonNode  1 * ROOT 
    6 IndexNode   1  - FOR country IN countries /* hash index scan */ 
    5 ReturnNode   1  - RETURN country 

Indexes used: 
By Type Collection Unique Sparse Selectivity Fields  Ranges 
    6 hash countries false false  66.67 % [ `name` ] country.`name` == "Germany" 

Optimization rules applied: 
Id RuleName 
    1 use-indexes 
    2 remove-filter-covered-by-index 

, हम विपरीत दिशा में एक ग्राफ ट्रेवर्सल है।के बाद से हम जानते हैं कि Employees वास्तव में 3 चरणों शुरू वर्टेक्स से दूर हैं, और हम रास्ते में रुचि नहीं रखते हैं, हम केवल 3 परत वापसी:

db._query("FOR country IN countries FILTER country.name == 'Germany' FOR v IN 3 INBOUND country CityInCountry, CompanyIsInCity, WorksAtCompany RETURN v") 

[ 
    { 
    "cname" : "Xaver", 
    "lname" : "Kraxlhuber", 
    "_id" : "employees/user1", 
    "_rev" : "1286703864570", 
    "_key" : "user1" 
    }, 
    { 
    "cname" : "Vroni", 
    "lname" : "Heilmann", 
    "_id" : "employees/user2", 
    "_rev" : "1286729095930", 
    "_key" : "user2" 
    } 
] 

इस बारे में कुछ शब्द प्रश्नों प्रदर्शन:

  • हम एक हैश सूचकांक का उपयोग कर जर्मनी का पता लगाने निरंतर समय है ->हे (1)
  • कि हम मीटर कई रास्ते को पार करना चाहते हैं के आधार पर जहां मीटर टी है जर्मनी में में कर्मचारियों की संख्या; उनमें से प्रत्येक को निरंतर समय में पार किया जा सकता है। इस चरण में ->ओ (एम)
  • वापसी निरंतर समय में परिणाम ->हे (1)

    सभी संयुक्त हम जरूरत हे (एम) जहां हम उम्मीद करते हैं मीटर कम से कम n (कर्मचारियों की संख्या होने के लिए) जैसा कि आपके एसक्यूएल-ट्रैवर्सल में उपयोग किया जाता है।

+0

ओह, मुझे यह मिल गया है, इसलिए मुझे यह कहने की बजाय मुझे अपनी मानसिकता बदलनी चाहिए, "मुझे उन लोगों की एक सूची प्राप्त करें जिनके शहर जर्मनी है," मुझे पूछना चाहिए "जर्मनी पर एक नज़र डालें, पथ जब तक आप उपयोगकर्ताओं तक नहीं पहुंचते और मुझे वह सूची प्राप्त नहीं करते हैं "। तब क्या होगा यदि मेरे पास 1 से अधिक शर्त है (पुराने दिमाग के लिए खेद है) उन उपयोगकर्ताओं से चुनें जहां User.company.location.city.country.name = "जर्मनी" और उपयोगकर्ता.department.parent.parent = "उत्पाद विकास"; "विभाग" के साथ पदानुक्रमित हो सकता है (बस स्थान की तरह), उदा। "बैकएंड" -> "वेब विकास" -> "सॉफ्टवेयर विकास" -> "उत्पाद विकास"? – TruongSinh

+0

उपरोक्त वर्णित परिदृश्य के लिए उपयुक्त "ग्राफ चौराहे" है, और क्या यह ओ (एम + एन) है जहां एम नंबर है यदि जर्मनी में कर्मचारी और एन "उत्पाद विकास" विभाग में कर्मचारियों की संख्या है? और क्या सही कार्य 'GRAPH_COMMON_NEIGHBORS' है? – TruongSinh

+0

आप [ट्रैवर्सल भाग में फ़िल्टर विवरण] जोड़ सकते हैं (https://docs.arangodb.com/devel/Aql/GraphTraversals.html#filter-examples) और शायद इसलिए path.vertices [3 जैसे कुछ के लिए फ़िल्टर करना चाहते हैं ] .department == "उत्पाद विकास" - या यदि वह किसी अन्य संग्रह से आता है, तो आप पहले उस विभाग को 'एलईटी विभाग = (डी विभागों के लिए फ़िल्टर नाम =" उत्पाद विकास "रिटर्न डी)' – dothebart

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