Neo4j - Ngôn ngữ truy vấn Cypher vs Gremlin


101

Tôi đang bắt đầu phát triển với Neo4j bằng API REST. Tôi thấy rằng có hai tùy chọn để thực hiện các truy vấn phức tạp - Cypher (ngôn ngữ truy vấn của Neo4j) và Gremlin (ngôn ngữ truy vấn biểu đồ mục đích chung / ngôn ngữ truyền tải).

Đây là những gì tôi muốn biết - có bất kỳ truy vấn hoặc thao tác nào có thể được thực hiện bằng cách sử dụng Gremlin và không thể thực hiện được với Cypher không? hoặc ngược lại?

Cypher có vẻ rõ ràng hơn nhiều so với Gremlin đối với tôi, và nói chung có vẻ như những người trong Neo4j đang đi với Cypher. Nhưng - nếu Cypher bị giới hạn so với Gremlin - thì tôi thực sự muốn biết trước điều đó.


Cypher là một ngôn ngữ khai báo hoàn chỉnh không điều chỉnh. Gremlin là một trình bao bọc ưa thích đối với API Neo4j Java và là bắt buộc. Rõ ràng, có những điều có thể làm trong gremlin mà bạn không thể làm trong cypher.
Prakhar Agrawal

1
Apache Spark 3 sẽ bao gồm Cypher, nói rất nhiều về quan điểm của họ về điều đó.
Walker Rowe

Câu trả lời:


76

Đối với truy vấn chung, Cypher là đủ và có lẽ nhanh hơn. Lợi thế của Gremlin so với Cypher là khi bạn vượt qua cấp độ cao. Trong Gremlin, bạn có thể xác định rõ hơn mô hình duyệt chính xác (hoặc các thuật toán của riêng bạn) trong khi trong Cypher, công cụ cố gắng tự tìm ra giải pháp duyệt tốt nhất.

Cá nhân tôi sử dụng Cypher vì tính đơn giản của nó và cho đến nay, tôi chưa gặp bất kỳ trường hợp nào mà tôi phải sử dụng Gremlin (ngoại trừ làm việc với các hàm xuất / nhập của graphML Gremlin). Tuy nhiên, tôi mong đợi rằng ngay cả khi tôi cần sử dụng Gremlin, tôi sẽ làm như vậy cho một truy vấn cụ thể mà tôi sẽ tìm thấy trên mạng và không bao giờ quay lại nữa.

Bạn luôn có thể học Cypher thật nhanh (trong vài ngày) và sau đó tiếp tục với Gremlin chung (lâu dài hơn).


2
Có một hướng dẫn trực tuyến mới bắt đầu tại neo4j.org/learn/cypher để bạn cũng có thể bắt đầu.
Peter Neubauer

2
Tôi đã hiểu rằng Cypher giống SQL hơn, ở chỗ bạn nói với nó những gì bạn muốn và nó sẽ tìm ra cách thực hiện. Với Gremlin, bạn đưa ra các lệnh truyền tải chính xác mà nó phải tuân theo.
Stewart

2
Đối với tôi Gremlin tình cờ nhanh hơn đáng kể so với Cypher trong hầu hết các truy vấn.
Joan

9
Kể từ TinkerPop 3.x , Gremlin có cả đặc điểm bắt buộc và khai báo. Bạn có thể viết các đường truyền của mình để xác định một mẫu truyền tải chính xác như đã nêu trong câu trả lời này hoặc bạn có thể sử dụng bước đối sánh để chỉ cần xác định mẫu bạn đang tìm kiếm và Gremlin sẽ giải quyết điều đó.
stephen mallette

40

Chúng tôi phải duyệt qua hàng nghìn nút trong các truy vấn của mình. Cypher chậm chạp. Nhóm Neo4j nói với chúng tôi rằng việc triển khai thuật toán của chúng tôi trực tiếp dựa trên Java API sẽ nhanh hơn 100-200 lần. Chúng tôi đã làm như vậy và dễ dàng có được hệ số 60 trong số đó. Hiện tại, chúng tôi không có truy vấn Cypher nào trong hệ thống của mình do thiếu tự tin. Các truy vấn Easy Cypher rất dễ viết bằng Java, các truy vấn phức tạp sẽ không thực hiện được. Vấn đề là khi bạn có nhiều điều kiện trong truy vấn của mình, không có cách nào trong Cypher để cho biết thứ tự thực hiện các đường truyền. Vì vậy, truy vấn cypher của bạn có thể đi vào biểu đồ theo một hướng sai trước tiên. Tôi chưa làm được gì nhiều với Gremlin, nhưng tôi có thể tưởng tượng bạn có thể kiểm soát thực thi nhiều hơn với Gremlin.


