मैं एक नोड प्राप्त करना चाहता हूं, एक निश्चित प्रकार के सभी आउटगोइंग रिश्तों को हटाना चाहता हूं और फिर रिश्तों को वापस जोड़ना चाहता हूं।

मेरे पास समस्या यह है कि एक बार जब मैं नोड को पकड़ लेता हूं, तब भी यह हटाए जाने के बाद भी अपने पिछले संबंधों को बनाए रखता है, इसलिए 1 होने के बजाय यह जो कुछ भी है उसे दोगुना करता रहता है। 1->2->4->8 आदि

नमूना ग्राफ:

CREATE (a:Basic {name:'a'})
CREATE (b:Basic {name:'b'})
CREATE (c:Basic {name:'c'})
CREATE (a)-[:TO]->(b)
CREATE (a)-[:SO]->(c)

पिछले संबंधों को हटाने और फिर नए संबंधों में जोड़ने की क्वेरी। (यह सिर्फ एक संक्षिप्त नमूना है जहां वास्तव में यह समान संबंधों को वापस नहीं जोड़ेगा, लेकिन अधिक संभावना है कि इसे एक अलग नोड पर इंगित करें)।

MATCH (a:Basic {name:'a'})

WITH a
OPTIONAL MATCH (a)-[r:TO|SO]->()
DELETE r

WITH a
MATCH (b:Basic {name:'b'})
CREATE (a)-[:TO]->(b)

WITH a
MATCH (c:Basic {name:'c'})
CREATE (a)-[:SO]->(c) 

अगर मैं CREATE को MERGE में बदल दूं तो यह समस्या का समाधान कर देता है, लेकिन जब मुझे पता चलता है कि मैंने सभी रिश्तों को हटा दिया है तो विलय करना अजीब लगता है। क्या क्वेरी के बीच में "ए" को अपडेट करने का कोई तरीका है, इसलिए यह परिवर्तनों को दर्शाता है? मैं इसे एक प्रश्न में रखना चाहूंगा

1
GUID_33 19 फरवरी 2019, 23:58

1 उत्तर

सबसे बढ़िया उत्तर

आपने जो व्यवहार देखा वह सूक्ष्म तथ्य के कारण है कि वैकल्पिक MATCH क्लॉज ने डेटा की 2 पंक्तियाँ उत्पन्न कीं, जिसके कारण बाद के सभी ऑपरेशन दो बार किए गए।

DELETE खंड के बाद डेटा की केवल एक पंक्ति होने के लिए बाध्य करने के लिए, आप DELETE खंड के ठीक बाद WITH DISTINCT a (WITH a के बजाय) का उपयोग कर सकते हैं, जैसे:

MATCH (a:Basic {name:'a'})

OPTIONAL MATCH (a)-[r:TO|SO]->()
DELETE r

WITH DISTINCT a
MATCH (b:Basic {name:'b'})
CREATE (a)-[:TO]->(b)

WITH a
MATCH (c:Basic {name:'c'})
CREATE (a)-[:SO]->(c) 
1
cybersam 19 फरवरी 2019, 21:27