แƒ”แƒฅแƒกแƒžแƒ”แƒ แƒ˜แƒ›แƒ”แƒœแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก JanusGraph แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜แƒก DBMS-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒ“แƒแƒ‘แƒแƒก แƒจแƒ”แƒกแƒแƒคแƒ”แƒ แƒ˜แƒกแƒ˜ แƒ’แƒ–แƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒ•แƒœแƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒ“แƒแƒกแƒแƒญแƒ แƒ”แƒšแƒแƒ“

แƒ”แƒฅแƒกแƒžแƒ”แƒ แƒ˜แƒ›แƒ”แƒœแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก JanusGraph แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜แƒก DBMS-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒ“แƒแƒ‘แƒแƒก แƒจแƒ”แƒกแƒแƒคแƒ”แƒ แƒ˜แƒกแƒ˜ แƒ’แƒ–แƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒ•แƒœแƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒ“แƒแƒกแƒแƒญแƒ แƒ”แƒšแƒแƒ“

แฒกแƒแƒšแƒแƒ›แƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒก. แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ— แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒก แƒแƒคแƒšแƒแƒ˜แƒœ แƒขแƒ แƒแƒคแƒ˜แƒ™แƒ˜แƒก แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒžแƒ แƒแƒ”แƒฅแƒขแƒก แƒแƒฅแƒ•แƒก แƒแƒ›แƒแƒชแƒแƒœแƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ แƒ”แƒ’แƒ˜แƒแƒœแƒ”แƒ‘แƒจแƒ˜ แƒ•แƒ˜แƒ–แƒ˜แƒขแƒแƒ แƒ—แƒ แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ”แƒ‘แƒ˜แƒก แƒกแƒขแƒแƒขแƒ˜แƒกแƒขแƒ˜แƒ™แƒฃแƒ  แƒแƒœแƒแƒšแƒ˜แƒ–แƒ—แƒแƒœ.

แƒ แƒแƒ’แƒแƒ แƒช แƒแƒ› แƒแƒ›แƒแƒชแƒแƒœแƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜, แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ”แƒ‘แƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒฃแƒกแƒ•แƒแƒœ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒขแƒ˜แƒžแƒ˜แƒก:

  • แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜ แƒ•แƒ˜แƒ–แƒ˜แƒขแƒแƒ แƒ˜ แƒ’แƒแƒ•แƒ˜แƒ“แƒ "A" แƒ–แƒแƒœแƒ˜แƒ“แƒแƒœ "B" แƒ–แƒแƒœแƒแƒจแƒ˜;
  • แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜ แƒ•แƒ˜แƒ–แƒ˜แƒขแƒแƒ แƒ˜ แƒ’แƒแƒ•แƒ˜แƒ“แƒ "A" แƒ–แƒแƒœแƒ˜แƒ“แƒแƒœ "B" แƒ–แƒแƒœแƒแƒจแƒ˜ "C" แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ "D" แƒ–แƒแƒœแƒ˜แƒก แƒ’แƒแƒ•แƒšแƒ˜แƒ—;
  • แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜ แƒ“แƒ แƒ แƒ“แƒแƒกแƒญแƒ˜แƒ แƒ“แƒ แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒขแƒ˜แƒžแƒ˜แƒก แƒ•แƒ˜แƒ–แƒ˜แƒขแƒแƒ แƒก แƒ›แƒแƒ’แƒ–แƒแƒฃแƒ แƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก "A" แƒ–แƒแƒœแƒ˜แƒ“แƒแƒœ "B"-แƒ›แƒ“แƒ”.

แƒ“แƒ แƒ แƒ˜แƒ’แƒ˜ แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒแƒœแƒแƒšแƒ˜แƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜.