Khi bạn nói "trực tiếp chống lại API Java", bạn có nghĩa là Neo4j được nhúng trong Java?
Pavel

2
Sử dụng phần mở rộng máy chủ trong neo4j được cài đặt như một máy chủ độc lập.
Heinrich

11
Cập nhật từ năm 2018 - với nhiều loại chỉ mục gốc trong phiên bản hiện đại của neo4j, câu trả lời này về cơ bản đã lỗi thời; neo4j đã công bố số hiệu suất
FrobberOfBits

3
"triển khai thuật toán của chúng tôi trực tiếp dựa trên Java API" thực sự có một chút sai lệch. Rõ ràng, con đường nhanh nhất để đi từ điểm A đến điểm B là con đường ngắn nhất. Điều đó đòi hỏi phải biết thông tin bổ sung, cụ thể. Lên cấp độ thấp sẽ luôn tốt hơn một người lập kế hoạch bằng máy, bởi vì bạn biết rằng bạn có thể đưa ra những giả định mà máy không làm được. Tuy nhiên, Cypher có thể dễ dàng làm tốt hơn một thuật toán cấp thấp được triển khai thuần túy, đòi hỏi ít kiến ​​thức hơn để sử dụng và thực hiện nhanh hơn nhiều. Đặc biệt là kể từ khi Cypher trở nên tốt hơn với mỗi bản phát hành Neo4j. (những người lập kế hoạch thông minh hơn)
Tezra

28

Những nỗ lực của nhóm Neo4j đối với Cypher thực sự rất ấn tượng và nó đã đi một chặng đường dài. Nhóm Neo thường đẩy mọi người về phía nó, và khi Cypher trưởng thành, Gremlin có thể sẽ ít được chú ý hơn. Cypher là một lựa chọn tốt về lâu dài.

Điều đó nói rằng- Gremlin là một DSL của Groovy. Sử dụng nó thông qua điểm cuối Neo4j REST của nó cho phép truy cập đầy đủ, không bị kiểm soát vào API Neo4j Java bên dưới. Nó (và các plugin tập lệnh khác trong cùng danh mục) không thể phù hợp về sức mạnh cấp thấp. Ngoài ra, bạn có thể chạy Cypher từ bên trong plugin Gremlin .

Dù bằng cách nào, có một lộ trình nâng cấp lành mạnh nơi bạn học cả hai. Tôi sẽ đi với cái giúp bạn thiết lập và chạy nhanh hơn. Trong các dự án của mình , tôi thường sử dụng Gremlin và sau đó gọi Cypher (từ bên trong Gremlin hoặc không) khi tôi cần kết quả dạng bảng hoặc so khớp mẫu biểu cảm - cả hai đều là một vấn đề trong Gremlin DSL.


19

Ban đầu tôi bắt đầu sử dụng Gremlin. Tuy nhiên, vào thời điểm đó, giao diện REST hơi không ổn định, vì vậy tôi đã chuyển sang Cypher. Nó hỗ trợ tốt hơn nhiều cho Neo4j. Tuy nhiên, có một số loại truy vấn không thể thực hiện được với Cypher hoặc Cypher không thể tối ưu hóa hoàn toàn theo cách bạn có thể làm với Gremlin.

Gremlin được xây dựng dựa trên Groovy, vì vậy bạn thực sự có thể sử dụng nó như một cách chung để Neo4j thực thi mã 'Java' và thực hiện các tác vụ khác nhau từ máy chủ mà không phải nhận lần truy cập HTTP từ giao diện REST. Trong số những người khác, Gremlin sẽ cho phép bạn sửa đổi dữ liệu.

Tuy nhiên, khi tất cả những gì tôi muốn là truy vấn dữ liệu, tôi sử dụng Cypher vì nó dễ đọc hơn và dễ bảo trì hơn. Gremlin là dự phòng khi đạt đến giới hạn.


1
Cypher có hỗ trợ cập nhật các truy vấn kể từ Neo4j 1.7, xem docs.neo4j.org/chunked/snapshot/cypher-query-lang.html
Peter Neubauer

2
Lưu ý rằng giao diện REST sẽ biến mất trong TinkerPop 3. Người dùng sẽ phải gửi các chuỗi Gremlin tới Máy chủ Gremlin (về cơ bản là Rexster, đã được đổi tên và cải tiến).
jbmusso

10

Các truy vấn Gremlin có thể được tạo theo chương trình. (Xem http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects để biết ý tôi.) Điều này có vẻ phức tạp hơn một chút với Cypher.


