เชฏเซ‹เช—เซเชฏ เชชเชพเชฅ เชถเซ‹เชงเชตเชพเชจเซ€ เชธเชฎเชธเซเชฏเชพเชจเซ‡ เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡ เชœเชพเชจเซเชธเช—เซเชฐเชพเชซ เช—เซเชฐเชพเชซ เชกเซ€เชฌเซ€เชเชฎเชเชธเชจเซ€ เชฒเชพเช—เซ เชชเชกเชคเซ€ เชšเช•เชพเชธเชฃเซ€เชจเซ‹ เชชเซเชฐเชฏเซ‹เช—

เชฏเซ‹เช—เซเชฏ เชชเชพเชฅ เชถเซ‹เชงเชตเชพเชจเซ€ เชธเชฎเชธเซเชฏเชพเชจเซ‡ เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡ เชœเชพเชจเซเชธเช—เซเชฐเชพเชซ เช—เซเชฐเชพเชซ เชกเซ€เชฌเซ€เชเชฎเชเชธเชจเซ€ เชฒเชพเช—เซ เชชเชกเชคเซ€ เชšเช•เชพเชธเชฃเซ€เชจเซ‹ เชชเซเชฐเชฏเซ‹เช—

เช•เซ‡เชฎ เช›เซ‹ เชฌเชงเชพ. เช…เชฎเซ‡ เช‘เชซเชฒเชพเช‡เชจ เชŸเซเชฐเชพเชซเชฟเช• เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชฎเชพเชŸเซ‡ เช‰เชคเซเชชเชพเชฆเชจ เชตเชฟเช•เชธเชพเชตเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช. เช† เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ เชธเชฎเช—เซเชฐ เชชเซเชฐเชฆเซ‡เชถเซ‹เชฎเชพเช‚ เชฎเซเชฒเชพเช•เชพเชคเซ€เช“เชจเชพ เชฎเชพเชฐเซเช—เซ‹เชจเชพ เช†เช‚เช•เชกเชพเช•เซ€เชฏ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชธเชพเชฅเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค เช•เชพเชฐเซเชฏ เช›เซ‡.

เช† เช•เชพเชฐเซเชฏเชจเชพ เชญเชพเช— เชฐเซ‚เชชเซ‡, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชจเซ€เชšเซ‡เชจเชพ เชชเซเชฐเช•เชพเชฐเชจเซ€ เชธเชฟเชธเซเชŸเชฎ เชชเซเชฐเชถเซเชจเซ‹ เชชเซ‚เช›เซ€ เชถเช•เซ‡ เช›เซ‡:

  • เช•เซ‡เชŸเชฒเชพ เชฎเซเชฒเชพเช•เชพเชคเซ€เช“ เชตเชฟเชธเซเชคเชพเชฐ "A" เชฅเซ€ เชตเชฟเชธเซเชคเชพเชฐ "B" เชธเซเชงเซ€ เชชเชธเชพเชฐ เชฅเชฏเชพ;
  • เช•เซ‡เชŸเชฒเชพ เชฎเซเชฒเชพเช•เชพเชคเซ€เช“ เชตเชฟเชธเซเชคเชพเชฐ "A" เชฅเซ€ เชตเชฟเชธเซเชคเชพเชฐ "B" เชฎเชพเช‚ เชตเชฟเชธเซเชคเชพเชฐ "C" เช…เชจเซ‡ เชชเช›เซ€ เชตเชฟเชธเซเชคเชพเชฐ "D" เชฆเซเชตเชพเชฐเชพ เชชเชธเชพเชฐ เชฅเชฏเชพ;
  • เชšเซ‹เช•เซเช•เชธ เชชเซเชฐเช•เชพเชฐเชจเชพ เชฎเซเชฒเชพเช•เชพเชคเซ€เชจเซ‡ เชตเชฟเชธเซเชคเชพเชฐ โ€œAโ€ เชฅเซ€ เชตเชฟเชธเซเชคเชพเชฐ โ€œBโ€ เชธเซเชงเซ€ เชฎเซเชธเชพเชซเชฐเซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช•เซ‡เชŸเชฒเซ‹ เชธเชฎเชฏ เชฒเชพเช—เซเชฏเซ‹.

