ื ืืืื ืืขืืขืจ. ืืืจ ืึทื ืืืืืงืืขื ืึท ืคึผืจืึธืืืงื ืคึฟืึทืจ ืึธืคืคืืื ืข ืคืึทืจืงืขืจ ืึทื ืึทืืืกืืก. ืื ืคึผืจืืืขืงื ืืื ืึท ืึทืจืืขื ืฉืืึทืืืช ืฆื ืกืืึทืืืกืืืฉ ืึทื ืึทืืืกืืก ืคืื ืืึทืกื ืจืืฅ ืึทืจืืืขืจ ืืงืืืืช.
ืืื ืึท ืืืื ืคืื ืืขื ืึทืจืืขื, ืืืืขืจื ืงืขื ืขื ืคืจืขืื ืื ืกืืกืืขื ืงืืืืจืื ืคืื ืื ืคืืืืขื ืืข ืืืคึผ:
- ืืืืคืื ืืืืืืขืจ ืืขื ืขื ืืืจืืืขืืื ืืขื ืคืื ืืขืื ื "ื" ืฆื ืืขืื ื "ื";
- ืืืืคืื ืืืืืืขืจ ืืขื ืขื ืืืจืืืขืืื ืืขื ืคืื ืืขืื ื "ื" ืฆื ืืขืื ื "ื" ืืืจื ืืขืื ื "C" ืืื ืืขืจื ืึธื ืืืจื ืืขืื ื "ื";
- ืืื ืืึทื ื ืขืก ืืึธื ืืขืืืืขืจื ืคึฟืึทืจ ืึท ืืืืขืจ ืืืคึผ ืคืื ืืึทืกื ืฆื ืึทืจืืืคืึธืจื ืคืื ืืขืื ื "ื" ืฆื ืืขืื ื "ื".
ืืื ืึท ื ืืืขืจ ืคืื ืขื ืืขื ืึทื ืึทืืืืืงืึทื ืคึฟืจืืื.
ืื ืืึทืืืขืืื ื ืคืื ืื ืืึทืกื ืึทืจืืืขืจ ืืขืืืื ืืื ืึท ืืืจืขืงืืขื ืืจืึทืคืืง. ื ืึธื ืืืืขื ืขื ืื ืืื ืืขืจื ืขื, ืืื ืืืกืงืึทืืืขืจื ืึทื ืืจืึทืคืืง ืืืืก ืืขื ืขื ืืืื ืืขื ืืฆื ืคึฟืึทืจ ืึทื ืึทืืืืืงืึทื ืจืืคึผืึธืจืฅ. ืืื ืืึธื ืืขืืื ืึท ืคืึทืจืืึทื ื ืฆื ืืขื ืืื ืืจืึทืคืืง ืืืืก ืืืึธืื ืงืึธืคึผืข ืืื ืึทืืึท ืคึฟืจืืื (ืื; ืืจ; ืฉืืขืื).
ืืื ืืืืกืืขืจืืืืืื ืฆื ื ืืฆื ืื DBMS
- BerkeleyDB ืกืืึธืจืืืืฉ ืืึทืงืขื ื, Apache Cassandra, Scylla;
- ืงืึธืืคึผืืขืงืก ืื ืืขืงืกืื ืงืขื ืขื ืืืื ืกืืึธืจื ืืื Lucene, Elasticsearch, Solr.
ืื ืืืืจืื ืคืื JanusGraph ืฉืจืืึทืื ืึทื ืขืก ืืื ืคึผืึทืกืืง ืคึฟืึทืจ ืืืืืข OLTP ืืื OLAP.
ืืื ืืึธื ืืขืืจืืขื ืืื BerkeleyDB, Apache Cassandra, Scylla ืืื ES, ืืื ืื ืคึผืจืึธืืืงืื ืืขื ืขื ืึธืคื ืืขื ืืฆื ืืื ืืื ืืืขืจ ืกืืกืืขืืขื, ืึทืืื ืืื ืืื ืืขืืืขื ืึธืคึผืืืืืกืืืฉ ืืืขืื ืืขืกืืื ื ืืขื ืืจืึทืคืืง DBMS. ืืื ืืขืคึฟืื ืขื ืขืก ืืึธืื ืข ืฆื ืงืืืึทืื BerkeleyDB ืืืืขืจ RocksDB, ืึธืืขืจ ืืึธืก ืืื ืืืกืืึธืืข ืจืขืื ืฆื ืืขืจ ืืจืึทื ืกืึทืงืืืึธื ืจืขืงืืืืจืขืืขื ืฅ. ืืื ืงืืื ืคืึทื, ืคึฟืึทืจ ืกืงืึทืืึทืืืข ืคึผืจืึธืืืงื ื ืืฆื, ืขืก ืืื ืกืึทืืืืฉืขืกืืื ืฆื ื ืืฆื ืึท ืืึทืงืขื ื ืืืืฃ Cassandra ืึธืืขืจ Scylla.
ืืื ืืึธื ื ืืฉื ืืึทืืจืึทืืื Neo4j ืืืืึทื ืงืืึทืกืืขืจืื ื ืจืืงืืืืืขืจื ืึท ืืขืฉืขืคื ืืืขืจืกืืข, ืืึธืก ืืื, ืืขืจ ืคึผืจืึธืืืงื ืืื ื ืืฉื ืึธืคึฟื ืืงืืจ.
ืืจืึทืคืืง ืืืืก ืืึธืื: "ืืืื ืขืก ืงืืงื ืืื ืึท ืืจืึทืคืืง, ืืืึทืื ืขืก ืืื ืึท ืืจืึทืคืืง!" - ืฉืืื ืงืืื!
ืขืจืฉืืขืจ, ืืื ืืขืฆืืืื ืึท ืืจืึทืคืืง, ืืืึธืก ืืื ืืขืืืื ืคึผืื ืงื ืืืื ืื ืงืึทื ืึทื ื ืคืื ืืจืึทืคืืง ืืืืก:
ืขืก ืืื ืึท ืขืกืึทื ืก 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, ื ืขืืขื ืึทืืข ืื ืืืขืจืืืงืก ืคืื ืืืึธืก ืึท ืืจืขื ืืืื ืฆื ืืื (ืืึธื ืขืกืืขืคึผ), ืกืืึทืืคึผ ืึธื ืืืื ืฆืืจืืง ืืื ืืืจ ืืขืคึฟืื ืขื ืื ืืึธื ืขืกืืขืคึผืก ืคืื ืืืึธืก ืขืก ืืื ืึท ืืจืขื ืฆื ืื ืืึธื ืข ืืื ID=19, ืฆืืืื ืื ื ืืืขืจ ืึทืืึท ืงืืืื.
ืืื ืืึธื ื ืื ืคืึทืจืืืื ืฆื ืืืืกื ืึทืืข ืื ืื ืืจืึทืงืึทืกืื ืคืื ืืืื ืืืืฃ ืืจืึทืคืก, ืึธืืขืจ ืื ืึธื ืคึฟืจืขื ืืื ืืขืืืขื ืืืฉืขื ืขืจืืืืึทื ืืืืืจื ืืืืฃ ืืขื ืืื (
ืืื ืืึธืืืื 50 ืืืืื ื ืืจืึทืงืก ืจืืื ืืืฉืื ื ืคืื 3 ืฆื 20 ืคืื ืงืื ืืื ืืขื ื ืืื ืึท JanusGraph ืืจืึทืคืืง ืืึทืืึทืืืืก ื ืืฆื ืื BerkeleyDB ืืึทืงืขื ื, ืืืฉืืคื ืื ืืขืงืกืื ืืืื ืฆื
ืคึผืืืืึธื ืืจืืคืงืืคืืข ืฉืจืืคื:
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)
ืืืจ ืืขืืืืื ื ืึท VM ืืื 4 ืงืึธืจืขืก ืืื 16 ืืืืืืืื ืืึทืจืึทื ืืืืฃ ืึท ืกืกื. JanusGraph ืืื ืืขืืืขื ืืืคึผืืืื ืืื ืืขื ืืึทืคึฟืขื:
docker run --name janusgraph -p8182:8182 janusgraph/janusgraph:latest
ืืื ืืขื ืคืึทื, ืื ืืึทืื ืืื ืื ืืขืงืกืื ืืืึธืก ืืขื ืขื ืืขื ืืฆื ืคึฟืึทืจ ืคึผืื ืืืขื ืืืืึทืื ืึธื ืคึฟืจืขืื ืืขื ืขื ืกืืึธืจื ืืื BerkeleyDB. ืืื ืืื ืืืจืืืขืคืืจื ืื ืคืจืืขืจืืืืข ืืงืฉื, ืืื ืืื ืืืงืืืขื ื ืฆืืื ืืืืื ืฆื ืขืืืืืข ืฆืขื ืืืืืขืจ ืกืขืงืื ืืขืก.
ืืืจื ืืืืคื ืื 4 ืืืืื ืกืงืจืืคึผืก ืืื ืคึผืึทืจืึทืืขื, ืืื ืืขืจืืื ืฆื ืืืขื ืื ืื DBMS ืืื ืึท ืงืืจืืขืก ืืื ืึท ืคืจืืืืขื ืืืึทื ืคืื ืืืฉืึทืืืึท ืกืืึทืงืงืืจืึทืกืขืก (ืืื ืืืจ ืึทืืข ืืื ืืืืขื ืขื ืืืฉืึทืืืึท ืกืืึทืงืงืืจืึทืกืขืก) ืืื ืื ืืึธืงืงืขืจ ืืึธืืก.
ื ืึธื ืขืืืขืืข ืืขืืึทื ืง, ืืื ืืึทืฉืืึธืกื ืฆื ืคืึทืจืคึผืึธืฉืขืืขืจื ืื ืืจืึทืคืืง ืืืึทืืจืึทืืข ืฆื ืื ืคืืืืขื ืืข:
ืืึทืฉืืึธืกื ืึทื ืืืื ืืืจื ืขื ืืืื ืึทืืจืึทืืืืฅ ืืืึธืื ืืืื ืคืึทืกืืขืจ ืืื ืืืื ืืืจื ืขืืืฉืึทื. ืืื ืึท ืจืขืืืืืึทื, ืืืื ืืงืฉื ืืื ืืขืืืืจื ืื ืคืืืืขื ืืข:
g.V().hasLabel('ZoneStep').has('id',0).repeat(__.out().simplePath()).until(__.hasLabel('ZoneStep').has('id',19)).count().next()
ืืืึธืก ืืื ืจืืกืืฉ ืืื ืขืคึผืขืก ืืื ืืึธืก: ืืขืคึฟืื ืขื ZoneStep ืืื ID=0, ืกืืึทืืคึผ ืึธื ืืืื ืฆืืจืืง ืืื ืืืจ ืืขืคึฟืื ืขื ZoneStep ืืื ID=19, ืฆืืืื ืื ื ืืืขืจ ืคืื ืึทืืึท ืงืืืื.
ืืื ืืืื ืกืืืคึผืืึทืคืืื ืื ืืึธืืืื ื ืฉืจืืคื ืืขืืขืื ืืืืื ืืื ืกืืจ ื ืืฉื ืฆื ืฉืึทืคึฟื ืืื ืืืืืง ืงืึทื ืขืงืฉืึทื ื, ืืืืืืขื ืืื ืฆื ืึทืืจืืืืืฅ.
ืื ืืงืฉื ืืึธื ื ืึธื ืืขื ืืืขื ืขืืืขืืข ืกืขืงืื ืืขืก ืฆื ืคืึทืจืขื ืืืงื, ืืืึธืก ืืื ืืขืืืขื ืืึธืจ ืึทื ืึทืงืกืขืคึผืืึทืืึทื ืคึฟืึทืจ ืืื ืืืขืจ ืึทืจืืขื, ืืืืึทื ืขืก ืืื ื ืืฉื ืคึผืึทืกืืง ืคึฟืึทืจ ืื ืฆืืืขืงื ืคืื ืึทืืืึธืง ืจืืงืืืขืก ืคืื ืงืืื ืืื.
ืืื ืืขืคืจืืืื ืืืคึผืืืืื ื JanusGraph ื ืืฆื Scylla ืืื ืื ืคืึทืกืืึทืกื ืงืึทืกืกืึทื ืืจืึท ืืืคึผืืึทืืขื ืืืืฉืึทื, ืึธืืขืจ ืืึธืก ืืืื ืืื ื ืืฉื ืคืืจื ืฆื ืงืืื ืืึทืืืืืืง ืคืึธืจืฉืืขืืื ื ืขื ืืขืจืื ืืขื.
ืึทืืื ืืจืึธืฅ ืืขื ืคืึทืงื ืึทื "ืขืก ืงืืงื ืืื ืึท ืืจืึทืคืืง", ืืื ืงืขื ื ืืฉื ืืึทืงืืืขื ืื ืืจืึทืคืืง DBMS ืฆื ืคึผืจืึทืกืขืกื ืขืก ืืขืฉืืืื ื. ืืื ืืึธืจ ืืืขืจื ืขืืขื ืึทื ืขืก ืืื ืขืคึผืขืก ืืื ืืึธื ื ืื ืืืืกื ืืื ืึทื JanusGraph ืงืขื ืขื ืืืื ืืขืืืื ืฆื ืืืจืืคืืจื ืืขื ืืืื ืืื ืึท ืืจืึธืืฆืึธื ืคืื ืึท ืจืืข, ืึธืืขืจ, ืืื ืงืขื ื ืืฉื ืืึธื ืืึธืก.
ืืื ื ืื ืคึผืจืึธืืืขื ื ืึธื ืืืจืฃ ืฆื ืืืื ืกืึทืืืื, ืืื ืื ืืขืืืืื ืฆื ืืจืึทืืื ืืืขืื JOINs ืืื ืคึผืืืืึธืฅ ืคืื ืืืฉื, ืืืึธืก ืืื ื ืืฉื ืื ืกืคึผืืจืืจื ืึธืคึผืืืืืื ืืื ืืขืจืืื ืขื ืคืื ืขืืึทืืึทื ืก, ืึธืืขืจ ืงืขื ืืืื ืึท ืืึธืจ ืืืขืจืงืึทืืึทื ืึธืคึผืฆืืข ืืื ืคืืจ.
ืืื ืืืขืจ ืคึผืจืืืขืงื ืฉืืื ื ืืฆื Apache ClickHouse, ืึทืืื ืืื ืืึทืฉืืึธืกื ืฆื ืคึผืจืืืืจื ืืืื ืคืึธืจืฉืื ื ืืืืฃ ืืขื ืึทื ืึทืืืืืฉ DBMS.
ืืืคึผืืืื ืงืืืงืืึธืืกืข ืืื ืึท ืคึผืฉืื ืจืขืฆืขืคึผื:
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
ืืื ืึธื ืืขืคืืื ืขืก ืืื ืืึทืื ื ืืฆื ืื ืคืืืืขื ืืข ืฉืจืืคื:
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. ืฆื ืืึทื ืคืื ืคืื ื ื ืฆื ืคืื ื ื:
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
ืื ืจืืงืืืขืก, ืคืื ืงืืจืก, ืงืืง ืืึทื ืฅ ืกืงืขืจื; ืคึฟืึทืจ ืคืึทืงืืืฉ ื ืืฆื, ืืืจ ืืึทืจืคึฟื ืฆื ืฉืึทืคึฟื ืึท ืืืืืืืืืจื ืืขื ืขืจืึทืืึธืจ ืืึทืจื ืืก. ืึธืืขืจ, ืืื ืึทืจืืขื ืืื ืืื ืึทืจืืขื ืืขืฉืืืื ื. ืืืืืข ืืขืจ ืขืจืฉืืขืจ ืืื ืจืืข ืจืืงืืืขืก ืืขื ืขื ืืขืขื ืืืงื ืืื ืืืืื ืืงืขืจ ืืื 0.1 ืกืขืงืื ืืขืก. ืืึธ ืืื ืึท ืืืืฉืคึผืื ืคืื ืื ืึธื ืคึฟืจืขื ืืืจืืคืืจืื ื ืฆืืื ืคึฟืึทืจ ืฆืืืื (*) ืืืื ืคืืจืืื ืืืจื 3 ืคืื ืงืื:
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 ืืืฉืขื ืขืจืืืืึทื ืืื ืืืึทื ืืึทืกืข ืืืืฃ ืื ืืืกืง ืกืึทืืกืืกืืึทื.
ืกืึธืฃ
ืืืจ ืืึทืฉืืึธืกื ืฆื ื ืืฆื ClickHouse ืฆื ืืื ืขื ืืขื ืืืคึผ ืคืื ืืขืื. ืืืจ ืงืขื ืขื ืฉืืขื ืืืง ืึทืคึผืืึทืืืื ืื ืคึฟืจืืื ืืื ืืึทืืืจืืึทืืืืื ืงืืงื ืืื ืคึผืึทืจืึทืืขืืืืึทืืืึธื ืืืจื ืคืึทืจ-ืคึผืจืึทืกืขืกืื ื ืื ืืขืฉืขืขื ืืฉ ืืืึทื ืืื Apache Flink ืืืืืขืจ ืืืจ ืืึธืืืื ื ืืื ืืื ClickHouse.
ืื ืคืึธืจืฉืืขืืื ื ืืื ืึทืืื ืืื ืึทื ืืืจ ืืืกืืึธืืข ืืืขื ื ืืฉื ืืคืืื ืืึธืื ืฆื ืืจืึทืืื ืืืขืื ืคึผืืืืึทืืื ื ืืืฉื ืคึผืจืึธืืจืึทืืืึทืืืง. ืืื ืึทืืขืจ, ืืืจ ืืึธืื ืฆื ืืึธื ืคึผืืืืึทืฅ ืคืื ืืึทืื ืจืืืจืืืื ืคึฟืื ืืืขืจืืืงืึท ืืืจื ืืคึผืืึธืึทื ืฆื ืึทืคึผืึทืืฉื ืคึผืึทืจืงืืืขื.
ืฆืื ืืึทืืืืขืจื, ืื ืื ืืขืจ ืคึผืจืืืื ืฆื ื ืืฆื ืึท ืืจืึทืคืืง DBMS ืืื ื ืื ืืขืจืึธืื. ืืื ืืึธื ื ืื ืืขืคึฟืื ืขื JanusGraph ืฆื ืืึธืื ืึท ืคืจืืึทื ืืืขื ืืงืึธืืกืืกืืึทื ืืืึธืก ืืขืืืื ืขืก ืืจืื ื ืฆื ืืึทืงืืืขื ืึทืจืืืฃ ืฆื ืื ืคึผืจืึธืืืงื. ืืื ืืขืจ ืืขืืืืงืขืจ ืฆืืื, ืฆื ืงืึทื ืคืืืืขืจ ืื ืกืขืจืืืขืจ, ืื ืืจืืืืฆืืื ืขืื ื'ืืื ืืืขื ืืื ืืขื ืืฆื, ืืืึธืก ืืืขื ืืึทืื ืืขื ืืฉื ืืืึธืก ืืขื ืขื ื ืืฉื ืืึทืงืึทื ื ืืื ื'ืืื ืืืืื ืขื ืืจืขืจื ืคืื ืืืื:
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}
ืืื ืืขืจืืื ืฆื ืึทืงืกืึทืืขื ืึทืื "ืฉืืขืื" ืื BerkeleyDB ืืืขืจืกืืข ืคืื โโJanusGraph.
ืื ืืึทืงืืืืขื ืืืืฉืึทื ืืื ืืึทื ืฅ ืงืจืื ืืื ืืขืจืืื ืขื ืคืื ืื ืืขืงืกืื, ืืื ื ืึธื ืคืืจืื ื ืื ืืขืงืกืื ืจืืงืืืืืขืจื ืืืจ ืฆื ืืืจืืคืืจื ืขืืืขืืข ืืึทื ืฅ ืืึธืื ืข ืฉืึทืืึทื ืืกื ืืื ืืจืึธืึธืืื. ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืงืจืืืืืื ื ืึทื ืืื ืืขืงืก ืืืื ืืืื ืืขืืื ืืืจื ืฉืจืืืื ืงืึธื ืืื ืื ืืจืขืืืื ืงืึทื ืกืึธืื (ืืืึธืก, ืืืจื ืืขื ืืืขื, ืืื ื ืืฉื ืึทืจืืขืื ืืืืก ืคืื ืื ืงืขืกืื). ืคึฟืื ืืขืจ ืืึทืึทืืืขืจ 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()
ืึทืคืืขืจืืืึธืจื
ืืื ืึท ืืื ืขื, ืืขืจ ืืืืื ืขืงืกืคึผืขืจืืืขื ื ืืื ืึท ืคืึทืจืืืืึทื ืฆืืืืฉื ืืืึทืจืขื ืืื ืืืืื. ืืืื ืืืจ ืืจืึทืืื ืืืขืื ืืื, ืึท ืืจืึทืคืืง DBMS ืคึผืขืจืคืึธืจืื ืื ืืขืจืข ืึทืคึผืขืจืืืฉืึทื ื ืฆื ืืึทืงืืืขื ืื ืืขืืืข ืจืขืืืืืึทืื. ืึธืืขืจ, ืืื ืึท ืืืื ืคืื ืื ืืขืกืฅ, ืืื ืืืื ืืขืคืืจื ืึทื ืขืงืกืคึผืขืจืืืขื ื ืืื ืึท ืืงืฉื ืืื:
g.V().hasLabel('ZoneStep').has('id',0)
.repeat(__.out().simplePath()).until(__.hasLabel('ZoneStep').has('id',1)).count().next()
ืืืึธืก ืจืืคืืขืงืก ืืืื ืืืืึทืืงืืื. ืืืขืจ ืืคืืื ืืืืฃ ืืืขืืืข ืืืื ืืื ืื ืืจืืฃ ืืืืก ืืจืืืกืืขืืืืื ืจืขืืืืืืื ืืืืก ืืขื ืขื ืืจืืืขืจ ืืคืืจ ืกืขืงืื ืื... ืืืก ืืื, ืคืืจืฉืืืื ืืื, ืฆืืืื ืืขื ืืืืก ืขืก ืืขื ืขื ืืขืืืขื ืืืขืืขื ืืื 0 -> X -> Y ... -> 1
, ืืืึธืก ืื ืืจืึทืคืืง ืืึธืืึธืจ ืืืื ืึธืคึผืืขืฉืืขืื.
ืืคืืื ืคึฟืึทืจ ืึท ืึธื ืคึฟืจืขื ืืื:
g.V().hasLabel('ZoneStep').has('id',0).out().has('id',1)).count().next()
ืืื ืงืขื ื ืืฉื ืืึทืงืืืขื ืึท ืคึผืจืึธืืืงืืืื ืขื ืืคืขืจ ืืื ืึท ืคึผืจืึทืกืขืกืื ื ืฆืืื ืคืื ืืืืื ืืงืขืจ ืืื ืึท ืจืืข.
ืืขืจ ืืึธืจืึทืืืฉ ืคืื ืืขืจ ืืขืฉืืืืข ืืื ืึทื ืึท ืฉืืื ืืขืืึทื ืง ืืื ืคึผืขืจืึทืืืืืึทืืืง ืืึธืืขืืื ื ืืึธื ื ืื ืคืืจื ืฆื ืืขืจ ืืขืืืืื ืจืขืืืืืึทื, ืืืึธืก ืืื ืืขืืึทื ืกืืจืืืืื ืืื ืคืื ืืขืืขืจ ืขืคืขืงืืืืืงืืึทื ืืื ืืขื ืืืึทืฉืคึผืื ืคืื ClickHouse. ืื ื ืืฆื ืคืึทื ืืขืจืืื ืื ืืื ืืขื ืึทืจืืืงื ืืื ืึท ืงืืึธืจ ืึทื ืื-ืืืกืืขืจ ืคึฟืึทืจ ืืจืึทืคืืง ืืืืก, ืืึธืืฉ ืขืก ืืืื ื ืคึผืึทืกืืง ืคึฟืึทืจ ืืึธืืขืืื ื ืืื ืืืืขืจ ืคึผืขืจืึทืืืื.
ืืงืืจ: www.habr.com