แƒ•แƒ˜แƒ–แƒ˜แƒขแƒแƒ แƒ˜แƒก แƒ›แƒแƒซแƒ แƒแƒแƒ‘แƒ แƒ–แƒแƒœแƒ”แƒ‘แƒจแƒ˜ แƒแƒ แƒ˜แƒก แƒ›แƒ˜แƒ›แƒแƒ แƒ—แƒฃแƒšแƒ˜ แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜. แƒ˜แƒœแƒขแƒ”แƒ แƒœแƒ”แƒขแƒ˜แƒก แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒแƒฆแƒ›แƒแƒ•แƒแƒฉแƒ˜แƒœแƒ”, แƒ แƒแƒ› แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒฃแƒšแƒ˜ DBMS แƒแƒกแƒ”แƒ•แƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒแƒœแƒแƒšแƒ˜แƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ›แƒ˜แƒœแƒ“แƒแƒ“แƒ แƒ›แƒ”แƒœแƒแƒฎแƒ, แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒฃแƒ›แƒ™แƒšแƒแƒ•แƒ“แƒœแƒ”แƒœ แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒฃแƒšแƒ˜ DBMS แƒแƒกแƒ”แƒ— แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒก (TL; DR; แƒชแƒฃแƒ“แƒแƒ“).

แƒ›แƒ” แƒแƒ•แƒ˜แƒ แƒฉแƒ˜แƒ” DBMS-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ˜แƒแƒœแƒฃแƒกแƒ’แƒ แƒแƒคแƒ˜, แƒ แƒแƒ’แƒแƒ แƒช แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒฃแƒšแƒ˜ แƒฆแƒ˜แƒ แƒ™แƒแƒ“แƒ˜แƒก DBMS-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ แƒฉแƒ”แƒฃแƒšแƒ˜ แƒฌแƒแƒ แƒ›แƒแƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ”แƒšแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ”แƒงแƒ แƒ“แƒœแƒแƒ‘แƒ แƒ›แƒแƒ›แƒฌแƒ˜แƒคแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒขแƒ”แƒฅแƒœแƒแƒšแƒแƒ’แƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒขแƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช (แƒฉแƒ”แƒ›แƒ˜ แƒแƒ–แƒ แƒ˜แƒ—) แƒฃแƒœแƒ“แƒ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒก แƒ›แƒแƒก แƒฆแƒ˜แƒ แƒกแƒ”แƒฃแƒšแƒ˜ แƒแƒžแƒ”แƒ แƒแƒขแƒ˜แƒฃแƒšแƒ˜ แƒ›แƒแƒฎแƒแƒกแƒ˜แƒแƒ—แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜:

  • BerkeleyDB แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ˜แƒก backend, Apache Cassandra, Scylla;
  • แƒ แƒ—แƒฃแƒšแƒ˜ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ Lucene, Elasticsearch, Solr.

JanusGraph-แƒ˜แƒก แƒแƒ•แƒขแƒแƒ แƒ”แƒ‘แƒ˜ แƒฌแƒ”แƒ แƒ”แƒœ, แƒ แƒแƒ› แƒ˜แƒก แƒจแƒ”แƒกแƒแƒคแƒ”แƒ แƒ˜แƒกแƒ˜แƒ แƒ แƒแƒ’แƒแƒ แƒช OLTP-แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒกแƒ”แƒ•แƒ” OLAP-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ›แƒ” แƒ•แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ“แƒ˜ BerkeleyDB-แƒ—แƒแƒœ, Apache Cassandra-แƒกแƒ—แƒแƒœ, Scylla-แƒกแƒ—แƒแƒœ แƒ“แƒ ES-แƒ—แƒแƒœ แƒ“แƒ แƒ”แƒก แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒ”แƒ‘แƒ˜ แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒฉแƒ•แƒ”แƒœแƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ”แƒ‘แƒจแƒ˜, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒกแƒขแƒฃแƒ แƒแƒ“ แƒ•แƒ˜แƒงแƒแƒ•แƒ˜ แƒ’แƒแƒœแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒ˜ แƒแƒ› แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜แƒก DBMS-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒชแƒ“แƒแƒ–แƒ”. แƒ›แƒ” แƒฃแƒชแƒœแƒแƒฃแƒ แƒแƒ“ แƒ›แƒ˜แƒ•แƒ˜แƒฉแƒœแƒ˜แƒ”, แƒ แƒแƒ› แƒแƒ•แƒ˜แƒ แƒฉแƒ˜แƒ BerkeleyDB RocksDB-แƒ–แƒ”, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ”แƒก แƒแƒšแƒ‘แƒแƒ— แƒขแƒ แƒแƒœแƒ–แƒแƒฅแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ. แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ›แƒแƒกแƒจแƒขแƒแƒ‘แƒฃแƒ แƒ˜, แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒ”แƒ™แƒแƒ›แƒ”แƒœแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ™แƒแƒกแƒแƒœแƒ“แƒ แƒแƒ–แƒ” แƒแƒœ แƒกแƒ™แƒ˜แƒšแƒแƒ–แƒ” แƒ‘แƒ”แƒฅแƒ”แƒœแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ.

