Neo4j-Cypher 대 Gremlin 쿼리 언어


102

REST API를 사용하여 Neo4j로 개발하기 시작했습니다. 복잡한 쿼리를 수행하는 데는 Cypher (Neo4j의 쿼리 언어)와 Gremlin (범용 그래프 쿼리 / 순회 언어)의 두 가지 옵션이 있음을 확인했습니다.

제가 알고 싶은 것은 다음과 같습니다. Gremlin을 사용하여 수행 할 수 있고 Cypher로는 수행 할 수없는 쿼리 또는 작업이 있습니까? 혹은 그 반대로도?

Cypher는 Gremlin보다 나에게 훨씬 더 명확 해 보이며 일반적으로 Neo4j의 사람들은 Cypher와 함께 가고있는 것 같습니다. 그러나-Cypher가 Gremlin에 비해 제한적이라면-나는 그것을 미리 알고 싶습니다.


1
Cypher는 튜링이 아닌 완전한 선언적 언어입니다. Gremlin은 Neo4j Java API에 대한 멋진 래퍼이며 필수적입니다. 분명히, gremlin에서는 할 수있는 일이 있지만 cypher에서는 할 수없는 일이 있습니다.
Prakhar Agrawal

1
Apache Spark 3에는 Cypher가 포함되어 이에 대한 견해에 대해 많이 말합니다.
Walker Rowe

답변:


77

일반적인 쿼리의 경우 Cypher로 충분하며 아마도 더 빠를 것입니다. Cypher보다 Gremlin의 장점은 높은 수준의 횡단에 들어갈 때입니다. 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이이를 해결할 것입니다.
스티븐 mallette

41

쿼리에서 수천 개의 노드를 탐색해야합니다. 사이퍼는 느 렸습니다. Neo4j 팀은 Java API에 대해 알고리즘을 직접 구현하는 것이 100-200 배 더 빠를 것이라고 말했습니다. 우리는 그렇게했고 쉽게 60을 빼 냈습니다. 현재로서는 신뢰 부족으로 인해 시스템에 단일 Cypher 쿼리가 없습니다. Easy Cypher 쿼리는 Java로 작성하기 쉽고 복잡한 쿼리는 수행되지 않습니다. 문제는 쿼리에 여러 조건이있는 경우 Cypher에서 순회를 수행 할 순서를 알 수있는 방법이 없다는 것입니다. 따라서 cypher 쿼리가 먼저 잘못된 방향으로 그래프에 표시 될 수 있습니다. 나는 Gremlin을 많이 사용하지 않았지만 Gremlin을 사용하여 훨씬 더 많은 실행 제어를 얻을 수 있다고 상상할 수 있습니다.


"Java API에 직접 반대한다"는 말은 Java에 내장 된 Neo4j를 의미합니까?
Pavel

2
독립형 서버로 설치된 neo4j 내에서 서버 확장 사용.
Heinrich

12
2018 년 업데이트-최신 버전의 neo4j에서 다양한 기본 인덱스 유형을 고려할 때이 답변은 상당히 오래되었습니다. neo4j는 성능 수치를 발표했습니다
FrobberOfBits

3
"Java API에 대해 직접 알고리즘을 구현"하는 것은 실제로 약간 오해의 소지가 있습니다. 분명히 A 지점에서 B 지점으로가는 가장 빠른 방법은 최단 경로를 이용하는 것입니다. 이를 위해서는 추가적이고 구체적인 정보를 알아야합니다. 머신이 할 수없는 가정을 할 수 있다는 것을 알고 있기 때문에 낮은 수준으로가는 것은 항상 머신 플래너보다 성능이 뛰어납니다. 그러나 Cypher는 순진하게 구현 된 저수준 알고리즘을 쉽게 능가 할 수 있으며 사용하는 데 훨씬 적은 지식이 필요하며 구현이 훨씬 빠릅니다. 특히 Cypher는 Neo4j가 출시 될 때마다 더 좋아지기 때문입니다. (스마트 한 플래너)
Tezra

29

Cypher에 대한 Neo4j 팀의 노력은 정말 인상적이며 먼 길을 왔습니다. Neo 팀은 일반적으로 사람들을 그것에 밀고 Cypher가 성숙함에 따라 Gremlin은 아마도 관심을 덜 받게 될 것입니다. Cypher는 장기적으로 좋은 선택입니다.

즉, Gremlin은 Groovy DSL입니다. Neo4j REST 엔드 포인트를 통해이를 사용하면 기본 Neo4j Java API에 완전하고 자유롭게 액세스 할 수 있습니다. 그것 (및 동일한 카테고리의 다른 스크립트 플러그인)은 낮은 수준의 전력 측면에서 일치 할 수 없습니다. 또한 Gremlin 플러그인 내에서 Cypher를 실행할 수 있습니다 .

어느 쪽이든 두 가지를 모두 배우는 건전한 업그레이드 경로가 있습니다. 나는 당신을 더 빨리 시작하고 실행하는 것과 함께 갈 것입니다. 에서 프로젝트 , 나는 일반적으로 그렘린을 사용하고 난 모두가 그렘린 DSL에 통증이 있습니다 matching- 표 결과 나 표현 패턴을 필요로 할 때 다음 (그렘린 내에서 여부) 사이퍼를 호출합니다.


20