@MattLuongo: 1, tôi không biết về neo4django, 2, nó không áp dụng được trong mọi trường hợp (ví dụ: ngôn ngữ không phải là Python) 3, nó không giống nhau nếu bạn tự viết truy vấn theo chương trình hoặc bạn sử dụng thư viện để tạo truy vấn theo chương trình cho bạn. Về mặt này, neo4django có thể được coi là một giải pháp thay thế cho Cypher và Gremlin.
Tohotom

3
Ồ, tất nhiên tôi không mong đợi neo4django có thể áp dụng ngay lập tức; đó là một ví dụ, giống như SQL Alchemy trong câu trả lời của bạn. Nhưng không đúng là việc tạo Cypher khó hơn . Cypher và Gremlin thực hiện các cách tiếp cận khác nhau làm ngôn ngữ truy vấn, nhưng tôi không thấy Cypher khó tạo lập trình hơn như thế nào ...
Matt Luongo

7

Cypher chỉ hoạt động cho các truy vấn đơn giản. Khi bạn bắt đầu kết hợp logic nghiệp vụ phức tạp vào biểu đồ của mình, nó sẽ trở nên chậm chạp hoặc ngừng hoạt động hoàn toàn.

Neo4J rõ ràng biết rằng Cypher không phải là cắt nó, bởi vì họ cũng cung cấp các thủ tục APOC trong đó bao gồm một con đường nở xen kẽ ( apoc.path.expand, apoc.path.subgraphAll, vv).

Gremlin khó học hơn nhưng nó mạnh hơn Cypher và APOC. Bạn có thể triển khai bất kỳ logic nào bạn có thể nghĩ ra trong Gremlin.

Tôi thực sự ước Neo4J xuất xưởng với một máy chủ Gremlin có thể chuyển đổi (đọc xung quanh, điều này đã từng là trường hợp). Bạn có thể để Gremlin chạy với một phiên bản Neo4J trực tiếp, nhưng nó liên quan đến việc nhảy qua rất nhiều vòng. Tôi hy vọng rằng vì các đối thủ cạnh tranh của Neo4J đang cho phép Gremlin như một lựa chọn, nên Neo4J sẽ làm theo.


1
neo4j là DB đồ thị phổ biến nhất trên thế giới, tôi nghĩ có thể có lý do tại sao họ chưa áp dụng gremlin.
Luk Aron

1
vì bạn không chia sẻ những gì những lý do có thể là, tôi không thấy bất kỳ giá trị trong bình luận của bạn
user1302130

3

Cypher là một ngôn ngữ truy vấn khai báo để truy vấn cơ sở dữ liệu đồ thị. Thuật ngữ khai báo rất quan trọng vì là một cách lập trình khác với các mô hình lập trình như mệnh lệnh. Trong một ngôn ngữ truy vấn khai báo như Cypher và SQL, chúng tôi cho công cụ cơ bản biết chúng tôi muốn tìm nạp dữ liệu nào và chúng tôi không chỉ định cách chúng tôi muốn dữ liệu được tìm nạp. Trong Cypher, người dùng xác định một biểu đồ phụ quan tâm trong mệnh đề MATCH. Sau đó, công cụ cơ bản chạy một thuật toán so khớp mẫu để tìm kiếm các lần xuất hiện tương tự của đồ thị con trong cơ sở dữ liệu đồ thị. Gremlin là cả hai tính năng khai báo và mệnh lệnh. Đây là một ngôn ngữ truyền tải biểu đồ, nơi người dùng phải đưa ra các hướng dẫn rõ ràng về cách biểu đồ được điều hướng. Sự khác biệt giữa các ngôn ngữ này trong trường hợp này là trong Cypher, chúng ta có thể sử dụng toán tử sao Kleene để tìm đường dẫn giữa hai nút bất kỳ trong cơ sở dữ liệu đồ thị. Tuy nhiên, trong Gremlin, chúng ta sẽ phải xác định rõ ràng tất cả các đường dẫn như vậy. Nhưng chúng ta có thể sử dụng toán tử lặp trong Gremlin để tìm nhiều lần xuất hiện của các đường dẫn rõ ràng như vậy trong cơ sở dữ liệu đồ thị. Tuy nhiên, không thể thực hiện lặp lại các cấu trúc rõ ràng trong Cypher.


2

Câu trả lời ngắn gọn: Sử dụng cypher cho truy vấn và gremlin để duyệt. Bạn sẽ tự thấy thời gian phản hồi.


làm thế nào để làm điều đó ?
Optimus

2

Nếu bạn sử dụng gremlin, thì nó cho phép bạn di chuyển đến các cơ sở dữ liệu đồ thị khác nhau, Vì hầu hết các cơ sở dữ liệu đồ thị đều hỗ trợ truyền tải qua gremlin, nên bạn nên chọn gremlin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.