Neo4j - ภาษาแบบสอบถาม Cypher เทียบกับ Gremlin


103

ฉันกำลังเริ่มพัฒนา Neo4j โดยใช้ REST API ฉันเห็นว่ามีสองตัวเลือกสำหรับการดำเนินการค้นหาที่ซับซ้อน - Cypher (ภาษาสอบถามของ Neo4j) และ Gremlin (การสืบค้นกราฟ / ภาษาการสำรวจตามวัตถุประสงค์ทั่วไป)

นี่คือสิ่งที่ฉันต้องการทราบ - มีคำถามหรือการดำเนินการใดที่สามารถทำได้โดยใช้ Gremlin และไม่สามารถทำได้ด้วย Cypher? หรือในทางกลับกัน?

Cypher ดูเหมือนจะชัดเจนสำหรับฉันมากกว่า Gremlin และโดยทั่วไปแล้วดูเหมือนว่าคนใน Neo4j จะไปกับ Cypher แต่ - ถ้า Cypher มีข้อ จำกัด เมื่อเทียบกับ Gremlin - ฉันอยากจะรู้ล่วงหน้าจริงๆ


2
ไซเฟอร์เป็นภาษาประกาศที่ไม่สมบูรณ์ Gremlin เป็นกระดาษห่อหุ้มที่สวยงามเหนือ Neo4j Java API และมีความจำเป็น เห็นได้ชัดว่ามีหลายสิ่งที่เป็นไปได้ที่จะทำในเกรมลินที่คุณไม่สามารถทำได้ในไซเฟอร์
Prakhar Agrawal

1
Apache Spark 3 จะรวม Cypher ซึ่งบอกได้มากเกี่ยวกับมุมมองของพวกเขาในเรื่องนั้น
Walker Rowe

คำตอบ:


80

สำหรับการสอบถามทั่วไป Cypher ก็เพียงพอแล้วและอาจเร็วกว่า ข้อดีของ Gremlin เหนือ Cypher คือเมื่อคุณเข้าสู่การสำรวจในระดับสูง ใน Gremlin คุณสามารถกำหนดรูปแบบการข้ามผ่านที่แน่นอนได้ดีขึ้น (หรืออัลกอริทึมของคุณเอง) ในขณะที่ใน Cypher เอ็นจิ้นจะพยายามค้นหาวิธีการเดินทางที่ดีที่สุด

ฉันใช้ Cypher เป็นการส่วนตัวเนื่องจากความเรียบง่ายและจนถึงปัจจุบันฉันไม่เคยมีสถานการณ์ใด ๆ ที่ฉันต้องใช้ Gremlin (ยกเว้นการทำงานกับฟังก์ชันการนำเข้า / ส่งออก Gremlin graphML) อย่างไรก็ตามฉันคาดหวังว่าแม้ว่าฉันจะต้องใช้ Gremlin แต่ฉันก็จะทำเช่นนั้นสำหรับคำถามเฉพาะที่ฉันพบบนอินเทอร์เน็ตและจะไม่กลับมาอีก

คุณสามารถเรียนรู้ Cypher ได้เร็วมาก (เป็นวัน) จากนั้นเรียนต่อด้วย Gremlin ทั่วไป (ระยะยาว)


2
มีบทช่วยสอนออนไลน์ใหม่เริ่มต้นที่neo4j.org/learn/cypherเพื่อให้คุณเริ่มต้นด้วย
Peter Neubauer

3
ฉันมีความเข้าใจว่า Cypher เป็นเหมือน SQL มากกว่าโดยที่คุณบอกสิ่งที่คุณต้องการและมันก็หาวิธีทำ ด้วย Gremlin คุณจะต้องออกคำสั่งการข้ามผ่านที่แน่นอนซึ่งต้องปฏิบัติตาม
Stewart

2
สำหรับฉันแล้ว Gremlin นั้นเร็วกว่า Cypher อย่างมากในการสืบค้นส่วนใหญ่
Joan

9
สำหรับTinkerPop 3.xเกรมลินมีทั้งลักษณะที่จำเป็นและประกาศ คุณสามารถเขียนการข้ามผ่านของคุณเพื่อกำหนดรูปแบบการข้ามผ่านที่แน่นอนตามที่ระบุไว้ในคำตอบนี้หรือคุณสามารถใช้ขั้นตอนการจับคู่เพื่อกำหนดรูปแบบที่คุณกำลังมองหาจากนั้น Gremlin จะแก้ปัญหานั้น
stephen mallette