เช…เชจเซ‡ เชธเช‚เช–เซเชฏเชพเชฌเช‚เชง เชธเชฎเชพเชจ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชพเชคเซเชฎเช• เชชเซเชฐเชถเซเชจเซ‹.

เชตเชฟเชธเซเชคเชพเชฐเซ‹เชฎเชพเช‚ เชฎเซเชฒเชพเช•เชพเชคเซ€เช“เชจเซ€ เชนเชฟเชฒเชšเชพเชฒ เช เชจเชฟเชฐเซเชฆเซ‡เชถเชฟเชค เช—เซเชฐเชพเชซ เช›เซ‡. เช‡เชจเซเชŸเชฐเชจเซ‡เชŸ เชตเชพเช‚เชšเซเชฏเชพ เชชเช›เซ€, เชฎเซ‡เช‚ เชถเซ‹เชงเซเชฏเซเช‚ เช•เซ‡ เช—เซเชฐเชพเชซ เชกเซ€เชฌเซ€เชเชฎเชเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชพเชคเซเชฎเช• เช…เชนเซ‡เชตเชพเชฒเซ‹ เชฎเชพเชŸเซ‡ เชชเชฃ เชฅเชพเชฏ เช›เซ‡. เชฎเชจเซ‡ เชœเซ‹เชตเชพเชจเซ€ เชˆเชšเซเช›เชพ เชนเชคเซ€ เช•เซ‡ เช—เซเชฐเชพเชซ เชกเซ€เชฌเซ€เชเชฎเชเชธ เช†เชตเชพ เชชเซเชฐเชถเซเชจเซ‹ เชธเชพเชฅเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเชพเชฎเชจเซ‹ เช•เชฐเชถเซ‡ (เชŸเซ€เชเชฒ; เชกเซ€เช†เชฐ; เช–เชฐเชพเชฌ เชฐเซ€เชคเซ‡).

เชฎเซ‡เช‚ DBMS เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชชเชธเช‚เชฆ เช•เชฐเซเชฏเซเช‚ เชœเชพเชจเซเชธเช—เซเชฐเชพเชซ, เช—เซเชฐเชพเชซ เช“เชชเชจ-เชธเซ‹เชฐเซเชธ เชกเซ€เชฌเซ€เชเชฎเชเชธเชจเชพ เช‰เชคเซเช•เซƒเชทเซเชŸ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟ เชคเชฐเซ€เช•เซ‡, เชœเซ‡ เชชเชฐเชฟเชชเช•เซเชต เชคเช•เชจเซ€เช•เซ‹เชจเชพ เชธเซเชŸเซ‡เช• เชชเชฐ เช†เชงเชพเชฐ เชฐเชพเช–เซ‡ เช›เซ‡, เชœเซ‡ (เชฎเชพเชฐเชพ เชฎเชคเซ‡) เชคเซ‡เชจเซ‡ เชฏเซ‹เช—เซเชฏ เช“เชชเชฐเซ‡เชถเชจเชฒ เชฒเชพเช•เซเชทเชฃเชฟเช•เชคเชพเช“ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเซ€ เชœเซ‹เชˆเช:

  • BerkeleyDB เชธเซเชŸเซ‹เชฐเซ‡เชœ เชฌเซ‡เช•เชเชจเซเชก, Apache Cassandra, Scylla;
  • เชœเชŸเชฟเชฒ เชธเซ‚เชšเช•เชพเช‚เช•เซ‹ เชฒเซเชฏเซเชธเซ€เชจ, เช‡เชฒเชพเชธเซเชŸเชฟเช•เชธเชฐเซเชš, เชธเซ‹เชฒเชฐเชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

