เบชเบฐเบเบฒเบเบเบตเบเบธเบเบเบปเบ. เบเบงเบเปเบฎเบปเบฒเบเปเบฒเบฅเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบฐเบฅเบดเบเบเบฐเบเบฑเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบงเบดเปเบเบฒเบฐเบเบฒเบเบเบฐเบฅเบฒเบเบญเบเบญเบญเบเปเบฅเบเป. เปเบเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบงเบกเบตเบงเบฝเบเบเบฒเบเบเบตเปเบเปเบฝเบงเบเปเบญเบเบเบฑเบเบเบฒเบเบงเบดเปเบเบฒเบฐเบชเบฐเบเบดเบเบดเบเบญเบเปเบชเบฑเปเบเบเบฒเบเบเบฑเบเบเปเบญเบเบเปเบฝเบงเปเบเบเบปเปเบงเบเบฒเบเบเบทเปเบ.
เปเบเบฑเบเบชเปเบงเบเบซเบเบถเปเบเบเบญเบเบงเบฝเบเบเบฒเบเบเบตเป, เบเบนเปเปเบเปเบชเบฒเบกเบฒเบเบเบฒเบกเบเปเบฒเบเบฒเบกเบฅเบฐเบเบปเบเบเบญเบเบเบฐเปเบเบเบเบฑเปเบเบเปเปเปเบเบเบตเป:
- เบเบฑเบเบเปเบญเบเบเปเบฝเบงเบเบฒเบเปเบเบ "A" เปเบเปเบเบ "B" เบกเบตเบเปเบฒเบเบงเบเปเบเบปเปเบฒเปเบ;
- เบเบฑเบเบเปเบญเบเบเปเบฝเบงเบเปเบฒเบเปเบเบ "A" เปเบเบซเบฒเปเบเบ "B" เบเปเบฒเบเปเบเบ "C" เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบเปเบเบ "D";
- เบกเบฑเบเปเบเปเปเบงเบฅเบฒเบเบปเบเบเบฒเบเปเบเบชเปเบฒเบฅเบฑเบเบเบฑเบเบเปเบญเบเบเปเบฝเบงเบเบฐเปเบเบเปเบเบเบถเปเบเปเบเบเบฒเบเปเบเบตเบเบเบฒเบเบเบฒเบเปเบเบ โAโ เปเบเปเบเบ โBโ.
เปเบฅเบฐเบเบฒเบเบชเบญเบเบเบฒเบกเบเบฒเบเบงเบดเปเบเบฒเบฐเบเบตเปเบเปเบฒเบเบเบทเบเบฑเบเบเปเบฒเบเบงเบเบซเบเบถเปเบ.
เบเบฒเบโเปเบเบทเปเบญเบโเปเบซเบงโเบเบญเบโเบเบนเปโเบกเบฒโเบขเปเบฝเบกโเบขเบฒเบกโเปเบโเบเบปเปเบงโเบเบทเปเบโเบเบตเปโเปเบกเปเบโเปเบชเบฑเปเบโเบชเบฐโเปเบเบโเบเปเบฒโเบเบปเบโ. เบซเบผเบฑเบเบเบฒเบเบญเปเบฒเบเบญเบดเบเปเบเบตเปเบเบฑเบ, เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเบปเปเบเบเบปเบเบงเปเบฒ DBMSs graph เบเบฑเบเบเบทเบเบเปเบฒเปเบเปเบชเปเบฒเบฅเบฑเบเบเบปเบเบฅเบฒเบเบเบฒเบเบเบฒเบเบงเบดเปเบเบฒเบฐ. เบเปเบฒเบเบฐเปเบเบปเปเบฒเบกเบตเบเบงเบฒเบกเบเปเบญเบเบเบฒเบเบเบตเปเบเบฐเปเบเบดเปเบเบงเปเบฒ DBMSs เบเบฐเบฎเบฑเบเบกเบทเบเบฑเบเบเบฒเบเบชเบญเบเบเบฒเบกเบเบฑเปเบเบเปเบฒเบงเปเบเบงเปเบ (TL; DR; เบเปเปเบเบต).
เบเปเบญเบเปเบฅเบทเบญเบเปเบเป DBMS
- Backend เบเบฒเบเปเบเบฑเบเบฎเบฑเบเบชเบฒ BerkeleyDB, Apache Cassandra, Scylla;
- เบเบฑเบเบชเบฐเบเบตเบเบฑเบเบเปเบญเบเบชเบฒเบกเบฒเบเบเบทเบเปเบเบฑเบเปเบงเปเปเบ Lucene, Elasticsearch, Solr.
เบเบนเปเบเบฝเบเบเบญเบ JanusGraph เบเบฝเบเบงเปเบฒเบกเบฑเบเปเบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบเบเบฑเบ OLTP เปเบฅเบฐ OLAP.
เบเปเบญเบเปเบเปเปเบฎเบฑเบเบงเบฝเบเบเบฑเบ BerkeleyDB, Apache Cassandra, Scylla เปเบฅเบฐ ES, เปเบฅเบฐเบเบฐเบฅเบดเบเบเบฐเบเบฑเบเปเบซเบผเบปเปเบฒเบเบตเปเบกเบฑเบเบเบฐเบเบทเบเปเบเปเปเบเบฅเบฐเบเบปเบเบเบญเบเบเบงเบเปเบฎเบปเบฒ, เบเบฑเปเบเบเบฑเปเบเบเปเบญเบเบกเบตเบเบงเบฒเบกเบซเบงเบฑเบเปเบเบเบฒเบเบเบปเบเบชเบญเบ DBMS graph เบเบตเป. เบเปเบญเบเบเบปเบเบงเปเบฒเบกเบฑเบเปเบเบเบเบตเปเบเบฐเปเบฅเบทเบญเบ BerkeleyDB เบซเบผเบฒเบเบเบงเปเบฒ RocksDB, เปเบเปเบเบฑเปเบเบญเบฒเบเบเบฐเปเบเบฑเบเบเปเบญเบเบเบงเบฒเบกเบเปเบญเบเบเบฒเบเบเบฒเบเปเบฎเบฑเบเบเบธเบฅเบฐเบเปเบฒ. เปเบเบเปเบฅเบฐเบเบตเปเบเบเปเปเบเบฒเบก, เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฐเบซเบเบฒเบ, เบเบฒเบเบเปเบฒเปเบเปเบเบฐเบฅเบดเบเบเบฐเบเบฑเบ, เปเบเบฐเบเปเบฒเปเบซเปเปเบเป backend เบเปเบฝเบงเบเบฑเบ Cassandra เบซเบผเบท Scylla.
เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเปเปเปเบเปเบเบดเบเบฒเบฅเบฐเบเบฒ Neo4j เปเบเบฒเบฐเบงเปเบฒเบเบฒเบเบเบฑเบเบเบธเปเบกเบฎเบฝเบเบฎเปเบญเบเปเบซเปเบกเบตเบชเบฐเบเบฑเบเบเบฒเบเบเปเบฒ, เบเบฑเปเบเปเบกเปเบ, เบเบฐเบฅเบดเบเบเบฐเบเบฑเบเบเปเปเปเบกเปเบเปเบซเบผเปเบเปเบเบตเบ.
Graph DBMSs เปเบงเบปเปเบฒเบงเปเบฒ: "เบเปเบฒเบกเบฑเบเบเปเบฒเบเบเบทเบเบฒเบ, เบเบฐเบเบดเบเบฑเบเบกเบฑเบเบเบทเบเบฑเบเบเบฒเบ!" - เบเบงเบฒเบกเบเบฒเบก!
เบเปเบญเบเบญเบทเปเบ เปเบปเบ, เบเปเบญเบเปเบเปเปเบเปเบกเบเบฒเบ, เปเบเบดเปเบเบเบทเบเปเบฎเบฑเบเบเบฒเบก canons เบเบญเบเบเบฒเบ DBMSs:
เบกเบตเปเบเบทเปเบญเปเบเปเปเบฅเปเบง 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), เบขเบธเบเปเบเบเบเปเปเปเบเปเบเบฑเบเบเบทเบเบเบปเบเบเบงเปเบฒเบเปเบฒเบเบเบฐเบเบญเบเบซเบฒ ZoneSteps เบเบตเปเบกเบตเบเบญเบเปเบเบซเบฒเปเบเบเบเบตเปเบกเบต. ID=19, เบเบฑเบเบเบณเบเบงเบเบเปเบญเบเปเบชเปเบเบฑเปเบเบเปเบฒเบง.
เบเปเบฒโเบเบฐโเปเบเบปเปเบฒโเบเปเปโเปเบเปโเบเปเบฒโเบเปเบฒโเบเบตเปโเบเบฐโเบฎเบนเปโเบเบฑเบ intricacies เบเบฑเบโเบซเบกเบปเบโเบเบญเบโเบเบฒเบโเบเบญเบโเบซเบฒโเปเบโเบเบฒโเบโ, เปเบเปโเบเบฒเบโเบชเบญเบโเบเบฒเบกโเบเบตเปโเปเบเปโเบเบทเบโเบชเปเบฒเบโเบเบถเปเบโเปเบเบโเบญเบตเบโเปเบชเปโเบเบถเปเบกโเบเบตเป (
เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเปเบซเบฅเบ 50 เบเบฑเบเปเบเบเบเบฑเปเบเปเบเป 3 เบซเบฒ 20 เบเบธเบเปเบเบเบงเบฒเบกเบเบฒเบงเปเบเบปเปเบฒเปเบเปเบเบเบฒเบเบเปเปเบกเบนเบ JanusGraph เปเบเบเปเบเป backend BerkeleyDB, เบชเปเบฒเบเบเบฑเบเบชเบฐเบเบตเบญเบตเบเบเบฒเบกเบเบฒเบ
script เบเบฒเบงเปเบซเบผเบ Python:
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 cores เปเบฅเบฐ RAM 16 GB เปเบ SSD. JanusGraph เบเบทเบเบเบณเปเบเปเปเบเบเปเบเปเบเบณเบชเบฑเปเบเบเบตเป:
docker run --name janusgraph -p8182:8182 janusgraph/janusgraph:latest
เปเบเบเปเบฅเบฐเบเบตเบเบตเป, เบเปเปเบกเบนเบเปเบฅเบฐเบเบฑเบเบชเบฐเบเบตเบเบตเปเบเบทเบเบเปเบฒเปเบเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเปเบเบซเบฒเบเบปเบเบเบฑเบเบเบตเปเปเบเปเบเบญเบเบเบฐเบเบทเบเปเบเบฑเบเปเบงเปเปเบ BerkeleyDB. เปเบเบเปเบเปเบเบฐเบเบดเบเบฑเบเบเปเบฒเบฎเปเบญเบเบเปเบเบตเปเปเบซเปเบเปเบญเบเบซเบเปเบฒเบเบตเป, เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบฎเบฑเบเปเบงเบฅเบฒเปเบเบปเปเบฒเบเบฑเบเบซเบผเบฒเบเบชเบดเบเบงเบดเบเบฒเบเบต.
เปเบเบเบเบฒเบเปเบฅเปเบ 4 scripts เบเปเบฒเบเปเบเบดเบเปเบเบเบฐเบซเบเบฒเบ, เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเบฑเบเบเบฒเบเบเปเบฝเบ DBMS เปเบเบปเปเบฒเปเบเปเบเบเบฑเบเบเบตเปเบกเบตเบเปเปเบฒ Java stacktraces เบเบตเปเบกเบตเบเบงเบฒเบกเบชเบธเบ (เปเบฅเบฐเบเบงเบเปเบฎเบปเบฒเบเบธเบเบเบปเบเบกเบฑเบเบญเปเบฒเบ Java stacktraces) เปเบเบเบฑเบเบเบถเบ Docker.
เบซเบผเบฑเบเบเบฒเบเบเบตเปเบเบดเบเบเบฒเบเบญเบฑเบ, เบเปเบญเบเปเบเปเบเบฑเบเบชเบดเบเปเบเปเบฎเบฑเบเปเบเบเบงเบฒเบเบเบฃเบฒเบเปเบซเปเบเปเบฒเบเบเปเปเบชเบดเปเบเบเปเปเปเบเบเบตเป:
เบเบฒเบเบเบฑเบเบชเบดเบเปเบเบงเปเบฒเบเบฒเบเบเบญเบเบซเบฒเบเบฒเบกเบเบธเบเบฅเบฑเบเบชเบฐเบเบฐเบเบญเบเบเบดเบเบดเบเบธเบเบเบปเบเบเบฐเปเบงเบเบงเปเบฒเบเบฒเบเบเบญเบเบซเบฒเบเบฒเบกเบเบญเบ. เบเบฑเปเบเบเบฑเปเบ, เบเปเบฒเบฎเปเบญเบเบเปเบเบญเบเบเปเบญเบเปเบเปเบเบฒเบเปเบเบฑเบเบเบฑเปเบเบเปเปเปเบเบเบตเป:
g.V().hasLabel('ZoneStep').has('id',0).repeat(__.out().simplePath()).until(__.hasLabel('ZoneStep').has('id',19)).count().next()
เบชเบดเปเบเบเบตเปเปเบเบฑเบเบเบฒเบชเบฒเบฅเบฑเบเปเบเบเปเบกเปเบเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเปเบเบฑเปเบเบเบตเป: เบเบญเบเบซเบฒ ZoneStep เบเบฑเบ ID = 0, stomp เปเบเบเบเปเปเบกเบตเบเบฒเบเบเบฑเบเบเบทเบเปเบเบเปเบญเบเบเบปเบเบเปเบงเบฒเบเปเบฒเบเบเบญเบเบซเบฒ ZoneStep เบเบฑเบ ID = 19, เบเบฑเบเบเปเบฒเบเบงเบเบเบญเบเบเปเบญเบเปเบชเปเบเบฑเปเบเบเปเบฒเบง.
เบเปเบญเบเบเบฑเบเปเบเปเบเบฑเบเบเบธเบเบชเบฐเบเบดเบเปเบซเบผเบเบเบตเปเปเบซเปเปเบงเปเบเปเบฒเบเปเบเบดเบเปเบเบทเปเบญเบเปเปเบชเปเบฒเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบตเปเบเปเปเบเปเบฒเปเบเบฑเบ, เบเปเบฒเบเบฑเบเบเบปเบงเปเบญเบเบเบฑเบเบเบธเบเบฅเบฑเบเบชเบฐเบเบฐเบเปเบฒเบเป.
เบเบฒเบเบฎเปเบญเบเบเปเบเบฑเบเบเบปเบเปเบเปเปเบงเบฅเบฒเบซเบผเบฒเบเบงเบดเบเบฒเบเบตเปเบเบทเปเบญเปเบซเปเบชเปเบฒเปเบฅเบฑเบ, เปเบเบดเปเบเบเปเปเบชเบฒเบกเบฒเบเบเบญเบกเบฎเบฑเบเปเบเปเบขเปเบฒเบเบชเบปเบกเบเบนเบเบชเปเบฒเบฅเบฑเบเบงเบฝเบเบเบฒเบเบเบญเบเบเบงเบเปเบฎเบปเบฒ, เปเบเบฒเบฐเบงเปเบฒเบกเบฑเบเบเปเปเปเบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบเบเบธเบเบเบฐเบชเบปเบเบเบญเบเบเบฒเบเบฎเปเบญเบเบเปเบเบญเบ AdHoc เปเบเป.
เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเบฐเบเบฒเบเบฒเบกเปเบเป JanusGraph เปเบเบเปเบเป Scylla เปเบเบฑเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ Cassandra เบเบตเปเปเบงเบเบตเปเบชเบธเบ, เปเบเปเบเบตเปเบเปเปเปเบเปเบเปเบฒเปเบเบชเบนเปเบเบฒเบเบเปเบฝเบเปเบเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบตเปเบชเปเบฒเบเบฑเบเปเบเป.
เบเบฑเปเบเบเบฑเปเบเปเบเบดเบเบงเปเบฒเบเบฐเบกเบตเบเบงเบฒเบกเบเบดเบเบเบตเปเบงเปเบฒ "เบกเบฑเบเบเปเบฒเบเบเบทเบเบฒเบ", เบเปเบญเบเบเปเปเบชเบฒเบกเบฒเบเปเบญเบปเบฒเปเบชเบฑเปเบเบชเบฐเปเบเบ DBMS เปเบเบทเปเบญเบเบธเบเปเบเปเบเบกเบฑเบเปเบเปเปเบง. เบเปเบญเบเบชเบปเบกเบกเบธเบเปเบเบฑเบกเบเบตเปเบงเปเบฒเบกเบตเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเบเบตเปเบเปเบญเบเบเปเปเบฎเบนเปเปเบฅเบฐ JanusGraph เบชเบฒเบกเบฒเบเปเบฎเบฑเบเปเบเปเปเบเบทเปเบญเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเบปเปเบเบซเบฒเบเบตเปเปเบเบชเบญเบเบชเบฒเบกเบงเบดเบเบฒเบเบต, เปเบเบงเปเบเบเปเปเบเบฒเบก, เบเปเบญเบเบเปเปเบชเบฒเบกเบฒเบเปเบฎเบฑเบเบกเบฑเบเปเบเป.
เปเบเบทเปเบญเบเบเบฒเบเบเบฑเบเบซเบฒเบเบฑเบเบเปเบญเบเปเบเปเปเบ, เบเปเบญเบเปเบฅเบตเปเบกเบเบดเบเบเปเบฝเบงเบเบฑเบ JOINs เปเบฅเบฐ Pivots เบเบญเบเบเบฒเบเบฐเบฅเบฒเบ, เปเบเบดเปเบเบเปเปเปเบเปเบเบปเบเปเบเปเบเปเบเปเบเบตเปเบเปเบเปเบเบญเบเบเบงเบฒเบกเบชเบฐเบซเบเปเบฒเบเบฒเบก, เปเบเปเบญเบฒเบเบเบฐเปเบเบฑเบเบเบฒเบเปเบฅเบทเบญเบเบเบตเปเปเบฎเบฑเบเบงเบฝเบเปเบเปเบขเปเบฒเบเบชเบปเบกเบเบนเบเปเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ.
เปเบเบเบเบฒเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบเป 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
)
เบเบฑเบเบเบฑเปเบเปเบเป inserts เปเบเบปเปเบฒเบกเบฒเปเบ batches, เบเบฒเบเบเบทเปเบกเบเปเปเบกเบนเบเปเบกเปเบเปเบงเบเบงเปเบฒ 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
เบเบฒเบเบฎเปเบญเบเบเป, เปเบเปเบเบญเบ, เปเบเบดเปเบเบเปเบญเบเบเปเบฒเบเปเบเบฑเบเบเบฒเบขเปเบฒเบ; เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเปเบฒเปเบเปเบเบปเบงเบเบดเบ, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบชเปเบฒเบเบชเบฒเบเปเบเบทเปเบญเบเบเปเบฒเปเบเบตเบเบเบญเบเปเบง. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบเบงเบเปเบเบปเบฒเปเบฎเบฑเบเบงเบฝเบเปเบฅเบฐเปเบฎเบฑเบเบงเบฝเบเบขเปเบฒเบเปเบงเบงเบฒ. เบเบฑเบเบชเบญเบเบเปเบฒเบฎเปเบญเบเบเปเบเปเบฒเบญเบดเบเปเบฅเบฐเบเบตเบชเบญเบเปเบกเปเบเบชเปเบฒเปเบฅเบฑเบเปเบเปเบงเบฅเบฒเบซเบเปเบญเบเบเบงเปเบฒ 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.
เบเบฒเบเบเบฐเบเบดเบเบฑเบเปเบกเปเบเบเบตเบซเบผเบฒเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบญเบฒเบเบเบฐเบเปเปเบเปเบญเบเบเบดเบเบเปเบฝเบงเบเบฑเบเบเบฒเบ pivoting เบเบฒเบเบฐเบฅเบฒเบเปเบเบฑเบเปเบเบผเปเบเบผเบก. เบเปเบญเบเบซเบเปเบฒเบเบตเป, เบเบงเบเปเบฎเบปเบฒเบเปเบญเบเปเบฎเบฑเบ pivots เบเบญเบเบเปเปเบกเบนเบเบเบตเปเบเบถเบเบกเบฒเบเบฒเบ Vertica เปเบเบเบเปเบฒเบเบเบฒเบเบญเบฑเบเปเบซเบฅเบเปเบเบเบฑเบ Apache Parquet.
เปเบเปเบซเบเปเบฒเปเบชเบเบเบฒเบ, เบเบงเบฒเบกเบเบฐเบเบฒเบเบฒเบกเบญเบทเปเบเบเบตเปเบเบฐเปเบเปเบเบฒเบ DBMS เบเปเปเบชเปเบฒเปเบฅเบฑเบ. เบเปเบญเบเบเปเปเบเบปเบเบงเปเบฒ JanusGraph เบกเบตเบฅเบฐเบเบปเบเบเบดเปเบงเบเบเบตเปเปเบเบฑเบเบกเบดเบเบเบตเปเปเบฎเบฑเบเปเบซเปเบกเบฑเบเบเปเบฒเบเบเปเปเบเบฒเบเปเบฅเบฑเปเบเบเบฑเบเบเบฐเบฅเบดเบเบเบฐเบเบฑเบ. เปเบเปเบงเบฅเบฒเบเบฝเบงเบเบฑเบ, เบเบฒเบเบเบฑเปเบเบเปเบฒเปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบ, เบงเบดเบเบตเบเบฒเบ 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}
เบเปเบญเบเบชเบฒเบกเบฒเบ "เปเบญเบปเบฒ" เปเบงเบตเบเบฑเบ BerkeleyDB เบเบญเบ JanusGraph เปเบเบเบเบฑเบเปเบญเบตเบ.
เปเบญเบเบฐเบชเบฒเบเปเบกเปเบเบเปเบญเบเบเปเบฒเบเบซเบเบฒเบเบเบฒเบเปเบเปเบเปเบเบญเบเบเบฑเบเบชเบฐเบเบต, เบเบฑเบเบเบฑเปเบเปเบเปเบเบฒเบเบเบธเปเบกเบเบญเบเบเบฑเบเบชเบฐเบเบตเบฎเบฝเบเบฎเปเบญเบเปเบซเปเบเปเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบ shamanism เบเบตเปเปเบเบเบเบฐเบซเบผเบฒเบเปเบ Groovy. เบเบปเบงเบขเปเบฒเบ, เบเบฒเบเบชเปเบฒเบเบเบฑเบเบชเบฐเบเบตเบเปเบญเบเปเบฎเบฑเบเปเบเบเบเบฒเบเบเบฝเบเบฅเบฐเบซเบฑเบเปเบ console 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()
เบเปเบญเบเบเปเปเบชเบฒเบกเบฒเบเปเบเปเบฎเบฑเบเบเบฒเบเบเบญเบเบชเบฐเบซเบเบญเบเบเบตเปเบกเบตเบเบฐเบชเบดเบเบเบดเบเบฒเบเปเบเบเปเบเปเปเบงเบฅเบฒเบเบฐเบกเบงเบเบเบปเบเบซเบเปเบญเบเบเบงเปเบฒเบซเบเบถเปเบเบงเบดเบเบฒเบเบต.
เบชเบปเบกเบเบฑเบเบชเบดเบเบเปเบฒเบเบญเบเปเบฅเบทเปเบญเบเปเบกเปเบเบงเปเบฒเบเบงเบฒเบกเบเบดเบเบเบตเปเบชเบงเบเบเบฒเบกเปเบฅเบฐเบเบฒเบเบชเปเบฒเบเปเบเบเบเปเบฒเบฅเบญเบเปเบเบ paradigmatic เบเปเปเปเบเปเบเปเบฒเปเบเบชเบนเปเบเบปเบเปเบเปเบฎเบฑเบเบเบตเปเบเปเบญเบเบเบฒเบ, เปเบเบดเปเบเบชเบฐเปเบเบเปเบซเปเปเบซเบฑเบเปเบเบดเบเบเบฐเบชเบดเบเบเบดเบเบฒเบเบชเบนเบเบเบงเปเบฒเบซเบผเบฒเบเปเบเบเปเบเปเบเบปเบงเบขเปเบฒเบเบเบญเบ ClickHouse. เบเปเบฅเบฐเบเบตเบเบฒเบเบเปเบฒเปเบเปเบเบตเปเบเปเบฒเบชเบฐเปเบซเบเบตเปเบเบเบปเบเบเบงเบฒเบกเบเบตเปเปเบกเปเบเปเบเบฑเบเบฎเบนเบเปเบเบเบเบฒเบเบเปเปเบเปเบฒเบเบเบตเปเบเบฑเบเปเบเบเบชเปเบฒเบฅเบฑเบเบเบฒเบ DBMSs, เปเบเบดเบเปเบกเปเบเบงเปเบฒเบกเบฑเบเปเบเบดเปเบเบเบทเบงเปเบฒเปเบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบเบเบฒเบเบชเปเบฒเบเปเบเบเบเปเบฒเบฅเบญเบเปเบเบเปเบฒเบเบงเบฑเบเบเบญเบเบเบงเบเปเบเบปเบฒ.
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com