Computer >> 컴퓨터 >  >> 프로그램 작성 >> Redis

RedisGraph 2.8이 출시되었습니다!

오늘 RedisGraph 2.8의 일반 공급 릴리스를 발표하게 되어 기쁩니다. 이 블로그 게시물은 현재 사용할 수 있는 주요 새 기능에 대해 자세히 설명합니다.

RedisGraph 소개

RedisGraph는 Redis를 위한 고성능, 메모리 우선 그래프 데이터 구조입니다. RedisGraph는 그래프 다중 테넌시를 지원하며(많은 그래프를 동시에 보유할 수 있음) 그래프에 동시에 액세스하는 여러 클라이언트에 서비스를 제공할 수 있습니다. 이제 Redis Stack의 일부로도 사용할 수 있습니다.

RedisGraph 2.8의 주요 새로운 기능

  • 풍부한 그래프 모델
    • 다중 레이블이 지정된 노드
  • 향상된 쿼리 기능
    • 향상된 전체 텍스트 검색
    • 더 많은 Cypher 구조, 함수 및 연산자 지원
  • 성능 개선
    • 관계 속성에 대한 색인
    • 델타 행렬
    • 제어 가능한 노드 생성 버퍼
    • 벤치마크

https://redis.com/blog/redisgraph-2-8-is-generally-available/(새 탭에서 열림)

풍부한 그래프 모델

다중 레이블이 지정된 노드

레이블이 지정된 속성 그래프(LPG) 데이터 모델의 많은 정의(예:속성 그래프 데이터베이스 모델 – 각도, 2018 및 ISO/IEC JTC 1/SC 32 – GQL 초안)은 노드가 여러 레이블을 가질 수 있음을 지정합니다. v2.8까지 RedisGraph는 단일 레이블만 지원했습니다. 현재로서는 성능 저하나 상당한 메모리 증가 없이 각 노드에 여러 레이블을 추가할 수 있습니다.

여러 레이블이 있는 노드를 만들려면 모든 레이블을 콜론으로 구분하여 나열하기만 하면 됩니다.

GRAPH.QUERY g "CREATE(e:Employee:BoardMember {이름:'Vincent Chan', 직위:'웹 마케팅 리드'}) return e"

여러 레이블(AND 조건)이 있는 노드를 일치시키려면 동일한 콜론 표기법도 사용해야 합니다.

GRAPH.QUERY g "MATCH(e:Employee:BoardMember) 리턴 e"

향상된 쿼리 기능

향상된 전체 텍스트 검색

RedisGraph는 RedisSearch와 함께 제공되며 보조 인덱싱에 활용되지만 고급 인덱싱 및 검색에도 사용할 수 있습니다. 예를 들어 - 지구상의 특정 지점에 대한 지리적 근접성을 기반으로 노드를 찾거나 관련 항목에 더 높은 점수를 매깁니다.

버전 2.8에는 언어 및 불용어 구성 옵션이 추가되었습니다. 언어는 단어의 기본 형태를 색인에 추가하는 형태소 분석에 사용할 언어를 정의합니다. 이를 통해 예를 들어 "가는"에 대한 쿼리가 "가는" 및 "가는"에 대한 결과도 반환할 수 있습니다. 불용어는 검색에 많은 정보를 추가하지 않지만 색인에서 많은 공간을 차지하는 매우 일반적인 단어(예:"is,,, and...")입니다. 이러한 단어는 색인이 생성되지 않고 검색 시 무시됩니다. "in Paris"와 같이 불용어가 포함된 검색어는 "Paris"로만 표시됩니다.

독일어를 사용하고 레이블이 Movie인 모든 노드의 사용자 정의 불용어를 사용하여 영화의 title 속성에 대한 전체 텍스트 인덱스를 구성하려면:

GRAPH.QUERY DEMO_GRAPH "콜 db.idx.fulltext.createNodeIndex({ 레이블:'영화', 언어:'독일어', 불용어:['a', 'ab'] }, '제목')" 

RediSearch는 3가지 추가 필드 구성 옵션을 제공합니다. 

  • 가중치 – 필드에서 텍스트의 중요성
  • nostem – 텍스트 색인 생성 시 형태소 분석 건너뛰기
  • 음성 - 텍스트에서 음성 검색 활성화

Movie 레이블이 있는 모든 노드의 음성 검색을 사용하여 title 속성에 대한 전체 텍스트 인덱스를 구성하려면:

GRAPH.QUERY DEMO_GRAPH "db.idx.fulltext.createNodeIndex('영화', {필드:'제목', 음성:'dm:en'}) 호출"

더 많은 Cypher 구성, 함수 및 연산자 지원

RedisGraph 2.8 확장된 Cypher 지원 범위:

  • 패턴 이해
  • allShortestPaths
    에 대한 지원 추가 기능
  • 암호화 기능:
    키, 줄이기, 바꾸기, 없음,
    단일
  • SET
    의 노드 속성 집합 복사 조항
  • WHERE
    의 노드 레이블로 필터링 조항
  • 암호 연산자:
    XOR
    그리고
    ^ 

패턴 이해

패턴 이해는 Cypher에서 사용할 수 있는 구문 구조입니다. 목록 이해를 사용하면 기존 목록을 기반으로 목록을 만들 수 있지만 패턴 이해는 패턴 일치 결과로 목록을 채우는 방법입니다. 표준

MATCH
에서와 같이 지정된 패턴과 일치합니다. 절, 표준
WHERE
에서와 같은 술어 포함 절이지만 지정된 프로젝션을 생성합니다.

예를 들어, 다음 쿼리는 보조금 금액이 $1000보다 큰 남성 직원이 받은 모든 보조금 유형을 포함하는 목록을 반환합니다.

GRAPH.QUERY g "CREATE (e:Employee {gender:'남성'})-[:granted]->(g:Grant {유형:'연구', 금액:2000})"

GRAPH.QUERY g "MATCH (e:Employee {gender:'남성'}) RETURN [(e)-[:granted]->(g:Grant) WHERE g.amount> 1000 | g.type] AS 부여 유형"

지원 추가 allShortestPaths 기능

allShortestPaths
함수는 모든 기준과 일치하는 엔터티 쌍 간의 모든 최단 경로를 반환합니다. 두 엔터티 모두 이전
WITH
에 바인딩되어야 합니다. - 범위가 구분됩니다.

GRAPH.QUERY DEMO_GRAPH "MATCH (c:Actor {name:'Charlie Sheen'}), (k:Actor {name:'Kevin Bacon'}) WITH c, k MATCH p =allShortestPaths((c)-[ :PLAYED_WITH*]->(k)) 노드(p)를 액터로 반환"

이 쿼리는 Charlie Sheen을 나타내는 액터 노드를 Kevin Bacon을 나타내는 노드로 연결하는 최소 길이의 모든 경로를 생성합니다. 두 액터 사이에는 여러 개의 2홉 경로가 있으며 모두 반환됩니다. 길이가 2보다 큰 경로에는 관심이 없으므로 경로 계산이 종료됩니다.

검색을 위한 최소 길이(1이어야 함)와 최대 길이(최소 1이어야 함)를 지정할 수 있습니다. 0개 이상의 관계 유형을 지정할 수 있습니다(예:

[:R|Q*1..3]
). 패턴에 속성 필터를 도입할 수 없습니다.

지원 추가 암호 기능

함수는 노드, 관계 또는 지도를 입력으로 받아들이고 입력에 포함된 모든 키의 배열을 반환합니다.

MATCH(a) RETURN 키(a) 
MATCH ()-[e]->() RETURN 키(e)
RETURN 키({a:1, b:2})

지원 추가 감소 암호 기능

감소
함수는 시작 값과 목록을 허용합니다. 그런 다음 목록의 각 요소에 대해 표현식을 평가하여 값을 업데이트합니다.

GRAPH.QUERY g "RETURN reduce(sum =0, n IN range(1,10) | sum + n)"

이 함수의 출력은 1과 10 사이의 정수의 합인 55가 됩니다.

GRAPH.QUERY g "반환 감소(arr =[], n IN 범위(1,10) | arr + [n*n])"

이 함수의 출력은 1에서 10 사이의 정수의 제곱을 포함하는 배열입니다.

Cypher 문자열 기능 대체 지원 추가

지정된 하위 문자열의 모든 항목을 다른 문자열로 바꿉니다. 이 함수는 3개의 매개변수를 받습니다:원래 문자열, 대체할 항목, 대체할 대상입니다.

GRAPH.QUERY g "RETURN replace('abc*efg', '*', 'd')"

반환 값은 'abcdefg'입니다.

이 함수는 하위 문자열을 빈 문자열('')로 대체하여 삭제할 수도 있습니다.

지원 추가 없음 싱글 암호 기능