JanusGraph เชจเชพ เชฒเซ‡เช–เช•เซ‹ เชฒเช–เซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡ OLTP เช…เชจเซ‡ OLAP เชฌเช‚เชจเซ‡ เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เช›เซ‡.

เชฎเซ‡เช‚ BerkeleyDB, Apache Cassandra, Scylla เช…เชจเซ‡ ES เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซเชฏเซเช‚ เช›เซ‡, เช…เชจเซ‡ เช† เช‰เชคเซเชชเชพเชฆเชจเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช…เชฎเชพเชฐเซ€ เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชตเชพเชฐเช‚เชตเชพเชฐ เชฅเชพเชฏ เช›เซ‡, เชคเซ‡เชฅเซ€ เชนเซเช‚ เช† เช—เซเชฐเชพเชซ DBMS เชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช†เชถเชพเชตเชพเชฆเซ€ เชนเชคเซ‹. เชฎเชจเซ‡ RocksDB เชชเชฐ BerkeleyDB เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชจเซเช‚ เชตเชฟเชšเชฟเชคเซเชฐ เชฒเชพเช—เซเชฏเซเช‚, เชชเชฐเช‚เชคเซ เชคเซ‡ เช•เชฆเชพเชš เชตเซเชฏเชตเชนเชพเชฐเชจเซ€ เช†เชตเชถเซเชฏเช•เชคเชพเช“เชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช›เซ‡. เช•เซ‹เชˆเชชเชฃ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชฎเชพเชชเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเชพ, เช‰เชคเซเชชเชพเชฆเชจเชจเชพ เช‰เชชเชฏเซ‹เช— เชฎเชพเชŸเซ‡, เช•เซ‡เชธเชพเชจเซเชกเซเชฐเชพ เช…เชฅเชตเชพ เชธเชพเชฏเชฒเชพ เชชเชฐ เชฌเซ‡เช•เชเชจเซเชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชธเซ‚เชšเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชฎเซ‡เช‚ 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, เช†เชตเซ€ เชธเชพเช‚เช•เชณเซ‹เชจเซ€ เชธเช‚เช–เซเชฏเชพ เช—เชฃเซ‹.

