2013-02-11 33 views
9

के बीच सभी रूट प्राप्त करें मैं एक परियोजना पर काम कर रहा हूं जहां मुझे ग्राफ से निपटना होगा ... मैं दो स्टॉप के बीच बस और बाइक द्वारा मार्ग प्राप्त करने के लिए एक ग्राफ का उपयोग कर रहा हूं।दो नोड्स neo4j

तथ्य यह है कि, मेरे सभी रिश्तों में रिश्ते और अंत के प्रारंभ बिंदु से जाने के लिए आवश्यक समय शामिल है।

नोड के बीच सबसे छोटा रास्ता पाने के लिए, मैं साइफर का सबसे छोटा पथ कार्य कर रहा हूं। लेकिन कुछ, सबसे छोटा रास्ता सबसे तेज नहीं है ....

क्या दो नोड्स के बीच सभी मार्गों को रिश्ते से जुड़े नहीं होने का कोई तरीका है?

धन्यवाद

संपादित करें:

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

साइफर का सबसे छोटा पाथ फ़ंक्शन उस पथ को देता है जिसमें कम संबंध होता है। मैं चाहता हूं कि यह पथ लौटाए जहां सभी प्रकार (समय) का जोड़ा सबसे छोटा .. क्या यह संभव है?

धन्यवाद

+0

क्या आपको साइफर का उपयोग करने की आवश्यकता है? मैं कुछ gremlin स्क्रिप्ट्स के बारे में सोच सकता हूं जो इसे प्रिंट करेंगे जो बहुत साफ दिखना चाहिए। – Nicholas

+0

असल में मैं nodeJs का उपयोग कर रहा हूं .. और मेरे पास मेरे neo4j ग्राफ से पूछने के लिए एक लाइब्रेरी है जो मुझे कुछ साइफर क्वेरी करने की अनुमति देती है ... और gremlin क्वेरी नहीं ... –

उत्तर

11

बीजलेख में, दो नोड्स एक रिश्ते से जुड़े हुए नहीं है, और तरह एक वजन में कुल द्वारा बीच सभी रास्तों को पाने के लिए, आप को कम समारोह 1.9 में पेश उपयोग कर सकते हैं:

start a=node(...), b=node(...) // get your start nodes 
match p=a-[r*2..5]->b // match paths (best to provide maximum lengths to prevent queries from running away) 
where not(a-->b) // where a is not directly connected to b 
with p, relationships(p) as rcoll // just for readability, alias rcoll 
return p, reduce(totalTime=0, x in rcoll: totalTime + x.time) as totalTime 
order by totalTime 

आप फेंक कर सकते हैं एक अंत में 1 को सीमित करें, अगर आपको केवल सबसे छोटी आवश्यकता है।

+0

'रिश्ते से जुड़े दो नोड्स के बीच सभी पथ प्राप्त करने' का क्या मतलब है? नोड्स के बीच एक पथ कैसे बनाया जा सकता है यदि वे संबंधों से जुड़े नहीं हैं? –

+0

सीधे जुड़े नहीं, मेरा मतलब था। (यह भी ध्यान दें, यह बहुत पुराना है ... वाक्यविन्यास इन दिनों भी नहीं चलाएगा)। ऐसा करने के कुछ बेहतर तरीकों के लिए कृपया 3.0 में एपोक देखें। –

4

आप डिज्कस्ट्रा/Astar एल्गोरिथ्म, जो आप के लिए एक सही फिट हो रहा है उपयोग कर सकते हैं। http://api.neo4j.org/1.8.1/org/neo4j/graphalgo/GraphAlgoFactory.html

दुर्भाग्यवश आप साइफ़र से उन लोगों का उपयोग नहीं कर सकते हैं।

+0

हाँ, मैंने ऐसा करने के बारे में सोचा .. मैं बस जानना चाहता था कि क्या साइबर के साथ दो नोड्स के बीच सभी पथ प्राप्त करने का कोई तरीका था क्योंकि सभी संभव पथ प्राप्त करने के बाद, मैं उन्हें पार्स कर सकता हूं और सबसे तेज़ हो सकता हूं .. और साइफर का उपयोग करके उन लोगों को प्राप्त करना मेरे लिए आसान होगा क्योंकि मैं ' node4s के साथ neo4j का उपयोग कर .. –

+1

हालांकि पहले दो नोड्स के बीच सभी पथ प्राप्त करने के लिए और बाद में फ़िल्टर संभवतः बहुत धीमी है, क्योंकि एल्गोरिदम चालाक नहीं हो सकता है और तुरंत सर्वोत्तम पथ का चयन कर सकता है, यानी "शॉर्टकट्स" –

+6

ले लो शायद किसी भी तरह से साइफर को उन एल्गोरिदम का कुछ और खुलासा करना चाहिए। –