<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>devkuma – Gremlin</title>
    <link>https://www.devkuma.com/en/tags/gremlin/</link>
    <image>
      <url>https://www.devkuma.com/en/tags/gremlin/logo/180x180.jpg</url>
      <title>Gremlin</title>
      <link>https://www.devkuma.com/en/tags/gremlin/</link>
    </image>
    <description>Recent content in Gremlin on devkuma</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <managingEditor>kc@example.com (kc kim)</managingEditor>
    <webMaster>kc@example.com (kc kim)</webMaster>
    <copyright>The devkuma</copyright>
    
	  <atom:link href="https://www.devkuma.com/en/tags/gremlin/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Graph Database Quick Start Guide</title>
      <link>https://www.devkuma.com/en/docs/graph-database/quick-start/</link>
      <pubDate>Wed, 27 Jul 2022 07:48:00 +0900</pubDate>
      <author>kc@example.com (kc kim)</author>
      <guid>https://www.devkuma.com/en/docs/graph-database/quick-start/</guid>
      <description>
        
        
        &lt;h2 id=&#34;what-is-a-graph-database&#34;&gt;What is a graph database?&lt;/h2&gt;
&lt;p&gt;A graph database stores and processes graph structures. Relational databases model data as tables and can represent relationships, but doing so often requires careful schemas, complex queries, and expensive joins. Graph databases model connected data much like a whiteboard diagram. They are intuitive for connected data but less suitable for unrelated records.&lt;/p&gt;
&lt;h3 id=&#34;property-graph-model&#34;&gt;Property graph model&lt;/h3&gt;
&lt;p&gt;&lt;img src=&#34;https://www.devkuma.com/docs/graph-database/graph-data-model.png&#34; alt=&#34;Graph data model&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A graph contains nodes (vertices) and edges.&lt;/li&gt;
&lt;li&gt;Nodes have labels and key-value properties.&lt;/li&gt;
&lt;li&gt;Edges have labels, directions, start nodes, and end nodes.&lt;/li&gt;
&lt;li&gt;Edges can also have properties.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;try-a-graph-database&#34;&gt;Try a graph database&lt;/h2&gt;
&lt;p&gt;Clone the air-route sample from &lt;em&gt;Practical Gremlin&lt;/em&gt; and run TinkerGraph through Docker:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;% git clone https://github.com/krlawrence/graph.git
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;% cd graph/sample-data
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;% docker run -it --rm -v `pwd`:/mydata tinkerpop/gremlin-console
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gremlin&amp;gt; :load /mydata/load-air-routes-graph-34.groovy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;explore-the-graph-with-gremlin&#34;&gt;Explore the graph with Gremlin&lt;/h2&gt;
&lt;p&gt;Gremlin traversals conventionally begin with &lt;code&gt;g&lt;/code&gt;, the graph traversal source.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gremlin&amp;gt; g.V().count()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;3619
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gremlin&amp;gt; g.V().hasLabel(&amp;#39;airport&amp;#39;).count()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;3374
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gremlin&amp;gt; g.V().hasLabel(&amp;#39;airport&amp;#39;).has(&amp;#39;code&amp;#39;,&amp;#39;ICN&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;v[122]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gremlin&amp;gt; g.V().hasLabel(&amp;#39;airport&amp;#39;).has(&amp;#39;code&amp;#39;,&amp;#39;ICN&amp;#39;).valueMap()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;[country:[KR],code:[ICN],city:[Seoul],icao:[RKSI],runways:[3]]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;V()&lt;/code&gt; selects vertices, &lt;code&gt;hasLabel&lt;/code&gt; filters labels, &lt;code&gt;has&lt;/code&gt; filters properties, and &lt;code&gt;valueMap&lt;/code&gt; returns properties.&lt;/p&gt;
&lt;h3 id=&#34;follow-relationships&#34;&gt;Follow relationships&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gremlin&amp;gt; g.V().hasLabel(&amp;#39;airport&amp;#39;).has(&amp;#39;code&amp;#39;,&amp;#39;ICN&amp;#39;).out(&amp;#39;route&amp;#39;).count()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;144
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gremlin&amp;gt; g.V().hasLabel(&amp;#39;airport&amp;#39;).has(&amp;#39;code&amp;#39;,&amp;#39;ICN&amp;#39;).out(&amp;#39;route&amp;#39;).values(&amp;#39;code&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;BKK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;SVO
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;HND
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With one connection, duplicate destinations produce 11,386 paths. &lt;code&gt;dedup()&lt;/code&gt; reduces these to 1,817 unique airports:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gremlin&amp;gt; g.V().hasLabel(&amp;#39;airport&amp;#39;).has(&amp;#39;code&amp;#39;,&amp;#39;ICN&amp;#39;).out(&amp;#39;route&amp;#39;).out(&amp;#39;route&amp;#39;).dedup().count()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;1817
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Exclude destinations already reachable nonstop:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gremlin&amp;gt; g.V().hasLabel(&amp;#39;airport&amp;#39;).has(&amp;#39;code&amp;#39;,&amp;#39;ICN&amp;#39;).out(&amp;#39;route&amp;#39;).aggregate(&amp;#39;nonstop&amp;#39;).out(&amp;#39;route&amp;#39;).where(without(&amp;#39;nonstop&amp;#39;)).dedup().count()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;1673
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Find two-leg routes from Incheon to Gimpo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gremlin&amp;gt; g.V().hasLabel(&amp;#39;airport&amp;#39;).has(&amp;#39;code&amp;#39;,&amp;#39;ICN&amp;#39;).out(&amp;#39;route&amp;#39;).out(&amp;#39;route&amp;#39;).has(&amp;#39;code&amp;#39;,&amp;#39;GMP&amp;#39;).path().by(&amp;#39;code&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;[ICN,HND,GMP]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;[ICN,KIX,GMP]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;[ICN,NGO,GMP]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;[ICN,CJU,GMP]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;[ICN,PEK,GMP]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Count routes from Korean airports to Japan by origin:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gremlin&amp;gt; g.V().hasLabel(&amp;#39;airport&amp;#39;).has(&amp;#39;country&amp;#39;,&amp;#39;KR&amp;#39;).as(&amp;#39;kr&amp;#39;).out(&amp;#39;route&amp;#39;).has(&amp;#39;country&amp;#39;,&amp;#39;JP&amp;#39;).select(&amp;#39;kr&amp;#39;).groupCount().by(&amp;#39;code&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;[ICN:27,TAE:5,GMP:3,CJU:4,PUS:6]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Find the longest route by traversing edges and ordering their &lt;code&gt;dist&lt;/code&gt; property:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gremlin&amp;gt; g.V().hasLabel(&amp;#39;airport&amp;#39;).has(&amp;#39;country&amp;#39;,&amp;#39;KR&amp;#39;).outE(&amp;#39;route&amp;#39;).order().by(&amp;#39;dist&amp;#39;,desc).inV().has(&amp;#39;country&amp;#39;,&amp;#39;JP&amp;#39;).path().by(&amp;#39;code&amp;#39;).by(&amp;#39;dist&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;==&amp;gt;[ICN,882,CTS]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;strengths-and-challenges&#34;&gt;Strengths and challenges&lt;/h2&gt;
&lt;p&gt;Graph databases make connected data easy to traverse, but performance still declines when a traversal touches huge numbers of nodes or edges—for example, millions of followers of a celebrity. Design the graph around common queries, write efficient traversals, and keep data in other database systems when it does not benefit from graph storage.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://kelvinlawrence.net/book/Gremlin-Graph-Guide.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Practical Gremlin&lt;i class=&#34;fas fa-external-link-alt&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.oreilly.com/library/view/graph-databases/9781449356255/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;O&amp;rsquo;Reilly Graph Databases&lt;i class=&#34;fas fa-external-link-alt&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://tinkerpop.apache.org/docs/current/reference/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;TinkerPop documentation&lt;i class=&#34;fas fa-external-link-alt&#34;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
      
      <category>Database</category>
      
      <category>Graph Database</category>
      
      <category>Gremlin</category>
      
    </item>
    
  </channel>
</rss>