เชนเซเช‚ เช†เชฒเซ‡เช– เชชเชฐ เชถเซ‹เชงเชตเชพเชจเซ€ เชคเชฎเชพเชฎ เชœเชŸเชฟเชฒเชคเชพเช“เชจเซ‡ เชœเชพเชฃเชตเชพเชจเซ‹ เชกเซ‹เชณ เช•เชฐเชคเซ‹ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เช† เช•เซเชตเซ‡เชฐเซ€ เช† เชชเซเชธเซเชคเช•เชจเชพ เช†เชงเชพเชฐเซ‡ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€ (https://kelvinlawrence.net/book/Gremlin-Graph-Guide.html).

เชฎเซ‡เช‚ เชฌเชฐเซเช•เชฒเซ‡เชกเซ€เชฌเซ€ เชฌเซ‡เช•เชเชจเซเชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชœเชพเชจเซเชธเช—เซเชฐเชพเชซ เช—เซเชฐเชพเชซ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ 50 เชฅเซ€ 3 เชชเซ‹เชˆเชจเซเชŸเชจเซ€ เชฒเช‚เชฌเชพเชˆเชจเชพ 20 เชนเชœเชพเชฐ เชŸเซเชฐเซ‡เช• เชฒเซ‹เชก เช•เชฐเซเชฏเชพ, เชœเซ‡ เชฎเซเชœเชฌ เชˆเชจเซเชกเซ‡เช•เซเชธ เชฌเชจเชพเชตเซเชฏเชพ เชจเซ‡เชคเซƒเชคเซเชต.

เชชเชพเชฏเชฅเซ‹เชจ เชกเชพเช‰เชจเชฒเซ‹เชก เชธเซเช•เซเชฐเชฟเชชเซเชŸ:


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 เช•เซ‹เชฐเซ‹ เช…เชจเซ‡ 16 GB RAM เชธเชพเชฅเซ‡ VM เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹ เช›เซ‡. JanusGraph เช† เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชœเชฎเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹:

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

เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชšเซ‹เช•เซเช•เชธ เชฎเซ‡เชณ เชถเซ‹เชง เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเชพ เชกเซ‡เชŸเชพ เช…เชจเซ‡ เช‡เชจเซเชกเซ‡เช•เซเชธ เชฌเชฐเซเช•เชฒเซ‡เชกเซ€เชฌเซ€เชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เชฅเชพเชฏ เช›เซ‡. เช…เช—เชพเช‰ เช†เชชเซ‡เชฒเซ€ เชตเชฟเชจเช‚เชคเซ€เชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เซเชฏเชพ เชชเช›เซ€, เชฎเชจเซ‡ เช˜เชฃเซ€ เชฆเชธ เชธเซ‡เช•เช‚เชก เชœเซ‡เชŸเชฒเซ‹ เชธเชฎเชฏ เชฎเชณเซเชฏเซ‹.

เช‰เชชเชฐเซ‹เช•เซเชค 4 เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹เชจเซ‡ เชธเชฎเชพเช‚เชคเชฐเชฎเชพเช‚ เชšเชฒเชพเชตเซ€เชจเซ‡, เชฎเซ‡เช‚ เชกเซ‹เช•เชฐ เชฒเซ‹เช—เชฎเชพเช‚ เชœเชพเชตเชพ เชธเซเชŸเซ‡เช•เชŸเซเชฐเซ‡เชธ (เช…เชจเซ‡ เช†เชชเชฃเซ‡ เชฌเชงเชพ เชœเชพเชตเชพ เชธเซเชŸเซ‡เช•เชŸเซเชฐเซ‡เชธ เชตเชพเช‚เชšเชตเชพเชจเซเช‚ เชชเชธเช‚เชฆ เช•เชฐเซ€เช เช›เซ€เช) เชจเซ€ เช–เซเชถเช–เซเชถเชพเชฒ เชธเซเชŸเซเชฐเซ€เชฎ เชธเชพเชฅเซ‡ DBMS เชจเซ‡ เช•เซ‹เชณเชพเชฎเชพเช‚ เชซเซ‡เชฐเชตเชตเชพเชฎเชพเช‚ เชธเชซเชณ เชฅเชฏเซ‹.

เชฅเซ‹เชกเซ‹ เชตเชฟเชšเชพเชฐ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชฎเซ‡เช‚ เช—เซเชฐเชพเชซ เชกเชพเชฏเชพเช—เซเชฐเชพเชฎเชจเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚:

เชฏเซ‹เช—เซเชฏ เชชเชพเชฅ เชถเซ‹เชงเชตเชพเชจเซ€ เชธเชฎเชธเซเชฏเชพเชจเซ‡ เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡ เชœเชพเชจเซเชธเช—เซเชฐเชพเชซ เช—เซเชฐเชพเชซ เชกเซ€เชฌเซ€เชเชฎเชเชธเชจเซ€ เชฒเชพเช—เซ เชชเชกเชคเซ€ เชšเช•เชพเชธเชฃเซ€เชจเซ‹ เชชเซเชฐเชฏเซ‹เช—

เช เชจเช•เซเช•เซ€ เช•เชฐเชตเซเช‚ เช•เซ‡ เชเชจเซเชŸเชฟเชŸเซ€ เชเชŸเซเชฐเชฟเชฌเซเชฏเซเชŸเซเชธ เชฆเซเชตเชพเชฐเชพ เชถเซ‹เชงเชตเซเช‚ เช เชงเชพเชฐ เชฆเซเชตเชพเชฐเชพ เชถเซ‹เชงเชตเชพ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชเชกเชชเซ€ เชนเชถเซ‡. เชชเชฐเชฟเชฃเชพเชฎเซ‡, เชฎเชพเชฐเซ€ เชตเชฟเชจเช‚เชคเซ€ เชจเซ€เชšเซ‡เชจเชพเชฎเชพเช‚ เชซเซ‡เชฐเชตเชพเชˆ:

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

เชฐเชถเชฟเชฏเชจเชฎเชพเช‚ เช•เช‚เชˆเช• เช†เชจเชพ เชœเซ‡เชตเซเช‚ เช›เซ‡: ID=0 เชธเชพเชฅเซ‡ ZoneStep เชถเซ‹เชงเซ‹, เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เชคเชฎเชจเซ‡ ID=19 เชธเชพเชฅเซ‡ ZoneStep เชจ เชฎเชณเซ‡ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เชชเชพเช›เชพ เชจ เชœเชพเชต, เช†เชตเซ€ เชธเชพเช‚เช•เชณเซ‹เชจเซ€ เชธเช‚เช–เซเชฏเชพ เช—เชฃเซ‹.

เชฌเชฟเชจเชœเชฐเซ‚เชฐเซ€ เชœเซ‹เชกเชพเชฃเซ‹ เชจ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชฎเชพเชฐเซ€ เชœเชพเชคเชจเซ‡ เชตเชฟเชถเซ‡เชทเชคเชพเช“ เชธเซเชงเซ€ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชฐเชพเช–เชตเชพ เชฎเชพเชŸเซ‡ เชฎเซ‡เช‚ เช‰เชชเชฐ เช†เชชเซ‡เชฒ เชฒเซ‹เชกเชฟเช‚เช— เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‡ เชชเชฃ เชธเชฐเชณ เชฌเชจเชพเชตเซ€ เช›เซ‡.

เชตเชฟเชจเช‚เชคเซ€เชจเซ‡ เชชเซ‚เชฐเซเชฃ เชฅเชตเชพเชฎเชพเช‚ เชนเชœเซ เชชเชฃ เช˜เชฃเซ€ เชธเซ‡เช•เช‚เชก เชฒเชพเช—เซ€, เชœเซ‡ เช…เชฎเชพเชฐเชพ เช•เชพเชฐเซเชฏ เชฎเชพเชŸเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช…เชธเซเชตเซ€เช•เชพเชฐเซเชฏ เชนเชคเซ€, เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เช•เซ‹เชˆเชชเชฃ เชชเซเชฐเช•เชพเชฐเชจเซ€ AdHoc เชตเชฟเชจเช‚เชคเซ€เช“เชจเชพ เชนเซ‡เชคเซเช“ เชฎเชพเชŸเซ‡ เชฌเชฟเชฒเช•เซเชฒ เชฏเซ‹เช—เซเชฏ เชจ เชนเชคเซ€.

เชฎเซ‡เช‚ เชœเชพเชจเซเชธเช—เซเชฐเชพเชซเชจเซ‹ เช‰เชชเชฏเซ‹เช— Scylla เชจเซ‹ เชธเซŒเชฅเซ€ เชเชกเชชเซ€ Cassandra เช…เชฎเชฒเซ€เช•เชฐเชฃ เชคเชฐเซ€เช•เซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซเชฏเซ‹, เชชเชฐเช‚เชคเซ เช†เชจเชพเชฅเซ€ เชชเซเชฐเชญเชพเชตเชฎเชพเช‚ เช•เซ‹เชˆ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชฅเชฏเชพ เชจเชฅเซ€.

เชคเซ‡เชฅเซ€ "เชคเซ‡ เช—เซเชฐเชพเชซ เชœเซ‡เชตเซ‹ เชฆเซ‡เช–เชพเชฏ เช›เซ‡" เช เชนเช•เซ€เช•เชค เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เชนเซเช‚ เชเชกเชชเชฅเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช—เซเชฐเชพเชซ DBMS เชฎเซ‡เชณเชตเซ€ เชถเช•เซเชฏเซ‹ เชจเชฅเซ€. เชนเซเช‚ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฐเซ€เชคเซ‡ เชฎเชพเชจเซเช‚ เช›เซเช‚ เช•เซ‡ เชนเซเช‚ เช•เช‚เชˆเช• เชœเชพเชฃเชคเซ‹ เชจเชฅเซ€ เช…เชจเซ‡ เชœเซ‡เชจเซเชธเช—เซเชฐเชพเชซเชจเซ‡ เชตเชฟเชญเชพเชœเชฟเชค เชธเซ‡เช•เชจเซเชกเชฎเชพเช‚ เช† เชถเซ‹เชง เช•เชฐเชตเชพเชจเซเช‚ เชถเช•เซเชฏ เช›เซ‡, เชœเซ‹ เช•เซ‡, เชนเซเช‚ เชคเซ‡ เช•เชฐเซ€ เชถเช•เซเชฏเซ‹ เชจ เชนเชคเซ‹.

เชธเชฎเชธเซเชฏเชพเชจเซ‡ เชนเชœเซ€ เชนเชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชตเชพเชฅเซ€, เชฎเซ‡เช‚ เชœเซ‹เช‡เชจ เช…เชจเซ‡ เช•เซ‹เชทเซเชŸเช•เซ‹เชจเชพ เชชเซ€เชตเชŸ เชตเชฟเชถเซ‡ เชตเชฟเชšเชพเชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚, เชœเซ‡ เชฒเชพเชตเชฃเซเชฏเชจเซ€ เชฆเซเชฐเชทเซเชŸเชฟเช เช†เชถเชพเชตเชพเชฆเชจเซ‡ เชชเซเชฐเซ‡เชฐเชฟเชค เช•เชฐเชคเซเช‚ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช‚ เชเช• เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช•เชพเชฐเซเชฏเช•เซเชทเชฎ เชตเชฟเช•เชฒเซเชช เชฌเชจเซ€ เชถเช•เซ‡ เช›เซ‡.

เช…เชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ 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
    )