แƒ›แƒ” แƒแƒ  แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒ” Neo4j, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒ™แƒแƒ›แƒ”แƒ แƒชแƒ˜แƒฃแƒš แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒก, แƒแƒœแƒฃ แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒฆแƒ˜แƒ แƒฌแƒงแƒแƒ แƒ.

แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒฃแƒšแƒ˜ DBMS แƒแƒ›แƒ‘แƒแƒ‘แƒก: โ€žแƒ—แƒฃ แƒ˜แƒก แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒแƒก แƒฐแƒ’แƒแƒ•แƒก, แƒ›แƒแƒ”แƒฅแƒ”แƒชแƒ˜แƒ— แƒ›แƒแƒก แƒ แƒแƒ’แƒแƒ แƒช แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒก!โ€œ - แƒกแƒ˜แƒšแƒแƒ›แƒแƒ–แƒ”!

แƒฏแƒ”แƒ  แƒ“แƒแƒ•แƒฎแƒแƒขแƒ” แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ–แƒฃแƒกแƒขแƒแƒ“ แƒจแƒ”แƒ“แƒ’แƒ”แƒœแƒ˜แƒšแƒ˜แƒ แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜แƒก DBMS-แƒ˜แƒก แƒ™แƒแƒœแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—:

แƒ”แƒฅแƒกแƒžแƒ”แƒ แƒ˜แƒ›แƒ”แƒœแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก 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), แƒ“แƒแƒแƒ แƒขแƒงแƒ˜แƒ— แƒฃแƒ™แƒแƒœ แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”, แƒกแƒแƒœแƒแƒ› แƒแƒ  แƒ˜แƒžแƒแƒ•แƒ˜แƒ— แƒ˜แƒ› ZoneSteps-แƒก, แƒกแƒแƒ˜แƒ“แƒแƒœแƒแƒช แƒแƒ แƒ˜แƒก แƒ–แƒฆแƒ•แƒแƒ แƒ˜ แƒ–แƒแƒœแƒแƒจแƒ˜. ID=19, แƒ“แƒแƒ˜แƒ—แƒ•แƒแƒšแƒ”แƒ— แƒแƒกแƒ”แƒ—แƒ˜ แƒฏแƒแƒญแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ.

