You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@s2graph.apache.org by st...@apache.org on 2019/03/28 11:04:33 UTC

svn commit: r1856470 [9/13] - in /incubator/s2graph/site: ./ docs/ docs/_sources/ docs/_sources/api/ docs/_sources/api/management/ docs/_sources/api/mutate/ docs/_sources/api/query/ docs/_sources/getting_started/ docs/_static/ docs/_static/css/ docs/_s...

Added: incubator/s2graph/site/docs/api/management/index.html
URL: http://svn.apache.org/viewvc/incubator/s2graph/site/docs/api/management/index.html?rev=1856470&view=auto
==============================================================================
--- incubator/s2graph/site/docs/api/management/index.html (added)
+++ incubator/s2graph/site/docs/api/management/index.html Thu Mar 28 11:04:32 2019
@@ -0,0 +1,734 @@
+
+
+<!DOCTYPE html>
+<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
+<head>
+  <meta charset="utf-8">
+  
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  
+  <title>Management APIs &mdash; S2Graph 0.0.2 documentation</title>
+  
+
+  
+  
+  
+  
+
+  
+  <script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
+  
+    
+      <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
+        <script type="text/javascript" src="../../_static/jquery.js"></script>
+        <script type="text/javascript" src="../../_static/underscore.js"></script>
+        <script type="text/javascript" src="../../_static/doctools.js"></script>
+        <script type="text/javascript" src="../../_static/language_data.js"></script>
+    
+    <script type="text/javascript" src="../../_static/js/theme.js"></script>
+
+    
+
+  
+  <link rel="stylesheet" href="../../_static/css/s2graph_style.css" type="text/css" />
+  <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+    <link rel="next" title="Mutate APIs" href="../mutate/index.html" />
+    <link rel="prev" title="HTTP API Glossary" href="../index.html" /> 
+</head>
+
+<body class="wy-body-for-nav">
+
+   
+  <div class="wy-grid-for-nav">
+    
+    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
+      <div class="wy-side-scroll">
+        <div class="wy-side-nav-search" >
+          
+
+          
+            <a href="../../index.html" class="icon icon-home"> S2Graph
+          
+
+          
+          </a>
+
+          
+            
+            
+          
+
+          
+<div role="search">
+  <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
+    <input type="text" name="q" placeholder="Search docs" />
+    <input type="hidden" name="check_keywords" value="yes" />
+    <input type="hidden" name="area" value="default" />
+  </form>
+</div>
+
+          
+        </div>
+
+        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
+          
+            
+            
+              
+            
+            
+              <p class="caption"><span class="caption-text">S2Graph Documentation</span></p>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../getting_started/index.html">Getting Started</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../getting_started/your_first_graph.html">Your First S2Graph</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">HTTP API Glossary</a><ul class="current">
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Management APIs</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#create-a-service">Create a Service</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#service-fields">Service Fields</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#basic-service-operations">Basic Service Operations</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#create-a-label">Create a Label</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#label-fields">Label Fields</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#props-indices">Props &amp; Indices</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#basic-label-operations">Basic Label Operations</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#adding-extra-properties-to-labels">Adding Extra Properties to Labels</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#consistency-level">Consistency Level</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#adding-extra-indices-optional">Adding Extra Indices (Optional)</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="#create-a-servicecolumn-optional">Create a ServiceColumn (Optional)</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#service-column-fields">Service Column Fields</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#basic-service-column-operations">Basic Service Column Operations</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../mutate/index.html">Mutate APIs</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../query/index.html">Query APIs</a></li>
+</ul>
+</li>
+</ul>
+
+            
+          
+        </div>
+      </div>
+    </nav>
+
+    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
+
+      
+      <nav class="wy-nav-top" aria-label="top navigation">
+        
+          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
+          <a href="../../index.html">S2Graph</a>
+        
+      </nav>
+
+
+      <div class="wy-nav-content">
+        
+        <div class="rst-content">
+        
+          
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<div role="navigation" aria-label="breadcrumbs navigation">
+
+  <ul class="wy-breadcrumbs">
+    
+      <li><a href="../../index.html">Docs</a> &raquo;</li>
+        
+          <li><a href="../index.html">HTTP API Glossary</a> &raquo;</li>
+        
+      <li>Management APIs</li>
+    
+    
+      <li class="wy-breadcrumbs-aside">
+        
+            
+            <a href="../../_sources/api/management/index.rst.txt" rel="nofollow"> View page source</a>
+          
+        
+      </li>
+    
+  </ul>
+
+  
+  <hr/>
+</div>
+          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
+           <div itemprop="articleBody">
+            
+  <div class="section" id="management-apis">
+<h1>Management APIs<a class="headerlink" href="#management-apis" title="Permalink to this headline">¶</a></h1>
+<p>Admin Apis for Management Service, Label, Index ..</p>
+<div class="section" id="create-a-service">
+<h2>Create a Service<a class="headerlink" href="#create-a-service" title="Permalink to this headline">¶</a></h2>
+<p><code class="docutils literal notranslate"><span class="pre">Service</span></code> is the top level abstraction in S2Graph which could be considered as a database in MySQL.</p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">POST</span> <span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">createService</span>
+</pre></div>
+</div>
+<div class="section" id="service-fields">
+<h3>Service Fields<a class="headerlink" href="#service-fields" title="Permalink to this headline">¶</a></h3>
+<p>In order to create a Service, the following fields should be specified in the request.</p>
+<table border="1" class="colwidths-given docutils" id="id1">
+<caption><span class="caption-text">Option</span><a class="headerlink" href="#id1" title="Permalink to this table">¶</a></caption>
+<colgroup>
+<col width="11%" />
+<col width="22%" />
+<col width="22%" />
+<col width="22%" />
+<col width="22%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">Field Name</th>
+<th class="head">Definition</th>
+<th class="head">Data Type</th>
+<th class="head">Example</th>
+<th class="head">Note</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td>serviceName</td>
+<td>User defined namespace</td>
+<td>String</td>
+<td>talk_friendship</td>
+<td>Required</td>
+</tr>
+<tr class="row-odd"><td>cluster</td>
+<td>Zookeeper quorum address</td>
+<td>String</td>
+<td>abc.com:2181,abd.com:2181</td>
+<td>Optional</td>
+</tr>
+<tr class="row-even"><td>hTableName</td>
+<td>HBase table name</td>
+<td>String</td>
+<td>test</td>
+<td>Optional</td>
+</tr>
+<tr class="row-odd"><td>hTableTTL</td>
+<td>Time to live setting for data</td>
+<td>Integer</td>
+<td>86000</td>
+<td>Optional</td>
+</tr>
+<tr class="row-even"><td>preSplitSize</td>
+<td>Factor for the table pre-split size</td>
+<td>Integer</td>
+<td>1</td>
+<td>Optional</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="basic-service-operations">
+<h3>Basic Service Operations<a class="headerlink" href="#basic-service-operations" title="Permalink to this headline">¶</a></h3>
+<p>You can create a service using the following API:</p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">curl</span> <span class="o">-</span><span class="n">XPOST</span> <span class="n">localhost</span><span class="p">:</span><span class="mi">9000</span><span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">createService</span> <span class="o">-</span><span class="n">H</span> <span class="s1">&#39;Content-Type: Application/json&#39;</span> <span class="o">-</span><span class="n">d</span> <span class="s1">&#39;</span>
+<span class="p">{</span>
+   <span class="s2">&quot;serviceName&quot;</span><span class="p">:</span> <span class="s2">&quot;s2graph&quot;</span><span class="p">,</span>
+   <span class="s2">&quot;cluster&quot;</span><span class="p">:</span> <span class="s2">&quot;address for zookeeper&quot;</span><span class="p">,</span>
+   <span class="s2">&quot;hTableName&quot;</span><span class="p">:</span> <span class="s2">&quot;hbase table name&quot;</span><span class="p">,</span>
+   <span class="s2">&quot;hTableTTL&quot;</span><span class="p">:</span> <span class="mi">86000</span><span class="p">,</span>
+   <span class="s2">&quot;preSplitSize&quot;</span><span class="p">:</span> <span class="mi">2</span>
+<span class="p">}</span><span class="s1">&#39;</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="create-a-label">
+<h2>Create a Label<a class="headerlink" href="#create-a-label" title="Permalink to this headline">¶</a></h2>
+<p>A <code class="docutils literal notranslate"><span class="pre">Label</span></code> represents a relation between two serviceColumns. Labels are to S2Graph what tables are to RDBMS since they contain the schema information, i.e. descriptive information of the data being managed or indices used for efficient retrieval.
+In most scenarios, defining an edge schema (in other words, label) requires a little more care compared to a vertex schema (which is pretty straightforward).
+First, think about the kind of queries you will be using, then, model user actions or relations into <code class="docutils literal notranslate"><span class="pre">edges</span></code> and design a label accordingly.</p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">POST</span> <span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">createLabel</span>
+</pre></div>
+</div>
+<div class="section" id="label-fields">
+<h3>Label Fields<a class="headerlink" href="#label-fields" title="Permalink to this headline">¶</a></h3>
+<p>A Label creation request includes the following information.</p>
+<table border="1" class="colwidths-given docutils" id="id2">
+<caption><span class="caption-text">Option</span><a class="headerlink" href="#id2" title="Permalink to this table">¶</a></caption>
+<colgroup>
+<col width="11%" />
+<col width="22%" />
+<col width="22%" />
+<col width="22%" />
+<col width="22%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">Field Name</th>
+<th class="head">Definition</th>
+<th class="head">Data Type</th>
+<th class="head">Example</th>
+<th class="head">Note</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td>label</td>
+<td>Name of the relation</td>
+<td>String</td>
+<td>talk_friendship</td>
+<td>Required</td>
+</tr>
+<tr class="row-odd"><td>srcServiceName</td>
+<td>Source column’s service</td>
+<td>String</td>
+<td>kakaotalk</td>
+<td>Required</td>
+</tr>
+<tr class="row-even"><td>srcColumnName</td>
+<td>Source column’s name</td>
+<td>String</td>
+<td>user_id</td>
+<td>Required</td>
+</tr>
+<tr class="row-odd"><td>srcColumnType</td>
+<td>Source column’s data type</td>
+<td>Long/Integer/String</td>
+<td>string</td>
+<td>Required</td>
+</tr>
+<tr class="row-even"><td>tgtServiceName</td>
+<td>Target column’s service</td>
+<td>String</td>
+<td>kakaotalk/kakaomusic</td>
+<td>Optional</td>
+</tr>
+<tr class="row-odd"><td>tgtColumnName</td>
+<td>Target column’s name</td>
+<td>String</td>
+<td>item_id</td>
+<td>Required</td>
+</tr>
+<tr class="row-even"><td>tgtColumnType</td>
+<td>Target column’s data type</td>
+<td>Long/Integer/String</td>
+<td>string</td>
+<td>Required</td>
+</tr>
+<tr class="row-odd"><td>isDirected</td>
+<td>Wether the label is directed or undirected</td>
+<td>True/False</td>
+<td>true/false</td>
+<td>Optional. default is true</td>
+</tr>
+<tr class="row-even"><td>serviceName</td>
+<td>Which service the label belongs to</td>
+<td>String</td>
+<td>kakaotalk</td>
+<td>Optional. tgtServiceName is used by default</td>
+</tr>
+<tr class="row-odd"><td>hTableName</td>
+<td>A dedicated HBase table to your Label</td>
+<td>String</td>
+<td>s2graph-batch</td>
+<td>Optional. Service hTableName is used by default</td>
+</tr>
+<tr class="row-even"><td>hTableTTL</td>
+<td>Data time to live setting</td>
+<td>Integer</td>
+<td>86000</td>
+<td>Optional. Service hTableTTL is used by default</td>
+</tr>
+<tr class="row-odd"><td>consistencyLevel</td>
+<td>If set to ‘strong’, only one edge is alowed between a pair of source/ target vertices. Set to ‘weak’, and multiple-edge is supported</td>
+<td>String</td>
+<td>strong/weak</td>
+<td>Optional. default is ‘weak’</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="props-indices">
+<h3>Props &amp; Indices<a class="headerlink" href="#props-indices" title="Permalink to this headline">¶</a></h3>
+<p>A couple of key elements of a Label are its Properties (props) and indices.
+Supplementary information of a Vertex or Edge can be stored as props. A single property can be defined in a simple key-value JSON as follows:</p>
+<div class="code json highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
+  <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;name of property&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;data type of property value&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="s2">&quot;default value in string&quot;</span>
+<span class="p">}</span>
+</pre></div>
+</div>
+<p>In a scenario where user - video playback history is stored in a Label, a typical example for props would look like this:</p>
+<div class="code json highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span>
+  <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;play_count&quot;</span><span class="p">,</span> <span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;integer&quot;</span><span class="p">},</span>
+  <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;is_hidden&quot;</span><span class="p">,</span><span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="n">false</span><span class="p">,</span><span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;boolean&quot;</span><span class="p">},</span>
+  <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;category&quot;</span><span class="p">,</span><span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="s2">&quot;jazz&quot;</span><span class="p">,</span><span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;string&quot;</span><span class="p">},</span>
+  <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;score&quot;</span><span class="p">,</span><span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span><span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;float&quot;</span><span class="p">}</span>
+<span class="p">]</span>
+</pre></div>
+</div>
+<p>Props can have data types of <code class="docutils literal notranslate"><span class="pre">numeric</span></code> (byte/ short/ integer/ float/ double), <code class="docutils literal notranslate"><span class="pre">boolean</span></code> or <code class="docutils literal notranslate"><span class="pre">string</span></code>.
+In order to achieve efficient data retrieval, a Label can be indexed using the “indices” option.
+Default value for indices is <code class="docutils literal notranslate"><span class="pre">_timestamp</span></code>, a hidden label property.</p>
+<p>All labels have <code class="docutils literal notranslate"><span class="pre">_timestamp</span></code> in their props under the hood</p>
+<p>The first index in indices array will be the primary index <code class="docutils literal notranslate"><span class="pre">(Think</span> <span class="pre">of</span> <span class="pre">PRIMARY</span> <span class="pre">INDEX</span> <span class="pre">idx_xxx(p1,</span> <span class="pre">p2)</span> <span class="pre">in</span> <span class="pre">MySQL)</span></code>
+S2Graph will automatically store edges according to the primary index.
+Trailing indices are used for multiple ordering on edges. <code class="docutils literal notranslate"><span class="pre">(Think</span> <span class="pre">of</span> <span class="pre">ALTER</span> <span class="pre">TABLE</span> <span class="pre">ADD</span> <span class="pre">INDEX</span> <span class="pre">idx_xxx(p2,</span> <span class="pre">p1)</span> <span class="pre">in</span> <span class="pre">MySQL)</span></code></p>
+<p>props define meta datas that will not be affect the order of edges.
+Please avoid using S2Graph-reserved property names:</p>
+<ul class="simple">
+<li><code class="docutils literal notranslate"><span class="pre">_timestamp</span></code> is reserved for system wise timestamp. this can be interpreted as last_modified_at</li>
+<li><code class="docutils literal notranslate"><span class="pre">_from</span></code> is reserved for label’s start vertex.</li>
+<li><code class="docutils literal notranslate"><span class="pre">_to</span></code> is reserved for label’s target vertex.</li>
+</ul>
+</div>
+<div class="section" id="basic-label-operations">
+<h3>Basic Label Operations<a class="headerlink" href="#basic-label-operations" title="Permalink to this headline">¶</a></h3>
+<p>Here is an sample request that creates a label <code class="docutils literal notranslate"><span class="pre">user_article_liked</span></code> between column <code class="docutils literal notranslate"><span class="pre">user_id</span></code> of service <code class="docutils literal notranslate"><span class="pre">s2graph</span></code> and column <code class="docutils literal notranslate"><span class="pre">article_id</span></code> of service <code class="docutils literal notranslate"><span class="pre">s2graph_news</span></code>.
+Note that the default indexed property <code class="docutils literal notranslate"><span class="pre">_timestamp</span></code> will be created since the <code class="docutils literal notranslate"><span class="pre">indexedProps</span></code> field is empty.</p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">curl</span> <span class="o">-</span><span class="n">XPOST</span> <span class="n">localhost</span><span class="p">:</span><span class="mi">9000</span><span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">createLabel</span> <span class="o">-</span><span class="n">H</span> <span class="s1">&#39;Content-Type: Application/json&#39;</span> <span class="o">-</span><span class="n">d</span> <span class="s1">&#39;</span>
+<span class="p">{</span>
+  <span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;user_article_liked&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;srcServiceName&quot;</span><span class="p">:</span> <span class="s2">&quot;s2graph&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;srcColumnName&quot;</span><span class="p">:</span> <span class="s2">&quot;user_id&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;srcColumnType&quot;</span><span class="p">:</span> <span class="s2">&quot;long&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;tgtServiceName&quot;</span><span class="p">:</span> <span class="s2">&quot;s2graph_news&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;tgtColumnName&quot;</span><span class="p">:</span> <span class="s2">&quot;article_id&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;tgtColumnType&quot;</span><span class="p">:</span> <span class="s2">&quot;string&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;indices&quot;</span><span class="p">:</span> <span class="p">[],</span> <span class="o">//</span> <span class="n">_timestamp</span> <span class="n">will</span> <span class="n">be</span> <span class="n">used</span> <span class="k">as</span> <span class="n">default</span>
+  <span class="s2">&quot;props&quot;</span><span class="p">:</span> <span class="p">[],</span>
+  <span class="s2">&quot;serviceName&quot;</span><span class="p">:</span> <span class="s2">&quot;s2graph_news&quot;</span>
+<span class="p">}</span><span class="s1">&#39;</span>
+</pre></div>
+</div>
+<p>The created label <code class="docutils literal notranslate"><span class="pre">user_article_liked</span></code> will manage edges in a timestamp-descending order (which seems to be the common requirement for most services).
+Here is another example that creates a label <code class="docutils literal notranslate"><span class="pre">friends</span></code>, which represents the friend relation between <code class="docutils literal notranslate"><span class="pre">users</span></code> in service <code class="docutils literal notranslate"><span class="pre">s2graph</span></code>.
+This time, edges are managed by both affinity_score and <code class="docutils literal notranslate"><span class="pre">_timestamp</span></code>.</p>
+<p>Friends with higher affinity_scores come first and if affinity_score is a tie, recently added friends comes first.</p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">curl</span> <span class="o">-</span><span class="n">XPOST</span> <span class="n">localhost</span><span class="p">:</span><span class="mi">9000</span><span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">createLabel</span> <span class="o">-</span><span class="n">H</span> <span class="s1">&#39;Content-Type: Application/json&#39;</span> <span class="o">-</span><span class="n">d</span> <span class="s1">&#39;</span>
+<span class="p">{</span>
+  <span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;friends&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;srcServiceName&quot;</span><span class="p">:</span> <span class="s2">&quot;s2graph&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;srcColumnName&quot;</span><span class="p">:</span> <span class="s2">&quot;user_id&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;srcColumnType&quot;</span><span class="p">:</span> <span class="s2">&quot;long&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;tgtServiceName&quot;</span><span class="p">:</span> <span class="s2">&quot;s2graph&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;tgtColumnName&quot;</span><span class="p">:</span> <span class="s2">&quot;user_id&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;tgtColumnType&quot;</span><span class="p">:</span> <span class="s2">&quot;long&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;indices&quot;</span><span class="p">:</span> <span class="p">[</span>
+    <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;idx_affinity_timestamp&quot;</span><span class="p">,</span> <span class="s2">&quot;propNames&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;affinity_score&quot;</span><span class="p">,</span> <span class="s2">&quot;_timestamp&quot;</span><span class="p">]}</span>
+  <span class="p">],</span>
+  <span class="s2">&quot;props&quot;</span><span class="p">:</span> <span class="p">[</span>
+    <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;affinity_score&quot;</span><span class="p">,</span> <span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;float&quot;</span><span class="p">,</span> <span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="mf">0.0</span><span class="p">},</span>
+    <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;_timestamp&quot;</span><span class="p">,</span> <span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;long&quot;</span><span class="p">,</span> <span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span>
+    <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;is_hidden&quot;</span><span class="p">,</span> <span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;boolean&quot;</span><span class="p">,</span> <span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="n">false</span><span class="p">},</span>
+    <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;is_blocked&quot;</span><span class="p">,</span> <span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;boolean&quot;</span><span class="p">,</span> <span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="n">true</span><span class="p">},</span>
+    <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;error_code&quot;</span><span class="p">,</span> <span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;integer&quot;</span><span class="p">,</span> <span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="mi">500</span><span class="p">}</span>
+  <span class="p">],</span>
+  <span class="s2">&quot;serviceName&quot;</span><span class="p">:</span> <span class="s2">&quot;s2graph&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;consistencyLevel&quot;</span><span class="p">:</span> <span class="s2">&quot;strong&quot;</span>
+  <span class="p">}</span><span class="s1">&#39;</span>
+</pre></div>
+</div>
+<p>S2Graph supports <strong>multiple indices</strong> on a label which means you can add separate ordering options for edges.</p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">curl</span> <span class="o">-</span><span class="n">XPOST</span> <span class="n">localhost</span><span class="p">:</span><span class="mi">9000</span><span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">addIndex</span> <span class="o">-</span><span class="n">H</span> <span class="s1">&#39;Content-Type: Application/json&#39;</span> <span class="o">-</span><span class="n">d</span> <span class="s1">&#39;</span>
+<span class="p">{</span>
+  <span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;friends&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;indices&quot;</span><span class="p">:</span> <span class="p">[</span>
+    <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;idx_3rd&quot;</span><span class="p">,</span> <span class="s2">&quot;propNames&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;is_blocked&quot;</span><span class="p">,</span> <span class="s2">&quot;_timestamp&quot;</span><span class="p">]}</span>
+  <span class="p">]</span>
+<span class="p">}</span><span class="s1">&#39;</span>
+</pre></div>
+</div>
+<p>In order to get general information on a label, make a GET request to <code class="docutils literal notranslate"><span class="pre">/admin/getLabel/{label</span> <span class="pre">name}</span></code></p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">curl</span> <span class="o">-</span><span class="n">XGET</span> <span class="n">localhost</span><span class="p">:</span><span class="mi">9000</span><span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">getLabel</span><span class="o">/</span><span class="n">friends</span>
+</pre></div>
+</div>
+<p>Delete a label with a PUT request to <code class="docutils literal notranslate"><span class="pre">/admin/deleteLabel/{label</span> <span class="pre">name}</span></code></p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">curl</span> <span class="o">-</span><span class="n">XPUT</span> <span class="n">localhost</span><span class="p">:</span><span class="mi">9000</span><span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">deleteLabel</span><span class="o">/</span><span class="n">friends</span>
+</pre></div>
+</div>
+<p>Label updates are not supported (except when you are adding an index). Instead, you can delete the label and re-create it.</p>
+</div>
+<div class="section" id="adding-extra-properties-to-labels">
+<h3>Adding Extra Properties to Labels<a class="headerlink" href="#adding-extra-properties-to-labels" title="Permalink to this headline">¶</a></h3>
+<p>To add a new property, use <code class="docutils literal notranslate"><span class="pre">/admin/addProp/{label</span> <span class="pre">name}</span></code></p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">curl</span> <span class="o">-</span><span class="n">XPOST</span> <span class="n">localhost</span><span class="p">:</span><span class="mi">9000</span><span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">addProp</span><span class="o">/</span><span class="n">friend</span> <span class="o">-</span><span class="n">H</span> <span class="s1">&#39;Content-Type: Application/json&#39;</span> <span class="o">-</span><span class="n">d</span> <span class="s1">&#39;</span>
+<span class="p">{</span>
+  <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;is_blocked&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="n">false</span><span class="p">,</span>
+  <span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;boolean&quot;</span>
+<span class="p">}</span><span class="s1">&#39;</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="consistency-level">
+<h3>Consistency Level<a class="headerlink" href="#consistency-level" title="Permalink to this headline">¶</a></h3>
+<p>Simply put, the consistency level of your label will determine how the edges are stored at storage level.
+First, note that S2Graph identifies a unique edge by combining its from, label, to values as a key.</p>
+<p>Now, let’s consider inserting the following two edges that have same keys (1, graph_test, 101) and different timestamps (1418950524721 and 1418950524723).</p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1418950524721</span>    <span class="n">insert</span>  <span class="n">e</span> <span class="mi">1</span> <span class="mi">101</span>    <span class="n">graph_test</span>    <span class="p">{</span><span class="s2">&quot;weight&quot;</span><span class="p">:</span> <span class="mi">10</span><span class="p">}</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">graph_test</span><span class="p">,</span> <span class="mi">101</span><span class="p">)</span>
+<span class="mi">1418950524723</span>    <span class="n">insert</span>  <span class="n">e</span> <span class="mi">1</span> <span class="mi">101</span>    <span class="n">graph_test</span>    <span class="p">{</span><span class="s2">&quot;weight&quot;</span><span class="p">:</span> <span class="mi">20</span><span class="p">}</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">graph_test</span><span class="p">,</span> <span class="mi">101</span><span class="p">)</span>
+</pre></div>
+</div>
+<p><strong>Each consistency levels handle the case differently.</strong></p>
+<ul class="simple">
+<li>strong<ul>
+<li>The strong option makes sure that there is only one edge record stored in the HBase table for edge key (1, graph_test, 101). With strong consistency level, the later insertion will overwrite the previous one.</li>
+</ul>
+</li>
+<li>weak<ul>
+<li>The weak option will allow two different edges stored in the table with different timestamps and weight values.</li>
+</ul>
+</li>
+</ul>
+<p>For a better understanding, let’s simplify the notation for an edge that connects two vertices u - v at time t as u -&gt; (t, v), and assume that we are inserting these four edges into two different labels with each consistency configuration (both indexed by timestamp only).</p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">u1</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">t1</span><span class="p">,</span> <span class="n">v1</span><span class="p">)</span>
+<span class="n">u1</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">t2</span><span class="p">,</span> <span class="n">v2</span><span class="p">)</span>
+<span class="n">u1</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">t3</span><span class="p">,</span> <span class="n">v2</span><span class="p">)</span>
+<span class="n">u1</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">t4</span><span class="p">,</span> <span class="n">v1</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>With a strong consistencyLevel, your Label contents will be:</p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">u1</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">t4</span><span class="p">,</span> <span class="n">v1</span><span class="p">)</span>
+<span class="n">u1</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">t3</span><span class="p">,</span> <span class="n">v2</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>Note that edges with same vertices and earlier timestamp (u1 -&gt; (t1, v1) and u1 -&gt; (t2, v2)) were overwritten and do not exist.
+On the other hand, with consistencyLevel weak.</p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">u1</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">t1</span><span class="p">,</span> <span class="n">v1</span><span class="p">)</span>
+<span class="n">u1</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">t2</span><span class="p">,</span> <span class="n">v2</span><span class="p">)</span>
+<span class="n">u1</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">t3</span><span class="p">,</span> <span class="n">v2</span><span class="p">)</span>
+<span class="n">u1</span> <span class="o">-&gt;</span> <span class="p">(</span><span class="n">t4</span><span class="p">,</span> <span class="n">v1</span><span class="p">)</span>
+</pre></div>
+</div>
+<p><strong>It is recommended to set consistencyLevel to weak unless you are expecting concurrent updates on same edge.</strong></p>
+<p>In real world systems, it is not guaranteed that operation requests arrive at S2Graph in the order of their timestamp. Depending on the environment (network conditions, client making asynchronous calls, use of a message que, and so on) request that were made earlier can arrive later. Consistency level also determines how S2Graph handles these cases.
+Strong consistencyLevel promises a final result consistent to the timestamp.
+For example, consider a set of operation requests on edge (1, graph_test, 101) were made in the following order;</p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1418950524721</span>    <span class="n">insert</span>    <span class="n">e</span>    <span class="mi">1</span>    <span class="mi">101</span>    <span class="n">graph_test</span>    <span class="p">{</span><span class="s2">&quot;is_blocked&quot;</span><span class="p">:</span> <span class="n">false</span><span class="p">}</span>
+<span class="mi">1418950524722</span>    <span class="n">delete</span>    <span class="n">e</span>    <span class="mi">1</span>    <span class="mi">101</span>    <span class="n">graph_test</span>
+<span class="mi">1418950524723</span>    <span class="n">insert</span>    <span class="n">e</span>    <span class="mi">1</span>    <span class="mi">101</span>    <span class="n">graph_test</span>    <span class="p">{</span><span class="s2">&quot;is_hidden&quot;</span><span class="p">:</span> <span class="n">false</span><span class="p">,</span> <span class="s2">&quot;weight&quot;</span><span class="p">:</span> <span class="mi">10</span><span class="p">}</span>
+<span class="mi">1418950524724</span>    <span class="n">update</span>    <span class="n">e</span>    <span class="mi">1</span>    <span class="mi">101</span>    <span class="n">graph_test</span>    <span class="p">{</span><span class="s2">&quot;time&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;weight&quot;</span><span class="p">:</span> <span class="o">-</span><span class="mi">10</span><span class="p">}</span>
+<span class="mi">1418950524726</span>    <span class="n">update</span>    <span class="n">e</span>    <span class="mi">1</span>    <span class="mi">101</span>    <span class="n">graph_test</span>    <span class="p">{</span><span class="s2">&quot;is_blocked&quot;</span><span class="p">:</span> <span class="n">true</span><span class="p">}</span>
+</pre></div>
+</div>
+<p>and actually arrived in a shuffled order due to complications</p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">1418950524726</span>    <span class="n">update</span>    <span class="n">e</span>    <span class="mi">1</span>    <span class="mi">101</span>    <span class="n">graph_test</span>    <span class="p">{</span><span class="s2">&quot;is_blocked&quot;</span><span class="p">:</span> <span class="n">true</span><span class="p">}</span>
+<span class="mi">1418950524723</span>    <span class="n">insert</span>    <span class="n">e</span>    <span class="mi">1</span>    <span class="mi">101</span>    <span class="n">graph_test</span>    <span class="p">{</span><span class="s2">&quot;is_hidden&quot;</span><span class="p">:</span> <span class="n">false</span><span class="p">,</span> <span class="s2">&quot;weight&quot;</span><span class="p">:</span> <span class="mi">10</span><span class="p">}</span>
+<span class="mi">1418950524722</span>    <span class="n">delete</span>    <span class="n">e</span>    <span class="mi">1</span>    <span class="mi">101</span>    <span class="n">graph_test</span>
+<span class="mi">1418950524721</span>    <span class="n">insert</span>    <span class="n">e</span>    <span class="mi">1</span>    <span class="mi">101</span>    <span class="n">graph_test</span>    <span class="p">{</span><span class="s2">&quot;is_blocked&quot;</span><span class="p">:</span> <span class="n">false</span><span class="p">}</span>
+<span class="mi">1418950524724</span>    <span class="n">update</span>    <span class="n">e</span>    <span class="mi">1</span>    <span class="mi">101</span>    <span class="n">graph_test</span>    <span class="p">{</span><span class="s2">&quot;time&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">&quot;weight&quot;</span><span class="p">:</span> <span class="o">-</span><span class="mi">10</span><span class="p">}</span>
+</pre></div>
+</div>
+<p>Strong consistency still makes sure that you get the same eventual state on (1, graph_test, 101).
+Here is pseudocode of what S2Graph does to provide a strong consistency level.</p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">complexity</span> <span class="o">=</span> <span class="n">O</span><span class="p">(</span><span class="n">one</span> <span class="n">read</span><span class="p">)</span> <span class="o">+</span> <span class="n">O</span><span class="p">(</span><span class="n">one</span> <span class="n">delete</span><span class="p">)</span> <span class="o">+</span> <span class="n">O</span><span class="p">(</span><span class="mi">2</span> <span class="n">put</span><span class="p">)</span>
+
+<span class="n">fetchedEdge</span> <span class="o">=</span> <span class="n">fetch</span> <span class="n">edge</span> <span class="k">with</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">graph_test</span><span class="p">,</span> <span class="mi">101</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">lookup</span> <span class="n">table</span><span class="o">.</span>
+
+<span class="k">if</span> <span class="n">fetchedEdge</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">exist</span><span class="p">:</span>
+       <span class="n">create</span> <span class="n">new</span> <span class="n">edge</span> <span class="n">same</span> <span class="k">as</span> <span class="n">current</span> <span class="n">insert</span> <span class="n">operation</span>
+       <span class="n">update</span> <span class="n">lookup</span> <span class="n">table</span> <span class="k">as</span> <span class="n">current</span> <span class="n">insert</span> <span class="n">operation</span>
+<span class="k">else</span><span class="p">:</span>
+       <span class="n">valid</span> <span class="o">=</span> <span class="n">compare</span> <span class="n">fetchedEdge</span> <span class="n">vs</span> <span class="n">current</span> <span class="n">insert</span> <span class="n">operation</span><span class="o">.</span>
+       <span class="k">if</span> <span class="n">valid</span><span class="p">:</span>
+       <span class="n">delete</span> <span class="n">fetchedEdge</span>
+       <span class="n">create</span> <span class="n">new</span> <span class="n">edge</span> <span class="n">after</span> <span class="n">comparing</span> <span class="n">fetchedEdge</span> <span class="ow">and</span> <span class="n">current</span> <span class="n">insert</span><span class="o">.</span>
+       <span class="n">update</span> <span class="n">lookup</span> <span class="n">table</span>
+</pre></div>
+</div>
+<p>Limitations Since S2Graph makes asynchronous writes to HBase via Asynchbase, there is no consistency guaranteed on same edge within its flushInterval (1 second).</p>
+</div>
+<div class="section" id="adding-extra-indices-optional">
+<h3>Adding Extra Indices (Optional)<a class="headerlink" href="#adding-extra-indices-optional" title="Permalink to this headline">¶</a></h3>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">POST</span> <span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">addIndex</span>
+</pre></div>
+</div>
+<p>A label can have multiple properties set as indexes. When edges are queried, the ordering will determined according to indexes, therefore, deciding which edges will be included in the top-K results.</p>
+<p><strong>Edge retrieval queries in S2Graph by default returns top-K edges. Clients must issue another query to fetch the next K edges, i.e., top-K ~ 2 x top-K</strong></p>
+<p>Edges sorted according to the indices in order to limit the number of edges being fetched by a query. If no ordering property is given, S2Graph will use the timestamp as an index, thus resulting in the most recent data.</p>
+<p><strong>It would be extremely difficult to fetch millions of edges and sort them at request time and return a top-K in a reasonable amount of time. Instead, S2Graph uses vertex-centric indexes to avoid this.
+Using a vertex-centric index, having millions of edges is fine as long as size K of the top-K values is reasonable (under 1K) Note that indexes must be created prior to inserting any data on the label (which is the same case with the conventional RDBMS).</strong></p>
+<p>New indexes can be dynamically added, but will not be applied to pre-existing data (support for this is planned for future versions). Currently, a label can have up to eight indices.
+The following is an example of adding index <code class="docutils literal notranslate"><span class="pre">play_count</span></code> to a label <code class="docutils literal notranslate"><span class="pre">graph_test</span></code>.</p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># add prop first</span>
+<span class="n">curl</span> <span class="o">-</span><span class="n">XPOST</span> <span class="n">localhost</span><span class="p">:</span><span class="mi">9000</span><span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">addProp</span><span class="o">/</span><span class="n">graph_test</span> <span class="o">-</span><span class="n">H</span> <span class="s1">&#39;Content-Type: Application/json&#39;</span> <span class="o">-</span><span class="n">d</span> <span class="s1">&#39;</span>
+<span class="p">{</span> <span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;play_count&quot;</span><span class="p">,</span> <span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;integer&quot;</span> <span class="p">}</span><span class="s1">&#39;</span>
+
+<span class="c1"># then add index</span>
+<span class="n">curl</span> <span class="o">-</span><span class="n">XPOST</span> <span class="n">localhost</span><span class="p">:</span><span class="mi">9000</span><span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">addIndex</span> <span class="o">-</span><span class="n">H</span> <span class="s1">&#39;Content-Type: Application/json&#39;</span> <span class="o">-</span><span class="n">d</span> <span class="s1">&#39;</span>
+<span class="p">{</span>
+  <span class="s2">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;graph_test&quot;</span><span class="p">,</span>
+   <span class="s2">&quot;indices&quot;</span><span class="p">:</span> <span class="p">[</span>
+     <span class="p">{</span> <span class="n">name</span><span class="p">:</span> <span class="s2">&quot;idx_play_count&quot;</span><span class="p">,</span> <span class="n">propNames</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;play-count&quot;</span><span class="p">]</span> <span class="p">}</span>
+   <span class="p">]</span>
+<span class="p">}</span><span class="s1">&#39;</span>
+</pre></div>
+</div>
+</div>
+</div>
+<div class="section" id="create-a-servicecolumn-optional">
+<h2>Create a ServiceColumn (Optional)<a class="headerlink" href="#create-a-servicecolumn-optional" title="Permalink to this headline">¶</a></h2>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">POST</span> <span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">createServiceColumn</span>
+</pre></div>
+</div>
+<p>If your use case requires props assigned to vertices instead of edges, what you need is a Service Column</p>
+<p><strong>Remark: If it is only the vertex id that you need and not additional props, there’s no need to create a Service Column explicitly. At label creation, by default, S2Graph creates column space with empty properties according to the label schema.</strong></p>
+<div class="section" id="service-column-fields">
+<h3>Service Column Fields<a class="headerlink" href="#service-column-fields" title="Permalink to this headline">¶</a></h3>
+<table border="1" class="colwidths-given docutils" id="id3">
+<caption><span class="caption-text">Option</span><a class="headerlink" href="#id3" title="Permalink to this table">¶</a></caption>
+<colgroup>
+<col width="11%" />
+<col width="22%" />
+<col width="22%" />
+<col width="22%" />
+<col width="22%" />
+</colgroup>
+<thead valign="bottom">
+<tr class="row-odd"><th class="head">Field Name</th>
+<th class="head">Definition</th>
+<th class="head">Data Type</th>
+<th class="head">Example</th>
+<th class="head">Note</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr class="row-even"><td>Field Name</td>
+<td>Definition</td>
+<td>Data Type</td>
+<td>Example</td>
+<td>Remarks</td>
+</tr>
+<tr class="row-odd"><td>serviceName</td>
+<td>Which service the Service Column belongs to</td>
+<td>String</td>
+<td>kakaotalk</td>
+<td>Required</td>
+</tr>
+<tr class="row-even"><td>columnName</td>
+<td>Service Column`s name</td>
+<td>String</td>
+<td>talk_user_id</td>
+<td>Required</td>
+</tr>
+<tr class="row-odd"><td>props</td>
+<td>Optional properties of Service Column</td>
+<td>JSON (array dictionaries)</td>
+<td>Please refer to the examples</td>
+<td>Optional</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="basic-service-column-operations">
+<h3>Basic Service Column Operations<a class="headerlink" href="#basic-service-column-operations" title="Permalink to this headline">¶</a></h3>
+<p>Here are some sample requests for Service Column creation as well as vertex insertion and selection.</p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">curl</span> <span class="o">-</span><span class="n">XPOST</span> <span class="n">localhost</span><span class="p">:</span><span class="mi">9000</span><span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">createServiceColumn</span> <span class="o">-</span><span class="n">H</span> <span class="s1">&#39;Content-Type: Application/json&#39;</span> <span class="o">-</span><span class="n">d</span> <span class="s1">&#39;</span>
+<span class="p">{</span>
+  <span class="s2">&quot;serviceName&quot;</span><span class="p">:</span> <span class="s2">&quot;s2graph&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;columnName&quot;</span><span class="p">:</span> <span class="s2">&quot;user_id&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;columnType&quot;</span><span class="p">:</span> <span class="s2">&quot;long&quot;</span><span class="p">,</span>
+  <span class="s2">&quot;props&quot;</span><span class="p">:</span> <span class="p">[</span>
+     <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;is_active&quot;</span><span class="p">,</span> <span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;boolean&quot;</span><span class="p">,</span> <span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="n">true</span><span class="p">},</span>
+     <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;phone_number&quot;</span><span class="p">,</span> <span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="s2">&quot;-&quot;</span><span class="p">},</span>
+     <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;nickname&quot;</span><span class="p">,</span> <span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="s2">&quot;..&quot;</span><span class="p">},</span>
+     <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;activity_score&quot;</span><span class="p">,</span> <span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;float&quot;</span><span class="p">,</span> <span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="mf">0.0</span><span class="p">},</span>
+     <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;age&quot;</span><span class="p">,</span> <span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;integer&quot;</span><span class="p">,</span> <span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">}</span>
+  <span class="p">]</span>
+<span class="p">}</span><span class="s1">&#39;</span>
+</pre></div>
+</div>
+<p>General information on a vertex schema can be retrieved with <code class="docutils literal notranslate"><span class="pre">/admin/getServiceColumn/{service</span> <span class="pre">name}/{column</span> <span class="pre">name}</span></code></p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">curl</span> <span class="o">-</span><span class="n">XGET</span> <span class="n">localhost</span><span class="p">:</span><span class="mi">9000</span><span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">getServiceColumn</span><span class="o">/</span><span class="n">s2graph</span><span class="o">/</span><span class="n">user_id</span>
+</pre></div>
+</div>
+<p>This will give all properties on serviceName <code class="docutils literal notranslate"><span class="pre">s2graph</span></code> and columnName <code class="docutils literal notranslate"><span class="pre">user_id</span></code> serviceColumn.
+Properties can be added to a Service Column with <code class="docutils literal notranslate"><span class="pre">/admin/addServiceColumnProps/{service</span> <span class="pre">name}/{column</span> <span class="pre">name}</span></code></p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">curl</span> <span class="o">-</span><span class="n">XPOST</span> <span class="n">localhost</span><span class="p">:</span><span class="mi">9000</span><span class="o">/</span><span class="n">admin</span><span class="o">/</span><span class="n">addServiceColumnProps</span><span class="o">/</span><span class="n">s2graph</span><span class="o">/</span><span class="n">user_id</span> <span class="o">-</span><span class="n">H</span> <span class="s1">&#39;Content-Type: Application/json&#39;</span> <span class="o">-</span><span class="n">d</span> <span class="s1">&#39;</span>
+<span class="p">[</span>
+  <span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;home_address&quot;</span><span class="p">,</span> <span class="s2">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="s2">&quot;korea&quot;</span><span class="p">,</span> <span class="s2">&quot;dataType&quot;</span><span class="p">:</span> <span class="s2">&quot;string&quot;</span><span class="p">}</span>
+<span class="p">]</span><span class="s1">&#39;</span>
+</pre></div>
+</div>
+<p>Vertices can be inserted to a Service Column using <code class="docutils literal notranslate"><span class="pre">/admin/vertices/insert/{service</span> <span class="pre">name}/{column</span> <span class="pre">name}</span></code></p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">curl</span> <span class="o">-</span><span class="n">XPOST</span> <span class="n">localhost</span><span class="p">:</span><span class="mi">9000</span><span class="o">/</span><span class="n">mutate</span><span class="o">/</span><span class="n">vertex</span><span class="o">/</span><span class="n">insert</span><span class="o">/</span><span class="n">s2graph</span><span class="o">/</span><span class="n">user_id</span> <span class="o">-</span><span class="n">H</span> <span class="s1">&#39;Content-Type: Application/json&#39;</span> <span class="o">-</span><span class="n">d</span> <span class="s1">&#39;</span>
+<span class="p">[</span>
+  <span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span><span class="s2">&quot;props&quot;</span><span class="p">:{</span><span class="s2">&quot;is_active&quot;</span><span class="p">:</span><span class="n">true</span><span class="p">},</span> <span class="s2">&quot;timestamp&quot;</span><span class="p">:</span><span class="mi">1417616431</span><span class="p">},</span>
+  <span class="p">{</span><span class="s2">&quot;id&quot;</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span><span class="s2">&quot;props&quot;</span><span class="p">:{},</span><span class="s2">&quot;timestamp&quot;</span><span class="p">:</span><span class="mi">1417616431</span><span class="p">}</span>
+<span class="p">]</span><span class="s1">&#39;</span>
+</pre></div>
+</div>
+<p>Finally, query your vertex via <code class="docutils literal notranslate"><span class="pre">/graphs/getVertices</span></code></p>
+<div class="code bash highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">curl</span> <span class="o">-</span><span class="n">XPOST</span> <span class="n">localhost</span><span class="p">:</span><span class="mi">9000</span><span class="o">/</span><span class="n">graphs</span><span class="o">/</span><span class="n">getVertices</span> <span class="o">-</span><span class="n">H</span> <span class="s1">&#39;Content-Type: Application/json&#39;</span> <span class="o">-</span><span class="n">d</span> <span class="s1">&#39;</span>
+<span class="p">[</span>
+  <span class="p">{</span><span class="s2">&quot;serviceName&quot;</span><span class="p">:</span> <span class="s2">&quot;s2graph&quot;</span><span class="p">,</span> <span class="s2">&quot;columnName&quot;</span><span class="p">:</span> <span class="s2">&quot;user_id&quot;</span><span class="p">,</span> <span class="s2">&quot;ids&quot;</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]}</span>
+<span class="p">]</span><span class="s1">&#39;</span>
+</pre></div>
+</div>
+</div>
+</div>
+</div>
+
+
+           </div>
+           
+          </div>
+          <footer>
+  
+    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
+      
+        <a href="../mutate/index.html" class="btn btn-neutral float-right" title="Mutate APIs" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
+      
+      
+        <a href="../index.html" class="btn btn-neutral float-left" title="HTTP API Glossary" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
+      
+    </div>
+  
+
+  <hr/>
+
+  <div role="contentinfo">
+    <p>
+        &copy; Copyright 2018, s2graph
+
+    </p>
+  </div>
+  Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. 
+
+</footer>
+
+        </div>
+      </div>
+
+    </section>
+
+  </div>
+  
+
+
+  <script type="text/javascript">
+      jQuery(function () {
+          SphinxRtdTheme.Navigation.enable(true);
+      });
+  </script>
+
+  
+  
+    
+   
+
+</body>
+</html>
\ No newline at end of file

Added: incubator/s2graph/site/docs/api/mutate/index.html
URL: http://svn.apache.org/viewvc/incubator/s2graph/site/docs/api/mutate/index.html?rev=1856470&view=auto
==============================================================================
--- incubator/s2graph/site/docs/api/mutate/index.html (added)
+++ incubator/s2graph/site/docs/api/mutate/index.html Thu Mar 28 11:04:32 2019
@@ -0,0 +1,233 @@
+
+
+<!DOCTYPE html>
+<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
+<head>
+  <meta charset="utf-8">
+  
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  
+  <title>Mutate APIs &mdash; S2Graph 0.0.2 documentation</title>
+  
+
+  
+  
+  
+  
+
+  
+  <script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
+  
+    
+      <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
+        <script type="text/javascript" src="../../_static/jquery.js"></script>
+        <script type="text/javascript" src="../../_static/underscore.js"></script>
+        <script type="text/javascript" src="../../_static/doctools.js"></script>
+        <script type="text/javascript" src="../../_static/language_data.js"></script>
+    
+    <script type="text/javascript" src="../../_static/js/theme.js"></script>
+
+    
+
+  
+  <link rel="stylesheet" href="../../_static/css/s2graph_style.css" type="text/css" />
+  <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+    <link rel="index" title="Index" href="../../genindex.html" />
+    <link rel="search" title="Search" href="../../search.html" />
+    <link rel="next" title="Manage Edges" href="mutate_edge.html" />
+    <link rel="prev" title="Management APIs" href="../management/index.html" /> 
+</head>
+
+<body class="wy-body-for-nav">
+
+   
+  <div class="wy-grid-for-nav">
+    
+    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
+      <div class="wy-side-scroll">
+        <div class="wy-side-nav-search" >
+          
+
+          
+            <a href="../../index.html" class="icon icon-home"> S2Graph
+          
+
+          
+          </a>
+
+          
+            
+            
+          
+
+          
+<div role="search">
+  <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
+    <input type="text" name="q" placeholder="Search docs" />
+    <input type="hidden" name="check_keywords" value="yes" />
+    <input type="hidden" name="area" value="default" />
+  </form>
+</div>
+
+          
+        </div>
+
+        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
+          
+            
+            
+              
+            
+            
+              <p class="caption"><span class="caption-text">S2Graph Documentation</span></p>
+<ul class="current">
+<li class="toctree-l1"><a class="reference internal" href="../../getting_started/index.html">Getting Started</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../getting_started/your_first_graph.html">Your First S2Graph</a></li>
+<li class="toctree-l1 current"><a class="reference internal" href="../index.html">HTTP API Glossary</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="../management/index.html">Management APIs</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Mutate APIs</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="mutate_edge.html">Manage Edges</a></li>
+<li class="toctree-l3"><a class="reference internal" href="mutate_vertex.html">Manage Vertices (Optional)</a></li>
+</ul>
+</li>
+<li class="toctree-l2"><a class="reference internal" href="../query/index.html">Query APIs</a></li>
+</ul>
+</li>
+</ul>
+
+            
+          
+        </div>
+      </div>
+    </nav>
+
+    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
+
+      
+      <nav class="wy-nav-top" aria-label="top navigation">
+        
+          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
+          <a href="../../index.html">S2Graph</a>
+        
+      </nav>
+
+
+      <div class="wy-nav-content">
+        
+        <div class="rst-content">
+        
+          
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<div role="navigation" aria-label="breadcrumbs navigation">
+
+  <ul class="wy-breadcrumbs">
+    
+      <li><a href="../../index.html">Docs</a> &raquo;</li>
+        
+          <li><a href="../index.html">HTTP API Glossary</a> &raquo;</li>
+        
+      <li>Mutate APIs</li>
+    
+    
+      <li class="wy-breadcrumbs-aside">
+        
+            
+            <a href="../../_sources/api/mutate/index.rst.txt" rel="nofollow"> View page source</a>
+          
+        
+      </li>
+    
+  </ul>
+
+  
+  <hr/>
+</div>
+          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
+           <div itemprop="articleBody">
+            
+  <div class="section" id="mutate-apis">
+<h1>Mutate APIs<a class="headerlink" href="#mutate-apis" title="Permalink to this headline">¶</a></h1>
+<p>Contents:</p>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="mutate_edge.html">Manage Edges</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="mutate_edge.html#edge-fields">Edge Fields</a></li>
+<li class="toctree-l2"><a class="reference internal" href="mutate_edge.html#basic-edge-operations">Basic Edge Operations</a></li>
+<li class="toctree-l2"><a class="reference internal" href="mutate_edge.html#strong-consistency">Strong Consistency</a></li>
+<li class="toctree-l2"><a class="reference internal" href="mutate_edge.html#weak-consistency">Weak Consistency</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="mutate_vertex.html">Manage Vertices (Optional)</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="mutate_vertex.html#vertex-fields">Vertex Fields</a></li>
+<li class="toctree-l2"><a class="reference internal" href="mutate_vertex.html#basic-vertex-operations">Basic Vertex Operations</a></li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+
+
+           </div>
+           
+          </div>
+          <footer>
+  
+    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
+      
+        <a href="mutate_edge.html" class="btn btn-neutral float-right" title="Manage Edges" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
+      
+      
+        <a href="../management/index.html" class="btn btn-neutral float-left" title="Management APIs" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
+      
+    </div>
+  
+
+  <hr/>
+
+  <div role="contentinfo">
+    <p>
+        &copy; Copyright 2018, s2graph
+
+    </p>
+  </div>
+  Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. 
+
+</footer>
+
+        </div>
+      </div>
+
+    </section>
+
+  </div>
+  
+
+
+  <script type="text/javascript">
+      jQuery(function () {
+          SphinxRtdTheme.Navigation.enable(true);
+      });
+  </script>
+
+  
+  
+    
+   
+
+</body>
+</html>
\ No newline at end of file