เช‡เชจเซเชธเชฐเซเชŸเซเชธ เชฌเซ‡เชšเชฎเชพเช‚ เช†เชตเชคเชพ เชนเซ‹เชตเชพเชฅเซ€, เชญเชฐเชตเชพเชจเซเช‚ เชœเชพเชจเซเชธเช—เซเชฐเชพเชซ เช•เชฐเชคเชพเช‚ เช˜เชฃเซเช‚ เชเชกเชชเซ€ เชนเชคเซเช‚.

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 เชตเชฟเชถเซ‡ เชจเซ‹เช‚เชง. เชกเซ‡เชŸเชพเชจเซ€ เชตเชธเซเชคเซ€ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เชœเชพเชจเซเชธเช—เซเชฐเชพเชซเซ‡ IOPS (เชšเชพเชฐ เชกเซ‡เชŸเชพ เชตเชธเซเชคเซ€ เชฅเซเชฐเซ‡เชกเซ‹ เชฎเชพเชŸเซ‡ 1000-1300) เชจเซ€ เชเช•เชฆเชฎ เชŠเช‚เชšเซ€ เชธเช‚เช–เซเชฏเชพ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ€ เชนเชคเซ€ เช…เชจเซ‡ IOWAIT เช–เซ‚เชฌ เชŠเช‚เชšเซ€ เชนเชคเซ€. เชคเซ‡ เชœ เชธเชฎเชฏเซ‡, เช•เซเชฒเชฟเช•เชนเชพเช‰เชธเซ‡ เชกเชฟเชธเซเช• เชธเชฌเชธเชฟเชธเซเชŸเชฎ เชชเชฐ เชจเซเชฏเซ‚เชจเชคเชฎ เชฒเซ‹เชก เชœเชจเชฐเซ‡เชŸ เช•เชฐเซเชฏเซ‹.