처음에는 Gremlin을 사용하기 시작했습니다. 하지만 당시 REST 인터페이스가 약간 불안정해서 Cypher로 전환했습니다. Neo4j를 훨씬 더 잘 지원합니다. 그러나 Cypher에서는 불가능하거나 Cypher가 Gremlin으로 할 수있는 방식으로 최적화 할 수없는 쿼리 유형이 있습니다.

Gremlin은 Groovy를 기반으로 구축되었으므로 실제로 Neo4j가 'Java'코드를 실행하고 REST 인터페이스에서 HTTP 히트를 가져 오지 않고도 서버에서 다양한 작업을 수행하도록하는 일반적인 방법으로 사용할 수 있습니다. 무엇보다도 Gremlin을 사용하면 데이터를 수정할 수 있습니다.

그러나 내가 원하는 모든 것이 데이터를 쿼리하는 것이라면 더 읽기 쉽고 유지 관리하기 쉽기 때문에 Cypher를 사용합니다. Gremlin은 제한에 도달했을 때의 대안입니다.


1
Cypher는 Neo4j 1.7부터 쿼리 업데이트를 지원합니다. docs.neo4j.org/chunked/snapshot/cypher-query-lang.html
Peter Neubauer

3
REST 인터페이스는 TinkerPop 3에서 사라질 것입니다. 사용자는 Gremlin의 문자열을 Gremlin 서버 (기본적으로 Rexster, 이름이 변경되고 개선됨)로 보내야합니다.
jbmusso 2014 년

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 2014

3
아, 물론 neo4django가 즉시 적용 가능할 것이라고는 생각하지 않습니다. SQL Alchemy가 답변에 있었던 것처럼 예였습니다. 그러나 Cypher를 생성하는 것이 어렵다는 것은 사실이 아닙니다 . 사이퍼와 그렘린은 쿼리 언어와 같은 다른 접근 방식을 가지고,하지만 난 사이퍼는 ... 프로그램 생성하는 모든 어렵 표시되지 않습니다
매트 Luongo

8

Cypher는 간단한 쿼리에만 작동합니다. 복잡한 비즈니스 로직을 그래프 순회에 통합하기 시작하면 속도가 엄청나게 느려지거나 완전히 작동하지 않습니다.

Neo4J 분명히 그들은 또한 대체 경로 확장기 (포함 APOC 절차를 제공하기 때문에 사이퍼이 그것을 절단되지 않는 것을 알고 apoc.path.expand, apoc.path.subgraphAll등).

Gremlin은 배우기가 더 어렵지만 Cypher 및 APOC보다 강력합니다. Gremlin에서 생각할 수있는 모든 논리를 구현할 수 있습니다.

Neo4J가 토글 가능한 Gremlin 서버와 함께 제공되기를 바랍니다. 라이브 Neo4J 인스턴스에 대해 Gremlin을 실행할 수 있지만 많은 농구를 뛰어 넘습니다. 내 희망은 Neo4J의 경쟁자들이 Gremlin을 옵션으로 허용했기 때문에 Neo4J가 그 뒤를 따를 것이라는 것입니다.


1
neo4j는 세계에서 가장 인기있는 그래프 DB이기 때문에 아직 gremlin을 채택하지 않은 이유가있을 것 같습니다.
Luk Aron

1
그 이유가 무엇인지 공유하지 않았기 때문에 귀하의 의견에 아무런 가치가 없습니다
user1302130

4

Cypher는 그래프 데이터베이스 쿼리를위한 선언적 쿼리 언어입니다. 선언적이라는 용어는 명령형과 같은 프로그래밍 패러다임과는 다른 프로그래밍 방식이기 때문에 중요합니다.

Cypher 및 SQL과 같은 선언적 쿼리 언어에서는 기본 엔진에 가져 오려는 데이터를 알리고 데이터를 가져 오는 방법을 지정하지 않습니다.

Cypher에서 사용자는 MATCH 절에서 관심있는 하위 그래프를 정의합니다. 그런 다음 기본 엔진은 패턴 일치 알고리즘을 실행하여 그래프 데이터베이스에서 유사한 하위 그래프 발생을 검색합니다.

Gremlin은 선언적 기능과 명령 적 기능입니다. 사용자가 그래프를 탐색하는 방법에 대해 명시적인 지침을 제공해야하는 그래프 순회 언어입니다.

이 경우 이러한 언어의 차이점은 Cypher에서 Kleene 별 연산자를 사용하여 그래프 데이터베이스에서 주어진 두 노드 사이의 경로를 찾을 수 있다는 것입니다. 그러나 Gremlin에서는 이러한 모든 경로를 명시 적으로 정의해야합니다. 그러나 Gremlin에서 반복 연산자를 사용하여 그래프 데이터베이스에서 이러한 명시 적 경로의 여러 항목을 찾을 수 있습니다. 그러나 Cypher에서는 명시 적 구조에 대한 반복을 수행 할 수 없습니다.


3

gremlin을 사용하면 다른 그래프 데이터베이스로 마이그레이션 할 수 있습니다. 대부분의 그래프 데이터베이스는 gremlin 순회를 지원하므로 gremlin을 선택하는 것이 좋습니다.


2

Long answer short : 쿼리에는 cypher를 사용하고 순회에는 gremlin을 사용합니다. 응답 타이밍을 직접 확인할 수 있습니다.


그렇게하는 방법 ?
Optimus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.