42

เราต้องสำรวจหลายพันโหนดในแบบสอบถามของเรา ไซเฟอร์ช้า ทีม Neo4j บอกเราว่าการใช้อัลกอริทึมของเราโดยตรงกับ Java API จะเร็วขึ้น 100-200 เท่า เราทำได้และแยกตัวประกอบ 60 ออกมาได้อย่างง่ายดาย ณ ตอนนี้เราไม่มีแบบสอบถาม Cypher เพียงรายการเดียวในระบบของเราเนื่องจากขาดความมั่นใจ คิวรี Easy Cypher เขียนง่ายใน Java คิวรีที่ซับซ้อนจะไม่ทำงาน ปัญหาคือเมื่อคุณมีหลายเงื่อนไขในแบบสอบถามของคุณไม่มีวิธีใดใน Cypher ที่จะบอกได้ว่าจะดำเนินการข้ามผ่านอย่างไร ดังนั้นการสืบค้นแบบไซเฟอร์ของคุณอาจทำให้กราฟไปในทิศทางที่ไม่ถูกต้องก่อน ฉันไม่ได้ทำอะไรกับเกรมลินมากนัก แต่ฉันนึกภาพออกว่าคุณจะควบคุมการดำเนินการกับเกรมลินได้มากกว่านี้


เมื่อคุณพูดว่า "เทียบกับ Java API โดยตรง" คุณหมายถึง Neo4j ที่ฝังอยู่ใน Java หรือไม่?
Pavel

2
การใช้ส่วนขยายเซิร์ฟเวอร์ภายใน neo4j ที่ติดตั้งเป็นเซิร์ฟเวอร์แบบสแตนด์อโลน
Heinrich

12
อัปเดตจากปี 2018 - ด้วยประเภทดัชนีเนทีฟที่หลากหลายใน neo4j เวอร์ชันใหม่คำตอบนี้ล้าสมัยไปมาก neo4j ได้เผยแพร่ตัวเลขประสิทธิภาพ
FrobberOfBits

3
"การนำอัลกอริทึมของเราไปใช้โดยตรงกับ Java API" นั้นทำให้เข้าใจผิดเล็กน้อย เห็นได้ชัดว่าวิธีที่เร็วที่สุดในการเดินทางจากจุด A ไปยังจุด B คือการใช้เส้นทางที่สั้นที่สุด ที่ต้องรู้ข้อมูลเพิ่มเติมเฉพาะเจาะจง การไปในระดับต่ำจะทำได้ดีกว่าผู้วางแผนเครื่องจักรเสมอเพราะคุณรู้ว่าคุณสามารถตั้งสมมติฐานที่เครื่องทำไม่ได้ อย่างไรก็ตาม Cypher สามารถทำงานได้ดีกว่าอัลกอริทึมระดับต่ำที่นำมาใช้อย่างไร้เดียงสาอย่างง่ายดายต้องการความรู้ในการใช้งานน้อยกว่ามากและนำไปใช้ได้เร็วกว่ามาก โดยเฉพาะอย่างยิ่งเมื่อ Cypher ทำงานได้ดีขึ้นใน Neo4j แต่ละรุ่น (นักวางแผนที่ฉลาดกว่า)
Tezra

29

ความพยายามของทีม Neo4j เกี่ยวกับ Cypher นั้นน่าประทับใจมากและมันมาไกลมากแล้ว โดยทั่วไปทีม Neo จะผลักดันผู้คนเข้าหามันและเมื่อ Cypher เติบโตเต็มที่ Gremlin อาจได้รับความสนใจน้อยลง ไซเฟอร์เป็นทางเลือกที่ดีในระยะยาว

ที่กล่าวว่า - Gremlin เป็น Groovy DSL การใช้งานผ่านปลายทาง Neo4j REST ช่วยให้สามารถเข้าถึง Neo4j Java API ที่เป็นพื้นฐานได้อย่างเต็มที่ มัน (และปลั๊กอินสคริปต์อื่น ๆ ในหมวดหมู่เดียวกัน) ไม่สามารถจับคู่ได้ในแง่ของพลังงานระดับต่ำ นอกจากนี้คุณยังสามารถเรียกใช้Cypher จากภายในปลั๊กอินโสม

