ฉันคิดว่าคุณจะต้องการใช้แนวทางนี้แตกต่างออกไป การสืบค้นที่การดำเนินการต้องใช้ข้อมูลจากแถวก่อนหน้านั้นยากต่อการรวบรวม การไปถึงจุดที่คุณสามารถอ้างอิงข้อมูลจากสองแถวที่แตกต่างกันในเวลาเดียวกันนั้นเป็นเรื่องยาก และความสามารถในการดำเนินการแบบเดียวกันระหว่างแต่ละชุดของสองแถวก็เป็นอีกหนึ่งปัญหาที่ยาก
หากคุณมีความสัมพันธ์ระหว่างคำสั่งซื้อของคุณแทน เช่น [:ถัดไป] ระหว่างแต่ละคำสั่งซื้อจากน้อยไปหามาก อาการปวดหัวของปัญหาจะกลายเป็นเรื่องเล็กน้อย
แบบสอบถามต่อไปนี้ไม่มีการเรียงลำดับ ฉันจะปล่อยให้คุณเป็นเช่นนั้น เนื่องจากตัวอย่างของคุณแนะนำว่าวันที่ซื้ออาจอยู่ในรูปแบบสตริง ซึ่งจะเรียงลำดับไม่ถูกต้องตามที่เป็นอยู่
MATCH (o1:Order)-[:Next]->(o2:Order)-[:Contains]->(p2:Product)
WHERE NOT (o1)-[:Contains]->(p2)
WITH o1, o2, COLLECT(p2) AS NewProds
RETURN o1, o2, NewProds, SIZE(NewProds) AS NewProdCnt
ซึ่งจะส่งคืนแถวที่มีคู่คำสั่งซื้อ โดยแสดงทั้งผลิตภัณฑ์ใหม่และจำนวนผลิตภัณฑ์ใหม่ระหว่างคำสั่งซื้อแต่ละรายการ คุณสามารถลบ o1 และ/หรือ NewProds ออกจากการคืนสินค้าได้อย่างง่ายดายหากคุณไม่ต้องการ ซึ่งจะแจ้งเฉพาะคำสั่งซื้อและจำนวนผลิตภัณฑ์ใหม่ในคำสั่งซื้อนั้นเท่านั้น
ข้อบกพร่องที่ชัดเจนที่นี่คือห่วงโซ่คำสั่งซื้อแรกสุด (ซึ่งไม่มีคำสั่งซื้อก่อนหน้า) หายไป
การปรับเปลี่ยนต่อไปนี้ควรแก้ไขปัญหาดังกล่าว หากคุณต้องการ:
MATCH (o1:Order)-[:Next*0..1]->(o2:Order)-[:Contains]->(p2:Product)
WHERE (o1 = o2 AND NOT (:Order)-[:Next]->(o2) AND (o2)-[:Next]->(:Order))
OR NOT (o1)-[:Contains]->(p2)
WITH o1, o2, COLLECT(p2) AS NewProds
RETURN o1, o2, NewProds, SIZE(NewProds) AS NewProdCnt
:ความสัมพันธ์ถัดไประหว่าง o1 และ o2 เป็นทางเลือก ทำให้สามารถจับคู่กับคำสั่งซื้อที่ไม่มีลำดับก่อนหน้า แต่เราต้องนับเฉพาะเมื่อไม่มีลำดับก่อนหน้าเท่านั้น (มิฉะนั้น ทุกคำสั่งซื้อสามารถจับคู่กับตัวมันเองเป็นทั้ง o1 และ o2 แทนที่จะเป็นเพียงคำสั่งซื้อที่จุดเริ่มต้นของห่วงโซ่) และช่วยเพิ่มเงื่อนไขเพิ่มเติมหนึ่งข้อที่คำสั่งซื้อต้องมีคำสั่งซื้อถัดไป ซึ่งหมายความว่าเราจะไม่คืนสิ่งใดๆ สำหรับคำสั่งซื้อเดี่ยวๆ ซึ่งอาจต้องการได้หากความสัมพันธ์ :Next เกิดขึ้นชั่วคราวเท่านั้น หรือสร้างขึ้นอย่างรวดเร็ว (จะถูกลบออกเมื่อเสร็จสิ้น) ระหว่างคำสั่งซื้อบางคำสั่งซื้อสำหรับการเรียกใช้แบบสอบถามประเภทนี้ คุณคงไม่อยากรับคำสั่งซื้ออื่นใดที่คุณไม่สนใจ
สุดท้ายนี้ การสร้างความสัมพันธ์ :Next มีความยุ่งเหยิงไปหมดตั้งแต่เริ่มต้น บทความนี้ มีเนื้อหาที่น่าสนใจมากเกี่ยวกับการทำงานกับ Linked Lists ใน neo4j แต่ส่วนหนึ่ง ที่เกี่ยวข้องกับเราตอนนี้มีลักษณะดังนี้ (คัดลอกและวางจากบทความ):
...
WITH elem ORDER BY elem.name ASC
WITH COLLECT(elem) AS elems
FOREACH (n IN RANGE(0, LENGTH(elems)-2) |
FOREACH (prec IN [elems[n]] |
FOREACH (next IN [elems[n+1]] |
MERGE prec-[:Next]->next)))
คุณควรแทนที่ส่วนเริ่มต้นและส่วนแรกด้วยคำสั่งที่สนใจด้วยการจับคู่และการเรียงลำดับคำสั่งซื้อที่คุณสนใจ คุณจะรวบรวมและวนซ้ำรายการนั้นเพื่อสร้างความสัมพันธ์ :ถัดไป ระหว่างพวกเขา แน่นอน คุณสามารถใช้ป้ายกำกับอื่นได้ โดยเฉพาะอย่างยิ่งหากคุณมีหรือวางแผนที่จะใช้ :Next ความสัมพันธ์ระหว่างคำสั่งซื้อสำหรับกรณีการใช้งานอื่น ๆ (ซึ่งอาจทำให้ข้อความค้นหาของคุณยุ่งเหยิง และการลบความสัมพันธ์เหล่านั้นเมื่อคุณทำเสร็จแล้วอาจกำจัดออกไปโดยไม่ตั้งใจ ของความสัมพันธ์ที่ไม่เกี่ยวข้องกับป้ายกำกับเดียวกัน)
เมื่อฉันตั้งค่าความสัมพันธ์ครั้งถัดไป ฉันพบสิ่งที่น่าสงสัยโดยที่ :ความสัมพันธ์ถัดไปถูกสร้างขึ้นโดยชี้จากและไปยังโหนดเดียวกัน หากสิ่งนั้นเกิดขึ้นกับคุณ คุณจะต้องล้างมันหลังจาก :Next การสร้างความสัมพันธ์ด้วย:
MATCH (a:Order)-[r:Next]->(a)
DELETE r
และในภายหลัง หากป้ายกำกับ :Next ของคุณเป็นแบบชั่วคราว และคุณจำเป็นต้องล้างข้อมูลหลังจากที่คุณได้รับข้อมูลที่ต้องการแล้ว ให้ลบความสัมพันธ์ :Next ทั้งหมดระหว่างโหนดคำสั่งซื้อ:
MATCH (:Order)-[r:Next]-(:Order)
DELETE r
person
InverseFalcon
schedule
10.07.2016