เชจเชฟเชทเซเช•เชฐเซเชท

เช…เชฎเซ‡ เช† เชชเซเชฐเช•เชพเชฐเชจเซ€ เชตเชฟเชจเช‚เชคเซ€เชจเซ‡ เชธเซ‡เชตเชพ เช†เชชเชตเชพ เชฎเชพเชŸเซ‡ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ เช›เซ‡. เช…เชฎเซ‡ เช•เซเชฒเซ€เช•เชนเชพเช‰เชธเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ เช…เชชเชพเชšเซ‡ เชซเซเชฒเชฟเช‚เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช‡เชตเซ‡เชจเซเชŸ เชธเซเชŸเซเชฐเซ€เชฎเชจเซ‡ เชชเซเชฐเซ€-เชชเซเชฐเซ‹เชธเซ‡เชธ เช•เชฐเซ€เชจเซ‡ เชฎเชŸเชฟเชฐเชฟเชฏเชฒเชพเช‡เชเซเชก เชตเซเชฏเซ‚เช เช…เชจเซ‡ เชชเซ‡เชฐเซ‡เชฒเชฒเชพเชˆเชเซ‡เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชนเช‚เชฎเซ‡เชถเชพ เช•เซเชตเซ‡เชฐเซ€เชเชจเซ‡ เชตเชงเซ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เช เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช.