주어진 목록에서 조건자가 요소에 대해 유지되지 않으면 none이 true를 반환하고 단일 요소가 하나의 요소에 대해서만 유지되는 경우 single이 true를 반환합니다.

GRAPH.QUERY g "RETURN 없음(x IN 범위(1,10) WHERE x>10)" 
GRAPH.QUERY g "RETURN single(x IN range(1,10) WHERE x>9)"

이러한 기능은 모든 기능과 유사합니다.

한 가지 가능한 사용 사례는 경로 필터링입니다.

graph.query DEMO_GRAPH “MATCH p =(a {name:'Johnny Depp'})-[*2..5]->(b {name:'Kevin Bacon'}) WHERE 없음(n IN 노드(p) WHERE n.년> 1970) 반환 p”

이 쿼리는 1970년 이후에 태어난 배우를 포함하지 않고 Johnny Depp에서 Kevin Bacon까지 길이가 2에서 5인 모든 경로를 반환합니다.

SET
에서 노드 속성 세트 복사 지원 추가 조항

SET
절은 한 노드의 모든 속성 값을 다른 노드의 속성 값으로 바꾸거나 추가하는 데 사용할 수 있습니다.

다음 쿼리는 두 엔터티를 일치시킨 다음 모든 a의 속성을 b의 속성으로 바꿉니다.

GRAPH.QUERY g "MATCH (a {v:1}), (b {v:2}) SET a =b"

다음 쿼리는 두 엔터티를 일치시킨 다음 a의 속성을 b의 속성으로 추가(또는 값 바꾸기)합니다.

GRAPH.QUERY g "MATCH (a {v:1}), (b {v:2}) SET a +=b"

속성을 변경하지 않고 관계 유형을 변경할 수도 있습니다.

GRAPH.QUERY g "MATCH (a)-[b]->(c) WHERE ID(b)=0 CREATE (a)-[d:bar]->(c) SET d=b DELETE b RETURN d"

노드 레이블별 필터링 지원 추가 어디서

이제 WHERE 절에서도 노드 레이블 또는 관계 유형별로 필터링할 수 있습니다.

GRAPH.QUERY g "MATCH (a) WHERE a:L RETURN a" 
GRAPH.QUERY g "MATCH (a)-[b]-(c) WHERE b:L RETURN b"

사이퍼 연산자 XOR 및 ^에 대한 지원 추가

GRAPH.QUERY g "RETURN true XOR true" 
GRAPH.QUERY g "2 ^ 3 반환"

결과는

거짓
입니다. 그리고
8
, 각각.

성능 개선

관계 속성에 대한 색인

노드의 경우 다음 명령을 실행하여 인덱스를 도입할 수 있습니다.

GRAPH.QUERY g "(n:GRANTS) ON(n.GrantedBy)에 대한 인덱스 생성"

이제 관계에 대한 색인도 도입할 수 있습니다.

GRAPH.QUERY g "CREATE INDEX FOR ()-[r:R]-() ON (r.prop)"

다음 쿼리를 고려하십시오.

GRAPH.QUERY g "MATCH (a)-[r:R {prop:5}]-(b) return *"

인덱스를 생성하기 전에 실행 계획을 살펴보겠습니다.

redis:6379> GRAPH.EXPLAIN g "MATCH (a)-[r:R {prop:5}]-(b) return *"

1) "결과" 
2) "    프로젝트"
3) "        필터"
4) "            조건부 트래버스 | (a)-[r:R]->(b)"
5) "                모든 노드 스캔 | (a)"

그리고 이것은 인덱스 생성 후 동일한 쿼리에 대한 실행 계획입니다.

redis:6379> GRAPH.EXPLAIN g "MATCH (a)-[r:R {prop:5}]-(b) return *"

1) "결과" 
2) "    프로젝트"
3) "        Edge By Index Scan | [r:R]"

델타 행렬

버전 2.8부터 그래프 노드 및 관계 추가 및 삭제는 작은 델타 행렬에서 먼저 업데이트되기 때문에 훨씬 더 빠릅니다. 그러면 기본 매트릭스가 일괄 업데이트됩니다.

RedisGraph에서 그래프는 인접 행렬로 표현됩니다. 그래프의 모든 노드 레이블과 모든 관계 유형에는 고유한 행렬이 있습니다. 이전에는 그래프에 새 노드가 추가될 때마다 모든 행렬의 크기를 조정해야 했고 데이터베이스가 클수록 더 많은 시간이 걸렸습니다.

