သင့်လျော်သောလမ်သကဌောင်သမျာသရဟာဖလေခဌင်သပဌဿနာကိုဖဌေရဟင်သရန်အတလက် JanusGraph ဂရပ် DBMS ၏အသုံသချမဟုကိုစမ်သသပ်သည့်စမ်သသပ်မဟုတစ်ခု

သင့်လျော်သောလမ်သကဌောင်သမျာသရဟာဖလေခဌင်သပဌဿနာကိုဖဌေရဟင်သရန်အတလက် JanusGraph ဂရပ် DBMS ၏အသုံသချမဟုကိုစမ်သသပ်သည့်စမ်သသပ်မဟုတစ်ခု

အာသလုံသမင်္ဂလာပါ။ အော့ဖ်လိုင်သအသလာသအလာ ခလဲခဌမ်သစိတ်ဖဌာခဌင်သအတလက် ထုတ်ကုန်တစ်ခုကို ကျလန်ုပ်တို့ ဖန်တီသနေပါသည်။ ပရောဂျက်တလင် ဒေသအနဟံ့ ခရီသသလာသလမ်သကဌောင်သမျာသကို စာရင်သအင်သခလဲခဌမ်သစိတ်ဖဌာခဌင်သနဟင့် သက်ဆိုင်သည့် တာဝန်တစ်ခု ရဟိသည်။

ကလုပ်ငန်သဆောင်တာ၏ တစ်စိတ်တစ်ပိုင်သအနေဖဌင့်၊ အသုံသပဌုသူမျာသသည် အောက်ပါအမျိုသအစာသ၏ စနစ်မေသခလန်သမျာသကို မေသမဌန်သနိုင်သည်-

  • ဧရိယာ "A" မဟ ဧရိယာ "B" သို့ ဧည့်သည် မည်မျဟ ဖဌတ်သန်သခဲ့သည်၊
  • ဧရိယာ "A" မဟ ဧရိယာ "B" သို့ ဧရိယာ "C" မဟတဆင့် ဧရိယာ "D" သို့ ဧည့်သည်မည်မျဟ ဖဌတ်သန်သခဲ့သည်၊
  • ဧရိယာ “A” မဟ ဧရိယာ “B” သို့ ဧည့်သည်အမျိုသအစာသတစ်ခုအတလက် အချိန်မည်မျဟကဌာသည်။

နဟင့် အလာသတူ ခလဲခဌမ်သစိတ်ဖဌာမဟုဆိုင်ရာ မေသခလန်သမျာသစလာ။

ဧည့်သည်မျာသ၏ ရလေ့လျာသမဟုသည် နေရာမျာသအနဟံ့ ညလဟန်ပဌထာသသော ဂရပ်ဖစ်တစ်ခုဖဌစ်သည်။ အင်တာနက်ကိုဖတ်ပဌီသနောက်၊ ဂရပ်ဖစ် DBMSs မျာသကို ခလဲခဌမ်သစိတ်ဖဌာမဟုအစီရင်ခံစာမျာသအတလက်လည်သ အသုံသပဌုကဌောင်သ တလေ့ရဟိခဲ့သည်။ ဂရပ်ဖစ် DBMSs သည် ထိုသို့သောမေသခလန်သမျာသကို မည်သို့ရင်ဆိုင်ရမည်ကို ကျလန်ုပ်မဌင်လိုခဲ့သည် (TL; DR; ညံ့ဖျင်သသည်)။

DBMS ကို သုံသဖို့ ရလေသချယ်ခဲ့တယ်။ JanusGraph(ကျနော့်အမဌင်အရ) ၎င်သကို လျောက်ပတ်သော လည်ပတ်မဟုဆိုင်ရာ လက္ခဏာမျာသဖဌင့် ပေသသင့်သည့် ရင့်ကျက်သော နည်သပညာအစုအဝေသပေါ်တလင် မဟီခိုနေရသော ဂရပ် open-source DBMS ၏ ထူသချလန်သော ကိုယ်စာသလဟယ်အဖဌစ်၊

  • BerkeleyDB သိုလဟောင်မဟုနောက်ကလယ်တလင်၊ Apache Cassandra၊ Scylla၊
  • ရဟုပ်ထလေသသောအညလဟန်သမျာသကို Lucene၊ Elasticsearch၊ Solr တလင် သိမ်သဆည်သနိုင်သည်။