ไม่ว่าจะด้วยวิธีใดมีเส้นทางการอัปเกรดที่มีเหตุผลซึ่งคุณจะได้เรียนรู้ทั้งสองอย่าง ฉันจะไปกับสิ่งที่ช่วยให้คุณทำงานได้เร็วขึ้น ในโครงการของ ฉันฉันมักจะใช้ Gremlin แล้วโทรหา Cypher (จากใน Gremlin หรือไม่) เมื่อฉันต้องการผลลัพธ์แบบตารางหรือการจับคู่รูปแบบที่แสดงออก - ทั้งสองอย่างเป็นความเจ็บปวดใน Gremlin DSL


20

ตอนแรกฉันเริ่มใช้ Gremlin อย่างไรก็ตามในเวลานั้นอินเทอร์เฟซ REST ไม่เสถียรเล็กน้อยฉันจึงเปลี่ยนไปใช้ Cypher มีการรองรับ Neo4j ที่ดีกว่ามาก อย่างไรก็ตามมีคำถามบางประเภทที่ไม่สามารถทำได้ด้วย Cypher หรือ Cypher ไม่สามารถปรับให้เหมาะสมกับวิธีที่คุณทำได้กับ Gremlin

Gremlin สร้างขึ้นบน Groovy ดังนั้นคุณจึงสามารถใช้มันเป็นวิธีทั่วไปในการรับ Neo4j เพื่อรันโค้ด 'Java' และทำงานต่างๆจากเซิร์ฟเวอร์โดยไม่ต้องรับ HTTP hit จากอินเทอร์เฟซ REST เกรมลินจะช่วยให้คุณแก้ไขข้อมูลได้

อย่างไรก็ตามเมื่อสิ่งที่ฉันต้องการคือการสืบค้นข้อมูลฉันไปกับ Cypher เนื่องจากอ่านได้ง่ายกว่าและดูแลรักษาง่ายกว่า เกรมลินเป็นทางเลือกเมื่อถึงข้อ จำกัด


1
Cypher รองรับการอัปเดตคำค้นหาตั้งแต่ Neo4j 1.7 โปรดดูdocs.neo4j.org/chunked/snapshot/cypher-query-lang.html
Peter Neubauer

3
โปรดทราบว่าอินเทอร์เฟซ REST จะหายไปใน TinkerPop 3 ผู้ใช้คาดว่าจะส่งสตริงของ Gremlin ไปยัง Gremlin Server (ซึ่งโดยทั่วไปคือ Rexster เปลี่ยนชื่อและปรับปรุง)
jbmusso

10

