ArangoDB-퀵 가이드
ArangoDB는 개발자가 기본 다중 모델 데이터베이스로 환영합니다. 이것은 다른 NoSQL 데이터베이스와 다릅니다. 이 데이터베이스에서 데이터는 문서, 키 / 값 쌍 또는 그래프로 저장 될 수 있습니다. 또한 단일 선언적 쿼리 언어로 데이터의 일부 또는 전체에 액세스 할 수 있습니다. 또한 여러 모델을 단일 쿼리로 결합 할 수 있습니다. 또한 다중 모델 스타일로 인해 세 가지 데이터 모델 중 일부 또는 모두를 사용하여 수평으로 확장 할 수있는 린 애플리케이션을 만들 수 있습니다.
계층화 vs. 네이티브 다중 모델 데이터베이스
이 섹션에서는 기본 및 계층화 된 다중 모델 데이터베이스 간의 중요한 차이점을 강조합니다.
많은 데이터베이스 공급 업체는 제품을 "다중 모델"이라고 부르지 만 키 / 값 또는 문서 저장소에 그래프 계층을 추가하는 것은 기본 다중 모델로 인정되지 않습니다.
동일한 쿼리 언어를 사용하는 동일한 코어 인 ArangoDB를 사용하면 이전 섹션에서 이미 언급했듯이 단일 쿼리에 서로 다른 데이터 모델과 기능을 결합 할 수 있습니다. ArangoDB에서는 데이터 모델간에 "전환"이 없으며 쿼리를 실행하기 위해 A에서 B로 데이터를 이동하지 않습니다. 이는 "계층화 된"접근 방식과 비교하여 ArangoDB의 성능 이점으로 이어집니다.
멀티 모달 데이터베이스의 필요성
[Fowler의] 기본 아이디어를 해석하면 더 큰 소프트웨어 아키텍처의 일부인 지속성 계층의 여러 부분에 대해 다양한 적절한 데이터 모델을 사용하는 이점을 실현할 수 있습니다.
이에 따르면, 예를 들어 관계형 데이터베이스를 사용하여 구조화 된 표 형식의 데이터를 유지할 수 있습니다. 구조화되지 않은 객체와 유사한 데이터를위한 문서 저장소 해시 테이블을위한 키 / 값 저장소; 고도로 연결된 참조 데이터를위한 그래프 데이터베이스.
그러나이 접근 방식의 전통적인 구현은 동일한 프로젝트에서 여러 데이터베이스를 사용하도록 유도합니다. 데이터 일관성 및 중복 문제는 물론 운영상의 마찰 (더 복잡한 배포, 더 빈번한 업그레이드)이 발생할 수 있습니다.
세 가지 데이터 모델에 대한 데이터를 통합 한 후 다음 과제는 데이터 관리자가 문서 쿼리, 키 / 값 조회, 그래픽 쿼리 및 임의 조합과 같은 다양한 쿼리를 표현할 수있는 공통 쿼리 언어를 고안하고 구현하는 것입니다. 이들의.
으로 graphy queries, 우리는 그래프 이론적 고려를 포함하는 쿼리를 의미합니다. 특히, 이들은 가장자리에서 오는 특정 연결 기능을 포함 할 수 있습니다. 예를 들면ShortestPath, GraphTraversal, 및 Neighbors.
그래프는 관계에 대한 데이터 모델로 완벽하게 적합합니다. 소셜 네트워크, 추천 시스템 등과 같은 많은 실제 사례에서 매우 자연스러운 데이터 모델은 그래프입니다. 관계를 캡처하고 각 모서리 및 각 정점과 함께 레이블 정보를 보유 할 수 있습니다. 또한 JSON 문서는 이러한 유형의 정점 및 가장자리 데이터를 저장하는 데 자연스럽게 적합합니다.
ArangoDB ─ 특징
ArangoDB에는 여러 가지 주목할만한 기능이 있습니다. 아래에서 눈에 띄는 기능을 강조하겠습니다.
- 다중 모델 패러다임
- ACID 속성
- HTTP API
ArangoDB는 모든 인기있는 데이터베이스 모델을 지원합니다. 다음은 ArangoDB에서 지원하는 몇 가지 모델입니다.
- 문서 모델
- 키 / 값 모델
- 그래프 모델
단일 쿼리 언어로 데이터베이스에서 데이터를 검색 할 수 있습니다.
네 가지 속성 Atomicity, Consistency, Isolation, 및 Durability(ACID)는 데이터베이스 트랜잭션의 보장을 설명합니다. ArangoDB는 ACID 호환 트랜잭션을 지원합니다.
ArangoDB를 사용하면 브라우저와 같은 클라이언트가 HTTP API를 사용하여 데이터베이스와 상호 작용할 수 있습니다. API는 리소스 지향적이고 JavaScript로 확장 할 수 있습니다.
다음은 ArangoDB 사용의 장점입니다.
강화
기본 다중 모델 데이터베이스 인 ArangoDB는 여러 데이터베이스를 배포 할 필요가 없으므로 구성 요소의 수와 유지 관리를 줄입니다. 결과적으로 애플리케이션의 기술 스택 복잡성을 줄입니다. 전체적인 기술적 요구 사항을 통합하는 것 외에도 이러한 단순화는 총 소유 비용을 낮추고 유연성을 향상시킵니다.
단순화 된 성능 확장
시간이 지남에 따라 애플리케이션이 성장함에 따라 ArangoDB는 다양한 데이터 모델로 독립적으로 확장하여 증가하는 성능 및 스토리지 요구 사항을 해결할 수 있습니다. ArangoDB는 수직 및 수평으로 확장 할 수 있으므로 성능 저하가 필요한 경우 (고의적이고 원하는 속도 저하) 백엔드 시스템을 쉽게 축소하여 하드웨어 및 운영 비용을 절약 할 수 있습니다.
운영 복잡성 감소
Polyglot Persistence의 법령은 수행하는 모든 작업에 가장 적합한 도구를 사용하는 것입니다. 특정 작업에는 문서 데이터베이스가 필요하고 다른 작업에는 그래프 데이터베이스가 필요할 수 있습니다. 단일 모델 데이터베이스로 작업 한 결과 여러 가지 운영상의 문제가 발생할 수 있습니다. 단일 모델 데이터베이스를 통합하는 것은 그 자체로 어려운 작업입니다. 그러나 가장 큰 문제는 서로 관련이없는 별도의 데이터베이스 시스템간에 데이터 일관성과 내결함성을 갖춘 대규모의 응집력있는 구조를 구축하는 것입니다. 거의 불가능할 수도 있습니다.
Polyglot Persistence는 다중 언어 데이터를 쉽게 가질 수 있지만 동시에 내결함성 시스템에서 데이터 일관성을 유지하므로 기본 다중 모델 데이터베이스로 처리 할 수 있습니다. ArangoDB를 사용하면 복잡한 작업에 올바른 데이터 모델을 사용할 수 있습니다.
강력한 데이터 일관성
여러 단일 모델 데이터베이스를 사용하는 경우 데이터 일관성이 문제가 될 수 있습니다. 이러한 데이터베이스는 서로 통신하도록 설계되지 않았으므로 서로 다른 모델간에 데이터를 일관되게 유지하려면 일부 형태의 트랜잭션 기능을 구현해야합니다.
ACID 트랜잭션을 지원하는 ArangoDB는 단일 백엔드로 다양한 데이터 모델을 관리하여 단일 인스턴스에서 강력한 일관성을 제공하고 클러스터 모드에서 작동 할 때 원자 적 작업을 제공합니다.
결함 허용
관련없는 구성 요소가 많은 내결함성 시스템을 구축하는 것은 어려운 일입니다. 이 문제는 클러스터로 작업 할 때 더욱 복잡해집니다. 다양한 기술 및 / 또는 기술 스택을 사용하여 이러한 시스템을 배포하고 유지 관리하려면 전문 지식이 필요합니다. 또한 독립적으로 실행되도록 설계된 여러 하위 시스템을 통합하면 엔지니어링 및 운영 비용이 많이 발생합니다.
통합 기술 스택 인 다중 모델 데이터베이스는 우아한 솔루션을 제공합니다. 다양한 데이터 모델로 현대적인 모듈 식 아키텍처를 지원하도록 설계된 ArangoDB는 클러스터 사용에도 작동합니다.
총 소유 비용 절감
각 데이터베이스 기술에는 지속적인 유지 관리, 버그 수정 패치 및 공급 업체에서 제공하는 기타 코드 변경이 필요합니다. 다중 모델 데이터베이스를 수용하면 애플리케이션 설계에서 데이터베이스 기술의 수를 제거함으로써 관련 유지 관리 비용을 크게 줄일 수 있습니다.
업무
여러 시스템에 걸쳐 트랜잭션 보장을 제공하는 것은 정말 어려운 일이며 이러한 보장을 제공하는 NoSQL 데이터베이스는 거의 없습니다. 네이티브 멀티 모델이기 때문에 ArangoDB는 데이터 일관성을 보장하기 위해 트랜잭션을 부과합니다.
이 장에서는 ArangoDB의 기본 개념과 용어에 대해 설명합니다. 우리가 다루는 기술 주제와 관련된 기본 용어에 대한 노하우를 갖는 것은 매우 중요합니다.
ArangoDB의 용어는 다음과 같습니다.
- Document
- Collection
- 컬렉션 식별자
- 컬렉션 이름
- Database
- 데이터베이스 이름
- 데이터베이스 조직
데이터 모델의 관점에서 문서의 개념은 후자의 수학적 개념이므로 ArangoDB는 문서 지향 데이터베이스로 간주 될 수 있습니다. 문서 지향 데이터베이스는 NoSQL 데이터베이스의 주요 범주 중 하나입니다.
계층 구조는 다음과 같습니다. 문서는 컬렉션으로 그룹화되고 컬렉션은 데이터베이스 내에 존재합니다.
식별자와 이름은 컬렉션과 데이터베이스에 대한 두 가지 속성이라는 것이 분명해야합니다.
일반적으로 문서 컬렉션에 저장된 두 개의 문서 (정점)는 에지 컬렉션에 저장된 문서 (가장자리)로 연결됩니다. 이것은 ArangoDB의 그래프 데이터 모델입니다. 모서리에 레이블이있는 것이 아니라 완전한 문서라는 점을 제외하면 방향성, 레이블이 지정된 그래프의 수학적 개념을 따릅니다.
이 데이터베이스의 핵심 용어에 익숙해지면 ArangoDB의 그래프 데이터 모델을 이해하기 시작합니다. 이 모델에는 문서 컬렉션과 에지 컬렉션이라는 두 가지 유형의 컬렉션이 있습니다. Edge 컬렉션은 문서를 저장하며 두 가지 특수 속성도 포함합니다._from 두 번째는 _to속성. 이러한 속성은 그래프 데이터베이스에 필수적인 문서 간의 간선 (관계)을 만드는 데 사용됩니다. 문서 컬렉션은 그래프 컨텍스트에서 정점 컬렉션이라고도합니다 (그래프 이론 책 참조).
이제 데이터베이스가 얼마나 중요한지 살펴 보겠습니다. 컬렉션은 데이터베이스 내부에 존재하기 때문에 중요합니다. ArangoDB의 한 인스턴스에는 하나 이상의 데이터베이스가있을 수 있습니다. 여러 데이터베이스는 일반적으로 다중 테넌트 설정에 사용됩니다. 내부 데이터 집합 (컬렉션, 문서 등)이 서로 분리되어 있기 때문입니다. 기본 데이터베이스_system제거 할 수 없기 때문에 특별합니다. 사용자는이 데이터베이스에서 관리되며 해당 자격 증명은 서버 인스턴스의 모든 데이터베이스에 대해 유효합니다.
이 장에서는 ArangoDB의 시스템 요구 사항에 대해 설명합니다.
ArangoDB의 시스템 요구 사항은 다음과 같습니다.
- Ubuntu가 설치된 VPS 서버
- RAM : 1GB; CPU : 2.2GHz
이 자습서의 모든 명령에 대해 처리 능력이 2.2GHz 인 CPU 1 개와 함께 RAM 1GB의 Ubuntu 16.04 (xenial) 인스턴스를 사용했습니다. 이 튜토리얼의 모든 arangosh 명령은 ArangoDB 버전 3.1.27에서 테스트되었습니다.
ArangoDB를 설치하는 방법?
이 섹션에서는 ArangoDB를 설치하는 방법을 살펴 봅니다. ArangoDB는 많은 운영 체제 및 배포판을 위해 미리 빌드되었습니다. 자세한 내용은 ArangoDB 문서를 참조하세요. 이미 언급했듯이이 자습서에서는 Ubuntu 16.04x64를 사용합니다.
첫 번째 단계는 저장소에 대한 공개 키를 다운로드하는 것입니다.
# wget https://www.arangodb.com/repositories/arangodb31/
xUbuntu_16.04/Release.key
산출
--2017-09-03 12:13:24-- https://www.arangodb.com/repositories/arangodb31/xUbuntu_16.04/Release.key
Resolving https://www.arangodb.com/
(www.arangodb.com)... 104.25.1 64.21, 104.25.165.21,
2400:cb00:2048:1::6819:a415, ...
Connecting to https://www.arangodb.com/
(www.arangodb.com)|104.25. 164.21|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3924 (3.8K) [application/pgpkeys]
Saving to: ‘Release.key’
Release.key 100%[===================>] 3.83K - .-KB/s in 0.001s
2017-09-03 12:13:25 (2.61 MB/s) - ‘Release.key’ saved [39 24/3924]
중요한 점은 Release.key 출력 끝에 저장됩니다.
다음 코드 줄을 사용하여 저장된 키를 설치하겠습니다.
# sudo apt-key add Release.key
산출
OK
다음 명령을 실행하여 apt 저장소를 추가하고 색인을 업데이트하십시오.
# sudo apt-add-repository 'deb
https://www.arangodb.com/repositories/arangodb31/xUbuntu_16.04/ /'
# sudo apt-get update
마지막 단계로 ArangoDB를 설치할 수 있습니다.
# sudo apt-get install arangodb3
산출
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
grub-pc-bin
Use 'sudo apt autoremove' to remove it.
The following NEW packages will be installed:
arangodb3
0 upgraded, 1 newly installed, 0 to remove and 17 not upgraded.
Need to get 55.6 MB of archives.
After this operation, 343 MB of additional disk space will be used.
프레스 Enter. 이제 ArangoDB 설치 프로세스가 시작됩니다.
Get:1 https://www.arangodb.com/repositories/arangodb31/xUbuntu_16.04
arangodb3 3.1.27 [55.6 MB]
Fetched 55.6 MB in 59s (942 kB/s)
Preconfiguring packages ...
Selecting previously unselected package arangodb3.
(Reading database ... 54209 files and directories currently installed.)
Preparing to unpack .../arangodb3_3.1.27_amd64.deb ...
Unpacking arangodb3 (3.1.27) ...
Processing triggers for systemd (229-4ubuntu19) ...
Processing triggers for ureadahead (0.100.0-19) ...
Processing triggers for man-db (2.7.5-1) ...
Setting up arangodb3 (3.1.27) ...
Database files are up-to-date.
ArangoDB 설치가 완료 되려고하면 다음 화면이 나타납니다.
여기에서 ArangoDB의 비밀번호를 입력하라는 메시지가 표시됩니다. root사용자. 주의 깊게 기록하십시오.
선택 yes 다음 대화 상자가 나타날 때 옵션-
클릭하면 Yes위의 대화 상자와 같이 다음과 같은 대화 상자가 나타납니다. 딸깍 하는 소리Yes 여기.
다음 명령으로 ArangoDB의 상태를 확인할 수도 있습니다.
# sudo systemctl status arangodb3
산출
arangodb3.service - LSB: arangodb
Loaded: loaded (/etc/init.d/arangodb3; bad; vendor pre set: enabled)
Active: active (running) since Mon 2017-09-04 05:42:35 UTC;
4min 46s ago
Docs: man:systemd-sysv-generator(8)
Process: 2642 ExecStart=/etc/init.d/arangodb3 start (code = exited,
status = 0/SUC
Tasks: 22
Memory: 158.6M
CPU: 3.117s
CGroup: /system.slice/arangodb3.service
├─2689 /usr/sbin/arangod --uid arangodb
--gid arangodb --pid-file /va
└─2690 /usr/sbin/arangod --uid arangodb
--gid arangodb --pid-file /va
Sep 04 05:42:33 ubuntu-512 systemd[1]: Starting LSB: arangodb...
Sep 04 05:42:33 ubuntu-512 arangodb3[2642]: * Starting arango database server a
Sep 04 05:42:35 ubuntu-512 arangodb3[2642]: {startup} starting up in daemon mode
Sep 04 05:42:35 ubuntu-512 arangodb3[2642]: changed working directory for child
Sep 04 05:42:35 ubuntu-512 arangodb3[2642]: ...done.
Sep 04 05:42:35 ubuntu-512 systemd[1]: StartedLSB: arang odb.
Sep 04 05:46:59 ubuntu-512 systemd[1]: Started LSB: arangodb. lines 1-19/19 (END)
이제 ArangoDB를 사용할 준비가되었습니다.
arangosh 터미널을 호출하려면 터미널에 다음 명령을 입력하십시오.
# arangosh
산출
Please specify a password:
공급 root 설치시 생성 된 암호-
_
__ _ _ __ __ _ _ __ __ _ ___ | |
/ | '__/ _ | ’ \ / ` |/ _ / | ’
| (| | | | (| | | | | (| | () _ \ | | |
_,|| _,|| ||_, |_/|/| ||
|__/
arangosh (ArangoDB 3.1.27 [linux] 64bit, using VPack 0.1.30, ICU 54.1, V8
5.0.71.39, OpenSSL 1.0.2g 1 Mar 2016)
Copyright (c) ArangoDB GmbH
Pretty printing values.
Connected to ArangoDB 'http+tcp://127.0.0.1:8529' version: 3.1.27 [server],
database: '_system', username: 'root'
Please note that a new minor version '3.2.2' is available
Type 'tutorial' for a tutorial or 'help' to see common examples
127.0.0.1:8529@_system> exit
ArangoDB에서 로그 아웃하려면 다음 명령을 입력하십시오.
127.0.0.1:8529@_system> exit
산출
Uf wiederluege! Na shledanou! Auf Wiedersehen! Bye Bye! Adiau! ¡Hasta luego!
Εις το επανιδείν!
להתראות ! Arrivederci! Tot ziens! Adjö! Au revoir! さようなら До свидания! Até
Breve! !خداحافظ
이 장에서는 Arangosh가 ArangoDB의 명령 줄로 작동하는 방식에 대해 설명합니다. 데이터베이스 사용자를 추가하는 방법부터 시작하겠습니다.
Note − 숫자 키패드는 Arangosh에서 작동하지 않을 수 있습니다.
사용자가 "harry"이고 암호가 "hpwdb"라고 가정하겠습니다.
127.0.0.1:8529@_system> require("org/arangodb/users").save("harry", "hpwdb");
산출
{
"user" : "harry",
"active" : true,
"extra" : {},
"changePassword" : false,
"code" : 201
}
이 장에서는 인증을 활성화 / 비활성화하는 방법과 ArangoDB를 공용 네트워크 인터페이스에 바인딩하는 방법에 대해 알아 봅니다.
# arangosh --server.endpoint tcp://127.0.0.1:8529 --server.database "_system"
이전에 저장 한 비밀번호를 입력하라는 메시지가 표시됩니다.
Please specify a password:
구성에서 루트에 대해 생성 한 암호를 사용합니다.
curl을 사용하여 인증이 필요한 요청에 대해 실제로 HTTP 401 (승인되지 않은) 서버 응답을 받고 있는지 확인할 수도 있습니다.
# curl --dump - http://127.0.0.1:8529/_api/version
산출
HTTP/1.1 401 Unauthorized
X-Content-Type-Options: nosniff
Www-Authenticate: Bearer token_type = "JWT", realm = "ArangoDB"
Server: ArangoDB
Connection: Keep-Alive
Content-Type: text/plain; charset = utf-8
Content-Length: 0
학습 과정에서 매번 비밀번호를 입력하지 않도록 인증을 비활성화합니다. 이를 위해 구성 파일을 엽니 다.
# vim /etc/arangodb3/arangod.conf
코드가 제대로 보이지 않으면 색 구성표를 변경해야합니다.
:colorscheme desert
아래 스크린 샷과 같이 인증을 false로 설정합니다.
서비스를 다시 시작하십시오-
# service arangodb3 restart
인증을 거짓으로 설정하면 로그인 할 수 있습니다 (루트 또는 생성 된 사용자 Harry 이 경우) 암호를 입력하지 않고 please specify a password.
확인하자 api 인증이 꺼져있을 때 버전 −
# curl --dump - http://127.0.0.1:8529/_api/version
산출
HTTP/1.1 200 OK
X-Content-Type-Options: nosniff
Server: ArangoDB
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8
Content-Length: 60
{"server":"arango","version":"3.1.27","license":"community"}
이 장에서는 두 가지 예제 시나리오를 고려합니다. 이 예제는 이해하기 쉽고 ArangoDB 기능이 작동하는 방식을 이해하는 데 도움이됩니다.
API를 시연하기 위해 ArangoDB에는 쉽게 이해할 수있는 그래프 세트가 미리로드되어 있습니다. ArangoDB에서 이러한 그래프의 인스턴스를 생성하는 두 가지 방법이 있습니다.
- 웹 인터페이스의 그래프 생성 창에 예제 탭 추가,
- 또는 모듈로드 @arangodb/graph-examples/example-graph Arangosh에서.
먼저 웹 인터페이스를 사용하여 그래프를로드하겠습니다. 이를 위해 웹 인터페이스를 시작하고graphs 탭.
그만큼 Create Graph대화 상자가 나타납니다. 마법사에는 두 개의 탭이 있습니다.Examples 과 Graph. 그만큼Graph탭은 기본적으로 열려 있습니다. 새 그래프를 만들고 싶다고 가정하면 그래프의 이름과 다른 정의를 묻습니다.
이제 이미 생성 된 그래프를 업로드합니다. 이를 위해 우리는Examples 탭.
세 가지 예제 그래프를 볼 수 있습니다. 선택Knows_Graph 녹색 버튼 만들기를 클릭합니다.
만든 후에는 아래 그림을 만드는 데 사용 된 웹 인터페이스에서 검사 할 수 있습니다.
Knows_Graph
이제 어떻게 Knows_Graph공장. Knows_Graph를 선택하면 그래프 데이터를 가져옵니다.
Knows_Graph는 하나의 정점 컬렉션으로 구성됩니다. persons 하나의 에지 컬렉션을 통해 연결 knows. 여기에는 Alice, Bob, Charlie, Dave 및 Eve가 정점으로 5 명 포함됩니다. 우리는 다음과 같은 지시 관계를 가질 것입니다
Alice knows Bob
Bob knows Charlie
Bob knows Dave
Eve knows Alice
Eve knows Bob
노드 (정점)를 클릭하면 'bob'이라고 말하면 ID (persons / bob) 속성 이름이 표시됩니다.
가장자리를 클릭하면 ID (knows / 4590) 속성이 표시됩니다.
이것이 우리가 그것을 만들고 정점과 가장자리를 검사하는 방법입니다.
이번에는 Arangosh를 사용하여 다른 그래프를 추가하겠습니다. 이를 위해 ArangoDB 구성 파일에 다른 엔드 포인트를 포함해야합니다.
여러 끝점을 추가하는 방법
구성 파일 열기-
# vim /etc/arangodb3/arangod.conf
아래 터미널 스크린 샷에 표시된대로 다른 엔드 포인트를 추가합니다.
ArangoDB를 다시 시작하십시오-
# service arangodb3 restart
Arangosh 실행-
# arangosh
Please specify a password:
_
__ _ _ __ __ _ _ __ __ _ ___ ___| |__
/ _` | '__/ _` | '_ \ / _` |/ _ \/ __| '_ \
| (_| | | | (_| | | | | (_| | (_) \__ \ | | |
\__,_|_| \__,_|_| |_|\__, |\___/|___/_| |_|
|___/
arangosh (ArangoDB 3.1.27 [linux] 64bit, using VPack 0.1.30, ICU 54.1, V8
5.0.71.39, OpenSSL 1.0.2g 1 Mar 2016)
Copyright (c) ArangoDB GmbH
Pretty printing values.
Connected to ArangoDB 'http+tcp://127.0.0.1:8529' version: 3.1.27
[server], database: '_system', username: 'root'
Please note that a new minor version '3.2.2' is available
Type 'tutorial' for a tutorial or 'help' to see common examples
127.0.0.1:8529@_system>
Social_Graph
이제 Social_Graph가 무엇이며 어떻게 작동하는지 이해하겠습니다. 그래프는 일련의 사람과 그 관계를 보여줍니다-
이 예제에는 여성과 남성의 두 정점 컬렉션에서 정점으로 여성과 남성이 있습니다. 가장자리는 관계 가장자리 컬렉션의 연결입니다. Arangosh를 사용하여이 그래프를 만드는 방법을 설명했습니다. 독자는 Knows_Graph에서했던 것처럼 문제를 해결하고 속성을 탐색 할 수 있습니다.
이 장에서는 다음 주제에 초점을 맞출 것입니다.
- 데이터베이스 상호 작용
- 데이터 모델
- 데이터 검색
ArangoDB는 문서 기반 데이터 모델과 그래프 기반 데이터 모델을 지원합니다. 먼저 문서 기반 데이터 모델을 설명하겠습니다.
ArangoDB의 문서는 JSON 형식과 매우 유사합니다. 문서에는 0 개 이상의 속성이 포함되며 각 속성과 함께 값이 첨부됩니다. 값은 숫자, 부울 또는 널, 리터럴 문자열과 같은 원자 유형이거나 포함 된 문서 / 객체 또는 배열과 같은 복합 데이터 유형입니다. 배열 또는 하위 개체는 이러한 데이터 유형으로 구성 될 수 있으며, 이는 단일 문서가 중요하지 않은 데이터 구조를 나타낼 수 있음을 의미합니다.
더 나아가 계층 구조에서 문서는 컬렉션으로 정렬되어 문서가 (이론상) 포함되지 않거나 둘 이상의 문서가 포함될 수 있습니다. 문서를 행과 컬렉션을 테이블과 비교할 수 있습니다 (여기에서 테이블과 행은 관계형 데이터베이스 관리 시스템 (RDBMS)의 항목을 나타냄).
그러나 RDBMS에서 열 정의는 이러한 정의 스키마를 호출하여 레코드를 테이블에 저장하기위한 전제 조건입니다. 그러나 새로운 기능으로서 ArangoDB는 스키마가 없습니다. 문서가 가질 속성을 지정해야 할 사전 이유가 없습니다.
그리고 RDBMS와 달리 각 문서는 다른 문서와 완전히 다른 방식으로 구성 될 수 있습니다. 이러한 문서는 하나의 컬렉션에 함께 저장할 수 있습니다. 실제로 컬렉션의 문서간에 공통된 특성이있을 수 있지만 데이터베이스 시스템, 즉 ArangoDB 자체는 사용자를 특정 데이터 구조에 바인딩하지 않습니다.
이제 우리는 ArangoDB의 [graph data model], 두 종류의 컬렉션이 필요합니다. 첫 번째는 문서 컬렉션 (그룹 이론 언어의 정점 컬렉션이라고 함)이고 두 번째는 에지 컬렉션입니다. 이 두 유형 사이에는 미묘한 차이가 있습니다. Edge 컬렉션도 문서를 저장하지만 두 가지 고유 속성을 포함하는 것이 특징입니다._from 과 _to문서 간의 관계를 생성합니다. 실제로 문서 (가장자리 읽기)는 두 문서 (정점 읽기)를 연결하며 둘 다 해당 컬렉션에 저장됩니다. 이 아키텍처는 레이블을 가질 수있을뿐만 아니라 문서 자체와 같은 완전한 JSON이 될 수있는 에지를 제외하고 레이블이있는 방향성 그래프의 그래프 이론적 개념에서 파생되었습니다.
새로운 데이터를 계산하거나 문서를 삭제하거나 조작하기 위해 주어진 기준에 따라 문서를 선택하거나 필터링하는 쿼리가 사용됩니다. "예제 쿼리"처럼 간단하거나 "조인"만큼 복잡하든 쿼리는 AQL-ArangoDB 쿼리 언어로 코딩됩니다.
이 장에서는 ArangoDB의 다양한 데이터베이스 메서드에 대해 설명합니다.
우선 데이터베이스의 속성을 알아 봅시다.
- Name
- ID
- Path
먼저 Arangosh를 호출합니다. Arangosh가 호출되면 지금까지 만든 데이터베이스를 나열합니다.
다음 코드 줄을 사용하여 Arangosh를 호출합니다.
127.0.0.1:8529@_system> db._databases()
산출
[
"_system",
"song_collection"
]
우리는 두 개의 데이터베이스를 봅니다. _system 기본적으로 생성되고 두 번째 song_collection 우리가 만든 것입니다.
이제 다음 코드 줄을 사용하여 song_collection 데이터베이스로 이동하겠습니다.
127.0.0.1:8529@_system> db._useDatabase("song_collection")
산출
true
127.0.0.1:8529@song_collection>
song_collection 데이터베이스의 속성을 살펴 보겠습니다.
이름을 찾으려면
이름을 찾기 위해 다음 코드 줄을 사용합니다.
127.0.0.1:8529@song_collection> db._name()
산출
song_collection
ID를 찾으려면-
다음 코드 줄을 사용하여 ID를 찾습니다.
song_collection
산출
4838
경로를 찾으려면-
다음 코드 줄을 사용하여 경로를 찾습니다.
127.0.0.1:8529@song_collection> db._path()
산출
/var/lib/arangodb3/databases/database-4838
이제 다음 코드 줄을 사용하여 시스템 데이터베이스에 있는지 확인하겠습니다.
127.0.0.1:8529@song_collection&t; db._isSystem()
산출
false
이는 우리가 시스템 데이터베이스에 없다는 것을 의미합니다 (우리가 song_collection으로 이동 했으므로). 다음 스크린 샷은이를 이해하는 데 도움이됩니다.
특정 컬렉션을 얻으려면 노래를 말하십시오.
특정 컬렉션을 가져 오기 위해 다음 코드 줄을 사용합니다.
127.0.0.1:8529@song_collection> db._collection("songs")
산출
[ArangoCollection 4890, "songs" (type document, status loaded)]
코드 줄은 단일 컬렉션을 반환합니다.
다음 장에서 데이터베이스 작업의 필수 사항으로 이동하겠습니다.
이 장에서는 Arangosh의 다양한 작업을 배웁니다.
다음은 Arangosh로 가능한 작업입니다-
- 문서 컬렉션 만들기
- 문서 생성
- 문서 읽기
- 문서 업데이트
새 데이터베이스를 만드는 것으로 시작하겠습니다. 다음 코드 줄을 사용하여 새 데이터베이스를 만듭니다.
127.0.0.1:8529@_system> db._createDatabase("song_collection")
true
다음 코드 줄은 새 데이터베이스로 이동하는 데 도움이됩니다.
127.0.0.1:8529@_system> db._useDatabase("song_collection")
true
프롬프트가 "@@ song_collection"으로 이동합니다.
127.0.0.1:8529@song_collection>
여기에서 우리는 CRUD 작업을 공부할 것입니다. 새 데이터베이스에 컬렉션을 생성 해 보겠습니다.
127.0.0.1:8529@song_collection> db._createDocumentCollection('songs')
산출
[ArangoCollection 4890, "songs" (type document, status loaded)]
127.0.0.1:8529@song_collection>
'노래'컬렉션에 몇 가지 문서 (JSON 개체)를 추가해 보겠습니다.
다음과 같은 방법으로 첫 번째 문서를 추가합니다.
127.0.0.1:8529@song_collection> db.songs.save({title: "A Man's Best Friend",
lyricist: "Johnny Mercer", composer: "Johnny Mercer", Year: 1950, _key:
"A_Man"})
산출
{
"_id" : "songs/A_Man",
"_key" : "A_Man",
"_rev" : "_VjVClbW---"
}
데이터베이스에 다른 문서를 추가해 보겠습니다. 이렇게하면 데이터 쿼리 프로세스를 배우는 데 도움이됩니다. 이 코드를 복사하여 Arangosh에 붙여 넣어 프로세스를 에뮬레이트 할 수 있습니다.
127.0.0.1:8529@song_collection> db.songs.save(
{
title: "Accentchuate The Politics",
lyricist: "Johnny Mercer",
composer: "Harold Arlen", Year: 1944,
_key: "Accentchuate_The"
}
)
{
"_id" : "songs/Accentchuate_The",
"_key" : "Accentchuate_The",
"_rev" : "_VjVDnzO---"
}
127.0.0.1:8529@song_collection> db.songs.save(
{
title: "Affable Balding Me",
lyricist: "Johnny Mercer",
composer: "Robert Emmett Dolan",
Year: 1950,
_key: "Affable_Balding"
}
)
{
"_id" : "songs/Affable_Balding",
"_key" : "Affable_Balding",
"_rev" : "_VjVEFMm---"
}
문서 읽는 방법
그만큼 _key또는 문서 핸들을 사용하여 문서를 검색 할 수 있습니다. 컬렉션 자체를 탐색 할 필요가없는 경우 문서 핸들을 사용합니다. 컬렉션이있는 경우 문서 기능을 사용하기 쉽습니다.
127.0.0.1:8529@song_collection> db.songs.document("A_Man");
{
"_key" : "A_Man",
"_id" : "songs/A_Man",
"_rev" : "_VjVClbW---",
"title" : "A Man's Best Friend",
"lyricist" : "Johnny Mercer",
"composer" : "Johnny Mercer",
"Year" : 1950
}
문서를 업데이트하는 방법
저장된 데이터를 업데이트하기 위해 두 가지 옵션을 사용할 수 있습니다. replace 과 update.
업데이트 기능은 문서를 패치하여 주어진 속성과 병합합니다. 반면에 바꾸기 기능은 이전 문서를 새 문서로 대체합니다. 완전히 다른 속성이 제공 되더라도 교체는 계속 발생합니다. 먼저 노래의 Production` 속성을 업데이트하는 비파괴 업데이트를 관찰합니다.
127.0.0.1:8529@song_collection> db.songs.update("songs/A_Man",{production:
"Top Banana"});
산출
{
"_id" : "songs/A_Man",
"_key" : "A_Man",
"_rev" : "_VjVOcqe---",
"_oldRev" : "_VjVClbW---"
}
이제 업데이트 된 노래의 속성을 읽어 보겠습니다.
127.0.0.1:8529@song_collection> db.songs.document('A_Man');
산출
{
"_key" : "A_Man",
"_id" : "songs/A_Man",
"_rev" : "_VjVOcqe---",
"title" : "A Man's Best Friend",
"lyricist" : "Johnny Mercer",
"composer" : "Johnny Mercer",
"Year" : 1950,
"production" : "Top Banana"
}
큰 문서는 update 기능, 특히 속성이 매우 적을 때.
대조적으로 replace 함수는 동일한 문서에서 사용하는 데이터를 폐기합니다.
127.0.0.1:8529@song_collection> db.songs.replace("songs/A_Man",{production:
"Top Banana"});
이제 다음 코드 줄로 업데이트 한 노래를 확인하겠습니다.
127.0.0.1:8529@song_collection> db.songs.document('A_Man');
산출
{
"_key" : "A_Man",
"_id" : "songs/A_Man",
"_rev" : "_VjVRhOq---",
"production" : "Top Banana"
}
이제 문서에 더 이상 원본 데이터가없는 것을 확인할 수 있습니다.
문서를 제거하는 방법
제거 기능은 문서 핸들과 함께 사용되어 컬렉션에서 문서를 제거합니다.
127.0.0.1:8529@song_collection> db.songs.remove('A_Man');
이제 다음 코드 줄을 사용하여 방금 제거한 노래의 속성을 확인하겠습니다.
127.0.0.1:8529@song_collection> db.songs.document('A_Man');
출력으로 다음과 같은 예외 오류가 발생합니다.
JavaScript exception in file
'/usr/share/arangodb3/js/client/modules/@arangodb/arangosh.js' at 97,7:
ArangoError 1202: document not found
! throw error;
! ^
stacktrace: ArangoError: document not found
at Object.exports.checkRequestResult
(/usr/share/arangodb3/js/client/modules/@arangodb/arangosh.js:95:21)
at ArangoCollection.document
(/usr/share/arangodb3/js/client/modules/@arangodb/arango-collection.js:667:12)
at <shell command>:1:10
이전 장에서는 명령 줄인 Arangosh를 사용하여 문서에서 다양한 작업을 수행하는 방법을 배웠습니다. 이제 웹 인터페이스를 사용하여 동일한 작업을 수행하는 방법을 배웁니다. 시작하려면 브라우저의 주소 표시 줄에 http : // your_server_ip : 8529 / _db / song_collection / _admin / aardvark / index.html # login 주소를 입력합니다. 다음 로그인 페이지로 이동합니다.
이제 사용자 이름과 암호를 입력하십시오.
성공하면 다음 화면이 나타납니다. 우리는 데이터베이스가 작동하도록 선택해야합니다._system데이터베이스가 기본입니다. 우리가 선택합시다song_collection 데이터베이스, 녹색 탭을 클릭하십시오-
컬렉션 만들기
이 섹션에서는 컬렉션을 만드는 방법을 배웁니다. 상단 탐색 표시 줄에서 컬렉션 탭을 누릅니다.
명령 줄에 추가 된 노래 모음이 표시됩니다. 그것을 클릭하면 항목이 표시됩니다. 이제 우리는artists’웹 인터페이스를 사용하여 수집. 수집songs우리가 Arangosh로 만든 것은 이미 거기에 있습니다. 이름 필드에artists 에 New Collection나타나는 대화 상자. 고급 옵션은 무시해도 안전하며 기본 컬렉션 유형 (예 : 문서)이 좋습니다.
저장 버튼을 클릭하면 마침내 컬렉션이 생성되고 이제 두 컬렉션이이 페이지에 표시됩니다.
새로 만든 컬렉션을 문서로 채우기
클릭하면 빈 컬렉션이 표시됩니다. artists 컬렉션-
문서를 추가하려면 오른쪽 상단 모서리에있는 + 기호를 클릭해야합니다. 메시지가 표시되면_key, 시작하다 Affable_Balding 열쇠로.
이제 문서의 속성을 추가하고 편집 할 수있는 양식이 나타납니다. 속성을 추가하는 방법에는 두 가지가 있습니다.Graphical 과 Tree. 그래픽 방식은 직관적이지만 느리므로Code 보기, 트리 드롭 다운 메뉴를 사용하여 선택-
프로세스를 더 쉽게 만들기 위해 JSON 형식으로 샘플 데이터를 만들었습니다.이 데이터를 복사하여 쿼리 편집기 영역에 붙여 넣을 수 있습니다.
{ "아티스트": "Johnny Mercer", "title": "Affable Balding Me", "composer": "Robert Emmett Dolan", "Year": 1950}
(참고 : 중괄호는 한 쌍만 사용해야합니다. 아래 스크린 샷 참조)
코드보기 모드에서 키와 값을 인용 한 것을 볼 수 있습니다. 이제Save. 성공적으로 완료되면 페이지에 녹색 깜박임이 잠시 나타납니다.
문서 읽는 방법
문서를 읽으려면 컬렉션 페이지로 돌아갑니다.
하나를 클릭하면 artist 컬렉션, 새 항목이 나타납니다.
문서를 업데이트하는 방법
문서의 항목을 편집하는 것은 간단합니다. 문서 개요에서 편집하려는 행을 클릭하기 만하면됩니다. 여기서도 새 문서를 만들 때와 동일한 쿼리 편집기가 표시됩니다.
문서 제거
'-'아이콘을 눌러 문서를 삭제할 수 있습니다. 모든 문서 행의 끝에이 기호가 있습니다. 안전하지 않은 삭제를 방지하기 위해 확인하라는 메시지가 표시됩니다.
또한 특정 컬렉션의 경우 문서 필터링, 색인 관리 및 데이터 가져 오기와 같은 다른 작업도 Collections Overview 페이지.
이어지는 장에서는 웹 인터페이스의 중요한 기능, 즉 AQL 쿼리 편집기에 대해 설명합니다.
이 장에서는 AQL을 사용하여 데이터를 쿼리하는 방법에 대해 설명합니다. 우리는 ArangoDB가 자체 쿼리 언어를 개발했으며 AQL이라는 이름으로 사용된다는 이전 장에서 이미 논의했습니다.
이제 AQL과 상호 작용을 시작하겠습니다. 아래 이미지와 같이 웹 인터페이스에서AQL Editor탐색 표시 줄 상단에있는 탭. 빈 쿼리 편집기가 나타납니다.
필요한 경우 아래 이미지와 같이 오른쪽 상단의 쿼리 또는 결과 탭을 클릭하여 결과보기에서 편집기로 전환하거나 그 반대로 전환 할 수 있습니다.
무엇보다도 편집기에는 구문 강조 표시, 실행 취소 / 다시 실행 기능 및 쿼리 저장이 있습니다. 자세한 참조는 공식 문서를 참조하십시오. AQL 쿼리 편집기의 몇 가지 기본적이고 일반적으로 사용되는 기능을 강조합니다.
AQL 기초
AQL에서 쿼리는 달성 할 최종 결과를 나타내지 만 최종 결과가 달성되는 프로세스가 아닙니다. 이 기능은 일반적으로 언어의 선언적 속성으로 알려져 있습니다. 또한 AQL은 데이터를 쿼리하고 수정할 수 있으므로 두 프로세스를 결합하여 복잡한 쿼리를 생성 할 수 있습니다.
AQL은 전적으로 ACID를 준수합니다. 쿼리를 읽거나 수정하면 전체가 종료되거나 전혀 종료되지 않습니다. 문서의 데이터를 읽는 것조차도 일관된 데이터 단위로 완료됩니다.
우리는 두 가지 새로운 songs우리가 이미 만든 노래 컬렉션에. 입력하는 대신 다음 쿼리를 복사하여 AQL 편집기에 붙여 넣을 수 있습니다.
FOR song IN [
{
title: "Air-Minded Executive", lyricist: "Johnny Mercer",
composer: "Bernie Hanighen", Year: 1940, _key: "Air-Minded"
},
{
title: "All Mucked Up", lyricist: "Johnny Mercer", composer:
"Andre Previn", Year: 1974, _key: "All_Mucked"
}
]
INSERT song IN songs
왼쪽 하단에있는 실행 버튼을 누릅니다.
두 개의 새 문서를 songs 수집.
이 쿼리는 FOR 루프가 AQL에서 작동하는 방식을 설명합니다. JSON으로 인코딩 된 문서 목록을 반복하여 컬렉션의 각 문서에 대해 코딩 된 작업을 수행합니다. 다른 작업으로는 새 구조 만들기, 필터링, 문서 선택, 문서 수정 또는 데이터베이스에 문서 삽입 (즉시 예제 참조)이 있습니다. 본질적으로 AQL은 CRUD 작업을 효율적으로 수행 할 수 있습니다.
데이터베이스에서 모든 노래를 찾으려면 다음 쿼리를 다시 실행 해 보겠습니다. SELECT * FROM songs SQL 유형 데이터베이스 (편집기가 마지막 쿼리를 기억하기 때문에 *New* 버튼을 눌러 편집기를 청소하십시오) −
FOR song IN songs
RETURN song
결과 세트에는 지금까지 저장된 노래 목록이 표시됩니다. songs 아래 스크린 샷에 표시된대로 수집.
같은 작업 FILTER, SORT 과 LIMIT 추가 할 수 있습니다 For loop 본문을 좁히고 결과를 정렬합니다.
FOR song IN songs
FILTER song.Year > 1940
RETURN song
위 쿼리는 결과 탭에서 1940 년 이후에 생성 된 노래를 제공합니다 (아래 이미지 참조).
이 예제에서는 문서 키가 사용되지만 다른 속성도 필터링에 해당하는 것으로 사용할 수 있습니다. 문서 키는 고유함이 보장되므로 하나의 문서 만이 필터와 일치합니다. 다른 속성의 경우 그렇지 않을 수 있습니다. 이름을 기준으로 오름차순으로 정렬 된 활성 사용자의 하위 집합 (상태라는 속성에 의해 결정됨)을 반환하려면 다음 구문을 사용합니다.
FOR song IN songs
FILTER song.Year > 1940
SORT song.composer
RETURN song
LIMIT 2
우리는이 예제를 의도적으로 포함 시켰습니다. 여기에서 AQL에 의해 빨간색으로 강조 표시된 쿼리 구문 오류 메시지를 관찰합니다. 이 구문은 오류를 강조하고 아래 스크린 샷에 표시된대로 쿼리를 디버깅하는 데 유용합니다.
이제 올바른 쿼리를 실행 해 보겠습니다 (수정 사항에 유의하십시오).
FOR song IN songs
FILTER song.Year > 1940
SORT song.composer
LIMIT 2
RETURN song
AQL의 복잡한 쿼리
AQL은 지원되는 모든 데이터 유형에 대해 여러 기능을 갖추고 있습니다. 쿼리 내에서 변수를 할당하면 매우 복잡한 중첩 구조를 만들 수 있습니다. 이렇게하면 데이터 집약적 인 작업이 클라이언트 (예 : 브라우저)보다 백엔드의 데이터에 더 가깝게 이동합니다. 이를 이해하기 위해 먼저 노래에 임의의 길이 (길이)를 추가해 보겠습니다.
첫 번째 기능, 즉 업데이트 기능부터 시작하겠습니다.
UPDATE { _key: "All_Mucked" }
WITH { length: 180 }
IN songs
위 스크린 샷과 같이 하나의 문서가 작성되었음을 알 수 있습니다.
이제 다른 문서 (노래)도 업데이트하겠습니다.
UPDATE { _key: "Affable_Balding" }
WITH { length: 200 }
IN songs
이제 모든 노래에 새로운 속성이 있는지 확인할 수 있습니다. length −
FOR song IN songs
RETURN song
산출
[
{
"_key": "Air-Minded",
"_id": "songs/Air-Minded",
"_rev": "_VkC5lbS---",
"title": "Air-Minded Executive",
"lyricist": "Johnny Mercer",
"composer": "Bernie Hanighen",
"Year": 1940,
"length": 210
},
{
"_key": "Affable_Balding",
"_id": "songs/Affable_Balding",
"_rev": "_VkC4eM2---",
"title": "Affable Balding Me",
"lyricist": "Johnny Mercer",
"composer": "Robert Emmett Dolan",
"Year": 1950,
"length": 200
},
{
"_key": "All_Mucked",
"_id": "songs/All_Mucked",
"_rev": "_Vjah9Pu---",
"title": "All Mucked Up",
"lyricist": "Johnny Mercer",
"composer": "Andre Previn",
"Year": 1974,
"length": 180
},
{
"_key": "Accentchuate_The",
"_id": "songs/Accentchuate_The",
"_rev": "_VkC3WzW---",
"title": "Accentchuate The Politics",
"lyricist": "Johnny Mercer",
"composer": "Harold Arlen",
"Year": 1944,
"length": 190
}
]
LET, FILTER, SORT 등과 같은 AQL의 다른 키워드 사용을 설명하기 위해 이제 노래의 길이를 mm:ss 체재.
질문
FOR song IN songs
FILTER song.length > 150
LET seconds = song.length % 60
LET minutes = FLOOR(song.length / 60)
SORT song.composer
RETURN
{
Title: song.title,
Composer: song.composer,
Duration: CONCAT_SEPARATOR(':',minutes, seconds)
}
이번에는 길이와 함께 노래 제목을 반환합니다. 그만큼Return 함수를 사용하면 각 입력 문서에 대해 반환 할 새 JSON 개체를 만들 수 있습니다.
이제 AQL 데이터베이스의 '조인'기능에 대해 이야기하겠습니다.
컬렉션을 만들어 시작하겠습니다. composer_dob. 또한 쿼리 상자에서 다음 쿼리를 실행하여 작곡가의 가상 생년월일이 포함 된 4 개의 문서를 생성합니다.
FOR dob IN [
{composer: "Bernie Hanighen", Year: 1909}
,
{composer: "Robert Emmett Dolan", Year: 1922}
,
{composer: "Andre Previn", Year: 1943}
,
{composer: "Harold Arlen", Year: 1910}
]
INSERT dob in composer_dob
SQL과의 유사성을 강조하기 위해 AQL에 중첩 된 FOR 루프 쿼리를 제공하여 REPLACE 작업을 수행하고 내부 루프에서 먼저 모든 작곡가의 dob을 반복 한 다음 모든 관련 노래에서 반복하여 다음을 포함하는 새 문서를 만듭니다. 속성 song_with_composer_key 대신 song 속성.
여기에 쿼리가 있습니다-
FOR s IN songs
FOR c IN composer_dob
FILTER s.composer == c.composer
LET song_with_composer_key = MERGE(
UNSET(s, 'composer'),
{composer_key:c._key}
)
REPLACE s with song_with_composer_key IN songs
이제 쿼리를 실행하겠습니다. FOR song IN songs RETURN song 노래 모음이 어떻게 바뀌 었는지 다시 확인하십시오.
산출
[
{
"_key": "Air-Minded",
"_id": "songs/Air-Minded",
"_rev": "_Vk8kFoK---",
"Year": 1940,
"composer_key": "5501",
"length": 210,
"lyricist": "Johnny Mercer",
"title": "Air-Minded Executive"
},
{
"_key": "Affable_Balding",
"_id": "songs/Affable_Balding",
"_rev": "_Vk8kFoK--_",
"Year": 1950,
"composer_key": "5505",
"length": 200,
"lyricist": "Johnny Mercer",
"title": "Affable Balding Me"
},
{
"_key": "All_Mucked",
"_id": "songs/All_Mucked",
"_rev": "_Vk8kFoK--A",
"Year": 1974,
"composer_key": "5507",
"length": 180,
"lyricist": "Johnny Mercer",
"title": "All Mucked Up"
},
{
"_key": "Accentchuate_The",
"_id": "songs/Accentchuate_The",
"_rev": "_Vk8kFoK--B",
"Year": 1944,
"composer_key": "5509",
"length": 190,
"lyricist": "Johnny Mercer",
"title": "Accentchuate The Politics"
}
]
위의 쿼리는 데이터 마이그레이션 프로세스를 완료하고 composer_key 각 노래에.
이제 다음 쿼리는 다시 중첩 된 FOR-loop 쿼리이지만 이번에는 Join 작업으로 이어지고, 연관된 작곡가의 이름 (`composer_key`의 도움으로 선택)을 각 노래에 추가합니다.
FOR s IN songs
FOR c IN composer_dob
FILTER c._key == s.composer_key
RETURN MERGE(s,
{ composer: c.composer }
)
산출
[
{
"Year": 1940,
"_id": "songs/Air-Minded",
"_key": "Air-Minded",
"_rev": "_Vk8kFoK---",
"composer_key": "5501",
"length": 210,
"lyricist": "Johnny Mercer",
"title": "Air-Minded Executive",
"composer": "Bernie Hanighen"
},
{
"Year": 1950,
"_id": "songs/Affable_Balding",
"_key": "Affable_Balding",
"_rev": "_Vk8kFoK--_",
"composer_key": "5505",
"length": 200,
"lyricist": "Johnny Mercer",
"title": "Affable Balding Me",
"composer": "Robert Emmett Dolan"
},
{
"Year": 1974,
"_id": "songs/All_Mucked",
"_key": "All_Mucked",
"_rev": "_Vk8kFoK--A",
"composer_key": "5507",
"length": 180,
"lyricist": "Johnny Mercer",
"title": "All Mucked Up",
"composer": "Andre Previn"
},
{
"Year": 1944,
"_id": "songs/Accentchuate_The",
"_key": "Accentchuate_The",
"_rev": "_Vk8kFoK--B",
"composer_key": "5509",
"length": 190,
"lyricist": "Johnny Mercer",
"title": "Accentchuate The Politics",
"composer": "Harold Arlen"
}
]
이 장에서는 몇 가지 AQL 예제 쿼리를 Actors and Movies데이터 베이스. 이러한 쿼리는 그래프를 기반으로합니다.
문제
배우 컬렉션과 영화 컬렉션, 그리고 아래에 표시된대로 정점을 연결하는 actIn 가장자리 컬렉션 (연도 속성 포함)이 주어집니다.
[Actor] <- act in -> [Movie]
우리는 어떻게-
- "movie1"또는 "movie2"에서 연기 한 모든 배우?
- "movie1"과 "movie2"둘 다에서 연기 한 모든 배우?
- "actor1"과 "actor2"사이의 모든 일반적인 영화?
- 3 편 이상의 영화에서 연기 한 모든 배우?
- 정확히 6 명의 배우가 출연 한 모든 영화?
- 영화 배우의 수는?
- 배우별 영화 수?
- 2005 년에서 2010 년 사이에 배우가 연기 한 영화의 수는?
해결책
위의 쿼리를 해결하고 답을 얻는 과정에서 Arangosh를 사용하여 데이터 세트를 만들고 이에 대한 쿼리를 실행합니다. 모든 AQL 쿼리는 문자열이며 Arangosh 대신 선호하는 드라이버로 간단히 복사 할 수 있습니다.
Arangosh에서 테스트 데이터 세트를 생성하여 시작하겠습니다. 첫째, 다운로드 이 파일을 -
# wget -O dataset.js
https://drive.google.com/file/d/0B4WLtBDZu_QWMWZYZ3pYMEdqajA/view?usp=sharing
산출
...
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘dataset.js’
dataset.js [ <=> ] 115.14K --.-KB/s in 0.01s
2017-09-17 14:19:12 (11.1 MB/s) - ‘dataset.js’ saved [117907]
위의 출력에서 JavaScript 파일을 다운로드 한 것을 볼 수 있습니다. dataset.js.이 파일에는 데이터베이스에 데이터 세트를 생성하는 Arangosh 명령이 포함되어 있습니다. 명령을 하나씩 복사하여 붙여 넣는 대신--javascript.executeArangosh의 옵션을 사용하여 여러 명령을 비대화 형으로 실행합니다. 생명의 은인 명령이라고 생각하십시오!
이제 쉘에서 다음 명령을 실행하십시오-
$ arangosh --javascript.execute dataset.js
위의 스크린 샷에서 볼 수 있듯이 메시지가 표시되면 암호를 제공하십시오. 이제 데이터를 저장 했으므로이 장의 시작 부분에서 제기 된 특정 질문에 답하기 위해 AQL 쿼리를 구성 할 것입니다.
첫 번째 질문
첫 번째 질문을하겠습니다. All actors who acted in "movie1" OR "movie2". "TheMatrix"또는 "TheDevilsAdvocate"에서 활동 한 모든 배우의 이름을 찾고 싶다고 가정 해 보겠습니다.
배우의 이름을 얻기 위해 한 번에 하나의 영화로 시작합니다.
127.0.0.1:8529@_system> db._query("FOR x IN ANY 'movies/TheMatrix' actsIn
OPTIONS {bfs: true, uniqueVertices: 'global'} RETURN x._id").toArray();
산출
다음과 같은 출력을 받게됩니다.
[
"actors/Hugo",
"actors/Emil",
"actors/Carrie",
"actors/Keanu",
"actors/Laurence"
]
이제 우리는 솔루션이 될 두 개의 NEIGHBORS 쿼리의 UNION_DISTINCT를 계속 형성합니다.
127.0.0.1:8529@_system> db._query("FOR x IN UNION_DISTINCT ((FOR y IN ANY
'movies/TheMatrix' actsIn OPTIONS {bfs: true, uniqueVertices: 'global'} RETURN
y._id), (FOR y IN ANY 'movies/TheDevilsAdvocate' actsIn OPTIONS {bfs: true,
uniqueVertices: 'global'} RETURN y._id)) RETURN x").toArray();
산출
[
"actors/Charlize",
"actors/Al",
"actors/Laurence",
"actors/Keanu",
"actors/Carrie",
"actors/Emil",
"actors/Hugo"
]
두 번째 질문
이제 두 번째 질문을 고려해 보겠습니다. All actors who acted in both "movie1" AND "movie2". 이것은 위의 질문과 거의 동일합니다. 하지만 이번에는 UNION이 아니라 INTERSECTION에 관심이 있습니다.
127.0.0.1:8529@_system> db._query("FOR x IN INTERSECTION ((FOR y IN ANY
'movies/TheMatrix' actsIn OPTIONS {bfs: true, uniqueVertices: 'global'} RETURN
y._id), (FOR y IN ANY 'movies/TheDevilsAdvocate' actsIn OPTIONS {bfs: true,
uniqueVertices: 'global'} RETURN y._id)) RETURN x").toArray();
산출
다음과 같은 출력을 받게됩니다.
[
"actors/Keanu"
]
세 번째 질문
이제 세 번째 질문을 고려해 보겠습니다. All common movies between "actor1" and "actor2". 이것은 실제로 movie1과 movie2의 일반적인 배우에 대한 질문과 동일합니다. 시작 정점 만 변경하면됩니다. 예를 들어, Hugo Weaving ( "Hugo")과 Keanu Reeves가 공동 출연하는 모든 영화를 찾아 보겠습니다.
127.0.0.1:8529@_system> db._query(
"FOR x IN INTERSECTION (
(
FOR y IN ANY 'actors/Hugo' actsIn OPTIONS
{bfs: true, uniqueVertices: 'global'}
RETURN y._id
),
(
FOR y IN ANY 'actors/Keanu' actsIn OPTIONS
{bfs: true, uniqueVertices:'global'} RETURN y._id
)
)
RETURN x").toArray();
산출
다음과 같은 출력을 받게됩니다.
[
"movies/TheMatrixReloaded",
"movies/TheMatrixRevolutions",
"movies/TheMatrix"
]
네 번째 질문
이제 네 번째 질문을 고려해 보겠습니다. All actors who acted in 3 or more movies. 이 질문은 다릅니다. 여기서는 이웃 기능을 사용할 수 없습니다. 대신 우리는 그룹화를 위해 AQL의 에지 인덱스와 COLLECT 문을 사용할 것입니다. 기본 아이디어는 모든 가장자리를startVertex(이 데이터 세트에서 항상 액터입니다). 그런 다음 여기에 배우가 연기 한 영화 수를 포함 했으므로 결과에서 영화가 3 개 미만인 모든 배우를 제거합니다.
127.0.0.1:8529@_system> db._query("FOR x IN actsIn COLLECT actor = x._from WITH
COUNT INTO counter FILTER counter >= 3 RETURN {actor: actor, movies:
counter}"). toArray()
산출
[
{
"actor" : "actors/Carrie",
"movies" : 3
},
{
"actor" : "actors/CubaG",
"movies" : 4
},
{
"actor" : "actors/Hugo",
"movies" : 3
},
{
"actor" : "actors/Keanu",
"movies" : 4
},
{
"actor" : "actors/Laurence",
"movies" : 3
},
{
"actor" : "actors/MegR",
"movies" : 5
},
{
"actor" : "actors/TomC",
"movies" : 3
},
{
"actor" : "actors/TomH",
"movies" : 3
}
]
나머지 질문에 대해서는 쿼리 형성에 대해 논의하고 쿼리 만 제공합니다. 독자는 Arangosh 터미널에서 쿼리를 직접 실행해야합니다.
다섯 번째 질문
이제 다섯 번째 질문을 고려해 보겠습니다. All movies where exactly 6 actors acted in. 이전 쿼리와 동일하지만 같음 필터가 있습니다. 그러나 이제 배우 대신 영화가 필요하므로_to attribute −
db._query("FOR x IN actsIn COLLECT movie = x._to WITH COUNT INTO counter FILTER
counter == 6 RETURN movie").toArray()
영화 배우의 수는?
데이터 세트에서 기억합니다. _to 가장자리는 영화에 해당하므로 얼마나 자주 _to나타납니다. 이것은 배우의 수입니다. 쿼리는 이전 쿼리와 거의 동일하지만without the FILTER after COLLECT −
db._query("FOR x IN actsIn COLLECT movie = x._to WITH COUNT INTO counter RETURN
{movie: movie, actors: counter}").toArray()
여섯 번째 질문
이제 여섯 번째 질문을 고려해 보겠습니다. The number of movies by an actor.
위 쿼리에 대한 솔루션을 찾은 방법은이 쿼리에 대한 솔루션을 찾는데도 도움이됩니다.
db._query("FOR x IN actsIn COLLECT actor = x._from WITH COUNT INTO counter
RETURN {actor: actor, movies: counter}").toArray()
이 장에서는 ArangoDB를 배포 할 수있는 다양한 가능성에 대해 설명합니다.
배포 : 단일 인스턴스
이전 장 중 하나에서 Linux (Ubuntu)의 단일 인스턴스를 배포하는 방법을 이미 배웠습니다. 이제 Docker를 사용하여 배포하는 방법을 살펴 보겠습니다.
배포 : Docker
Docker를 사용한 배포의 경우 컴퓨터에 Docker를 설치합니다. 부두 노동자에 대한 자세한 내용은, 우리의 자습서를 참조하시기 바랍니다 도커 .
Docker가 설치되면 다음 명령을 사용할 수 있습니다.
docker run -e ARANGO_RANDOM_ROOT_PASSWORD = 1 -d --name agdb-foo -d
arangodb/arangodb
식별 이름으로 ArangoDB의 Docker 인스턴스를 생성하고 시작합니다. agdbfoo Docker 백그라운드 프로세스로.
또한 터미널은 프로세스 식별자를 인쇄합니다.
기본적으로 포트 8529는 ArangoDB가 요청을 수신하도록 예약되어 있습니다. 또한이 포트는 사용자가 연결했을 수있는 모든 Docker 애플리케이션 컨테이너에서 자동으로 사용할 수 있습니다.