2014-12-20 11 views
7

के साथ केस अभिव्यक्ति मैं साइफर में तर्क लागू करने की कोशिश कर रहा हूं, जहां एक विशेष स्थिति (CASE स्टेटमेंट) के आधार पर, मैं कुछ नोड्स और रिश्ते बनाएगा; मैं एक संपत्ति के आधार पर एक संबंध बनाने के लिए कोशिश कर रहा हूँसाइफर नियो 4 जे - मेरिज

Invalid input ']': expected whitespace or a relationship pattern (line 7, column 82) "MERGE (u)-[r2:STAGE {startdate:20141225, enddate:'99999999', status:'InProgress'}]->(b2 {fork:'fail'}) RETURN 1"

असल:

MATCH (g:Game)-[:PLAYER]->(u:User)-[r1:AT]->(b1:Block)-[:NEXT]->(b2:Block) 
WHERE g.game_id='G222' and u.email_id = '[email protected]' and b1.block_id='16' 
SET r1.status='Skipped', r1.enddate=20141225 
WITH u, b2,b1, g, r1 
SET b1.test = CASE b2.fork 
WHEN 'y' THEN 
    MERGE (u)-[r2:STAGE {startdate:20141225, enddate:'99999999', status:'InProgress'}]->(b2  {fork:'fail'}) RETURN 1 
ELSE 
    MERGE (u)-[r2:STAGE {startdate:20141225, enddate:'99999999', status:'InProgress'}]->(b2) RETURN 2 
END 
WITH u, g 
MATCH (u)-[:TIME]->(h:Time)<-[:TIME]-(g) 
SET h.after = 0 
SET h.before = h.before + 1 

इस क्वेरी में नीचे के रूप में वहाँ WHEN 'y' THEN के भीतर एक merge बयान है कोड है, इस क्वेरी एक त्रुटि फेंकता यानी MERGECASE कथन के भीतर, मैंने इस काम को वापस करने की तरह काम करने के विभिन्न तरीकों की कोशिश की ताकि मामला कुछ मूल्य लौटाए। लेकिन अब तक कुछ भी काम नहीं किया है।

इस प्रश्न के साथ समस्या क्या हो सकती है?

उत्तर

11

सशर्त लेखन संचालन करने के लिए आपको FOREACH चाल का उपयोग करने की आवश्यकता है। CASE का उपयोग करके आप या तो एक तत्व सरणी या खाली एक वापस कर सकते हैं। FOREACHCASE अभिव्यक्ति पर पुनरावृत्त करता है और इसलिए सशर्त रूप से कार्रवाई निष्पादित करता है। यदि आप ELSE भाग चाहते हैं तो आपको CASE में व्यस्त स्थिति का उपयोग करके FOREACH होना चाहिए। एक उदाहरण है,

WHEN 'y' THEN 
    MERGE (u)-[r2:STAGE {startdate:20141225, enddate:'99999999', status:'InProgress'}]->(b2  {fork:'fail'}) RETURN 1 
ELSE 
    MERGE (u)-[r2:STAGE {startdate:20141225, enddate:'99999999', status:'InProgress'}]->(b2) RETURN 2 
END 

उपयोग

FOREACH(ignoreMe IN CASE WHEN 'y' THEN [1] ELSE [] END | 
    MERGE (u)-[r2:STAGE {startdate:20141225, enddate:'99999999', status:'InProgress'}]->(b2 {fork:'fail'}) 
) 
FOREACH(ignoreMe IN CASE WHEN NOT 'y' THEN [1] ELSE [] END | 
    MERGE (u)-[r2:STAGE {startdate:20141225, enddate:'99999999', status:'InProgress'}]->(b2) 
) 

देखें के बजाय भी Mark's blog post इस पर के रूप में।

+0

धन्यवाद स्टीफन, हाँ आप सही हैं, ऐसा लगता है हम foreach का उपयोग करने की जरूरत है, मैं भी StackOverflow में अपने पहले पोस्ट में से एक के रूप में भेजा, अंत में तर्क इस तरह है, बी 2, बी 1, जी, आर 1, केस जब (बी 1.फोर = 'वाई' और बी 2.फर्क = 'सफलता') या (बी 1.फोर = 'एन') या (बी 1। कांटा = 'सफलता') फिर ['ठीक'] ELSE [] END के रूप में END1 FOREACH (सर 1 में el1 | मेरिज (यू) - [आर 2: चरण {स्टार्टडेट: 20141225, एंडडेट: 99 99 99 99, स्थिति: 'इन प्रोग्रेस'}] -> (बी 2)) – deepesh

+0

अच्छी चाल है, लेकिन क्या आप समझा सकते हैं कि 'THEN [1] ELSE [] 'का अर्थ क्या है, और' अनदेखा करें '* क्या है (क्षमा करें, मैं आपको अनदेखा नहीं कर सकता) *? – ADTC

+0

ऊपर लिखे गए मार्क के ब्लॉग पोस्ट को पढ़ें। –

2

नीचे

WITH u, b2,b1, g, r1, CASE WHEN (b1.fork='y' and b2.fork='success') or (b1.fork='n') or (b1.fork='success') THEN ['ok'] ELSE [] END as array1 
FOREACH (el1 in array1 | MERGE (u)-[r2:STAGE {startdate:20141225, enddate:99999999, status:'InProgress'}]->(b2)) 

अर्थात इस्तेमाल किया मामला एक डमी सरणी एक तरह से मैचों की गिनती मिलान डमी तत्व है कि बनाने और उसके बाद जब परिणाम के माध्यम से पुनरावृति करने के लिए foreach का उपयोग के रूप में समस्या का समाधान किया।

फिर, विचार के लिए धन्यवाद स्टीफन ...

दीपेश

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