เชชเซเชฐเชฆเชฐเซเชถเชจ เชเชŸเชฒเซเช‚ เชธเชพเชฐเซเช‚ เช›เซ‡ เช•เซ‡ เช†เชชเชฃเซ‡ เชธเช‚เชญเชตเชคเชƒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซ‡เชŸเชฟเช•เชฒเซ€ เชชเชฟเชตเซ‹เชŸเชฟเช‚เช— เช•เซ‹เชทเซเชŸเช•เซ‹ เชตเชฟเชถเซ‡ เชตเชฟเชšเชพเชฐเชตเซเช‚ เชชเชกเชถเซ‡ เชจเชนเซ€เช‚. เช…เช—เชพเช‰, เช…เชฎเชพเชฐเซ‡ เช…เชชเชพเชšเซ‡ เชชเชฐเซเช•เซเชตเซ‡เชŸ เชชเชฐ เช…เชชเชฒเซ‹เชก เช•เชฐเซ€เชจเซ‡ เชตเชฐเซเชŸเซ€เช•เชพเชฎเชพเช‚เชฅเซ€ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ เชกเซ‡เชŸเชพเชจเชพ เชชเชฟเชตเชŸ เช•เชฐเชตเชพ เชชเชกเชคเชพ เชนเชคเชพ.

เช•เชฎเชจเชธเซ€เชฌเซ‡, เช—เซเชฐเชพเชซ 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}

เชนเซเช‚ เช†เช•เชธเซเชฎเชฟเช• เชฐเซ€เชคเซ‡ JanusGraph เชจเชพ BerkeleyDB เชตเชฐเซเชเชจเชจเซ‡ "เชฎเซ‚เช•เชตเชพเชฎเชพเช‚" เชตเซเชฏเชตเชธเซเชฅเชพเชชเชฟเชค เชฅเชฏเซ‹.

เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเช“เชจเชพ เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เชคเชฆเซเชฆเชจ เช•เซเชŸเชฟเชฒ เช›เซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเช“เชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เช—เซเชฐเซเชตเซ€เชฎเชพเช‚ เช•เช‚เชˆเช• เชตเชฟเชšเชฟเชคเซเชฐ เชถเชพเชฎเชจเชตเชพเชฆ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช—เซเชฐเซ‡เชฎเชฒเชฟเชจ เช•เชจเซเชธเซ‹เชฒเชฎเชพเช‚ เช•เซ‹เชก เชฒเช–เซ€เชจเซ‡ เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ เชฌเชจเชพเชตเชตเซ€ เช†เชตเชถเซเชฏเช• เช›เซ‡ (เชœเซ‡, เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, เชฌเซ‰เช•เซเชธเชจเซ€ เชฌเชนเชพเชฐ เช•เชพเชฎ เช•เชฐเชคเซเช‚ เชจเชฅเซ€). เชธเชคเซเชคเชพเชตเชพเชฐ เชœเชพเชจเซเชธเช—เซเชฐเชพเชซ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃเชฎเชพเช‚เชฅเซ€:

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()

