আজ আমরা RedisGraph 2.8-এর সাধারণ উপলব্ধতা প্রকাশের ঘোষণা করতে পেরে আনন্দিত। এই ব্লগ পোস্টটি এখন উপলব্ধ প্রধান নতুন বৈশিষ্ট্যগুলির বিবরণ দেয়৷
৷RedisGraph সম্পর্কে
RedisGraph হল Redis-এর জন্য একটি উচ্চ-কর্মক্ষমতা, মেমরি-প্রথম গ্রাফ ডেটা স্ট্রাকচার। RedisGraph গ্রাফ মাল্টি-টেনেন্সি সমর্থন করে (এটি একসাথে অনেকগুলি গ্রাফ ধারণ করতে পারে) এবং একই সাথে গ্রাফগুলি অ্যাক্সেস করার জন্য একাধিক ক্লায়েন্টকে পরিবেশন করতে পারে। এটি এখন রেডিস স্ট্যাকের অংশ হিসেবেও উপলব্ধ৷
৷RedisGraph 2.8 এ প্রধান নতুন বৈশিষ্ট্যগুলি
- ধনী গ্রাফ মডেল
- মাল্টি-লেবেলযুক্ত নোড
- উন্নত কোয়েরি করার ক্ষমতা
- বর্ধিত পূর্ণ-পাঠ্য অনুসন্ধান
- আরো সাইফার কনস্ট্রাক্ট, ফাংশন এবং অপারেটরকে সমর্থন করে
- কর্মক্ষমতার উন্নতি
- সম্পর্কের বৈশিষ্ট্যের উপর সূচী
- ডেল্টা ম্যাট্রিসেস
- নিয়ন্ত্রণযোগ্য নোড তৈরির বাফার
- বেঞ্চমার্ক
https://redis.com/blog/redisgraph-2-8-is-generally-available/(একটি নতুন ট্যাবে খোলে)
ধনী গ্রাফ মডেল
মাল্টি-লেবেলযুক্ত নোডগুলি
লেবেলযুক্ত সম্পত্তি গ্রাফ (LPG) ডেটা মডেলের অনেকগুলি সংজ্ঞা (যেমন The Property Graph Database Model – Angles, 2018 , এবং ISO/IEC JTC 1/SC 32 – GQL খসড়া) নির্দিষ্ট করে যে একটি নোডে একাধিক লেবেল থাকতে পারে। v2.8 পর্যন্ত, RedisGraph শুধুমাত্র একটি একক লেবেল সমর্থন করে। এখন পর্যন্ত, আমরা প্রতিটি নোডে একাধিক লেবেল যোগ করতে পারি কোনো কর্মক্ষমতার অবনতি বা উল্লেখযোগ্য মেমরি বৃদ্ধি ছাড়াই৷
একাধিক লেবেল সহ একটি নোড তৈরি করতে, আপনি কেবল একটি কোলন দ্বারা পৃথক করা সমস্ত লেবেল তালিকাভুক্ত করুন:
গ্রাফ
একাধিক লেবেল (AND শর্ত) সহ একটি নোড মেলাতে, আপনার একই কোলন স্বরলিপি ব্যবহার করা উচিত:
GRAPH.QUERY g "MATCH (e:Employee:BoardMember) রিটার্ন e"
উন্নত প্রশ্ন করার ক্ষমতা
উন্নত পূর্ণ-পাঠ্য অনুসন্ধান
RedisGraph RedisSearch-এর সাথে এম্বেড করা হয় এবং সেকেন্ডারি ইনডেক্সিংয়ের জন্য এটিকে লিভারেজ করা হয় তবে এটি উন্নত ইন্ডেক্সিং এবং অনুসন্ধানের জন্যও ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ - পৃথিবীর একটি নির্দিষ্ট বিন্দুতে ভৌগলিক নৈকট্যের উপর ভিত্তি করে নোডগুলি সন্ধান করা বা সম্পর্কিত আইটেমগুলিকে উচ্চতর করা৷
সংস্করণ 2.8 ভাষা এবং স্টপওয়ার্ড কনফিগারেশন বিকল্প যোগ করে। টেক্সট স্টেমিং এর জন্য কোন ভাষা ব্যবহার করতে হবে তা ভাষা নির্ধারণ করে - যা সূচকে একটি শব্দের ভিত্তি ফর্ম যোগ করছে। এটি "going" এর জন্য ক্যোয়ারীটিকে "go" এবং "gone" এর জন্যও ফলাফল প্রদান করতে দেয়, উদাহরণস্বরূপ। স্টপওয়ার্ডগুলি খুব সাধারণ শব্দ (যেমন “is, the, an, and…”) যেগুলি অনুসন্ধানের জন্য খুব বেশি তথ্য যোগ করে না তবে সূচকে অনেক জায়গা নেয়। অনুসন্ধান করার সময় এই শব্দগুলি সূচীকৃত এবং উপেক্ষা করা হয় না। একটি স্টপওয়ার্ড সহ একটি প্রশ্ন শব্দ, যেমন "প্যারিসে" শুধুমাত্র "প্যারিস" হিসাবে দেখা হবে৷
জার্মান ভাষা ব্যবহার করে এবং মুভি লেবেল সহ সমস্ত নোডের কাস্টম স্টপওয়ার্ড ব্যবহার করে চলচ্চিত্রের শিরোনাম সম্পত্তিতে একটি পূর্ণ-পাঠ্য সূচক তৈরি করতে:
GRAPH.QUERY DEMO_GRAPH "CALL db.idx.fulltext.createNodeIndex({ লেবেল:'মুভি', ভাষা:'জার্মান', স্টপওয়ার্ডস:['a', 'ab'] }, 'title')"
RediSearch 3টি অতিরিক্ত ফিল্ড কনফিগারেশন বিকল্প প্রদান করে:
- ওজন – ক্ষেত্রের পাঠ্যের গুরুত্ব
- নোস্টেম – টেক্সট ইন্ডেক্স করার সময় স্টেমিং এড়িয়ে যান
- ফোনেটিক – টেক্সটে ফোনেটিক সার্চ সক্রিয় করুন
মুভি লেবেল সহ সমস্ত নোডের ফোনেটিক অনুসন্ধান সহ শিরোনাম সম্পত্তিতে একটি পূর্ণ-পাঠ্য সূচক তৈরি করতে:
GRAPH.QUERY DEMO_GRAPH "CALL db.idx.fulltext.createNodeIndex('Movie', {ক্ষেত্র:'title', ধ্বনিগত:'dm:en'})"
আরো সাইফার কনস্ট্রাক্ট, ফাংশন এবং অপারেটরকে সমর্থন করে
RedisGraph 2.8 বর্ধিত সাইফার সমর্থন কভারেজ:
- প্যাটার্ন বোধগম্যতা
-
allShortestPaths
-এর জন্য সমর্থন যোগ করুন ফাংশন - সাইফার ফাংশন:
কী, হ্রাস, প্রতিস্থাপন, কিছুই নয়,
এবংএকক
-
SET
-এ নোড অ্যাট্রিবিউট-সেটের কপি করা ধারাগুলি -
WHERE
-এ নোড লেবেল দ্বারা ফিল্টার করা ধারাগুলি - সাইফার অপারেটর:
XOR
এবং^
প্যাটার্ন বোধগম্যতা
প্যাটার্ন বোঝা সাইফারে উপলব্ধ একটি সিনট্যাকটিক নির্মাণ। যদিও তালিকা বোধগম্যতা আমাদের বিদ্যমান তালিকার উপর ভিত্তি করে একটি তালিকা তৈরি করতে দেয়, প্যাটার্ন বোঝা একটি প্যাটার্নের মিলের ফলাফলের সাথে একটি তালিকা তৈরি করার একটি উপায়। এটি একটি স্ট্যান্ডার্ড
MATCHহিসাবে নির্দিষ্ট প্যাটার্নের সাথে মিলবে ক্লজ, একটি স্ট্যান্ডার্ড
WHEREহিসাবে পূর্বাভাস সহ ধারা, কিন্তু একটি নির্দিষ্ট অভিক্ষেপ প্রদান করে।
উদাহরণ স্বরূপ, নিম্নলিখিত ক্যোয়ারীটি পুরুষ কর্মচারীদের দ্বারা প্রাপ্ত সমস্ত অনুদানের ধরন সমন্বিত একটি তালিকা ফেরত দেবে যেখানে অনুদানের পরিমাণ $1000-এর চেয়ে বেশি।
গ্রাফ
GRAPH.QUERY g "MATCH (e:Employee {gender:'Male'}) রিটার্ন [(e)-[:মঞ্জুর করা]->(g:Grant) যেখানে g.amount> 1000 | g.type] AS grantTypes"
এর জন্য সমর্থন যোগ করুন ৷ সমস্ত সংক্ষিপ্তপথ ফাংশন
সমস্ত সংক্ষিপ্তপথফাংশন সমস্ত মানদণ্ডের সাথে মেলে এমন এক জোড়া সত্তার মধ্যে সমস্ত সংক্ষিপ্ততম পথ ফেরত দেয়। উভয় সত্তাকে অবশ্যই আগের
WITH-এ আবদ্ধ থাকতে হবে -সীমাবদ্ধ সুযোগ।
গ্রাফ :PLAYED_WITH*]->(k)) অভিনেতা হিসেবে রিটার্ন নোড(p)"
এই ক্যোয়ারীটি চার্লি শিনের প্রতিনিধিত্বকারী অভিনেতা নোডকে কেভিন বেকনের প্রতিনিধিত্বকারীর সাথে সংযোগকারী ন্যূনতম দৈর্ঘ্যের সমস্ত পথ তৈরি করবে৷ দুই অভিনেতার মধ্যে বেশ কয়েকটি 2-হপ পথ রয়েছে এবং এই সবগুলিই ফিরে আসবে। পাথের গণনা তখন বন্ধ হয়ে যায়, কারণ আমরা 2-এর বেশি দৈর্ঘ্যের কোনো পাথে আগ্রহী নই।
অনুসন্ধানের জন্য একটি সর্বনিম্ন দৈর্ঘ্য (1 হতে হবে) এবং সর্বাধিক দৈর্ঘ্য (অন্তত 1 হতে হবে) নির্দিষ্ট করা যেতে পারে। শূন্য বা তার বেশি সম্পর্কের ধরন নির্দিষ্ট করা যেতে পারে (যেমন
[:R|Q*1..3]) প্যাটার্নে কোনো সম্পত্তি ফিল্টার চালু করা যাবে না।
এর জন্য সমর্থন যোগ করুন ৷ কী সাইফার ফাংশন
কীফাংশন ইনপুট হিসাবে একটি নোড, একটি সম্পর্ক বা একটি মানচিত্র গ্রহণ করে এবং ইনপুটটিতে থাকা সমস্ত কীগুলির একটি অ্যারে প্রদান করে৷
<পূর্ব>ম্যাচ (ক) রিটার্ন কী(ক)
ম্যাচ ()-[ই]->() রিটার্ন কী(ই)
রিটার্ন কী({a:1, b:2})
এর জন্য সমর্থন যোগ করুন ৷ কমাও সাইফার ফাংশন
হ্রাসফাংশন একটি প্রারম্ভিক মান এবং একটি তালিকা গ্রহণ করে। এটি তারপর তালিকার প্রতিটি উপাদানের বিপরীতে একটি অভিব্যক্তি মূল্যায়ন করে মান আপডেট করে।
GRAPH.QUERY g "ফেরত হ্রাস করুন(সমষ্টি =0, n পরিসরে(1,10) | যোগফল + n)"
এই ফাংশনের আউটপুট হবে 55 - 1 এবং 10 এর মধ্যে পূর্ণসংখ্যার যোগফল।
গ্রাফ
এই ফাংশনের আউটপুট হবে 1 এবং 10 এর মধ্যে পূর্ণসংখ্যার বর্গাকার সমন্বিত একটি অ্যারে।
সাইফার স্ট্রিং ফাংশন প্রতিস্থাপনের জন্য সমর্থন যোগ করুন
একটি প্রদত্ত সাবস্ট্রিং এর সমস্ত ঘটনাকে অন্যটির সাথে প্রতিস্থাপন করে। ফাংশনটি 3টি পরামিতি পায়:আসল স্ট্রিং, প্রতিস্থাপনের ঘটনা এবং সেগুলিকে কী দিয়ে প্রতিস্থাপন করতে হবে।
GRAPH.QUERY g "রিটার্ন প্রতিস্থাপন('abc*efg', '*', 'd')"
রিটার্ন মান হবে 'abcdefg'।
এই ফাংশনটি সাবস্ট্রিংগুলিকে একটি খালি স্ট্রিং (‘’) দিয়ে প্রতিস্থাপন করে মুছে ফেলতে পারে।
এর জন্য সমর্থন যোগ করুন ৷ কোনটিই নয় এবং একক সাইফার ফাংশন
একটি তালিকা প্রদত্ত, একটি প্রিডিকেট কোনো উপাদানের জন্য ধারণ না করলে কোনোটিই সত্য হয় না, যখন প্রদত্ত পূর্বাভাসটি শুধুমাত্র একটি উপাদানের জন্য ধারণ করে তবে একক প্রত্যাবর্তন করে।
গ্রাফ
GRAPH.QUERY g "রিটার্ন সিঙ্গেল(x ইন রেঞ্জ(1,10) WHERE x>9)"
এই ফাংশনগুলি সমস্ত এবং যেকোন ফাংশনের সাথে একই রকম৷
৷একটি সম্ভাব্য ব্যবহারের ক্ষেত্রে পাথ ফিল্টারিং:
graph.query DEMO_GRAPH “MATCH p =(a {নাম:'Johnny Depp'})-[*2..5]->(b {name:'Kevin Bacon'}) WHERE None(n NOdes(p) WHERE n.year> 1970) রিটার্ন p”
এই প্রশ্নটি জনি ডেপ থেকে কেভিন বেকন পর্যন্ত 2 থেকে 5 দৈর্ঘ্যের সমস্ত পথ ফিরিয়ে দেবে, যার মধ্যে 1970 সালের পরে জন্মগ্রহণকারী কোনও অভিনেতা নেই৷
SET
-এ নোড অ্যাট্রিবিউট সেটের অনুলিপি করার জন্য সমর্থন যোগ করুন ধারাগুলি
SETএকটি নোডের সমস্ত সম্পত্তি মান অন্য নোডের সম্পত্তি মানগুলির সাথে প্রতিস্থাপন বা যুক্ত করতে ক্লজ ব্যবহার করা যেতে পারে৷
নিম্নলিখিত ক্যোয়ারী দুটি সত্তার সাথে মিলিত হবে, এবং তারপর b এর বৈশিষ্ট্যগুলির সাথে a এর সমস্ত বৈশিষ্ট্য প্রতিস্থাপন করবে:
GRAPH.QUERY g "MATCH (a {v:1}), (b {v:2}) SET a =b"
নিম্নলিখিত ক্যোয়ারী দুটি সত্তার সাথে মিলবে, এবং তারপর b-এর বৈশিষ্ট্যের সাথে a-এর বৈশিষ্ট্যগুলির সাথে যোগ করুন (বা মান প্রতিস্থাপন করুন)৷
GRAPH.QUERY g "MATCH (a {v:1}), (b {v:2}) সেট a +=b"
আমরা বৈশিষ্ট্য পরিবর্তন না করেও সম্পর্কের ধরন পরিবর্তন করতে পারি:
গ্রাফ d"
এ নোড লেবেল দ্বারা ফিল্টার করার জন্য সমর্থন যোগ করুন কোথায় ধারা
WHERE ক্লজেও এখন নোড লেবেল বা সম্পর্কের ধরন দ্বারা ফিল্টার করা সম্ভব:
গ্রাফ
GRAPH.QUERY g "MATCH(a)-[b]-(c) কোথায় b:L রিটার্ন b"
সাইফার অপারেটর XOR এবং ^-এর জন্য সমর্থন যোগ করুন
GRAPH.QUERY g "রিটার্ন true XOR true"
GRAPH.QUERY g "রিটার্ন 2 ^ 3"
ফলাফল হল
falseএবং
8, যথাক্রমে।
পারফরম্যান্সের উন্নতি
সম্পর্কের বৈশিষ্ট্যের উপর সূচী
নোডের জন্য, আমরা নিম্নলিখিত কমান্ড জারি করে একটি সূচক প্রবর্তন করতে পারি
GRAPH.QUERY g "(n:গ্রান্টস) চালু করার জন্য সূচক তৈরি করুন"
এখন সম্পর্কের জন্যও সূচী প্রবর্তন করা সম্ভব:
GRAPH.QUERY g "()-[r:R]-() অন (r.prop) এর জন্য সূচক তৈরি করুন"
নিম্নলিখিত প্রশ্নটি বিবেচনা করুন:
GRAPH.QUERY g "MATCH (a)-[r:R {prop:5}]-(b) রিটার্ন *"
আসুন একটি সূচক তৈরি করার আগে কার্যকরী পরিকল্পনাটি পর্যবেক্ষণ করি:
redis:6379> GRAPH.Explain g "MATCH(a)-[r:R {prop:5}]-(b) return *"
1) "ফলাফল" |
এবং এটি একটি সূচক তৈরি করার পরে একই প্রশ্নের জন্য কার্যকরী পরিকল্পনা:
redis:6379> GRAPH.Explain g "MATCH(a)-[r:R {prop:5}]-(b) return *"
1) "ফলাফল" |
ডেল্টা ম্যাট্রিক্স
সংস্করণ 2.8 থেকে, গ্রাফ নোড এবং সম্পর্ক সংযোজন এবং মুছে ফেলা অনেক দ্রুত, কারণ সেগুলি প্রথমে ছোট ডেল্টা ম্যাট্রিসে আপডেট করা হয়। প্রধান ম্যাট্রিক্স তারপর বাল্ক-আপডেট করা হয়।
RedisGraph-এ, গ্রাফগুলি সংলগ্ন ম্যাট্রিক্সের সাথে উপস্থাপন করা হয়। প্রতিটি নোড লেবেল এবং গ্রাফের প্রতিটি সম্পর্ক প্রকারের নিজস্ব ম্যাট্রিক্স রয়েছে। আগে, প্রতিবার গ্রাফে একটি নতুন নোড যোগ করা হলে, সমস্ত ম্যাট্রিক্সের আকার পরিবর্তন করতে হবে, এবং ডাটাবেস যত বড় হবে, তত বেশি সময় লাগবে।
v2.8 থেকে, নতুন নোড এবং সম্পর্ক সন্নিবেশ করতে যে সময় লাগে তা যথেষ্ট ছোট এবং গ্রাফের আকারের উপর আর নির্ভর করে না। এই অপ্টিমাইজেশানটি গ্রাফে প্রতিটি ম্যাট্রিক্সের জন্য দুটি ডেল্টা ম্যাট্রিক্স প্রবর্তন করে অর্জন করা হয়েছিল:একটি নোড সংযোজনের জন্য (D+) এবং একটি নোড মুছে ফেলার জন্য (D-)। নোড সংযোজন এবং মুছে ফেলাগুলি তাদের উপযুক্ত ডেল্টা ম্যাট্রিক্সে প্রতিফলিত হয় এবং একবার একটি ডেল্টা ম্যাট্রিক্স 10000 নোডের থ্রেশহোল্ডে পৌঁছালে (
DELTA_MAX_PENDING_CHANGESএর মাধ্যমে কনফিগার করা যায় কনফিগারেশন প্যারামিটার), এটি একটি একক বাল্ক অপারেশনে প্রধান ম্যাট্রিক্সের সাথে সিঙ্ক্রোনাইজ করা হয়, খালি করা হয় এবং একই চক্র আবার শুরু হতে পারে।
নিয়ন্ত্রণযোগ্য নোড তৈরির বাফার
একটি নতুন লোড-টাইম কনফিগারেশন প্যারামিটার, NODE_CREATION_BUFFER, ভবিষ্যতে নোড তৈরির জন্য ম্যাট্রিসে সংরক্ষিত মেমরির পরিমাণ নিয়ন্ত্রণ করে। উদাহরণস্বরূপ, যখন 16,384 তে সেট করা হয়, তখন ম্যাট্রিক্সে 16384 নোড তৈরির জন্য অতিরিক্ত স্থান থাকবে। যখনই অতিরিক্ত স্থান শূন্য হবে, ম্যাট্রিক্সের আকার 16384 দ্বারা বৃদ্ধি পাবে।
এই মান হ্রাস করা মেমরি খরচ কমিয়ে দেবে, কিন্তু ম্যাট্রিক্স রিলোকেশনের বর্ধিত ফ্রিকোয়েন্সির কারণে কর্মক্ষমতা হ্রাস পাবে। বিপরীতভাবে, এটি বাড়ানোর ফলে লেখা-ভারী কাজের চাপের জন্য কর্মক্ষমতা উন্নত হতে পারে তবে মেমরি খরচ বৃদ্ধি পাবে।
পাস করা আর্গুমেন্ট যদি 2-এর পাওয়ার না হয়, তাহলে মেমরির সারিবদ্ধতা উন্নত করতে এটি 2-এর পরবর্তী-শ্রেষ্ঠ শক্তিতে রাউন্ড করা হবে৷
বেঞ্চমার্ক
আমরা ডেল্টা ম্যাট্রিক্স ছাড়াও আরও অনেক কর্মক্ষমতা বর্ধন যোগ করেছি। আমরা LDBC SNB বেঞ্চমার্ক ব্যবহার করে নীচে এই উন্নতিগুলি প্রদর্শন করি৷
LDBC SNB (লিঙ্কড ডেটা বেঞ্চমার্ক কাউন্সিল – সোশ্যাল নেটওয়ার্ক বেঞ্চমার্কস) হল গ্রাফ ডেটাবেস রিয়েল-ওয়ার্ল্ড রিড এবং রাইট ওয়ার্কলোড তুলনা করার জন্য ইন্ডাস্ট্রি-স্ট্যান্ডার্ড বেঞ্চমার্ক৷
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.4 এর চেয়ে 2.32 গুণ দ্রুত
- কোয়েরি লিখুন:
RedisGraph 2.8, RedisGraph 2.4 এর চেয়ে 1.09 গুণ দ্রুত
ডেটা পুনরুদ্ধার এবং সিঙ্ক করা (RDB এবং AOF) অনেক দ্রুত (কিছু কিছু পরিস্থিতিতে দ্রুততর মাত্রার বেশ কয়েকটি অর্ডার পর্যন্ত)।
RedisGraph হল Redis Stack এর অংশ
RedisGraph এখন Redis Stack এর অংশ। আপনি ম্যাকওএস, উবুন্টু, বা রেডহ্যাটের জন্য সর্বশেষ রেডিস স্ট্যাক সার্ভার বাইনারিগুলি ডাউনলোড করতে পারেন বা ডকার, হোমব্রু, বা লিনাক্সের সাথে ইনস্টল করতে পারেন৷
RedisInsight ব্যবহার করে RedisGraph-এর অভিজ্ঞতা নিন
RedisInsight হল ডেভেলপারদের জন্য একটি ভিজ্যুয়াল টুল যা Redis বা Redis Stack ব্যবহার করে ডেভেলপমেন্টের সময় RedisTimes থেকে ডেটা অন্বেষণ করার একটি চমৎকার উপায় প্রদান করে।
আপনি গ্রাফ ক্যোয়ারী চালাতে পারেন এবং গ্রাফিক্যাল ইউজার ইন্টারফেস থেকে সরাসরি ফলাফল দেখতে পারেন। RedisInsight এখন RedisGraph ক্যোয়ারী ফলাফল কল্পনা করতে পারে।
এছাড়াও, RedisInsight-এ RedisGraph ইন্টারেক্টিভভাবে শেখার জন্য দ্রুত গাইড এবং টিউটোরিয়াল রয়েছে।
redis.io এবং developer.redis.com-এ RedisGraph সম্পর্কে আরও জানুন।