RedisGraph 2.8이 출시되었습니다!

v2.8 이후로, 새로운 노드와 관계를 삽입하는 데 걸리는 시간이 훨씬 줄어들었고 더 이상 그래프의 크기에 의존하지 않습니다. 이 최적화는 그래프의 모든 행렬에 대해 두 개의 델타 행렬을 도입하여 달성되었습니다. 하나는 노드 추가(D+)용이고 다른 하나는 노드 삭제(D-)용입니다. 노드 추가 및 삭제는 적절한 델타 매트릭스에 반영되며, 델타 매트릭스가 10000개 노드 임계값에 도달하면(

DELTA_MAX_PENDING_CHANGES
를 통해 구성 가능) 구성 매개변수), 단일 대량 작업에서 기본 매트릭스와 동기화되고 비워지며 동일한 주기가 다시 시작될 수 있습니다.

제어 가능한 노드 생성 버퍼

새로운 로드 시간 구성 매개변수인 NODE_CREATION_BUFFER는 향후 노드 생성을 위해 매트릭스에 예약된 메모리 양을 제어합니다. 예를 들어, 16,384로 설정하면 행렬 생성 시 16,384개 노드를 위한 추가 공간이 생깁니다. 여분의 공간이 고갈될 때마다 행렬의 크기는 16384만큼 증가합니다.

이 값을 줄이면 메모리 소비가 줄어들지만 매트릭스 재할당 빈도가 높아져 성능이 저하됩니다. 반대로 이 값을 높이면 쓰기 작업이 많은 워크로드의 성능이 향상될 수 있지만 메모리 소비가 늘어납니다.

전달된 인수가 2의 거듭제곱이 아닌 경우 메모리 정렬을 개선하기 위해 다음으로 큰 2의 거듭제곱으로 반올림됩니다.

벤치마크

델타 행렬 외에도 많은 다른 성능 향상 기능을 추가했습니다. LDBC SNB 벤치마크를 사용하여 아래에서 이러한 개선 사항을 보여줍니다.
LDBC SNB(Linked Data Benchmark Council – Social Network Benchmarks)는 그래프 데이터베이스의 실제 읽기 및 쓰기 작업 부하를 비교하기 위한 업계 표준 벤치마크입니다.

전체 데이터 로드는 RedisGraph 2.8에서 훨씬 빠릅니다.

  • LDBC 배율 1:
    RedisGraph 2.8은 RedisGraph 2.4보다 1.92배 빠릅니다.
  • LDBC 배율 10:
    RedisGraph 2.8은 RedisGraph 2.4보다 2.00배 빠릅니다.
RedisGraph 2.8이 출시되었습니다!

LDBC 쿼리(읽기 및 쓰기 모두)는 RedisGraph 2.8에서 훨씬 빠르게 실행됩니다.

  • 쿼리 읽기:
    RedisGraph 2.8은 RedisGraph 2.4보다 2.32배 빠릅니다.
  • 쿼리 작성:
    RedisGraph 2.8은 RedisGraph 2.4보다 1.09배 빠릅니다.
RedisGraph 2.8이 출시되었습니다!

데이터(RDB 및 AOF) 복원 및 동기화도 훨씬 빠릅니다(일부 상황에서는 최대 몇 배 더 빠름).

RedisGraph는 Redis 스택의 일부입니다.

RedisGraph는 이제 Redis 스택의 일부입니다. macOS, Ubuntu 또는 Redhat용 최신 Redis Stack Server 바이너리를 다운로드하거나 Docker, Homebrew 또는 Linux와 함께 설치할 수 있습니다.

RedisInsight를 사용한 RedisGraph 경험

RedisInsight는 Redis 또는 Redis Stack을 사용하여 개발하는 동안 RedisTimes에서 데이터를 탐색할 수 있는 탁월한 방법을 제공하는 개발자용 시각적 도구입니다.

RedisGraph 2.8이 출시되었습니다!

그래프 쿼리를 실행하고 그래픽 사용자 인터페이스에서 직접 결과를 관찰할 수 있습니다. RedisInsight는 이제 RedisGraph 쿼리 결과를 시각화할 수 있습니다.

RedisGraph 2.8이 출시되었습니다!

또한 RedisInsight에는 대화식으로 RedisGraph를 학습하기 위한 빠른 가이드와 자습서가 포함되어 있습니다.

redis.io 및 developer.redis.com의 RedisGraph에 대해 자세히 알아보세요.