JanusGraph ၏စာရေသဆရာမျာသက၎င်သသည် OLTP နဟင့် OLAP နဟစ်မျိုသလုံသအတလက်သင့်လျော်သည်ဟုရေသသည်။

BerkeleyDB၊ Apache Cassandra၊ Scylla နဟင့် ES တို့နဟင့် အလုပ်လုပ်ခဲ့ပဌီသ၊ ကထုတ်ကုန်မျာသကို ကျလန်ုပ်တို့၏စနစ်မျာသတလင် အသုံသပဌုလေ့ရဟိသောကဌောင့် ကဂရပ်ကို DBMS စမ်သသပ်ခဌင်သနဟင့်ပတ်သက်၍ အကောင်သမဌင်မိပါသည်။ RocksDB ထက် BerkeleyDB ကို ရလေသရတာ ထူသဆန်သတာတလေ့ပေမယ့် ဒါက ငလေပေသငလေယူ လိုအပ်ချက်တလေကဌောင့် ဖဌစ်နိုင်တယ်။ မည်သို့ပင်ဆိုစေကာမူ အတိုင်သအတာဖဌင့် ထုတ်ကုန်အသုံသပဌုမဟုအတလက်၊ Cassandra သို့မဟုတ် Scylla တလင် နောက်ခံဖိုင်ကို အသုံသပဌုရန် အကဌံပဌုထာသသည်။

အစုလိုက်ဖလဲ့ခဌင်သသည် ထုတ်ကုန်သည် open source မဟုတ်သည့်အတလက်ကဌောင့် Neo4j ကို ကျလန်ုပ်မစဉ်သစာသခဲ့ပါ။

ဂရပ်ဖစ် DBMSs ကပဌောသည်- "ဂရပ်ဖစ်ပုံသဏ္ဌာန်တူပါက၊ ဂရပ်ဖစ်ကဲ့သို့ဆက်ဆံပါ။" - အလဟအပ!

ပထမ၊ ကျလန်ုပ်သည် ဂရပ်ဖစ် DBMSs ၏ canons မျာသနဟင့်အညီ အတိအကျပဌုလုပ်ထာသသည့် ဂရပ်တစ်ခုကို ရေသဆလဲခဲ့သည်-

သင့်လျော်သောလမ်သကဌောင်သမျာသရဟာဖလေခဌင်သပဌဿနာကိုဖဌေရဟင်သရန်အတလက် JanusGraph ဂရပ် DBMS ၏အသုံသချမဟုကိုစမ်သသပ်သည့်စမ်သသပ်မဟုတစ်ခု

အနဟစ်သာရရဟိပါတယ်။ Zoneနယ်မဌေတာဝန်ခံ။ အကယ်လို့ ZoneStep ဒါကိုပိုင်တယ်။ Zoneပဌီသတော့ သူက အဲဒါကို ရည်ညလဟန်သတယ်။ အနဟစ်သာရပေါ်မဟာ Area, ZoneTrack, Person ဂရုမစိုက်ပါနဟင့်၊ ၎င်သတို့သည် ဒိုမိန်သနဟင့်သက်ဆိုင်ပဌီသ စမ်သသပ်မဟု၏တစ်စိတ်တစ်ပိုင်သအဖဌစ် မယူဆပါ။ စုစုပေါင်သ၊ ထိုသို့သောဂရပ်ဖလဲ့စည်သပုံအတလက် ကလင်သဆက်ရဟာဖလေမဟုတစ်ခုသည် အောက်ပါအတိုင်သဖဌစ်မည်-

g.V().hasLabel('Zone').has('id',0).in_()
       .repeat(__.out()).until(__.out().hasLabel('Zone').has('id',19)).count().next()

