{"id":302854,"date":"2020-05-01T09:00:12","date_gmt":"2020-05-01T09:00:12","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=302854"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=302854","title":{"rendered":"\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e\u0441\u0442\u0438 \u0433\u0440\u0430\u0444\u043e\u0432\u043e\u0439 \u0421\u0423\u0411\u0414 JanusGraph \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u0443\u0442\u0435\u0439"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/499960\/\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mk\/vf\/uo\/mkvfuowfgydb3nh1lufzoknghoo.png\"><\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0442\u0440\u0430\u0444\u0438\u043a\u0430. \u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0435\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0430, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u043f\u0443\u0442\u0435\u0439 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439 \u043f\u043e \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u043c. <\/p>\n<p>  <\/p>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u043e\u0448\u043b\u043e \u0438\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 &quot;A&quot; \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u044c &quot;\u0411&quot;;<\/li>\n<li>\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u043e\u0448\u043b\u043e \u0438\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 &quot;A&quot; \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u044c &quot;\u0411&quot; \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u044c &quot;C&quot;, \u0430 \u0437\u0430\u0442\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u044c &quot;\u0414&quot;;<\/li>\n<li>\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043d\u044f\u043b\u043e \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0438\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 &quot;\u0410&quot; \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u044c &quot;\u0411&quot;.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0438 \u0435\u0449\u0435 \u0440\u044f\u0434 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0414\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044f \u043f\u043e \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444. \u041f\u043e\u0447\u0438\u0442\u0430\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u044b, \u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b, \u0447\u0442\u043e \u0433\u0440\u0430\u0444\u043e\u0432\u044b\u0435 \u0421\u0423\u0411\u0414 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0438 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432. \u0423 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u0431\u0443\u0434\u0443\u0442 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0433\u0440\u0430\u0444\u043e\u0432\u044b\u0435 \u0421\u0423\u0411\u0414 (<strong>TL;DR;<\/strong> \u043f\u043b\u043e\u0445\u043e). <\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p>\u042f \u0432\u044b\u0431\u0440\u0430\u043b \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0421\u0423\u0411\u0414 <a href=\"https:\/\/janusgraph.org\/\" rel=\"nofollow\">JanusGraph<\/a>, \u043a\u0430\u043a \u0432\u044b\u0434\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0433\u0440\u0430\u0444\u043e\u0432\u044b\u0445 open-source \u0421\u0423\u0411\u0414, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u0435\u043a \u0437\u0440\u0435\u043b\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 (\u043f\u043e \u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e) \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0435\u0439 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0431\u044d\u043a\u0435\u043d\u0434 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 BerkeleyDB, Apache Cassandra, Scylla;<\/li>\n<li>\u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 Lucene, Elasticsearch, Solr.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0410\u0432\u0442\u043e\u0440\u044b JanusGraph \u043f\u0438\u0448\u0443\u0442, \u0447\u0442\u043e \u043e\u043d\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043a \u0434\u043b\u044f OLTP, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f OLAP.<\/p>\n<p>  <\/p>\n<p>\u042f \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 BerkeleyDB, Apache Cassandra, Scylla \u0438 ES, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043d\u0430\u0448\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u043c\u043e\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043d\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0433\u0440\u0430\u0444\u043e\u0432\u043e\u0439 \u0421\u0423\u0411\u0414. \u041c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c \u0432\u044b\u0431\u043e\u0440 BerkeleyDB, \u0430 \u043d\u0435 RocksDB, \u043d\u043e, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u043a \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0434\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e, \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u044d\u043a\u0435\u043d\u0434 \u043d\u0430 Cassandra \u0438\u043b\u0438 Scylla.<\/p>\n<p>  <\/p>\n<blockquote><p>Neo4j \u044f \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c.<\/p><\/blockquote>\n<p>\u0413\u0440\u0430\u0444\u043e\u0432\u044b\u0435 \u0421\u0423\u0411\u0414 \u0433\u043e\u0432\u043e\u0440\u044f\u0442: &quot;\u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0433\u0440\u0430\u0444 \u2014 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0439\u0442\u0435 \u044d\u0442\u043e \u043a\u0430\u043a \u0433\u0440\u0430\u0444&quot;. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043b \u0442\u0430\u043a\u043e\u0439 \u0433\u0440\u0430\u0444:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xp\/zt\/c0\/xpztc0ybgzjglj9y5tksb5igkii.png\"><\/p>\n<p>  <\/p>\n<p>\u041e\u043d \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u0449\u0438\u043a\u0430\u043c. \u0415\u0441\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c <code>Zone<\/code>, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0430\u044f \u0437\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 <code>ZoneStep<\/code> \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u044d\u0442\u043e\u0439 <code>Zone<\/code>, \u0442\u043e \u043e\u043d \u043d\u0430 \u043d\u0435\u0435 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f. \u041d\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 <code>Area<\/code>, <code>ZoneTrack<\/code>, <code>Person<\/code> \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435, \u043e\u043d\u0438 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442 \u0434\u043e\u043c\u0435\u043d\u0443 \u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u0441\u0442\u0430 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f. \u0418\u0442\u043e\u0433\u043e, \u043a \u0442\u0430\u043a\u043e\u0439 \u0433\u0440\u0430\u0444\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u0438\u0441\u043a\u0430 \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0431\u044b \u043a\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">g.V().hasLabel('Zone').has('id',0).in_()        .repeat(__.out()).until(__.out().hasLabel('Zone').has('id',19)).count().next()<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a: \u043d\u0430\u0439\u0434\u0438 Zone \u0441 ID=0, \u0432\u043e\u0437\u044c\u043c\u0438 \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a \u043d\u0435\u0439 \u0438\u0434\u0435\u0442 \u0440\u0435\u0431\u0440\u043e (ZoneStep), \u0442\u043e\u043f\u0430\u0439 \u0431\u0435\u0437 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043d\u0430\u0437\u0430\u0434 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0448\u044c \u0442\u0430\u043a\u0438\u0435 ZoneStep, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0434\u0435\u0442 \u0440\u0435\u0431\u0440\u043e \u0432 Zone \u0441 ID=19, \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0439 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u043a\u0438\u0445 \u0446\u0435\u043f\u043e\u0447\u0435\u043a.<\/p>\n<p>  <\/p>\n<p>\u042f \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e \u043d\u0430 \u0437\u043d\u0430\u043d\u0438\u0435 \u0432\u0441\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0435\u0439 \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0430 \u0433\u0440\u0430\u0444\u0430\u0445, \u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u044b\u043b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0432\u043e\u0442 \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0438 (<a href=\"https:\/\/kelvinlawrence.net\/book\/Gremlin-Graph-Guide.html\" rel=\"nofollow\">https:\/\/kelvinlawrence.net\/book\/Gremlin-Graph-Guide.html<\/a>).<\/p>\n<p>  <\/p>\n<p>\u042f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b 50 \u0442\u044b\u0441\u044f\u0447 \u0442\u0440\u0435\u043a\u043e\u0432 \u0434\u043b\u0438\u043d\u043e\u0439 \u043e\u0442 3 \u0434\u043e 20 \u0442\u043e\u0447\u0435\u043a \u0432 \u0433\u0440\u0430\u0444\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443 JanusGraph, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0443\u044e \u0431\u044d\u043a\u0435\u043d\u0434 BerkeleyDB, \u0441\u043e\u0437\u0434\u0430\u043b \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e <a href=\"https:\/\/docs.janusgraph.org\/index-management\/index-performance\/\" rel=\"nofollow\">\u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0443<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 Python:<\/p>\n<p>  <\/p>\n<pre><code class=\"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 &lt; 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)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c VM c 4 \u044f\u0434\u0440\u0430\u043c\u0438 \u0438 16 GB RAM \u043d\u0430 SSD. JanusGraph \u0431\u044b\u043b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">docker run --name janusgraph -p8182:8182 janusgraph\/janusgraph:latest<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u0442\u043e\u0447\u043d\u043e\u043c\u0443 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044e \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 BerkeleyDB. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435, \u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0432\u043d\u043e\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u043c \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<p>  <\/p>\n<blockquote><p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0432 4 \u0432\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0432 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c, \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0421\u0423\u0411\u0414 \u0432 \u0442\u044b\u043a\u0432\u0443 \u0441 \u0432\u0435\u0441\u0435\u043b\u044b\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0441\u0442\u0435\u043a\u0442\u0440\u0435\u0439\u0441\u043e\u0432 Java (\u0430 \u043c\u044b \u0432\u0441\u0435 \u043b\u044e\u0431\u0438\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0435\u043a\u0442\u0440\u0435\u0439\u0441\u044b Java) \u0432 \u043b\u043e\u0433\u0430\u0445 Docker.<\/p><\/blockquote>\n<p>\u041f\u043e\u0440\u0430\u0437\u043c\u044b\u0448\u043b\u044f\u0432, \u044f \u0440\u0435\u0448\u0438\u043b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u0443 \u0433\u0440\u0430\u0444\u0430 \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/1p\/nv\/ry\/1pnvryk4do_lg5k_4djvjg4ohe0.png\"><\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0448\u0438\u0432, \u0447\u0442\u043e \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0440\u0435\u0431\u0440\u0430\u043c. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0441\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">g.V().hasLabel('ZoneStep').has('id',0).repeat(__.out().simplePath()).until(__.hasLabel('ZoneStep').has('id',19)).count().next()<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a: \u043d\u0430\u0439\u0434\u0438 ZoneStep \u0441 ID=0, \u0442\u043e\u043f\u0430\u0439 \u0431\u0435\u0437 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043d\u0430\u0437\u0430\u0434 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0448\u044c ZoneStep \u0441 ID=19, \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0439 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u043a\u0438\u0445 \u0446\u0435\u043f\u043e\u0447\u0435\u043a.<\/p>\n<p>  <\/p>\n<p>\u0421\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435, \u044f \u0442\u043e\u0436\u0435 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b, \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0445 \u0441\u0432\u044f\u0437\u0435\u0439, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0448\u0438\u0441\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0440\u043e\u0441 \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0439 AdHoc \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u043e.<\/p>\n<p>  <\/p>\n<p>\u042f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c JanusGraph \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Scylla, \u043a\u0430\u043a \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Cassandra, \u043d\u043e \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043d\u0435 \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e &quot;\u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0433\u0440\u0430\u0444&quot;, \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0430\u0444\u043e\u0432\u0443\u044e \u0421\u0423\u0411\u0414 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u044d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e. \u0412\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e, \u0447\u0442\u043e \u044f \u0447\u0435\u0433\u043e-\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u044e \u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c JanusGraph \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u043e\u0438\u0441\u043a \u0437\u0430 \u0434\u043e\u043b\u0438 \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u043e\u0434\u043d\u0430\u043a\u043e, \u043c\u043d\u0435 \u044d\u0442\u043e \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c. <\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443, \u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0443\u0436\u043d\u043e, \u044f \u043d\u0430\u0447\u0430\u043b \u0434\u0443\u043c\u0430\u0442\u044c \u043e JOIN-\u0430\u0445 \u0438 Pivot-\u0430\u0445 \u0442\u0430\u0431\u043b\u0438\u0446, \u0447\u0442\u043e \u043d\u0435 \u0432\u043d\u0443\u0448\u0430\u043b\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u043c\u0430 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0438\u0437\u044f\u0449\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u043c\u043e\u0433\u043b\u043e \u0431\u044b\u0442\u044c \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Apache ClickHouse, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u044f \u043d\u0430 \u044d\u0442\u043e\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0421\u0423\u0411\u0414.<\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b ClickHouse \u043f\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 \u0440\u0435\u0446\u0435\u043f\u0442\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">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<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u043b \u0432 \u043d\u0435\u043c \u0411\u0414 \u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432\u0438\u0434\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">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<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u043b \u0435\u0435 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">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(&quot;CNT: {}, TS: {}&quot;.format(r, time()))      data = [{             'area': 0,             'zone': 0,             'person': r         }]      while True:         if random() &lt; 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     )<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438\u0434\u0443\u0442 \u0431\u0430\u0442\u0447\u0430\u043c\u0438, \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0434\u043b\u044f JanusGraph.<\/p>\n<p>  <\/p>\n<p>\u0421\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043b \u0434\u0432\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e JOIN. \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0438\u0437 \u0442\u043e\u0447\u043a\u0438 A \u0432 \u0442\u043e\u0447\u043a\u0443 \u0411:<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">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 &lt;= s2.when<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 3 \u0442\u043e\u0447\u043a\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">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 &lt;= s2.when) p ANY INNER JOIN   (SELECT *    FROM steps    WHERE (area = 0)      AND (zone = 19)) AS s3 USING person WHERE p.s2w &lt;= s3.when<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e, \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0443\u044e \u043e\u0431\u0432\u044f\u0437\u043a\u0443-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. \u041e\u0434\u043d\u0430\u043a\u043e, \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0431\u044b\u0441\u0442\u0440\u043e. \u0418 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u043d\u0435\u0435 \u0447\u0435\u043c \u0437\u0430 0.1 \u0441\u0435\u043a. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043b\u044f count(*) \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u043f\u043e 3\u043c \u0442\u043e\u0447\u043a\u0430\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">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 &lt;= s2.when ) AS p ANY INNER JOIN  (     SELECT *     FROM steps     WHERE (area = 0) AND (zone = 19) ) AS s3 USING (person) WHERE p.s2w &lt;= s3.when  \u250c\u2500count()\u2500\u2510 \u2502   11592 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">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.)<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043f\u0440\u043e IOPS<\/strong>. \u041f\u0440\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, JanusGraph \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u044b\u0441\u043e\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e IOPS (1000-1300 \u0434\u043b\u044f \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438), \u0430 IOWAIT \u0431\u044b\u043b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u044b\u0441\u043e\u043a\u0438\u043c. \u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f, ClickHouse \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 \u0434\u0438\u0441\u043a\u043e\u0432\u0443\u044e \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0443.<\/p>\n<p>  <\/p>\n<h2 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u041c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c ClickHouse \u0434\u043b\u044f \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430. \u041c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u043c \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Apache Flink \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0438\u0445 \u0432 ClickHouse. <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0440\u043e\u0448\u0430, \u0447\u0442\u043e \u043d\u0430\u043c, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0434\u0430\u0436\u0435 \u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u0443\u043c\u0430\u0442\u044c \u043e pivot-\u0430\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438. \u0420\u0430\u043d\u0435\u0435, \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0434\u0435\u043b\u0430\u0442\u044c pivot-\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c\u044b\u0445 \u0438\u0437 Vertica \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0443 \u0432 Apache Parquet.<\/p>\n<p>  <\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u043e\u0432\u043e\u0439 \u0421\u0423\u0411\u0414 \u043d\u0435 \u0443\u0432\u0435\u043d\u0447\u0430\u043b\u0430\u0441\u044c \u0443\u0441\u043f\u0435\u0445\u043e\u043c. \u042f \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b, \u0447\u0442\u043e \u0443 JanusGraph \u0434\u0440\u0443\u0436\u0435\u043b\u044e\u0431\u043d\u0430\u044f \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0441\u0432\u043e\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u043c. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0439 Java-way, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u044e\u0434\u0435\u0439 \u0441 Java \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442 \u043f\u043b\u0430\u043a\u0430\u0442\u044c \u043a\u0440\u043e\u0432\u0430\u0432\u044b\u043c\u0438 \u0441\u043b\u0435\u0437\u0430\u043c\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">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}<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e &quot;\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c&quot; BerkeleyDB \u0432\u0435\u0440\u0441\u0438\u044e JanusGraph. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u0440\u0438\u0432\u0430\u044f \u0432 \u0447\u0430\u0441\u0442\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0435 \u0448\u0430\u043c\u0430\u043d\u0441\u0442\u0432\u0430 \u043d\u0430 Groovy. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 (\u043a\u043e\u0442\u043e\u0440\u043e\u0435, \u043a\u0441\u0442\u0430\u0442\u0438, \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438):<\/p>\n<p>  <\/p>\n<pre><code class=\"java\">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(&quot;byNameComposite&quot;), SchemaAction.REINDEX).get() mgmt.updateIndex(mgmt.getGraphIndex(&quot;byNameAndAgeComposite&quot;), SchemaAction.REINDEX).get() mgmt.commit()<\/code><\/pre>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/499960\/\"> https:\/\/habr.com\/ru\/post\/499960\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/499960\/\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mk\/vf\/uo\/mkvfuowfgydb3nh1lufzoknghoo.png\"><\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0442\u0440\u0430\u0444\u0438\u043a\u0430. \u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0435\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0430, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c \u043f\u0443\u0442\u0435\u0439 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439 \u043f\u043e \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u043c. <\/p>\n<p>  <\/p>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u043e\u0448\u043b\u043e \u0438\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 &quot;A&quot; \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u044c &quot;\u0411&quot;;<\/li>\n<li>\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u043e\u0448\u043b\u043e \u0438\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 &quot;A&quot; \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u044c &quot;\u0411&quot; \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u044c &quot;C&quot;, \u0430 \u0437\u0430\u0442\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u044c &quot;\u0414&quot;;<\/li>\n<li>\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043d\u044f\u043b\u043e \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0438\u0437 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 &quot;\u0410&quot; \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u044c &quot;\u0411&quot;.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0438 \u0435\u0449\u0435 \u0440\u044f\u0434 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0414\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044f \u043f\u043e \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444. \u041f\u043e\u0447\u0438\u0442\u0430\u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u044b, \u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b, \u0447\u0442\u043e \u0433\u0440\u0430\u0444\u043e\u0432\u044b\u0435 \u0421\u0423\u0411\u0414 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0438 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432. \u0423 \u043c\u0435\u043d\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u0431\u0443\u0434\u0443\u0442 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0433\u0440\u0430\u0444\u043e\u0432\u044b\u0435 \u0421\u0423\u0411\u0414 (<strong>TL;DR;<\/strong> \u043f\u043b\u043e\u0445\u043e). <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-302854","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/302854","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=302854"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/302854\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=302854"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=302854"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=302854"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}