สามารถสร้างข้อความค้นหาของ Gremlin ได้โดยใช้โปรแกรม (ดูhttp://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selectsเพื่อให้ทราบว่าฉันหมายถึงอะไร) ดูเหมือนว่า Cypher จะยุ่งยากกว่าเล็กน้อย


@MattLuongo: 1 ฉันไม่รู้เกี่ยวกับ neo4django, 2 มันไม่สามารถใช้ได้ในทุกกรณี (เช่นภาษาไม่ใช่ Python) 3 จะไม่เหมือนกันถ้าคุณเขียนแบบสอบถามด้วยโปรแกรมด้วยตัวเองหรือคุณใช้ไลบรารีเพื่อสร้าง ค้นหาโดยทางโปรแกรมสำหรับคุณ ในแง่นี้ neo4django ถือได้ว่าเป็นอีกทางเลือกหนึ่งของ Cypher และ Gremlin
Tohotom

3
แน่นอนฉันไม่คิดว่า neo4django จะใช้งานได้ในทันที มันเป็นตัวอย่างเช่นเดียวกับที่ SQL Alchemy อยู่ในคำตอบของคุณ แต่มันไม่เป็นความจริงว่าการสร้างศูนย์เป็นมากขึ้นยาก Cypher และ Gremlin ใช้แนวทางที่แตกต่างกันในการใช้ภาษาแบบสอบถาม แต่ฉันไม่เห็นว่า Cypher ยากที่จะสร้างโดยใช้โปรแกรมได้อย่างไร ...
Matt Luongo

8

Cypher ใช้งานได้กับข้อความค้นหาทั่วไปเท่านั้น เมื่อคุณเริ่มรวมตรรกะทางธุรกิจที่ซับซ้อนเข้ากับการสำรวจกราฟของคุณมันจะช้าลงอย่างห้ามไม่ได้หรือหยุดทำงานไปเลย

Neo4j รู้ได้อย่างชัดเจนว่าศูนย์จะไม่ตัดมันเพราะพวกเขายังมีขั้นตอนการ APOC ซึ่งรวมถึงแผ่เส้นทางอื่น ( apoc.path.expand, apoc.path.subgraphAllฯลฯ )

เกรมลินเรียนยากกว่า แต่มีพลังมากกว่า Cypher และ APOC คุณสามารถใช้ตรรกะใด ๆ ที่คุณคิดได้ในเกรมลิน

ฉันต้องการให้ Neo4J มาพร้อมกับเซิร์ฟเวอร์ Gremlin แบบสลับได้ (จากการอ่านรอบนี้เคยเป็นเช่นนั้นมาก่อน) คุณสามารถทำให้ Gremlin วิ่งแข่งกับอินสแตนซ์ Neo4J แบบสดได้ แต่มันเกี่ยวข้องกับการกระโดดผ่านห่วงจำนวนมาก ความหวังของฉันคือเนื่องจากคู่แข่งของ Neo4J ยอมให้ Gremlin เป็นตัวเลือก Neo4J ก็จะทำตาม


1
neo4j เป็นกราฟ DB ที่ได้รับความนิยมมากที่สุดในโลกฉันคิดว่าอาจมีเหตุผลว่าทำไมพวกเขาถึงยังไม่ได้ใช้ gremlin
ลูก

1
เนื่องจากคุณไม่
เปิดเผย

4

Cypher เป็นภาษาคิวรีที่เปิดเผยสำหรับการสืบค้นฐานข้อมูลกราฟ คำประกาศมีความสำคัญเนื่องจากเป็นวิธีการเขียนโปรแกรมที่แตกต่างจากกระบวนทัศน์การเขียนโปรแกรมเช่นความจำเป็น

ในภาษาเคียวรีที่เปิดเผยเช่น Cypher และ SQL เราจะบอกเอ็นจินต้นแบบว่าเราต้องการดึงข้อมูลใดและเราไม่ได้ระบุว่าเราต้องการดึงข้อมูลอย่างไร

ใน Cypher ผู้ใช้จะกำหนดกราฟย่อยที่สนใจในส่วนคำสั่ง MATCH จากนั้นเอ็นจิ้นพื้นฐานจะเรียกใช้อัลกอริธึมการจับคู่รูปแบบเพื่อค้นหาการเกิดขึ้นของกราฟย่อยที่คล้ายกันในฐานข้อมูลกราฟ

เกรมลินเป็นทั้งคุณสมบัติที่เปิดเผยและจำเป็น เป็นภาษากราฟการข้ามผ่านที่ผู้ใช้ต้องให้คำแนะนำอย่างชัดเจนเกี่ยวกับวิธีการนำทางกราฟ

ความแตกต่างระหว่างภาษาเหล่านี้ในกรณีนี้คือใน Cypher เราสามารถใช้ตัวดำเนินการ Kleene star เพื่อค้นหาเส้นทางระหว่างสองโหนดที่กำหนดในฐานข้อมูลกราฟ อย่างไรก็ตามใน Gremlin เราจะต้องกำหนดเส้นทางดังกล่าวทั้งหมดอย่างชัดเจน แต่เราสามารถใช้ตัวดำเนินการซ้ำในเกรมลินเพื่อค้นหาเส้นทางที่ชัดเจนดังกล่าวเกิดขึ้นหลายครั้งในฐานข้อมูลกราฟ อย่างไรก็ตามการทำซ้ำบนโครงสร้างที่ชัดเจนใน Cypher ไม่สามารถทำได้


3

หากคุณใช้ gremlin จะช่วยให้คุณสามารถย้ายไปยังฐานข้อมูลกราฟต่างๆได้เนื่องจากฐานข้อมูลกราฟส่วนใหญ่รองรับการส่งผ่าน gremlin จึงเป็นความคิดที่ดีที่จะเลือก gremlin


2

คำตอบแบบยาวสั้น: ใช้ cypher สำหรับการค้นหาและ gremlin สำหรับการส่งผ่าน คุณจะเห็นเวลาตอบสนองด้วยตัวคุณเอง


ทำอย่างไร?
Optimus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.