เชœเซ‡ เชšเชพเชฒเชตเชพเชจเซเช‚ เช…เช‚เชคเชฐ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡. เชœเซ‹ เช•เซ‡, เช†เชตเชพ เชกเซ‡เชŸเชพ เชชเชฐ เชชเชฃ, เช†เชฒเซ‡เช– DBMS เช เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชฌเชคเชพเชตเซเชฏเชพ เชœเซ‡ เชฅเซ‹เชกเซ€เช• เชธเซ‡เช•เช‚เชกเชฅเซ€ เช†เช—เชณ เชตเชงเซ€ เช—เชฏเชพ... เช†, เช…เชฒเชฌเชคเซเชค, เช เชนเช•เซ€เช•เชคเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช›เซ‡ เช•เซ‡ เชคเซเชฏเชพเช‚ เชชเชพเชฅ เชนเชคเชพ เชœเซ‡เชฎ เช•เซ‡ 0 -> X -> Y ... -> 1, เชœเซ‡ เช—เซเชฐเชพเชซ เชเชจเซเชœเชฟเชจเซ‡ เชชเชฃ เชคเชชเชพเชธเซเชฏเซเช‚ เชนเชคเซเช‚.

เชœเซ‡เชฎ เช•เซ‡ เช•เซเชตเซ‡เชฐเซ€ เชฎเชพเชŸเซ‡ เชชเชฃ:

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

เชนเซเช‚ เชเช• เชธเซ‡เช•เชจเซเชก เช•เชฐเชคเชพเช‚ เช“เช›เชพ เชธเชฎเชฏเชจเชพ เชชเซเชฐเซ‹เชธเซ‡เชธเชฟเช‚เช— เชธเชฎเชฏ เชธเชพเชฅเซ‡ เช‰เชคเซเชชเชพเชฆเช• เชชเซเชฐเชคเชฟเชธเชพเชฆ เชฎเซ‡เชณเชตเชตเชพเชฎเชพเช‚ เช…เชธเชฎเชฐเซเชฅ เชนเชคเซ‹.

เชตเชพเชฐเซเชคเชพเชจเซ€ เชจเซˆเชคเชฟเช•เชคเชพ เช เช›เซ‡ เช•เซ‡ เชเช• เชธเซเช‚เชฆเชฐ เชตเชฟเชšเชพเชฐ เช…เชจเซ‡ เชจเชฎเซ‚เชจเชพเชฐเซ‚เชช เชฎเซ‹เชกเซ‡เชฒเชฟเช‚เช— เช‡เชšเซเช›เชฟเชค เชชเชฐเชฟเชฃเชพเชฎ เชคเชฐเชซ เชฆเซ‹เชฐเซ€ เชœเชคเซเช‚ เชจเชฅเซ€, เชœเซ‡ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช˜เชฃเซ€ เช‰เชšเซเชš เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชธเชพเชฅเซ‡ เชฆเชฐเซเชถเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช† เชฒเซ‡เช–เชฎเชพเช‚ เชชเซเชฐเชธเซเชคเซเชค เช‰เชชเชฏเซ‹เช— เช•เซ‡เชธ เช—เซเชฐเชพเชซ DBMSs เชฎเชพเชŸเซ‡ เชธเซเชชเชทเซเชŸ เชตเชฟเชฐเซ‹เชงเซ€ เชชเซ‡เชŸเชฐเซเชจ เช›เซ‡, เชœเซ‹ เช•เซ‡ เชคเซ‡ เชคเซ‡เชฎเชจเชพ เชฆเชพเช–เชฒเชพเชฎเชพเช‚ เชฎเซ‹เชกเซ‡เชฒเชฟเช‚เช— เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เชฒเชพเช—เซ‡ เช›เซ‡.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