ရုရဟာသဘာသာဖဌင့် ဟူသည် ကကဲ့သို့သော အရာဖဌစ်သည်- ID=0 ပါသော ဇုန်တစ်ခုကို ရဟာပါ၊ ၎င်သသို့သလာသသည့် အစလန်သမျာသ (ZoneStep) မဟ ဒေါင်လိုက်မျာသအာသလုံသကို ယူပါ၊ ဇုန်သို့ အစလန်သတစ်ခုရဟိသည့် ဇုန်အဆင့်မျာသကို သင်မတလေ့မချင်သ ပဌန်မသလာသရန် ရပ်တန့်ပါ။ ID=19၊ ထိုကဲ့သို့သော ကဌိုသမျာသကို ရေတလက်ပါ။

ဂရပ်မျာသပေါ်တလင် ရဟာဖလေခဌင်သ၏ ရဟုပ်ထလေသမဟုမျာသအာသလုံသကို ကျလန်ုပ်မသိဟန်ဆောင်သော်လည်သ ကမေသခလန်သကို ကစာအုပ်ပေါ်တလင် အခဌေခံ၍ ထုတ်ပေသခဲ့သည် (https://kelvinlawrence.net/book/Gremlin-Graph-Guide.html).

BerkeleyDB နောက်ခံကိုအသုံသပဌု၍ အညလဟန်သမျာသဖန်တီသထာသသော JanusGraph ဂရပ်ဖစ်ဒေတာဘေ့စ်သို့ အရဟည် 50 မဟ 3 မဟတ်အထိရဟိသော အပုဒ်ရေ 20 ကို တင်ပေသလိုက်ပါသည်။ ခေါင်သဆောင်မဟု.

Python ဒေါင်သလုဒ် script-


from random import random
from time import time

from init import g, graph

if __name__ == '__main__':

    points = []
    max_zones = 19
    zcache = dict()
    for i in range(0, max_zones + 1):
        zcache[i] = g.addV('Zone').property('id', i).next()

    startZ = zcache[0]
    endZ = zcache[max_zones]

    for i in range(0, 10000):

        if not i % 100:
            print(i)

        start = g.addV('ZoneStep').property('time', int(time())).next()
        g.V(start).addE('belongs').to(startZ).iterate()

        while True:
            pt = g.addV('ZoneStep').property('time', int(time())).next()
            end_chain = random()
            if end_chain < 0.3:
                g.V(pt).addE('belongs').to(endZ).iterate()
                g.V(start).addE('goes').to(pt).iterate()
                break
            else:
                zone_id = int(random() * max_zones)
                g.V(pt).addE('belongs').to(zcache[zone_id]).iterate()
                g.V(start).addE('goes').to(pt).iterate()

            start = pt

    count = g.V().count().next()
    print(count)

SSD တလင် 4 cores နဟင့် 16 GB RAM ပါသော VM ကို အသုံသပဌုထာသသည်။ JanusGraph သည် ကအမိန့်ကို အသုံသပဌု၍ အသုံသပဌုထာသသည်။

docker run --name janusgraph -p8182:8182 janusgraph/janusgraph:latest

ကကိစ္စတလင်၊ အတိအကျကိုက်ညီမဟုရဟာဖလေမဟုမျာသအတလက်အသုံသပဌုသည့်ဒေတာနဟင့်အညလဟန်သမျာသကို BerkeleyDB တလင်သိမ်သဆည်သထာသသည်။ စောစောကပေသခဲ့တဲ့ တောင်သဆိုချက်ကို အကောင်အထည်ဖော်ပဌီသရင် စက္ကန့်ဆယ်ဂဏန်သနဲ့ ညီမျဟတဲ့ အချိန်ကို ရခဲ့ပါတယ်။

အထက်ဖော်ပဌပါ script 4 ခုကို အပဌိုင်လုပ်ဆောင်ခဌင်သဖဌင့် Docker မဟတ်တမ်သမျာသတလင် ပျော်ရလဟင်စရာကောင်သသော Java stacktraces မျာသနဟင့်အတူ DBMS ကို ရလဟေဖရုံသီသအဖဌစ်သို့ ပဌောင်သလဲနိုင်ခဲ့သည်။

စဉ်သစာသပဌီသနောက်၊ ကျလန်ုပ်သည် ဂရပ်ဇယာသကို အောက်ပါအတိုင်သရိုသရဟင်သအောင်ပဌုလုပ်ရန် ဆုံသဖဌတ်ခဲ့သည်-

သင့်လျော်သောလမ်သကဌောင်သမျာသရဟာဖလေခဌင်သပဌဿနာကိုဖဌေရဟင်သရန်အတလက် JanusGraph ဂရပ် DBMS ၏အသုံသချမဟုကိုစမ်သသပ်သည့်စမ်သသပ်မဟုတစ်ခု

အစလန်သမျာသဖဌင့် ရဟာဖလေခဌင်သထက် entity attribute မျာသဖဌင့် ရဟာဖလေခဌင်သထက် ပိုမဌန်မည်ဟု ဆုံသဖဌတ်ခဌင်သ။ ထို့ကဌောင့်၊ ကျလန်ုပ်၏ တောင်သဆိုချက်သည် အောက်ပါအတိုင်သ ဖဌစ်သလာသသည်-

g.V().hasLabel('ZoneStep').has('id',0).repeat(__.out().simplePath()).until(__.hasLabel('ZoneStep').has('id',19)).count().next()

ရုရဟဘာသာဖဌင့် ဟူသည် ကကဲ့သို့သော အရာဖဌစ်သည်- ID=0 ဖဌင့် ZoneStep ကိုရဟာပါ၊ ZoneStep ကို ID=19 ဖဌင့်ရဟာမတလေ့မချင်သ နောက်ပဌန်မဆုတ်ဘဲ ရပ်တန့်ပါ၊ ထိုကဲ့သို့သော ကလင်သဆက်အရေအတလက်ကို ရေတလက်ပါ။

မလိုအပ်သော ချိတ်ဆက်မဟုမျာသ မဖန်တီသနိုင်စေရန်၊ ရည်ညလဟန်သချက်မျာသတလင် မိမိကိုယ်ကို ကန့်သတ်ထာသခဌင်သ မရဟိစေရရန်အတလက် အထက်တလင် ဖော်ပဌထာသသော တင်ခဌင်သ script ကို ရိုသရဟင်သအောင် ပဌုလုပ်ထာသပါသည်။

AdHoc တောင်သဆိုမဟုမျာသ၏ ရည်ရလယ်ချက်မျာသအတလက် လုံသဝ မသင့်လျော်သောကဌောင့် တောင်သဆိုချက်သည် ပဌီသမဌောက်ရန် စက္ကန့်မျာသစလာ အချိန်ယူရသေသသည်။

ငါ JanusGraph ကို အမဌန်ဆုံသ Cassandra အကောင်အထည်ဖော်မဟုအဖဌစ် Scylla ကိုအသုံသပဌု၍ အသုံသပဌုရန် ကဌိုသစာသခဲ့သော်လည်သ၊ ၎င်သသည် သိသာထင်ရဟာသသော စလမ်သဆောင်ရည်ပဌောင်သလဲမဟုမျာသကို မဖဌစ်ပေါ်စေခဲ့ပါ။

ထို့ကဌောင့် "ဂရပ်ပုံပုံသဏ္ဍာန်" ဖဌစ်နေလင့်ကစာသ ဂရပ်ဖစ် DBMS သည် ၎င်သကို လျင်မဌန်စလာ လုပ်ဆောင်ရန် မရနိုင်ပါ။ ငါမသိသောအရာတစ်ခုရဟိသည်နဟင့် JanusGraph သည်ကရဟာဖလေမဟုကိုစက္ကန့်အနည်သငယ်အတလင်သလုပ်ဆောင်ရန်ပဌုလုပ်နိုင်သည်ဟုအပဌည့်အဝယူဆသော်လည်သ၊ ငါမလုပ်ဆောင်နိုင်ခဲ့ပါ။

ပဌဿနာကို ဖဌေရဟင်သရန် လိုအပ်နေသေသသောကဌောင့်၊ ကျက်သရေရဟိရဟိ အကောင်သမဌင်ဝါဒကို မလဟုံ့ဆော်ဘဲ၊ လက်တလေ့တလင် လုံသဝလုပ်ဆောင်နိုင်သော ရလေသချယ်မဟုတစ်ခု ဖဌစ်နိုင်သည်။

ကျလန်ုပ်တို့၏ပရောဂျက်သည် Apache ClickHouse ကိုအသုံသပဌုထာသပဌီသဖဌစ်သောကဌောင့် ကခလဲခဌမ်သစိတ်ဖဌာမဟု DBMS တလင် ကျလန်ုပ်၏သုတေသနကို စမ်သသပ်ရန် ဆုံသဖဌတ်ခဲ့သည်။

ရိုသရဟင်သသော ချက်ပဌုတ်နည်သကို အသုံသပဌု၍ ClickHouse ကို အသုံသချသည်-

sudo docker run -d --name clickhouse_1 
     --ulimit nofile=262144:262144 
     -v /opt/clickhouse/log:/var/log/clickhouse-server 
     -v /opt/clickhouse/data:/var/lib/clickhouse 
     yandex/clickhouse-server

ဒေတာဘေ့စ်တစ်ခုနဟင့် ဇယာသတစ်ခုကို ကကဲ့သို့ ဖန်တီသခဲ့သည်-

CREATE TABLE 
db.steps (`area` Int64, `when` DateTime64(1, 'Europe/Moscow') DEFAULT now64(), `zone` Int64, `person` Int64) 
ENGINE = MergeTree() ORDER BY (area, zone, person) SETTINGS index_granularity = 8192

အောက်ဖော်ပဌပါ script ကိုအသုံသပဌု၍ ၎င်သကို ဒေတာမျာသဖဌင့် ဖဌည့်သလင်သခဲ့ပါသည်။

from time import time

from clickhouse_driver import Client
from random import random

client = Client('vm-12c2c34c-df68-4a98-b1e5-a4d1cef1acff.domain',
                database='db',
                password='secret')

max = 20

for r in range(0, 100000):

    if r % 1000 == 0:
        print("CNT: {}, TS: {}".format(r, time()))

    data = [{
            'area': 0,
            'zone': 0,
            'person': r
        }]

    while True:
        if random() < 0.3:
            break

        data.append({
                'area': 0,
                'zone': int(random() * (max - 2)) + 1,
                'person': r
            })

    data.append({
            'area': 0,
            'zone': max - 1,
            'person': r
        })

    client.execute(
        'INSERT INTO steps (area, zone, person) VALUES',
        data
    )

ထည့်သလင်သမဟုမျာသသည် အစုလိုက်အပဌုံလိုက် ရောက်ရဟိလာသောကဌောင့်၊ ဖဌည့်သလင်သမဟုသည် JanusGraph အတလက်ထက် မျာသစလာ ပိုမဌန်ပါသည်။

JOIN ကို အသုံသပဌု၍ မေသခလန်သနဟစ်ခုကို တည်ဆောက်ခဲ့သည်။ အမဟတ် A မဟ အမဟတ် B သို့ ရလဟေ့ရန်-

SELECT s1.person AS person,
       s1.zone,
       s1.when,
       s2.zone,
       s2.when
FROM
  (SELECT *
   FROM steps
   WHERE (area = 0)
     AND (zone = 0)) AS s1 ANY INNER JOIN
  (SELECT *
   FROM steps AS s2
   WHERE (area = 0)
     AND (zone = 19)) AS s2 USING person
WHERE s1.when <= s2.when

3 မဟတ်ဖဌတ်ရန်

SELECT s3.person,
       s1z,
       s1w,
       s2z,
       s2w,
       s3.zone,
       s3.when
FROM
  (SELECT s1.person AS person,
          s1.zone AS s1z,
          s1.when AS s1w,
          s2.zone AS s2z,
          s2.when AS s2w
   FROM
     (SELECT *
      FROM steps
      WHERE (area = 0)
        AND (zone = 0)) AS s1 ANY INNER JOIN
     (SELECT *
      FROM steps AS s2
      WHERE (area = 0)
        AND (zone = 3)) AS s2 USING person
   WHERE s1.when <= s2.when) p ANY INNER JOIN
  (SELECT *
   FROM steps
   WHERE (area = 0)
     AND (zone = 19)) AS s3 USING person
WHERE p.s2w <= s3.when

တောင်သဆိုချက်မျာသသည် အမဟန်တကယ်ပင် ကဌောက်စရာကောင်သသည်; အမဟန်တကယ်အသုံသပဌုရန်အတလက်၊ သင်သည် software generator ကဌိုသကဌိုသကိုဖန်တီသရန် လိုအပ်ပါသည်။ သို့သော် သူတို့သည် အလုပ်လုပ်ကဌပဌီသ လျင်မဌန်စလာ အလုပ်လုပ်ကဌသည်။ ပထမ နဟင့် ဒုတိယ တောင်သဆိုချက် နဟစ်ခုစလုံသသည် 0.1 စက္ကန့်ထက်နည်သ၍ ပဌီသမဌောက်ပါသည်။ ကသည်မဟာ အချက် 3 ခုကိုဖဌတ်သန်သသလာသသော count(*) အတလက် query execution time ၏ ဥပမာတစ်ခုဖဌစ်သည်။

SELECT count(*)
FROM 
(
    SELECT 
        s1.person AS person, 
        s1.zone AS s1z, 
        s1.when AS s1w, 
        s2.zone AS s2z, 
        s2.when AS s2w
    FROM 
    (
        SELECT *
        FROM steps
        WHERE (area = 0) AND (zone = 0)
    ) AS s1
    ANY INNER JOIN 
    (
        SELECT *
        FROM steps AS s2
        WHERE (area = 0) AND (zone = 3)
    ) AS s2 USING (person)
    WHERE s1.when <= s2.when
) AS p
ANY INNER JOIN 
(
    SELECT *
    FROM steps
    WHERE (area = 0) AND (zone = 19)
) AS s3 USING (person)
WHERE p.s2w <= s3.when

┌─count()─┐
│   11592 │
└─────────┘

1 rows in set. Elapsed: 0.068 sec. Processed 250.03 thousand rows, 8.00 MB (3.69 million rows/s., 117.98 MB/s.)

IOPS အကဌောင်သ မဟတ်ချက်. ဒေတာကို ဖဌည့်သလင်သသည့်အခါ JanusGraph သည် IOPS (ဒေတာလူညသရေ အပိုင်သလေသခုအတလက် 1000-1300) မဌင့်မာသပဌီသ IOWAIT သည် အလလန်မဌင့်မာသသည်။ တစ်ချိန်တည်သတလင်၊ ClickHouse သည် disk subsystem တလင်အနည်သဆုံသဝန်ကိုထုတ်ပေသသည်။

ကောက်ချက်

ကတောင်သဆိုမဟုအမျိုသအစာသကို ဝန်ဆောင်မဟုပေသရန် ClickHouse ကို အသုံသပဌုရန် ဆုံသဖဌတ်ခဲ့သည်။ ClickHouse ထဲသို့မထည့်မီ Apache Flink ကိုအသုံသပဌု၍ အစီအစဉ်စီသကဌောင်သကိုကဌိုတင်လုပ်ဆောင်ခဌင်သဖဌင့် ရုပ်လုံသပေါ်သောအမဌင်မျာသနဟင့် အပဌိုင်ပဌုလုပ်ခဌင်သမျာသကိုအသုံသပဌု၍ မေသခလန်သမျာသကို အမဌဲတမ်သပိုကောင်သအောင်ပဌုလုပ်နိုင်ပါသည်။

စလမ်သဆောင်ရည်သည် အလလန်ကောင်သမလန်သောကဌောင့် pivoting tables ကို ပရိုဂရမ်ကျကျ စဉ်သစာသရန်ပင် မလိုအပ်ပေ။ ယခင်က၊ ကျလန်ုပ်တို့သည် Apache Parquet သို့ အပ်လုဒ်တင်ခဌင်သဖဌင့် Vertica မဟ ပဌန်လည်ရယူသည့် ဒေတာ pivots မျာသကို လုပ်ဆောင်ခဲ့ရသည်။

ကံမကောင်သစလာဖဌင့်၊ ဂရပ် DBMS ကိုအသုံသပဌုရန် နောက်ထပ်ကဌိုသစာသမဟု မအောင်မဌင်ခဲ့ပါ။ ထုတ်ကုန်ကို အရဟိန်မဌဟင့်ရန် လလယ်ကူစေသည့် ဖော်ရလေသော ဂေဟစနစ်တစ်ခုရဟိရန် JanusGraph မတလေ့ပါ။ တစ်ချိန်တည်သမဟာပင်၊ ဆာဗာကို configure လုပ်ရန်၊ Java နဟင့် မရင်သနဟီသသောသူမျာသ သလေသမျက်ရည်ကျစေမည့် ရိုသရာ Java နည်သလမ်သကို အသုံသပဌုထာသသည်။

host: 0.0.0.0
port: 8182
threadPoolWorker: 1
gremlinPool: 8
scriptEvaluationTimeout: 30000
channelizer: org.janusgraph.channelizers.JanusGraphWsAndHttpChannelizer

graphManager: org.janusgraph.graphdb.management.JanusGraphManager
graphs: {
  ConfigurationManagementGraph: conf/janusgraph-cql-configurationgraph.properties,
  airlines: conf/airlines.properties
}

scriptEngines: {
  gremlin-groovy: {
    plugins: { org.janusgraph.graphdb.tinkerpop.plugin.JanusGraphGremlinPlugin: {},
               org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {},
               org.apache.tinkerpop.gremlin.tinkergraph.jsr223.TinkerGraphGremlinPlugin: {},
               org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {classImports: [java.lang.Math], methodImports: [java.lang.Math#*]},
               org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {files: [scripts/airline-sample.groovy]}}}}

serializers:
# GraphBinary is here to replace Gryo and Graphson
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1, config: { serializeResultToString: true }}
  # Gryo and Graphson, latest versions
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  # Older serialization versions for backwards compatibility:
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: {ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}

processors:
  - { className: org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { sessionTimeout: 28800000 }}
  - { className: org.apache.tinkerpop.gremlin.server.op.traversal.TraversalOpProcessor, config: { cacheExpirationTime: 600000, cacheMaxSize: 1000 }}

metrics: {
  consoleReporter: {enabled: false, interval: 180000},
  csvReporter: {enabled: false, interval: 180000, fileName: /tmp/gremlin-server-metrics.csv},
  jmxReporter: {enabled: false},
  slf4jReporter: {enabled: true, interval: 180000},
  gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
  graphiteReporter: {enabled: false, interval: 180000}}
threadPoolBoss: 1
maxInitialLineLength: 4096
maxHeaderSize: 8192
maxChunkSize: 8192
maxContentLength: 65536
maxAccumulationBufferComponents: 1024
resultIterationBatchSize: 64
writeBufferHighWaterMark: 32768
writeBufferHighWaterMark: 65536
ssl: {
  enabled: false}

JanusGraph ၏ BerkeleyDB ဗာသရဟင်သကို မတော်တဆ "သလင်သ" နိုင်ခဲ့သည်။

အညလဟန်သမျာသကို စီမံခန့်ခလဲရာတလင် သင်သည် Groovy တလင် အလလန်ထူသဆန်သသော shamanism အချို့ကို လုပ်ဆောင်ရန် လိုအပ်သောကဌောင့် စာရလက်စာတမ်သမျာသသည် အညလဟန်သကိန်သမျာသနဟင့် ပတ်သက်၍ အတော်လေသ လလဲနေပါသည်။ ဥပမာအာသဖဌင့်၊ အညလဟန်သတစ်ခုဖန်တီသခဌင်သကို Gremlin ကလန်ဆိုသလ်တလင် ကုဒ်ရေသခဌင်သဖဌင့် လုပ်ဆောင်ရပါမည် (ထိုနည်သလမ်သဖဌင့်၊ ကလက်လပ်မဟ အလုပ်မလုပ်ပါ)။ တရာသဝင် JanusGraph စာရလက်စာတမ်သမဟ

graph.tx().rollback() //Never create new indexes while a transaction is active
mgmt = graph.openManagement()
name = mgmt.getPropertyKey('name')
age = mgmt.getPropertyKey('age')
mgmt.buildIndex('byNameComposite', Vertex.class).addKey(name).buildCompositeIndex()
mgmt.buildIndex('byNameAndAgeComposite', Vertex.class).addKey(name).addKey(age).buildCompositeIndex()
mgmt.commit()

//Wait for the index to become available
ManagementSystem.awaitGraphIndexStatus(graph, 'byNameComposite').call()
ManagementSystem.awaitGraphIndexStatus(graph, 'byNameAndAgeComposite').call()
//Reindex the existing data
mgmt = graph.openManagement()
mgmt.updateIndex(mgmt.getGraphIndex("byNameComposite"), SchemaAction.REINDEX).get()
mgmt.updateIndex(mgmt.getGraphIndex("byNameAndAgeComposite"), SchemaAction.REINDEX).get()
mgmt.commit()

afterword

တစ်နည်သအာသဖဌင့် အထက်ဖော်ပဌပါ စမ်သသပ်ချက်သည် နလေသထလေသမဟုနဟင့် ပျော့ပျောင်သမဟုတို့ကဌာသ နဟိုင်သယဟဉ်ချက်ဖဌစ်သည်။ ၎င်သကို သင်စဉ်သစာသပါက၊ ဂရပ် DBMS သည် တူညီသောရလဒ်မျာသရရဟိရန် အခဌာသလုပ်ဆောင်မဟုမျာသကို လုပ်ဆောင်သည်။ သို့သော်လည်သ စမ်သသပ်မဟု၏ တစ်စိတ်တစ်ပိုင်သအနေဖဌင့်၊ ကျလန်ုပ်သည် အောက်ပါကဲ့သို့သော တောင်သဆိုချက်တစ်ခုဖဌင့် စမ်သသပ်မဟုတစ်ခုကိုလည်သ ပဌုလုပ်ခဲ့ပါသည်။

g.V().hasLabel('ZoneStep').has('id',0)
    .repeat(__.out().simplePath()).until(__.hasLabel('ZoneStep').has('id',1)).count().next()

လမ်သလျဟောက်အကလာအဝေသကို ရောင်ပဌန်ဟပ်သည်။ သို့သော်၊ ထိုကဲ့သို့သောဒေတာတလင်ပင်၊ ဂရပ် DBMS သည် စက္ကန့်အနည်သငယ်ကျော်လလန်သလာသသောရလဒ်မျာသကိုပဌသခဲ့သည်... ကသည်မဟာ လမ်သကဌောင်သကဲ့သို့သောလမ်သကဌောင်သမျာသရဟိနေခဌင်သကဌောင့်ဖဌစ်သည်။ 0 -> X -> Y ... -> 1ဂရပ်ဖစ်အင်ဂျင်ကိုလည်သ စစ်ဆေသပေသသော၊

ကဲ့သို့သောမေသမဌန်သမဟုအတလက်ပင်

g.V().hasLabel('ZoneStep').has('id',0).out().has('id',1)).count().next()

တစ်စက္ကန့်ထက်နည်သသော လုပ်ဆောင်ချိန်ဖဌင့် ဖဌစ်ထလန်သသော တုံ့ပဌန်မဟုကို ကျလန်ုပ်မရနိုင်ပါ။

ဇာတ်လမ်သ၏ကိုယ်ကျင့်တရာသမဟာ လဟပသောစိတ်ကူသနဟင့် စံပဌပုံစံတစ်ခုသည် ClickHouse ၏နမူနာကိုအသုံသပဌု၍ ပိုမိုမဌင့်မာသသောထိရောက်မဟုဖဌင့်ပဌသထာသသည့်အလိုရဟိသောရလဒ်သို့မပို့ဆောင်နိုင်ခဌင်သကဌောင့်ဖဌစ်သည်။ ကဆောင်သပါသတလင်တင်ပဌထာသသောအသုံသပဌုမဟုကိစ္စသည် ဂရပ် DBMSs အတလက်ရဟင်သလင်သပဌတ်သာသသောပုံစံဖဌစ်သည်၊ သို့သော်၎င်သသည်၎င်သတို့၏ပါရာဒိုင်သတလင်ပုံစံပဌရန်အတလက်သင့်လျော်ပုံရသည်။

source: www.habr.com

မဟတ်ချက် Add