Neo4j-Cypher 대 Gremlin 쿼리 언어
REST API를 사용하여 Neo4j로 개발하기 시작했습니다. 복잡한 쿼리를 수행하는 데는 Cypher (Neo4j의 쿼리 언어)와 Gremlin (범용 그래프 쿼리 / 순회 언어)의 두 가지 옵션이 있음을 확인했습니다.
제가 알고 싶은 것은 다음과 같습니다. Gremlin을 사용하여 수행 할 수 있고 Cypher로는 수행 할 수없는 쿼리 또는 작업이 있습니까? 혹은 그 반대로도?
Cypher는 Gremlin보다 나에게 훨씬 더 명확 해 보이며 일반적으로 Neo4j의 사람들은 Cypher와 함께 가고있는 것 같습니다. 그러나-Cypher가 Gremlin에 비해 제한적이라면-나는 그것을 미리 알고 싶습니다.
일반적인 쿼리의 경우 Cypher로 충분하며 아마도 더 빠를 것입니다. Cypher보다 Gremlin의 장점은 높은 수준의 횡단에 들어갈 때입니다. Gremlin에서는 정확한 순회 패턴 (또는 자체 알고리즘)을 더 잘 정의 할 수 있지만 Cypher에서는 엔진이 최고의 순회 솔루션 자체를 찾으려고합니다.
개인적으로 Cypher를 사용하는 이유는 단순하기 때문에 지금까지 Gremlin을 사용해야하는 상황이 없었습니다 (Gremlin graphML 가져 오기 / 내보내기 기능 제외). 그러나 Gremlin을 사용해야하더라도 인터넷에서 찾을 수있는 특정 쿼리에 대해 그렇게하고 다시는 돌아 오지 않을 것으로 예상합니다.
항상 Cypher를 정말 빠르게 (일 단위로) 배우고 (장기적인) 장군 Gremlin과 함께 계속할 수 있습니다.
쿼리에서 수천 개의 노드를 탐색해야합니다. 사이퍼는 느 렸습니다. Neo4j 팀은 Java API에 대해 알고리즘을 직접 구현하는 것이 100-200 배 더 빠를 것이라고 말했습니다. 우리는 그렇게했고 쉽게 60을 빼 냈습니다. 현재로서는 신뢰 부족으로 인해 시스템에 단일 Cypher 쿼리가 없습니다. Easy Cypher 쿼리는 Java로 작성하기 쉽고 복잡한 쿼리는 수행되지 않습니다. 문제는 쿼리에 여러 조건이있는 경우 Cypher에서 순회를 수행 할 순서를 알 수있는 방법이 없다는 것입니다. 따라서 cypher 쿼리가 먼저 잘못된 방향으로 그래프에 표시 될 수 있습니다. 나는 Gremlin을 많이 사용하지 않았지만 Gremlin을 사용하여 훨씬 더 많은 실행 제어를 얻을 수 있다고 상상할 수 있습니다.
Cypher에 대한 Neo4j 팀의 노력은 정말 인상적이며 먼 길을 왔습니다. Neo 팀은 일반적으로 사람들을 그것에 밀고 Cypher가 성숙함에 따라 Gremlin은 아마도 관심을 덜 받게 될 것입니다. Cypher는 장기적으로 좋은 선택입니다.
즉, Gremlin은 Groovy DSL입니다. Neo4j REST 엔드 포인트를 통해이를 사용하면 기본 Neo4j Java API에 완전하고 자유롭게 액세스 할 수 있습니다. 그것 (및 동일한 카테고리의 다른 스크립트 플러그인)은 낮은 수준의 전력 측면에서 일치 할 수 없습니다. 또한 Gremlin 플러그인 내에서 Cypher를 실행할 수 있습니다 .
어느 쪽이든 두 가지를 모두 배우는 건전한 업그레이드 경로가 있습니다. 나는 당신을 더 빨리 시작하고 실행하는 것과 함께 갈 것입니다. 에서 내 프로젝트 , 나는 일반적으로 그렘린을 사용하고 난 모두가 그렘린 DSL에 통증이 있습니다 matching- 표 결과 나 표현 패턴을 필요로 할 때 다음 (그렘린 내에서 여부) 사이퍼를 호출합니다.
처음에는 Gremlin을 사용하기 시작했습니다. 하지만 당시 REST 인터페이스가 약간 불안정해서 Cypher로 전환했습니다. Neo4j를 훨씬 더 잘 지원합니다. 그러나 Cypher로는 불가능하거나 Cypher가 Gremlin으로 할 수있는 방식으로 최적화 할 수없는 쿼리 유형이 있습니다.
Gremlin은 Groovy를 기반으로 구축되었으므로 실제로 Neo4j가 'Java'코드를 실행하고 REST 인터페이스에서 HTTP 히트를 가져 오지 않고도 서버에서 다양한 작업을 수행하도록하는 일반적인 방법으로 사용할 수 있습니다. 무엇보다도 Gremlin을 사용하면 데이터를 수정할 수 있습니다.
그러나 내가 원하는 모든 것이 데이터를 쿼리하는 것이라면 더 읽기 쉽고 유지 관리하기 쉽기 때문에 Cypher를 사용합니다. Gremlin은 제한에 도달했을 때의 대안입니다.
Gremlin 쿼리는 프로그래밍 방식으로 생성 할 수 있습니다. (내 말이 무슨 뜻인지 알기 위해 http://docs.sqlalchemy.org/en/rel_0_7/core/tutorial.html#intro-to-generative-selects 를 참조 하십시오 .) 이것은 Cypher에서는 좀 더 까다로운 것 같습니다.
Cypher는 간단한 쿼리에만 작동합니다. 복잡한 비즈니스 로직을 그래프 순회에 통합하기 시작하면 속도가 엄청나게 느려지거나 완전히 작동하지 않습니다.
Neo4J 분명히 그들은 또한 대체 경로 확장기 (포함 APOC 절차를 제공하기 때문에 사이퍼이 그것을 절단되지 않는 것을 알고 apoc.path.expand
, apoc.path.subgraphAll
등).
Gremlin은 배우기가 더 어렵지만 Cypher 및 APOC보다 강력합니다. Gremlin에서 생각할 수있는 모든 논리를 구현할 수 있습니다.
Neo4J가 토글 가능한 Gremlin 서버와 함께 제공되기를 바랍니다. 라이브 Neo4J 인스턴스에 대해 Gremlin을 실행할 수 있지만 많은 농구를 뛰어 넘습니다. 내 희망은 Neo4J의 경쟁자들이 Gremlin을 옵션으로 허용했기 때문에 Neo4J가 그 뒤를 따를 것이라는 것입니다.
Cypher는 그래프 데이터베이스 쿼리를위한 선언적 쿼리 언어입니다. 선언적이라는 용어는 명령형과 같은 프로그래밍 패러다임과는 다른 프로그래밍 방식이기 때문에 중요합니다. Cypher 및 SQL과 같은 선언적 쿼리 언어에서는 기본 엔진에 가져 오려는 데이터를 알리고 데이터를 가져 오는 방법을 지정하지 않습니다. Cypher에서 사용자는 MATCH 절에서 관심있는 하위 그래프를 정의합니다. 그런 다음 기본 엔진은 패턴 일치 알고리즘을 실행하여 그래프 데이터베이스에서 유사한 하위 그래프 발생을 검색합니다. Gremlin은 선언적 기능과 명령 적 기능입니다. 사용자가 그래프를 탐색하는 방법에 대해 명시적인 지침을 제공해야하는 그래프 순회 언어입니다. 이 경우 이러한 언어의 차이점은 Cypher에서 Kleene 별 연산자를 사용하여 그래프 데이터베이스에서 주어진 두 노드 사이의 경로를 찾을 수 있다는 것입니다. 그러나 Gremlin에서는 이러한 모든 경로를 명시 적으로 정의해야합니다. 그러나 Gremlin에서 반복 연산자를 사용하여 그래프 데이터베이스에서 이러한 명시 적 경로의 여러 항목을 찾을 수 있습니다. 그러나 Cypher에서는 명시 적 구조에 대한 반복을 수행 할 수 없습니다.
Long answer short : 쿼리에는 cypher를 사용하고 순회에는 gremlin을 사용합니다. 응답 타이밍을 직접 확인할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/13824962/neo4j-cypher-vs-gremlin-query-language
'programing' 카테고리의 다른 글
리포지토리 패턴 대 DAL (0) | 2020.09.01 |
---|---|
Django에서 모든 요청 헤더를 어떻게 얻을 수 있습니까? (0) | 2020.09.01 |
Visual Studio 2013에서 WiX 프로젝트 활성화 (0) | 2020.09.01 |
브라우저 네이티브 JSON 지원 (window.JSON) (0) | 2020.09.01 |
몇 가지 Android 앱 및 ICS에서 볼 수있는 것처럼 도움말 오버레이를 만들려면 어떻게해야합니까? (0) | 2020.09.01 |