แƒ›แƒ” แƒแƒ  แƒ•แƒ˜แƒขแƒงแƒ•แƒ˜, แƒ แƒแƒ› แƒ•แƒ˜แƒชแƒ˜ แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ”แƒ‘แƒ–แƒ” แƒซแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒกแƒ˜แƒ แƒ—แƒฃแƒšแƒ”, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ”แƒก แƒจแƒ”แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ แƒจแƒ”แƒ˜แƒฅแƒ›แƒœแƒ แƒแƒ› แƒฌแƒ˜แƒ’แƒœแƒ˜แƒก แƒกแƒแƒคแƒฃแƒซแƒ•แƒ”แƒšแƒ–แƒ” (https://kelvinlawrence.net/book/Gremlin-Graph-Guide.html).

แƒ›แƒ” แƒฉแƒแƒ•แƒขแƒ•แƒ˜แƒ แƒ—แƒ” 50 แƒแƒ—แƒแƒกแƒ˜ แƒขแƒ แƒ”แƒ™แƒ˜, แƒกแƒ˜แƒ’แƒ แƒซแƒ˜แƒ— 3-แƒ“แƒแƒœ 20 แƒฅแƒฃแƒšแƒแƒ›แƒ“แƒ” JanusGraph แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜ BerkeleyDB backend-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—, แƒจแƒ”แƒ•แƒฅแƒ›แƒ”แƒœแƒ˜ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ— แƒฎแƒ”แƒšแƒ›แƒซแƒฆแƒ•แƒแƒœแƒ”แƒšแƒแƒ‘แƒ.

แƒžแƒ˜แƒ—แƒแƒœแƒ˜แƒก แƒฉแƒแƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜:


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-แƒ–แƒ” แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ— VM 4 แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒ— แƒ“แƒ 16 GB แƒแƒžแƒ”แƒ แƒแƒขแƒ˜แƒฃแƒšแƒ˜ แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒ—. JanusGraph แƒ’แƒแƒœแƒšแƒแƒ’แƒ“แƒ แƒแƒ› แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—:

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

แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ–แƒฃแƒกแƒขแƒ˜ แƒ—แƒแƒœแƒฎแƒ•แƒ”แƒ“แƒ แƒ˜แƒก แƒกแƒแƒซแƒ˜แƒ”แƒ‘แƒšแƒแƒ“, แƒ˜แƒœแƒแƒฎแƒ”แƒ‘แƒ BerkeleyDB-แƒจแƒ˜. แƒแƒ“แƒ แƒ” แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜ แƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ” แƒ“แƒ แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒขแƒแƒšแƒ˜แƒ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒแƒ—แƒ”แƒฃแƒš แƒฌแƒแƒ›แƒก.

แƒ–แƒ”แƒ›แƒแƒแƒฆแƒœแƒ˜แƒจแƒœแƒฃแƒšแƒ˜ 4 แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜แƒก แƒžแƒแƒ แƒแƒšแƒ”แƒšแƒฃแƒ แƒแƒ“ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒ—, แƒ›แƒ” แƒ›แƒแƒ•แƒแƒฎแƒ”แƒ แƒฎแƒ” DBMS-แƒ˜แƒก แƒ’แƒแƒ’แƒ แƒแƒ“ แƒ’แƒแƒ“แƒแƒฅแƒชแƒ”แƒ•แƒ Java stacktraces-แƒ˜แƒก แƒ›แƒฎแƒ˜แƒแƒ แƒฃแƒšแƒ˜ แƒœแƒแƒ™แƒแƒ“แƒ˜แƒ— (แƒ“แƒ แƒฉแƒ•แƒ”แƒœ แƒงแƒ•แƒ”แƒšแƒแƒก แƒ’แƒ•แƒ˜แƒงแƒ•แƒแƒ แƒก Java stacktraces-แƒ˜แƒก แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ) Docker-แƒ˜แƒก แƒŸแƒฃแƒ แƒœแƒแƒšแƒ”แƒ‘แƒจแƒ˜.

แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒคแƒ˜แƒฅแƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ” แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜แƒก แƒ“แƒ˜แƒแƒ’แƒ แƒแƒ›แƒ แƒ’แƒแƒ›แƒ”แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒ‘แƒ˜แƒœแƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒœแƒแƒ˜แƒ แƒแƒ“:

แƒ”แƒฅแƒกแƒžแƒ”แƒ แƒ˜แƒ›แƒ”แƒœแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก JanusGraph แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜แƒก 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-แƒ˜แƒ—, แƒ“แƒแƒ—แƒ•แƒแƒšแƒ”แƒ— แƒแƒกแƒ”แƒ—แƒ˜ แƒฏแƒแƒญแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ.

แƒ›แƒ” แƒแƒกแƒ”แƒ•แƒ” แƒ’แƒแƒ•แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ” แƒ–แƒ”แƒ›แƒแƒ— แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜ แƒฉแƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜, แƒ แƒแƒ—แƒ แƒแƒ  แƒจแƒ”แƒ›แƒ”แƒฅแƒ›แƒœแƒ แƒ–แƒ”แƒ“แƒ›แƒ”แƒขแƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜, แƒจแƒ”แƒ›แƒแƒ•แƒ˜แƒคแƒแƒ แƒ’แƒšแƒ แƒแƒขแƒ แƒ˜แƒ‘แƒฃแƒขแƒ”แƒ‘แƒ˜แƒ—.

แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒก แƒฏแƒ”แƒ  แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒฌแƒแƒ›แƒ˜ แƒ“แƒแƒกแƒญแƒ˜แƒ แƒ“แƒ, แƒ แƒแƒช แƒกแƒ แƒฃแƒšแƒ˜แƒแƒ“ แƒ›แƒ˜แƒฃแƒฆแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ˜แƒงแƒ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ˜แƒก แƒกแƒแƒ”แƒ แƒ—แƒแƒ“ แƒแƒ  แƒ˜แƒงแƒ แƒจแƒ”แƒกแƒแƒคแƒ”แƒ แƒ˜แƒกแƒ˜ แƒ แƒแƒ˜แƒ›แƒ” แƒกแƒแƒฎแƒ˜แƒก AdHoc แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ–แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ›แƒ” แƒ•แƒชแƒแƒ“แƒ” JanusGraph-แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ Scylla-แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ’แƒแƒ แƒช แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒกแƒฌแƒ แƒแƒคแƒ˜ Cassandra แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ›แƒแƒœ แƒแƒกแƒ”แƒ•แƒ” แƒแƒ  แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ•แƒ˜แƒ แƒ แƒแƒ˜แƒ›แƒ” แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜.

แƒแƒกแƒ” แƒ แƒแƒ›, แƒ›แƒ˜แƒฃแƒฎแƒ”แƒ“แƒแƒ•แƒแƒ“ แƒ˜แƒ›แƒ˜แƒกแƒ, แƒ แƒแƒ› "แƒ˜แƒก แƒฐแƒ’แƒแƒ•แƒก แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒก", แƒ›แƒ” แƒ•แƒ”แƒ  แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ” แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜แƒก DBMS แƒ›แƒ˜แƒกแƒ˜ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒ“แƒแƒกแƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒแƒ“. แƒ›แƒ” แƒกแƒ แƒฃแƒšแƒแƒ“ แƒ•แƒ•แƒแƒ แƒแƒฃแƒ“แƒแƒ‘, แƒ แƒแƒ› แƒแƒ แƒ˜แƒก แƒ แƒแƒฆแƒแƒช, แƒ แƒแƒช แƒแƒ  แƒ•แƒ˜แƒชแƒ˜ แƒ“แƒ แƒ แƒแƒ› JanusGraph-แƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒแƒก แƒ”แƒก แƒซแƒ”แƒ‘แƒœแƒ แƒฌแƒแƒ›แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒจแƒ˜, แƒ—แƒฃแƒ›แƒชแƒ แƒ›แƒ” แƒ”แƒก แƒ•แƒ”แƒ  แƒจแƒ”แƒ•แƒซแƒ”แƒšแƒ˜.

แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒ, แƒ แƒแƒ› แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒฏแƒ”แƒ  แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ›แƒแƒกแƒแƒ’แƒ•แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ˜แƒงแƒ, แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒ” แƒคแƒ˜แƒฅแƒ แƒ˜ แƒชแƒฎแƒ แƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก JOIN-แƒกแƒ แƒ“แƒ 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

แƒ›แƒ” แƒจแƒ”แƒ•แƒแƒ•แƒกแƒ” แƒ˜แƒ’แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—:

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

แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜, แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒกแƒแƒจแƒ˜แƒœแƒšแƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ; แƒ แƒ”แƒแƒšแƒฃแƒ แƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒ’แƒ”แƒœแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒแƒฆแƒ™แƒแƒ–แƒ›แƒฃแƒšแƒแƒ‘แƒ. แƒ—แƒฃแƒ›แƒชแƒ, แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ”แƒœ แƒ“แƒ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ”แƒœ. แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ“แƒ แƒ›แƒ”แƒแƒ แƒ” แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒกแƒ แƒฃแƒšแƒ“แƒ”แƒ‘แƒ 0.1 แƒฌแƒแƒ›แƒ–แƒ” แƒœแƒแƒ™แƒšแƒ”แƒ‘ แƒ“แƒ แƒแƒจแƒ˜. แƒแƒฅ แƒแƒ แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒแƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ count(*)-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ“แƒ˜แƒก 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-แƒจแƒ˜ แƒฉแƒแƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ•แƒ—.

แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒ™แƒแƒ แƒ’แƒ˜แƒ, แƒ แƒแƒ› แƒชแƒฎแƒ แƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒแƒ“ แƒ’แƒแƒ“แƒแƒฎแƒ•แƒ”แƒ•แƒแƒ–แƒ” แƒคแƒ˜แƒฅแƒ แƒ˜แƒช แƒแƒ  แƒ›แƒแƒ’แƒ•แƒ˜แƒฌแƒ”แƒ•แƒก. แƒแƒ“แƒ แƒ” แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ’แƒ•แƒ”แƒ™แƒ”แƒ—แƒ”แƒ‘แƒ˜แƒœแƒ แƒ•แƒ”แƒ แƒขแƒ˜แƒ™แƒ˜แƒ“แƒแƒœ แƒแƒ›แƒแƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ™แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ Apache Parket-แƒ–แƒ” แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ’แƒ–แƒ˜แƒ—.

แƒกแƒแƒ›แƒฌแƒฃแƒฎแƒแƒ แƒแƒ“, แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜แƒก 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 แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก โ€žแƒ“แƒแƒ“แƒ”แƒ‘แƒโ€œ.

แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ”แƒ‘แƒ˜แƒก แƒ—แƒ•แƒแƒšแƒกแƒแƒ–แƒ แƒ˜แƒกแƒ˜แƒ— แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ›แƒ แƒฃแƒ“แƒ”แƒ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ แƒ—แƒ•แƒ แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒ’แƒแƒœ แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒแƒ— แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒฃแƒชแƒœแƒแƒฃแƒ แƒ˜ แƒจแƒแƒ›แƒแƒœแƒ˜แƒ–แƒ›แƒ˜ Groovy-แƒจแƒ˜. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒฃแƒœแƒ“แƒ แƒ›แƒแƒฎแƒ“แƒ”แƒก 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-แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒ—. แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ˜แƒšแƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ แƒแƒจแƒ™แƒแƒ แƒ แƒแƒœแƒขแƒ˜-แƒœแƒ˜แƒ›แƒฃแƒจแƒ˜แƒ แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒฃแƒšแƒ˜ DBMS-แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ—แƒฃแƒ›แƒชแƒ, แƒ แƒแƒ’แƒแƒ แƒช แƒฉแƒแƒœแƒก, แƒจแƒ”แƒกแƒแƒคแƒ”แƒ แƒ˜แƒกแƒ˜แƒ แƒ›แƒแƒ—แƒ˜ แƒžแƒแƒ แƒแƒ“แƒ˜แƒ’แƒ›แƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