Added: tinkerpop/site/docs/3.5.5/dev/future/index.html
URL: 
http://svn.apache.org/viewvc/tinkerpop/site/docs/3.5.5/dev/future/index.html?rev=1906783&view=auto
==============================================================================
--- tinkerpop/site/docs/3.5.5/dev/future/index.html (added)
+++ tinkerpop/site/docs/3.5.5/dev/future/index.html Wed Jan 18 23:58:59 2023
@@ -0,0 +1,1280 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="generator" content="Asciidoctor 1.5.8">
+<title>TinkerPop 4.x Design Ideas</title>
+<style>
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*! normalize.css v2.1.2 | MIT License | git.io/normalize */
+/* ========================================================================== 
HTML5 display definitions 
========================================================================== */
+/** Correct `block` display not defined in IE 8/9. */
+@import 
url(http://cdnjs.cloudflare.com/ajax/libs/font-awesome/3.2.1/css/font-awesome.css);
+article, aside, details, figcaption, figure, footer, header, hgroup, main, 
nav, section, summary { display: block; }
+
+/** Correct `inline-block` display not defined in IE 8/9. */
+audio, canvas, video { display: inline-block; }
+
+/** Prevent modern browsers from displaying `audio` without controls. Remove 
excess height in iOS 5 devices. */
+audio:not([controls]) { display: none; height: 0; }
+
+/** Address `[hidden]` styling not present in IE 8/9. Hide the `template` 
element in IE, Safari, and Firefox < 22. */
+[hidden], template { display: none; }
+
+script { display: none !important; }
+
+/* ========================================================================== 
Base ========================================================================== 
*/
+/** 1. Set default font family to sans-serif. 2. Prevent iOS text size adjust 
after orientation change, without disabling user zoom. */
+html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ 
-webkit-text-size-adjust: 100%; /* 2 */ }
+
+/** Remove default margin. */
+body { margin: 0; }
+
+/* ========================================================================== 
Links 
========================================================================== */
+/** Remove the gray background color from active links in IE 10. */
+a { background: transparent; }
+
+/** Address `outline` inconsistency between Chrome and other browsers. */
+a:focus { outline: thin dotted; }
+
+/** Improve readability when focused and also mouse hovered in all browsers. */
+a:active, a:hover { outline: 0; }
+
+/* ========================================================================== 
Typography 
========================================================================== */
+/** Address variable `h1` font-size and margin within `section` and `article` 
contexts in Firefox 4+, Safari 5, and Chrome. */
+h1 { font-size: 2em; margin: 0.67em 0; }
+
+/** Address styling not present in IE 8/9, Safari 5, and Chrome. */
+abbr[title] { border-bottom: 1px dotted; }
+
+/** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */
+b, strong { font-weight: bold; }
+
+/** Address styling not present in Safari 5 and Chrome. */
+dfn { font-style: italic; }
+
+/** Address differences between Firefox and other browsers. */
+hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; }
+
+/** Address styling not present in IE 8/9. */
+mark { background: #ff0; color: #000; }
+
+/** Correct font family set oddly in Safari 5 and Chrome. */
+code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; }
+
+/** Improve readability of pre-formatted text in all browsers. */
+pre { white-space: pre-wrap; }
+
+/** Set consistent quote types. */
+q { quotes: "\201C" "\201D" "\2018" "\2019"; }
+
+/** Address inconsistent and variable font size in all browsers. */
+small { font-size: 80%; }
+
+/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */
+sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: 
baseline; }
+
+sup { top: -0.5em; }
+
+sub { bottom: -0.25em; }
+
+/* ========================================================================== 
Embedded content 
========================================================================== */
+/** Remove border when inside `a` element in IE 8/9. */
+img { border: 0; }
+
+/** Correct overflow displayed oddly in IE 9. */
+svg:not(:root) { overflow: hidden; }
+
+/* ========================================================================== 
Figures 
========================================================================== */
+/** Address margin not present in IE 8/9 and Safari 5. */
+figure { margin: 0; }
+
+/* ========================================================================== 
Forms 
========================================================================== */
+/** Define consistent border, margin, and padding. */
+fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 
0.75em; }
+
+/** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so 
people aren't caught out if they zero out fieldsets. */
+legend { border: 0; /* 1 */ padding: 0; /* 2 */ }
+
+/** 1. Correct font family not being inherited in all browsers. 2. Correct 
font size not being inherited in all browsers. 3. Address margins set 
differently in Firefox 4+, Safari 5, and Chrome. */
+button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 
100%; /* 2 */ margin: 0; /* 3 */ }
+
+/** Address Firefox 4+ setting `line-height` on `input` using `!important` in 
the UA stylesheet. */
+button, input { line-height: normal; }
+
+/** Address inconsistent `text-transform` inheritance for `button` and 
`select`. All other form control elements do not inherit `text-transform` 
values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. 
Correct `select` style inheritance in Firefox 4+ and Opera. */
+button, select { text-transform: none; }
+
+/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 
and `video` controls. 2. Correct inability to style clickable `input` types in 
iOS. 3. Improve usability and consistency of cursor style between image-type 
`input` and others. */
+button, html input[type="button"], input[type="reset"], input[type="submit"] { 
-webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ }
+
+/** Re-set default cursor for disabled elements. */
+button[disabled], html input[disabled] { cursor: default; }
+
+/** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess 
padding in IE 8/9. */
+input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ 
padding: 0; /* 2 */ }
+
+/** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. 
Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` 
to future-proof). */
+input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: 
content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; }
+
+/** Remove inner padding and search cancel button in Safari 5 and Chrome on OS 
X. */
+input[type="search"]::-webkit-search-cancel-button, 
input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
+
+/** Remove inner padding and border in Firefox 4+. */
+button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
+
+/** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and 
alignment in all browsers. */
+textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ }
+
+/* ========================================================================== 
Tables 
========================================================================== */
+/** Remove most spacing between table cells. */
+table { border-collapse: collapse; border-spacing: 0; }
+
+meta.foundation-mq-small { font-family: "only screen and (min-width: 768px)"; 
width: 768px; }
+
+meta.foundation-mq-medium { font-family: "only screen and (min-width:1280px)"; 
width: 1280px; }
+
+meta.foundation-mq-large { font-family: "only screen and (min-width:1440px)"; 
width: 1440px; }
+
+*, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: 
border-box; box-sizing: border-box; }
+
+html, body { font-size: 100%; }
+
+body { background: white; color: #222222; padding: 0; margin: 0; font-family: 
"Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-weight: 
normal; font-style: normal; line-height: 1; position: relative; cursor: auto; }
+
+a:hover { cursor: pointer; }
+
+img, object, embed { max-width: 100%; height: auto; }
+
+object, embed { height: 100%; }
+
+img { -ms-interpolation-mode: bicubic; }
+
+#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, 
.map_canvas embed, .map_canvas object { max-width: none !important; }
+
+.left { float: left !important; }
+
+.right { float: right !important; }
+
+.text-left { text-align: left !important; }
+
+.text-right { text-align: right !important; }
+
+.text-center { text-align: center !important; }
+
+.text-justify { text-align: justify !important; }
+
+.hide { display: none; }
+
+.antialiased, body { -webkit-font-smoothing: antialiased; }
+
+img { display: inline-block; vertical-align: middle; }
+
+textarea { height: auto; min-height: 50px; }
+
+select { width: 100%; }
+
+p.lead, .paragraph.lead > p, #preamble > .sectionbody > 
.paragraph:first-of-type p { font-size: 1.21875em; line-height: 1.6; }
+
+.subheader, #content #toctitle, .admonitionblock td.content > .title, 
.exampleblock > .title, .imageblock > .title, .listingblock > .title, 
.literalblock > .title, .mathblock > .title, .openblock > .title, .paragraph > 
.title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, 
.verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, 
.ulist > .title, .qlist > .title, .hdlist > .title, .tableblock > caption { 
line-height: 1.4; color: #6c818f; font-weight: 300; margin-top: 0.2em; 
margin-bottom: 0.5em; }
+
+/* Typography resets */
+div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > 
.title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; 
direction: ltr; }
+
+/* Default Link Styles */
+a { color: #444444; text-decoration: underline; line-height: inherit; }
+a:hover, a:focus { color: #111111; }
+a img { border: none; }
+
+/* Default paragraph styles */
+p { font-family: inherit; font-weight: normal; font-size: 1em; line-height: 
1.5; margin-bottom: 1.25em; text-rendering: optimizeLegibility; }
+p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; }
+
+/* Default header styles */
+h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { 
font-family: ff-meta-web-pro-1, ff-meta-web-pro-2, Arial, "Helvetica Neue", 
sans-serif; font-weight: bold; font-style: normal; color: #465158; 
text-rendering: optimizeLegibility; margin-top: 1em; margin-bottom: 0.5em; 
line-height: 1.2125em; }
+h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > 
.title small, h4 small, h5 small, h6 small { font-size: 60%; color: #909ea7; 
line-height: 0; }
+
+h1 { font-size: 2.125em; }
+
+h2 { font-size: 1.6875em; }
+
+h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.375em; }
+
+h4 { font-size: 1.125em; }
+
+h5 { font-size: 1.125em; }
+
+h6 { font-size: 1em; }
+
+hr { border: solid #dddddd; border-width: 1px 0 0; clear: both; margin: 1.25em 
0 1.1875em; height: 0; }
+
+/* Helpful Typography Defaults */
+em, i { font-style: italic; line-height: inherit; }
+
+strong, b { font-weight: bold; line-height: inherit; }
+
+small { font-size: 60%; line-height: inherit; }
+
+code { font-family: "Consolas", "Deja Vu Sans Mono", "Bitstream Vera Sans 
Mono", monospace; font-weight: normal; color: #444444; }
+
+/* Lists */
+ul, ol, dl { font-size: 1em; line-height: 1.5; margin-bottom: 1.25em; 
list-style-position: outside; font-family: inherit; }
+
+ul, ol { margin-left: 0; }
+ul.no-bullet, ol.no-bullet { margin-left: 0; }
+
+/* Unordered Lists */
+ul li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; /* 
Override nested font-size change */ }
+ul.square li ul, ul.circle li ul, ul.disc li ul { list-style: inherit; }
+ul.square { list-style-type: square; }
+ul.circle { list-style-type: circle; }
+ul.disc { list-style-type: disc; }
+ul.no-bullet { list-style: none; }
+
+/* Ordered Lists */
+ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; }
+
+/* Definition Lists */
+dl dt { margin-bottom: 0.3em; font-weight: bold; }
+dl dd { margin-bottom: 0.75em; }
+
+/* Abbreviations */
+abbr, acronym { text-transform: uppercase; font-size: 90%; color: black; 
border-bottom: 1px dotted #dddddd; cursor: help; }
+
+abbr { text-transform: none; }
+
+/* Blockquotes */
+blockquote { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; 
border-left: 1px solid #dddddd; }
+blockquote cite { display: block; font-size: 0.8125em; color: #748590; }
+blockquote cite:before { content: "\2014 \0020"; }
+blockquote cite a, blockquote cite a:visited { color: #748590; }
+
+blockquote, blockquote p { line-height: 1.5; color: #909ea7; }
+
+/* Microformats */
+.vcard { display: inline-block; margin: 0 0 1.25em 0; border: 1px solid 
#dddddd; padding: 0.625em 0.75em; }
+.vcard li { margin: 0; display: block; }
+.vcard .fn { font-weight: bold; font-size: 0.9375em; }
+
+.vevent .summary { font-weight: bold; }
+.vevent abbr { cursor: auto; text-decoration: none; font-weight: bold; border: 
none; padding: 0 0.0625em; }
+
+@media only screen and (min-width: 768px) { h1, h2, h3, #toctitle, 
.sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.4; }
+  h1 { font-size: 2.75em; }
+  h2 { font-size: 2.3125em; }
+  h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; }
+  h4 { font-size: 1.4375em; } }
+/* Print styles.  Inlined to avoid required HTTP connection: 
www.phpied.com/delay-loading-your-print-css/ Credit to Paul Irish and HTML5 
Boilerplate (html5boilerplate.com)
+*/
+.print-only { display: none !important; }
+
+@media print { * { background: transparent !important; color: #000 !important; 
/* Black prints faster: h5bp.com/s */ box-shadow: none !important; text-shadow: 
none !important; }
+  a, a:visited { text-decoration: underline; }
+  a[href]:after { content: " (" attr(href) ")"; }
+  abbr[title]:after { content: " (" attr(title) ")"; }
+  .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; 
}
+  pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
+  thead { display: table-header-group; /* h5bp.com/t */ }
+  tr, img { page-break-inside: avoid; }
+  img { max-width: 100% !important; }
+  @page { margin: 0.5cm; }
+  p, h2, h3, #toctitle, .sidebarblock > .content > .title { orphans: 3; 
widows: 3; }
+  h2, h3, #toctitle, .sidebarblock > .content > .title { page-break-after: 
avoid; }
+  .hide-on-print { display: none !important; }
+  .print-only { display: block !important; }
+  .hide-for-print { display: none !important; }
+  .show-for-print { display: inherit !important; } }
+/* Tables */
+table { background: white; margin-bottom: 1.25em; border: solid 0 #dddddd; }
+table thead, table tfoot { background: none; font-weight: bold; }
+table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { 
padding: 1px 8px 1px 5px; font-size: 1em; color: #222222; text-align: left; }
+table tr th, table tr td { padding: 1px 8px 1px 5px; font-size: 1em; color: 
#222222; }
+table tr.even, table tr.alt, table tr:nth-of-type(even) { background: none; }
+table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table 
tfoot tr td { display: table-cell; line-height: 1.5; }
+
+.clearfix:before, .clearfix:after, .float-group:before, .float-group:after { 
content: " "; display: table; }
+.clearfix:after, .float-group:after { clear: both; }
+
+*:not(pre) > code { font-size: 0.95em; padding: 0; white-space: nowrap; 
background-color: #f2f2f2; border: 0 solid #dddddd; -webkit-border-radius: 6px; 
border-radius: 6px; text-shadow: none; }
+
+pre, pre > code { line-height: 1.2; color: inherit; font-family: "Consolas", 
"Deja Vu Sans Mono", "Bitstream Vera Sans Mono", monospace; font-weight: 
normal; }
+
+.keyseq { color: #333333; }
+
+kbd:not(.keyseq) { display: inline-block; color: black; font-size: 0.75em; 
line-height: 1.4; background-color: #F7F7F7; border: 1px solid #ccc; 
-webkit-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 
rgba(0, 0, 0, 0.2), 0 0 0 2px white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 
0.2), 0 0 0 2px white inset; margin: -0.15em 0.15em 0 0.15em; padding: 0.2em 
0.6em 0.2em 0.5em; vertical-align: middle; white-space: nowrap; }
+
+.keyseq kbd:first-child { margin-left: 0; }
+
+.keyseq kbd:last-child { margin-right: 0; }
+
+.menuseq, .menu { color: black; }
+
+b.button:before, b.button:after { position: relative; top: -1px; font-weight: 
normal; }
+
+b.button:before { content: "["; padding: 0 3px 0 2px; }
+
+b.button:after { content: "]"; padding: 0 2px 0 3px; }
+
+p a > code:hover { color: #373737; }
+
+#header, #content, #footnotes, #footer { width: 100%; margin-left: auto; 
margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 
1; position: relative; padding-left: 0.9375em; padding-right: 0.9375em; }
+#header:before, #header:after, #content:before, #content:after, 
#footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " 
"; display: table; }
+#header:after, #content:after, #footnotes:after, #footer:after { clear: both; }
+
+#header { margin-bottom: 2.5em; }
+#header > h1 { color: #111111; font-weight: bold; border-bottom: 1px solid 
#dddddd; margin-bottom: -28px; padding-bottom: 32px; }
+#header span { color: #909ea7; }
+#header #revnumber { text-transform: capitalize; }
+#header br { display: none; }
+#header br + span { padding-left: 3px; }
+#header br + span:before { content: "\2013 \0020"; }
+#header br + span.author { padding-left: 0; }
+#header br + span.author:before { content: ", "; }
+
+#toc { border-bottom: 1px solid #dddddd; padding-bottom: 1.25em; }
+#toc > ul { margin-left: 0.25em; }
+#toc ul.sectlevel0 > li > a { font-style: italic; }
+#toc ul.sectlevel0 ul.sectlevel1 { margin-left: 0; margin-top: 0.5em; 
margin-bottom: 0.5em; }
+#toc ul { list-style-type: none; }
+
+#toctitle { color: #6c818f; }
+
+@media only screen and (min-width: 768px) { body.toc2 { padding-left: 15em; 
padding-right: 0; }
+  #toc.toc2 { position: fixed; width: 15em; left: 0; top: 0; border-right: 1px 
solid #dddddd; border-bottom: 0; z-index: 1000; padding: 1em; height: 100%; 
overflow: auto; }
+  #toc.toc2 #toctitle { margin-top: 0; font-size: 1.2em; }
+  #toc.toc2 > ul { font-size: .90em; }
+  #toc.toc2 ul ul { margin-left: 0; padding-left: 1em; }
+  #toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; 
margin-bottom: 0.5em; }
+  body.toc2.toc-right { padding-left: 0; padding-right: 15em; }
+  body.toc2.toc-right #toc.toc2 { border-right: 0; border-left: 1px solid 
#dddddd; left: auto; right: 0; } }
+@media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; 
padding-right: 0; }
+  #toc.toc2 { width: 20em; }
+  #toc.toc2 #toctitle { font-size: 1.375em; }
+  #toc.toc2 > ul { font-size: 0.95em; }
+  #toc.toc2 ul ul { padding-left: 1.25em; }
+  body.toc2.toc-right { padding-left: 0; padding-right: 20em; } }
+#content #toc { border-style: solid; border-width: 1px; border-color: #d9d9d9; 
margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; border-width: 0; 
-webkit-border-radius: 6px; border-radius: 6px; }
+#content #toc > :first-child { margin-top: 0; }
+#content #toc > :last-child { margin-bottom: 0; }
+#content #toc a { text-decoration: none; }
+
+#content #toctitle { font-weight: bold; font-family: ff-meta-web-pro-1, 
ff-meta-web-pro-2, Arial, "Helvetica Neue", sans-serif; font-size: 1em; 
padding-left: 0.125em; }
+
+#footer { max-width: 100%; background-color: black; padding: 1.25em; }
+
+#footer-text { color: white; line-height: 1.35; }
+
+.sect1 { padding-bottom: 1.25em; }
+
+.sect1 + .sect1 { border-top: 1px solid #dddddd; }
+
+#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, 
.sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 
> a.anchor { position: absolute; width: 1em; margin-left: -1em; display: block; 
text-decoration: none; visibility: hidden; text-align: center; font-weight: 
normal; }
+#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, 
#toctitle > a.anchor:before, .sidebarblock > .content > .title > 
a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > 
a.anchor:before { content: '\00A7'; font-size: .85em; vertical-align: text-top; 
display: block; margin-top: 0.05em; }
+#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > 
a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, 
.sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, 
#toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, 
h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > 
a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; 
}
+#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, 
.sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > 
a.link { color: #465158; text-decoration: none; }
+#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > 
a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > 
a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: #3b444a; }
+
+.imageblock, .literalblock, .listingblock, .mathblock, .verseblock, 
.videoblock { margin-bottom: 1.25em; }
+
+.admonitionblock td.content > .title, .exampleblock > .title, .imageblock > 
.title, .listingblock > .title, .literalblock > .title, .mathblock > .title, 
.openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > 
.title, .tableblock > .title, .verseblock > .title, .videoblock > .title, 
.dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > 
.title { text-align: left; font-weight: bold; }
+
+.tableblock > caption { text-align: left; font-weight: bold; white-space: 
nowrap; overflow: visible; max-width: 0; }
+
+table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { 
font-size: inherit; }
+
+.admonitionblock > table { border: 0; background: none; width: 100%; }
+.admonitionblock > table td.icon { text-align: center; width: 80px; }
+.admonitionblock > table td.icon img { max-width: none; }
+.admonitionblock > table td.icon .title { font-weight: bold; text-transform: 
uppercase; }
+.admonitionblock > table td.content { padding-left: 1.125em; padding-right: 
1.25em; border-left: 1px solid #dddddd; color: #909ea7; }
+.admonitionblock > table td.content > :last-child > :last-child { 
margin-bottom: 0; }
+
+.exampleblock > .content { border-style: solid; border-width: 1px; 
border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: 
white; -webkit-border-radius: 6px; border-radius: 6px; }
+.exampleblock > .content > :first-child { margin-top: 0; }
+.exampleblock > .content > :last-child { margin-bottom: 0; }
+.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > 
.content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > 
.content > .title, .exampleblock > .content h4, .exampleblock > .content h5, 
.exampleblock > .content h6, .exampleblock > .content p { color: #333333; }
+.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > 
.content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > 
.content > .title, .exampleblock > .content h4, .exampleblock > .content h5, 
.exampleblock > .content h6 { line-height: 1; margin-bottom: 0.625em; }
+.exampleblock > .content h1.subheader, .exampleblock > .content h2.subheader, 
.exampleblock > .content h3.subheader, .exampleblock > .content 
.subheader#toctitle, .sidebarblock.exampleblock > .content > .subheader.title, 
.exampleblock > .content h4.subheader, .exampleblock > .content h5.subheader, 
.exampleblock > .content h6.subheader { line-height: 1.4; }
+
+.exampleblock.result > .content { -webkit-box-shadow: 0 1px 8px #d9d9d9; 
box-shadow: 0 1px 8px #d9d9d9; }
+
+.sidebarblock { border-style: solid; border-width: 1px; border-color: #d9d9d9; 
margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; 
-webkit-border-radius: 6px; border-radius: 6px; }
+.sidebarblock > :first-child { margin-top: 0; }
+.sidebarblock > :last-child { margin-bottom: 0; }
+.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, 
.sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, 
.sidebarblock h6, .sidebarblock p { color: #333333; }
+.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, 
.sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, 
.sidebarblock h6 { line-height: 1; margin-bottom: 0.625em; }
+.sidebarblock h1.subheader, .sidebarblock h2.subheader, .sidebarblock 
h3.subheader, .sidebarblock .subheader#toctitle, .sidebarblock > .content > 
.subheader.title, .sidebarblock h4.subheader, .sidebarblock h5.subheader, 
.sidebarblock h6.subheader { line-height: 1.4; }
+.sidebarblock > .content > .title { color: #6c818f; margin-top: 0; 
line-height: 1.5; }
+
+.exampleblock > .content > :last-child > :last-child, .exampleblock > .content 
.olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul 
> li:last-child > :last-child, .exampleblock > .content .qlist > ol > 
li:last-child > :last-child, .sidebarblock > .content > :last-child > 
:last-child, .sidebarblock > .content .olist > ol > li:last-child > 
:last-child, .sidebarblock > .content .ulist > ul > li:last-child > 
:last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child 
{ margin-bottom: 0; }
+
+.literalblock pre:not([class]), .listingblock pre:not([class]) { background: 
#eeeeee; }
+.literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock 
pre[class] { border-width: 1px; border-style: solid; border-color: #cccccc; 
-webkit-border-radius: 6px; border-radius: 6px; padding: 0.5em; word-wrap: 
break-word; }
+.literalblock pre.nowrap, .literalblock pre[class].nowrap, .listingblock 
pre.nowrap, .listingblock pre[class].nowrap { overflow-x: auto; white-space: 
pre; word-wrap: normal; }
+.literalblock pre > code, .literalblock pre[class] > code, .listingblock pre > 
code, .listingblock pre[class] > code { display: block; }
+@media only screen { .literalblock pre, .literalblock pre[class], 
.listingblock pre, .listingblock pre[class] { font-size: 0.76em; } }
+@media only screen and (min-width: 768px) { .literalblock pre, .literalblock 
pre[class], .listingblock pre, .listingblock pre[class] { font-size: 0.855em; } 
}
+@media only screen and (min-width: 1280px) { .literalblock pre, .literalblock 
pre[class], .listingblock pre, .listingblock pre[class] { font-size: 0.95em; } }
+
+.listingblock pre.highlight { padding: 0; }
+.listingblock pre.highlight > code { padding: 0.5em; }
+
+.listingblock > .content { position: relative; }
+
+.listingblock:hover code[class*=" language-"]:before { text-transform: 
uppercase; font-size: 0.9em; color: #999; position: absolute; top: 0.375em; 
right: 0.375em; }
+
+.listingblock:hover code.asciidoc:before { content: "asciidoc"; }
+.listingblock:hover code.clojure:before { content: "clojure"; }
+.listingblock:hover code.css:before { content: "css"; }
+.listingblock:hover code.groovy:before { content: "groovy"; }
+.listingblock:hover code.html:before { content: "html"; }
+.listingblock:hover code.java:before { content: "java"; }
+.listingblock:hover code.javascript:before { content: "javascript"; }
+.listingblock:hover code.python:before { content: "python"; }
+.listingblock:hover code.ruby:before { content: "ruby"; }
+.listingblock:hover code.sass:before { content: "sass"; }
+.listingblock:hover code.scss:before { content: "scss"; }
+.listingblock:hover code.xml:before { content: "xml"; }
+.listingblock:hover code.yaml:before { content: "yaml"; }
+
+.listingblock.terminal pre .command:before { content: attr(data-prompt); 
padding-right: 0.5em; color: #999; }
+
+.listingblock.terminal pre .command:not([data-prompt]):before { content: '$'; }
+
+table.pyhltable { border: 0; margin-bottom: 0; }
+
+table.pyhltable td { vertical-align: top; padding-top: 0; padding-bottom: 0; }
+
+table.pyhltable td.code { padding-left: .75em; padding-right: 0; }
+
+.highlight.pygments .lineno, table.pyhltable td:not(.code) { color: #999; 
padding-left: 0; padding-right: .5em; border-right: 1px solid #dddddd; }
+
+.highlight.pygments .lineno { display: inline-block; margin-right: .25em; }
+
+table.pyhltable .linenodiv { background-color: transparent !important; 
padding-right: 0 !important; }
+
+.quoteblock { margin: 0 0 1.25em; padding: 0.5625em 1.25em 0 1.1875em; 
border-left: 1px solid #dddddd; }
+.quoteblock blockquote { margin: 0 0 1.25em 0; padding: 0 0 0.5625em 0; 
border: 0; }
+.quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; }
+.quoteblock .attribution { margin-top: -.25em; padding-bottom: 0.5625em; 
font-size: 0.8125em; color: #748590; }
+.quoteblock .attribution br { display: none; }
+.quoteblock .attribution cite { display: block; margin-bottom: 0.625em; }
+
+table thead th, table tfoot th { font-weight: bold; }
+
+table.tableblock.grid-all { border-collapse: separate; border-spacing: 1px; 
-webkit-border-radius: 6px; border-radius: 6px; border-top: 0 solid #dddddd; 
border-bottom: 0 solid #dddddd; }
+
+table.tableblock.frame-topbot, table.tableblock.frame-none { border-left: 0; 
border-right: 0; }
+
+table.tableblock.frame-sides, table.tableblock.frame-none { border-top: 0; 
border-bottom: 0; }
+
+table.tableblock td .paragraph:last-child p > p:last-child, table.tableblock 
th > p:last-child, table.tableblock td > p:last-child { margin-bottom: 0; }
+
+th.tableblock.halign-left, td.tableblock.halign-left { text-align: left; }
+
+th.tableblock.halign-right, td.tableblock.halign-right { text-align: right; }
+
+th.tableblock.halign-center, td.tableblock.halign-center { text-align: center; 
}
+
+th.tableblock.valign-top, td.tableblock.valign-top { vertical-align: top; }
+
+th.tableblock.valign-bottom, td.tableblock.valign-bottom { vertical-align: 
bottom; }
+
+th.tableblock.valign-middle, td.tableblock.valign-middle { vertical-align: 
middle; }
+
+tbody tr th { display: table-cell; line-height: 1.5; background: none; }
+
+tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { color: #222222; 
font-weight: bold; }
+
+td > div.verse { white-space: pre; }
+
+ol { margin-left: 0.25em; }
+
+ul li ol { margin-left: 0; }
+
+dl dd { margin-left: 1.125em; }
+
+dl dd:last-child, dl dd:last-child > :last-child { margin-bottom: 0; }
+
+ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist 
.olist, .olist .ulist { margin-bottom: 0.625em; }
+
+ul.unstyled, ol.unnumbered, ul.checklist, ul.none { list-style-type: none; }
+
+ul.unstyled, ol.unnumbered, ul.checklist { margin-left: 0.625em; }
+
+ul.checklist li > p:first-child > i[class^="icon-check"]:first-child, 
ul.checklist li > p:first-child > input[type="checkbox"]:first-child { 
margin-right: 0.25em; }
+
+ul.checklist li > p:first-child > input[type="checkbox"]:first-child { 
position: relative; top: 1px; }
+
+ul.inline { margin: 0 auto 0.625em auto; margin-left: -1.375em; margin-right: 
0; padding: 0; list-style: none; overflow: hidden; }
+ul.inline > li { list-style: none; float: left; margin-left: 1.375em; display: 
block; }
+ul.inline > li > * { display: block; }
+
+.unstyled dl dt { font-weight: normal; font-style: normal; }
+
+ol.arabic { list-style-type: decimal; }
+
+ol.decimal { list-style-type: decimal-leading-zero; }
+
+ol.loweralpha { list-style-type: lower-alpha; }
+
+ol.upperalpha { list-style-type: upper-alpha; }
+
+ol.lowerroman { list-style-type: lower-roman; }
+
+ol.upperroman { list-style-type: upper-roman; }
+
+ol.lowergreek { list-style-type: lower-greek; }
+
+.hdlist > table, .colist > table { border: 0; background: none; }
+.hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; 
}
+
+td.hdlist1 { padding-right: .75em; font-weight: bold; }
+
+td.hdlist1, td.hdlist2 { vertical-align: top; }
+
+.literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; }
+
+.colist > table tr > td:first-of-type { padding: 0 .75em; line-height: 1; }
+.colist > table tr > td:last-of-type { padding: 0.25em 0; }
+
+.qanda > ol > li > p > em:only-child { color: #373737; }
+
+.thumb, .th { line-height: 0; display: inline-block; border: solid 4px white; 
-webkit-box-shadow: 0 0 0 1px #dddddd; box-shadow: 0 0 0 1px #dddddd; }
+
+.imageblock.left, .imageblock[style*="float: left"] { margin: 0.25em 0.625em 
1.25em 0; }
+.imageblock.right, .imageblock[style*="float: right"] { margin: 0.25em 0 
1.25em 0.625em; }
+.imageblock > .title { margin-bottom: 0; }
+.imageblock.thumb, .imageblock.th { border-width: 6px; }
+.imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; }
+
+.image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; 
display: inline-block; line-height: 0; }
+.image.left { margin-right: 0.625em; }
+.image.right { margin-left: 0.625em; }
+
+a.image { text-decoration: none; }
+
+span.footnote, span.footnoteref { vertical-align: super; font-size: 0.875em; }
+span.footnote a, span.footnoteref a { text-decoration: none; }
+
+#footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 
0.625em; }
+#footnotes hr { width: 20%; min-width: 6.25em; margin: -.25em 0 .75em 0; 
border-width: 1px 0 0 0; }
+#footnotes .footnote { padding: 0 0.375em; line-height: 1.3; font-size: 
0.875em; margin-left: 1.2em; text-indent: -1.2em; margin-bottom: .2em; }
+#footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: 
none; }
+#footnotes .footnote:last-of-type { margin-bottom: 0; }
+
+#content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 
0; }
+
+.gist .file-data > table { border: none; background: #fff; width: 100%; 
margin-bottom: 0; }
+.gist .file-data > table td.line-data { width: 99%; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+.big { font-size: larger; }
+
+.small { font-size: smaller; }
+
+.underline { text-decoration: underline; }
+
+.overline { text-decoration: overline; }
+
+.line-through { text-decoration: line-through; }
+
+.aqua { color: #00bfbf; }
+
+.aqua-background { background-color: #00fafa; }
+
+.black { color: black; }
+
+.black-background { background-color: black; }
+
+.blue { color: #0000bf; }
+
+.blue-background { background-color: #0000fa; }
+
+.fuchsia { color: #bf00bf; }
+
+.fuchsia-background { background-color: #fa00fa; }
+
+.gray { color: #606060; }
+
+.gray-background { background-color: #7d7d7d; }
+
+.green { color: #006000; }
+
+.green-background { background-color: #007d00; }
+
+.lime { color: #00bf00; }
+
+.lime-background { background-color: #00fa00; }
+
+.maroon { color: #600000; }
+
+.maroon-background { background-color: #7d0000; }
+
+.navy { color: #000060; }
+
+.navy-background { background-color: #00007d; }
+
+.olive { color: #606000; }
+
+.olive-background { background-color: #7d7d00; }
+
+.purple { color: #600060; }
+
+.purple-background { background-color: #7d007d; }
+
+.red { color: #bf0000; }
+
+.red-background { background-color: #fa0000; }
+
+.silver { color: #909090; }
+
+.silver-background { background-color: #bcbcbc; }
+
+.teal { color: #006060; }
+
+.teal-background { background-color: #007d7d; }
+
+.white { color: #bfbfbf; }
+
+.white-background { background-color: #fafafa; }
+
+.yellow { color: #bfbf00; }
+
+.yellow-background { background-color: #fafa00; }
+
+span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; 
}
+
+.admonitionblock td.icon [class^="icon-"]:before { font-size: 2.5em; 
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; }
+.admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #444444; 
color: #333333; }
+.admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 
1px 2px rgba(155, 155, 0, 0.8); color: #111; }
+.admonitionblock td.icon .icon-warning:before { content: "\f071"; color: 
#bf6900; }
+.admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: 
#bf3400; }
+.admonitionblock td.icon .icon-important:before { content: "\f06a"; color: 
#bf0000; }
+
+.conum { display: inline-block; color: white !important; background-color: 
black; -webkit-border-radius: 100px; border-radius: 100px; text-align: center; 
width: 20px; height: 20px; font-size: 12px; font-weight: bold; line-height: 
20px; font-family: Arial, sans-serif; font-style: normal; position: relative; 
top: -2px; letter-spacing: -1px; }
+.conum * { color: white !important; }
+.conum + b { display: none; }
+.conum:after { content: attr(data-value); }
+.conum:not([data-value]):empty { display: none; }
+
+.listingblock code { white-space: pre; overflow: auto; overflow-wrap: normal; 
/* needed for webkit browsers */ }
+
+#toc ul.sectlevel0 > li > a { font-style: normal; font-weight: bold; }
+
+h4 { color: #6c818f; }
+
+.literalblock > .content > pre, .listingblock > .content > pre { 
-webkit-border-radius: 6px; border-radius: 6px; margin-left: 2em; margin-right: 
2em; }
+
+.admonitionblock { margin-left: 2em; margin-right: 2em; }
+.admonitionblock > table { border: 1px solid #609060; border-top-width: 1.5em; 
background-color: #e9ffe9; border-collapse: separate; -webkit-border-radius: 0; 
border-radius: 0; }
+.admonitionblock > table td.icon { padding-top: .5em; padding-bottom: .5em; }
+.admonitionblock > table td.content { padding: .5em 1em; color: black; 
font-size: .9em; border-left: none; }
+
+.sidebarblock { background-color: #e8ecef; border-color: #ccc; }
+.sidebarblock > .content > .title { color: #444444; }
+
+table.tableblock.grid-all { border-collapse: collapse; -webkit-border-radius: 
0; border-radius: 0; }
+table.tableblock.grid-all th.tableblock, table.tableblock.grid-all 
td.tableblock { border-bottom: 1px solid #aaa; }
+
+#footer { background-color: #465158; padding: 2em; }
+
+#footer-text { color: #eee; font-size: 0.8em; text-align: center; }
+.tabs{position:relative;margin:40px 
auto;width:1024px;max-width:100%;overflow:hidden;padding-top:10px;margin-bottom:60px}.tabs
 
input{position:absolute;z-index:1000;height:50px;left:0;top:0;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);cursor:pointer;margin:0}.tabs
 input:hover+label{background:#e08f24}.tabs 
label{background:#e9ffe9;color:#1a1a1a;font-size:15px;line-height:50px;height:60px;position:relative;top:0;padding:0
 
20px;float:left;display:block;letter-spacing:1px;text-transform:uppercase;font-weight:bold;text-align:center;box-shadow:2px
 0 2px rgba(0,0,0,0.1),-2px 0 2px 
rgba(0,0,0,0.1);box-sizing:border-box;-webkit-transition:all 150ms ease 
0s;transition:all 150ms ease 0s}.tabs label:hover{cursor:pointer}.tabs 
label:after{content:'';background:#609060;position:absolute;bottom:-2px;left:0;width:100%;height:2px;display:block}.tabs-2
 input{width:50%}.tabs-2 input.tab-selector-1{left:0%}.tabs-2 
input.tab-selector-2{left:50%}.tabs-
 2 label{width:50%}.tabs-3 input{width:33.33333%}.tabs-3 
input.tab-selector-1{left:0%}.tabs-3 
input.tab-selector-2{left:33.33333%}.tabs-3 
input.tab-selector-3{left:66.66667%}.tabs-3 label{width:33.33333%}.tabs-4 
input{width:25%}.tabs-4 input.tab-selector-1{left:0%}.tabs-4 
input.tab-selector-2{left:25%}.tabs-4 input.tab-selector-3{left:50%}.tabs-4 
input.tab-selector-4{left:75%}.tabs-4 label{width:25%}.tabs-5 
input{width:20%}.tabs-5 input.tab-selector-1{left:0%}.tabs-5 
input.tab-selector-2{left:20%}.tabs-5 input.tab-selector-3{left:40%}.tabs-5 
input.tab-selector-4{left:60%}.tabs-5 input.tab-selector-5{left:80%}.tabs-5 
label{width:20%}.tabs-6 input{width:16.66667%}.tabs-6 
input.tab-selector-1{left:0%}.tabs-6 
input.tab-selector-2{left:16.66667%}.tabs-6 
input.tab-selector-3{left:33.33333%}.tabs-6 
input.tab-selector-4{left:50%}.tabs-6 
input.tab-selector-5{left:66.66667%}.tabs-6 
input.tab-selector-6{left:83.33333%}.tabs-6 label{width:16.66667%}.tabs 
label:first-of-type{z-index:4}.tab-label-
 2{z-index:4}.tab-label-3{z-index:3}.tab-label-4{z-index:2}.tabs 
input:checked+label{background:#609060;color:#fefefe;z-index:6}.clear-shadow{clear:both}.tabcontent{height:auto;width:100%;float:left;position:relative;z-index:5;background:#eee;top:-10px;box-sizing:border-box}.tabcontent>div{position:relative;float:left;width:0;height:0;box-sizing:border-box;top:0;left:0;z-index:1;opacity:0;background:#eee}.tabcontent
 .CodeRay{background-color:#fefefe}.tabs .tab-selector-1:checked ~ .tabcontent 
.tabcontent-1{z-index:100;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}.tabs
 .tab-selector-2:checked ~ .tabcontent 
.tabcontent-2{z-index:100;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}.tabs
 .tab-selector-3:checked ~ .tabcontent .tabcontent-3{z-index:100;-ms-
 
filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}.tabs
 .tab-selector-4:checked ~ .tabcontent 
.tabcontent-4{z-index:100;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}.tabs
 .tab-selector-5:checked ~ .tabcontent 
.tabcontent-5{z-index:100;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}.tabs
 .tab-selector-6:checked ~ .tabcontent 
.tabcontent-6{z-index:100;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}
+
+.invisible {color: rgba(0,0,0,0); font-size: 0;}
+</style>
+<style>
+/* Stylesheet for CodeRay to match GitHub theme | MIT License | 
http://foundation.zurb.com */
+/*pre.CodeRay {background-color:#f7f7f8;}*/
+.CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em}
+.CodeRay 
span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)}
+.CodeRay .line-numbers strong{color:rgba(0,0,0,.4)}
+table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none}
+table.CodeRay td{vertical-align: top;line-height:1.45}
+table.CodeRay td.line-numbers{text-align:right}
+table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)}
+table.CodeRay td.code{padding:0 0 0 .5em}
+table.CodeRay td.code>pre{padding:0}
+.CodeRay .debug{color:#fff !important;background:#000080 !important}
+.CodeRay .annotation{color:#007}
+.CodeRay .attribute-name{color:#000080}
+.CodeRay .attribute-value{color:#700}
+.CodeRay .binary{color:#509}
+.CodeRay .comment{color:#998;font-style:italic}
+.CodeRay .char{color:#04d}
+.CodeRay .char .content{color:#04d}
+.CodeRay .char .delimiter{color:#039}
+.CodeRay .class{color:#458;font-weight:bold}
+.CodeRay .complex{color:#a08}
+.CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
+.CodeRay .color{color:#099}
+.CodeRay .class-variable{color:#369}
+.CodeRay .decorator{color:#b0b}
+.CodeRay .definition{color:#099}
+.CodeRay .delimiter{color:#000}
+.CodeRay .doc{color:#970}
+.CodeRay .doctype{color:#34b}
+.CodeRay .doc-string{color:#d42}
+.CodeRay .escape{color:#666}
+.CodeRay .entity{color:#800}
+.CodeRay .error{color:#808}
+.CodeRay .exception{color:inherit}
+.CodeRay .filename{color:#099}
+.CodeRay .function{color:#900;font-weight:bold}
+.CodeRay .global-variable{color:#008080}
+.CodeRay .hex{color:#058}
+.CodeRay .integer,.CodeRay .float{color:#099}
+.CodeRay .include{color:#555}
+.CodeRay .inline{color:#000}
+.CodeRay .inline .inline{background:#ccc}
+.CodeRay .inline .inline .inline{background:#bbb}
+.CodeRay .inline .inline-delimiter{color:#d14}
+.CodeRay .inline-delimiter{color:#d14}
+.CodeRay .important{color:#555;font-weight:bold}
+.CodeRay .interpreted{color:#b2b}
+.CodeRay .instance-variable{color:#008080}
+.CodeRay .label{color:#970}
+.CodeRay .local-variable{color:#963}
+.CodeRay .octal{color:#40e}
+.CodeRay .predefined{color:#369}
+.CodeRay .preprocessor{color:#579}
+.CodeRay .pseudo-class{color:#555}
+.CodeRay .directive{font-weight:bold}
+.CodeRay .type{font-weight:bold}
+.CodeRay .predefined-type{color:inherit}
+.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
+.CodeRay .key{color:#808}
+.CodeRay .key .delimiter{color:#606}
+.CodeRay .key .char{color:#80f}
+.CodeRay .value{color:#088}
+.CodeRay .regexp .delimiter{color:#808}
+.CodeRay .regexp .content{color:#808}
+.CodeRay .regexp .modifier{color:#808}
+.CodeRay .regexp .char{color:#d14}
+.CodeRay .regexp .function{color:#404;font-weight:bold}
+.CodeRay .string{color:#d20}
+.CodeRay .string .string .string{background:#ffd0d0}
+.CodeRay .string .content{color:#d14}
+.CodeRay .string .char{color:#d14}
+.CodeRay .string .delimiter{color:#d14}
+.CodeRay .shell{color:#d14}
+.CodeRay .shell .delimiter{color:#d14}
+.CodeRay .symbol{color:#990073}
+.CodeRay .symbol .content{color:#a60}
+.CodeRay .symbol .delimiter{color:#630}
+.CodeRay .tag{color:#008080}
+.CodeRay .tag-special{color:#d70}
+.CodeRay .variable{color:#036}
+.CodeRay .insert{background:#afa}
+.CodeRay .delete{background:#faa}
+.CodeRay .change{color:#aaf;background:#007}
+.CodeRay .head{color:#f8f;background:#505}
+.CodeRay .insert .insert{color:#080}
+.CodeRay .delete .delete{color:#800}
+.CodeRay .change .change{color:#66f}
+.CodeRay .head .head{color:#f4f}
+</style>
+</head>
+<body class="book toc2 toc-left">
+<div id="header">
+<div id="toc" class="toc2">
+<div id="toctitle">Table of Contents</div>
+<ul class="sectlevel0">
+<li><a href="#_tinkerpop_4_x_design_ideas">TinkerPop 4.x Design Ideas</a>
+<ul class="sectlevel1">
+<li><a href="#_the_main_features">The Main Features</a></li>
+<li><a href="#_hiding_blueprints">Hiding Blueprints</a>
+<ul class="sectlevel2">
+<li><a href="#_comments_spm">Comments [spm]</a></li>
+</ul>
+</li>
+<li><a href="#gremlin-language-subset">Gremlin Language Subset</a>
+<ul class="sectlevel2">
+<li><a href="#_comments_spm_2">Comments [spm]</a></li>
+</ul>
+</li>
+<li><a href="#serialization">Serialization</a></li>
+<li><a href="#_uniform_object_model">Uniform Object Model</a>
+<ul class="sectlevel2">
+<li><a href="#_comments_as">Comments [as]</a></li>
+<li><a href="#_comments_spm_3">Comments [spm]</a></li>
+</ul>
+</li>
+<li><a href="#_testing_framework">Testing Framework</a></li>
+<li><a href="#_elements_and_ids">Elements and IDs</a>
+<ul class="sectlevel2">
+<li><a href="#_comments_dk">Comments [dk]</a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<div id="content">
+<div id="preamble">
+<div class="sectionbody">
+<div class="imageblock">
+<div class="content">
+<a class="image" href="https://tinkerpop.apache.org";><img 
src="../../images/apache-tinkerpop-logo.png" alt="apache tinkerpop logo" 
width="500"></a>
+</div>
+</div>
+<div class="paragraph">
+<p><strong>4.0.0</strong></p>
+</div>
+</div>
+</div>
+<h1 id="_tinkerpop_4_x_design_ideas" class="sect0">TinkerPop 4.x Design 
Ideas</h1>
+<div class="openblock partintro">
+<div class="content">
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<div class="title">Note</div>
+</td>
+<td class="content">
+This document has not been updated in a significant way since 2018. The ideas 
presented here do not necessarily
+reflect the project direction going forward currently. We will revisit this 
document when there is greater focus on
+TinkerPop 4.x design discussions.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>Apache TinkerPop™ 4.x is not a version considered on the immediate 
horizon, but there are often points in the day to
+day development of TinkerPop 3.x where there are changes of importance, 
novelty and usefulness that are so big that
+they could only be implemented under a major new version. This document is 
meant to track these concepts as they
+develop, so that at some point in the future they can be referenced in a 
single place.</p>
+</div>
+<div class="paragraph">
+<p>There is no particular layout or style to this document. Simple bullet 
points, open questions posed as single
+sentences, or fully structured document headers and content are all 
acceptable. The main point is to capture ideas
+for future consideration when 4.x becomes the agenda of the day for The 
TinkerPop.</p>
+</div>
+<div class="paragraph">
+<p>If adding comments sections, please "sign" comments with initials and 
reference those initials here:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><strong>spm</strong> - Stephen Mallette</p>
+</li>
+<li>
+<p><strong>as</strong> - Ashwini Singh</p>
+</li>
+<li>
+<p><strong>dk</strong> - Daniel Kuppitz</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><span class="image"><img src="../../images/tp4-think.png" alt="tp4 
think"></span></p>
+</div>
+<div class="paragraph">
+<p>Development of 4.x occurs on the <code>4.0-dev</code> branch. This branch 
was created as an orphan branch and therefore has no
+history tied to any other branch in the repo including master. As such, there 
is no need to merge/rebase <code>4.0-dev</code>. When
+it comes time to promote <code>4.0-dev</code> to <code>master</code> the 
procedure for doing so will be to:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Create a <code>3.x-master</code> branch from <code>master</code></p>
+</li>
+<li>
+<p>Delete all content from <code>master</code> in one commit</p>
+</li>
+<li>
+<p>Rebase <code>4.0-dev</code> on <code>master</code></p>
+</li>
+<li>
+<p>Merge <code>4.0-dev</code> to <code>master</code> and push</p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>From this point 3.x development will occur on <code>3.x-master</code> and 
4.x development occurs on <code>master</code> (with the same version
+branching as we have now, e.g <code>3.3-dev</code>, <code>4.1-dev</code>, 
etc.) The <code>3.x-master</code> branch changes will likely still merge to
+<code>master</code>, but will all merge as no-op changes.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_the_main_features">The Main Features</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>TinkerPop 4.x should focus on the most successful aspects of TinkerPop 3.x 
and it should avoid the traps realized in
+TinkerPop 3.x. These items include:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>The concept of Gremlin as both a virtual machine and language.</p>
+<div class="ulist">
+<ul>
+<li>
+<p>A standard bytecode specification should be provided.</p>
+</li>
+<li>
+<p>A standard machine architecture should be provided.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>The concept of Gremlin language variants.</p>
+<div class="ulist">
+<ul>
+<li>
+<p>It should be easy to create Gremlin variants in every major programming 
language.</p>
+</li>
+<li>
+<p>A standard template should be followed for all languages.</p>
+</li>
+<li>
+<p>Apache TinkerPop should provide variants in all major programming 
languges.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>The concept of <code>Traversal</code> as the sole means of interacting with 
the graph.</p>
+<div class="ulist">
+<ul>
+<li>
+<p>The role of Blueprints should be significantly reduced.</p>
+</li>
+<li>
+<p>The role of Gremlin should be significantly increased.</p>
+</li>
+</ul>
+</div>
+</li>
+<li>
+<p>Provide better methods of versioning Gremlin itself - being bound to JVM 
releases and forcing local and remote
+versions of Gremlin to be the same isn&#8217;t ideal.</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_hiding_blueprints">Hiding Blueprints</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Originally from the <a 
href="https://lists.apache.org/thread.html/b4d80072ad36849b4e9cd3308f87115660574e3e7a4abb7ee68e959b@%3Cdev.tinkerpop.apache.org%3E";>mailing
 list</a>:</p>
+</div>
+<div class="paragraph">
+<p>Throughout our documentation we show uses of the “Blueprints API” (i.e. 
Graph/Vertex/Edge/etc. classes &amp; methods) as
+well as the use of the Traversal API (i.e. Gremlin).</p>
+</div>
+<div class="paragraph">
+<p>Enabling users to have two ways of interacting with the graph system has 
its problems:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>The DetachedXXX problem — how much data should a returned 
vertex/edge/etc. have associated with it?</p>
+</li>
+<li>
+<p><code>graph.addVertex()</code> and <code>g.addV()</code> — which should I 
use? The first is faster but is not recommended.</p>
+</li>
+<li>
+<p><code>SubgraphStrategy</code> leaking — I get subgraphs with Gremlin, but 
can then directly interact with the vertex objects to see more than I 
should.</p>
+</li>
+<li>
+<p><code>VertexProgram</code> model — I write traversals with Traversal API, 
but then develop VertexPrograms with the Blueprints API. That’s weird.</p>
+</li>
+<li>
+<p>GremlinServer returning fat objects — Serializers are created 
property-rich vertices and edges. The awkward HaltedTraversalStrategy 
solution.</p>
+</li>
+<li>
+<p>… various permutations of these source problems.</p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>In TinkerPop4 the solution might be as follows:</p>
+</div>
+<div class="paragraph">
+<p>There should be two “Graph APIs.”</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p>Provider Graph API: This is the current Blueprints API with 
<code>Graph.addVertex()</code>, <code>Vertex.edges()</code>, 
<code>Edge.inVertex()</code>, etc.</p>
+</li>
+<li>
+<p>User Graph API: This is a ReferenceXXX API.</p>
+</li>
+</ol>
+</div>
+<div class="paragraph">
+<p>The first API is well known, but the second bears further discussion. 
<code>ReferenceGraph</code> is simply a reference/dummy/proxy
+to the provider Graph API. <code>ReferenceGraph</code> has the following 
API:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>ReferenceGraph.open()</code></p>
+</li>
+<li>
+<p><code>ReferenceGraph.close()</code></p>
+</li>
+<li>
+<p><code>ReferenceGraph.tx()</code> // assuming we like the current 
transaction model (??)</p>
+</li>
+<li>
+<p><code>ReferenceGraph.traversal()</code></p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>That is it. What does this entail? Assume the following traversal:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java">g = 
ReferenceGraph.open(config).traversal()
+g.V(<span class="integer">1</span>).out(<span 
class="error">‘</span>knows<span class="error">’</span>)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><code>ReferenceGraph</code> is almost like a <code>RemoteGraph</code> 
(<code>RemoteStrategy</code>) in that it makes a connection (remote or 
inter-JVM)
+to the provider Graph API. When <code>g.V(1).out(‘knows’)</code> executes, 
it is really sending the bytecode to the provider Graph
+for execution (as specified by the config of 
<code>ReferenceGraph.open()</code>). Thus, once it hits the provider&#8217;s 
graph,
+<code>ProviderVertex</code>, <code>ProviderEdge</code>, etc. are the objects 
being processed. However, what the traversal’s 
<code>Iterator&lt;Vertex&gt;</code>
+returns is <code>ReferenceVertex</code>! That is, it never returns 
<code>ProviderVertex</code>. In this way, regardless if the user is
+going “over the wire” or within the same JVM or against a different 
provider’s graph database or from
+Gremlin-Python/C#/etc., all the vertices are simply ‘reference vertices’ 
(id + label). This makes it so that users
+never interact with the graph element objects themselves directly. They can 
ONLY interact with the graph via
+traversals! At most they can <code>ReferenceVertex.id()</code> and 
<code>ReferenceVertex.label()</code>. Thats it, — no mutations, not
+walking edges, nada! And moreover, since ReferenceXXX has enough information 
to re-attach to the source graph, they
+can always do the following to get more information:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="java">v = g.V(<span 
class="integer">1</span>).out(<span class="error">‘</span>knows<span 
class="error">’</span>).next()
+g.V(v).values(<span class="error">‘</span>name<span 
class="error">’</span>)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This split into two Graph APIs will enables us to make a hard boundary 
between what the provider (vendor) needs to
+implement and what the user (developer) gets to access.</p>
+</div>
+<div class="sect2">
+<h3 id="_comments_spm">Comments [spm]</h3>
+<div class="paragraph">
+<p>There is a question mark next to <code>ReferenceGraph.tx()</code> - 
Transactions are a bit of an open question for future versions
+of TinkerPop and likely deserve their own section in this document. The model 
used for last three version of TinkerPop
+now is rooted in the Neo4j approach to transactions and is often more trouble 
than it should be for us and providers.
+Distributed transactions are a challenge and don&#8217;t apply to every 
provider. Transactions are further complicated by
+GLVs. The idea of local subgraphs for mutations and transaction management 
might be good but that goes against having
+just <code>ReferenceGraph</code>.</p>
+</div>
+<div class="paragraph">
+<p>In "hiding blueprints" we should probably consider what relevance certain 
components of the Structure API still have:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>io()</code> - this sorta fell short a few ways: API was a bit clunky, 
no integration with loading via OLAP, etc.</p>
+</li>
+<li>
+<p><code>variables()</code> - one of the problems with variables is that they 
were not persisted by <code>io()</code> which was generally a
+problem for TinkerGraph which relied on <code>io()</code> for flushing to file 
storage. This topic was discussed a bit on
+<a 
href="https://issues.apache.org/jira/browse/TINKERPOP-892";>TINKERPOP-892</a></p>
+</li>
+<li>
+<p><code>tx()</code> - as discussed in the earlier paragraph</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="gremlin-language-subset">Gremlin Language Subset</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>On <a 
href="https://issues.apache.org/jira/browse/TINKERPOP-1417";>TINKERPOP-1417</a>, 
it was suggested that we "Create a
+Gremlin language subset that is easy to implement on any VM". Implementing the 
Gremlin VM in another language is
+pretty straightforward. However, its a lot of code.. all these steps 
implementations. One thing we could do to make
+it easy for database providers not on the JVM (e.g. ArangoDB and C) is to 
create "Gremlito" (Gremlin--). This language
+subset wouldn&#8217;t support side-effects, sacks, match, etc. Basically, just 
simple traversal steps and reducing barrier
+terminals.</p>
+</div>
+<div class="paragraph">
+<p>Thus:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>out, in, both, values, outE, inV, id, label, etc.</p>
+</li>
+<li>
+<p>repeat</p>
+</li>
+<li>
+<p>select, project</p>
+</li>
+<li>
+<p>where, has, limit, range, is, dedup</p>
+</li>
+<li>
+<p>path, simplePath, cyclicPath</p>
+</li>
+<li>
+<p>groupCount, sum, group, count, max, min, etc. (reducing barriers)</p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="_comments_spm_2">Comments [spm]</h3>
+<div class="paragraph">
+<p>This has an interesting potential impact on GLVs because "Little Gremlin" 
could be implemented within them for
+client-side traversals over remote subgraphs, where the subgraph is like a 
remote transaction. All graph mutations
+essentially build a subgraph which is merged into the primary graph. That 
subgraph is effectively the "transaction".
+Build it locally then submit it remotely and have the server sort out the 
merging. It&#8217;s perhaps the most natural way
+to load data. With "Gremlinito" you then get the added power of being able to 
traverse a local subgraph.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="serialization">Serialization</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Have we yet found the appropriate serialization model? We didn&#8217;t have 
it in 2.x at all. In 3.x we went with a use case
+based approach that made a lot of sense in the first few releases of 3.x, but 
the use cases couldn&#8217;t have conceived
+of what was to come with the development of GLVs. GLVs rendered Gryo, the 
decided "network option" from the use cases,
+to be pretty useless given that it is of the JVM only and GraphSON has gone 
through three versions now trying to find
+the appropriate format to cover the various features we&#8217;ve attempted to 
support. While GraphSON 3.0 seems to have met
+the mark for supporting our needs, it seems bloated with Java types and 
doesn&#8217;t perform terribly well in some cases.</p>
+</div>
+<div class="paragraph">
+<p>An ideal serialization format would be:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Compact for network transport</p>
+</li>
+<li>
+<p>Human readable (which competes with "compact" at some level)</p>
+</li>
+<li>
+<p>Language agnostic</p>
+</li>
+<li>
+<p>Exposes a small set of types that makes the format easy to maintain and 
test</p>
+</li>
+<li>
+<p>Extendable or perhaps built in such a way that graph providers could coerce 
their types to and from the types
+that TinkerPop exposes</p>
+</li>
+<li>
+<p>Upgrade friendly so that it is possible to easily detect the version of a 
format and have the system act
+transparently so as to avoid the heavy configuration that users currently have 
to do to be sure their versions of
+TinkerPop and their version of their serializers align</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_uniform_object_model">Uniform Object Model</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>On <a 
href="https://issues.apache.org/jira/browse/TINKERPOP-1909";>TINKERPOP-1909</a>, 
it was suggested that we are going to
+use reference (id/label) based object model. And, the direction is move 
towards more tidy object model contracts going
+forward. Reference model definitely provides big performance improvements 
especially with multi-property
+vertices/edges.  One thing that we can consider is to provide a configurable 
object model. Enabling users to
+configure the object model (OutputFormat) as server settings (Exposing server 
setting is being discussed here
+<a 
href="https://issues.apache.org/jira/browse/TINKERPOP-1636";>TINKERPOP-1636</a>).
 There will three types of output format.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Reference: includes id and label</p>
+</li>
+<li>
+<p>GraphSONCompact: object reference along with properties</p>
+</li>
+<li>
+<p>GraphSON: object reference, properties and edge details(inE/outE).</p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="_comments_as">Comments [as]</h3>
+<div class="paragraph">
+<p>This will enable the clients model based on their needs and avoid multiple 
query if they are sure what is expected
+from a gremlin query. If we need more details like edges/property as part of 
response, we can override the server
+configuration as part of the gremlin request arguments as hint.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_comments_spm_3">Comments [spm]</h3>
+<div class="paragraph">
+<p>A more full object model may be necessary as we consider implementing the 
options of the
+<a href="#gremlin-language-subset">Gremlin Language Subset</a>. A more robust 
object model, or at least the option to open up a
+more robust object model, could be necessary to support features there. We 
should also consider that the future is not
+necessarily a GraphSON format and could be something else as described in the 
<a href="#serialization">Serialization</a> section.</p>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_testing_framework">Testing Framework</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Consider a testing framework based on the Gherkin tests from 3.x and a 
<code>gremlin-test</code> parent module for all the test
+framework modules that will potentially be needed. In 3.x, we found situation 
where having test modules beyond
+<code>gremlin-test</code> would have been helpful, so a parent module that 
held all those would probably be smart.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_elements_and_ids">Elements and IDs</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>In <a 
href="https://issues.apache.org/jira/browse/TINKERPOP-2051";>TINKERPOP-2051</a> 
we tried to make vertex property ids local to their vertex. Several approaches 
were leading nowhere, in most cases we just broke the Gryo compatibility test 
suite. The basic idea was to remember the parent element (at least its id) and 
use it in property equality comparisons. This way, the property 
<code>[name&#8594;marko]</code> would only match another 
<code>[name&#8594;marko]</code> property if the parent elements were the same. 
In the end it was questioned if that&#8217;s even the right approach / what 
users expect. From a user perspective it would probably make more sense if two 
properties would match if the keys and values match. That said, we should 
question whether we actually need ids on properties and thus whether properties 
are actually <code>Element</code>s.</p>
+</div>
+<div class="sect2">
+<h3 id="_comments_dk">Comments [dk]</h3>
+<div class="paragraph">
+<p>In my opinion, only vertices should have globally unique ids. Edge ids 
should be local to the out-vertex (that requires that we "remember" the 
out-vertex id, even if the edge is detached) and properties should have no ids 
at all, they can be simply identified by their key (or key and value if we 
decide to keep multi-properties).</p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div id="footer">
+<div id="footer-text">
+Last updated 2023-01-18 15:44:49 -0800
+</div>
+</div>
+</body>
+</html>


Reply via email to