Using ipython-gremlin

The following guide demonstrates the usage of ipython-gremlin through an example interactive live session. It assumes that an instance of Gremlin Server version 3.2.4 is running is running at localhost:8182 using the gremlin-server-modern.yaml configuration file:

$ ./bin/gremlin-server.sh conf/gremlin-server-modern.yaml

Using Gremlin Magic

The first thing to do is load the extension:

In [1]: %load_ext gremlin

By default, ipython-gremlin will connect to ws://localhost:8182/gremlin. This can be changed at the beginning of the session by configuring the GremlinMagic object, but the easy way to do this is to simply set the current connection to the desired url:

In [2]: %gremlin.connection.set_current ws://localhost:8182/gremlin
Alias-- localhost --created for database at ws://localhost:8182/gremlin

Notice the output stating that an alias has been created for this connection. Connection aliases will be further discussed later in this document.

Line Magic

The first two statements shown here use what is called “line magic”, which is denoted by the % symbol followed by a command name as well as any number of arguments.

Line magic is generally the best way to use ipython-gremlin, as it allows you to bind the results of a magic traversal to a variable, or integrate with Python code in other ways:

In [3]: verts = %gremlin g.V()

In [4]: verts
Out[4]: [v[1], v[2], v[3], v[4], v[5], v[6]]

In [5]: for v in verts:
   ...:     vid = v.id
   ...:     props = %gremlin g.V(vid).properties()
   ...:     print(props)
   [vp[name->marko], vp[age->29]]
   [vp[name->vadas], vp[age->27]]
   [vp[name->lop], vp[lang->java]]
   [vp[name->josh], vp[age->32]]
   [vp[name->ripple], vp[lang->java]]
   [vp[name->peter], vp[age->35]]

Notice that ipython-gremlin can detect bindings stored in the user namespace:

In [6]: vid = 1

In [7]: %gremlin g.V(vid)
Out[7]: [v[1]]

Cell Magic

ipython-gremlin also supports “cell magic”, denoted by %%. This allows multi-line traversals to be submitted to the server. The downside to cell magic is that the results cannot be bound to a variable in the IPython namespace. Regardless, it can be useful for things like creating elements or executing management commands:

In [8]: %%gremlin
    ...: graph.addVertex('dog').property('name', 'ewok')
    ...: // ... do stuff ...
Out[8]: [v[13]]

Integration with pandas and networkx

When possible, results generated by traversal can be converted into pandas.DataFrame and networkx.MultiDiGraph objects. This helps facilitate plotting, transformation, and analysis.

pandas

Gremlin traversals can produce complex results and nested datastructures that are difficult to map to a two dimensional table. Despite this, many traversals return relatively simple results that are easy to translate to a tabular structure. For example:

In [9]: values = %gremlin g.V().valueMap(true)

In [10]: values.dataframe
Out[10]:
    age  id     label    lang      name
0  [29]   1    person     NaN   [marko]
1  [27]   2    person     NaN   [vadas]
2   NaN   3  software  [java]     [lop]
3  [32]   4    person     NaN    [josh]
4   NaN   5  software  [java]  [ripple]
5  [35]   6    person     NaN   [peter]

In [11]: edges = %gremlin g.E()

In [12]: edges.dataframe
Out[12]:
   id  inV    label  outV
0   7    2    knows     1
1   8    4    knows     1
2   9    3  created     1
3  10    5  created     4
4  11    3  created     4
5  12    3  created     6

NetworkX

When a traversal returns a collection of elements, they can be used to produce a NetworkX graph. Typically a container of edges or paths is the best way to utilize this functionality:

In [13]: edges.graph
Out[13]: <networkx.classes.multidigraph.MultiDiGraph at 0x7f806b8ee828>

In [14]: paths = %gremlin g.V().outE().inV().outE().inV().path()

In [15]: paths.graph
Out[15]: <networkx.classes.multidigraph.MultiDiGraph at 0x7f806b8a2208>

Managing Connections

Typically, Gremlin-Python manages connections using a Cluster object that maintains connection pools to a series of hosts specified using configuration parameters. ipython-gremlin has a simpler use case than many apps using Gremlin-Python or aiogremlin, and therefore doesn’t use a Cluster under the hood. Instead, it manages a registry of simple connections to individual hosts. To add a new host, simply use the line magic shown above:

In [16]: %gremlin.connection.set_current ws://davebshow@myhost:8182/gremlin
Alias-- davebshow@myhost --created for database at ws://localhost:8182/gremlin

If necessary, this creates a new connection to the specified host, and sets this connection as the current connection to be used by ipython-gremlin. An alias for this connection is created automagically, which can be used to refer to this connection. For example, to switch back to the default localhost connection:

In [17]: %gremlin.connection.set_current localhost
Now using connection at ws://localhost:8182/gremlin

Connection Aliases

ipython-gremlin allows the creation of custom aliases. If it is the first time a connection is created (using %gremlin.connection.set_current), the alias can be set during creation:

In [18]: %gremlin.connection.set_current ws://localhost:8182/gremlin as TestDB
Alias-- TestDB --created for database at ws://localhost:8182/gremlin
Now using connection at ws://localhost:8182/gremlin

For an existing connection, an alias can be set using the $gremlin.connection.set_alias line magic:

In [19]: %gremlin.connection.set_alias ws://localhost:8182/gremlin as TestDB2
Alias-- TestDB2 --created for database at ws://localhost:8182/gremlin

Getting the Current Connection

The current connection can be accessed using the line magic %gremlin.connection.current:

In [20]: %gremlin.connection.current
Out[20]: Connection at ws://localhost:8182/gremlin aliased as localhost

Cell Magic and Connection Management

Connections can also be managed using cell magic (%%gremlin). Connections are created, aliased, and set as current simply by passing a connection string on the first line of the cell:

In [21]: %%gremlin ws://localhost:8182/gremlin as MyHost
...: g.V()
...:
Out[21]: [v[1], v[2], v[3], v[4], v[5], v[6]]

In [22]: %%gremlin MyHost
   ...: g.V()
   ...:
Out[22]: [v[1], v[2], v[3], v[4], v[5], v[6]]

Closing Connections

ipython-gremlin tries to clean up conextions using the atexit module, but it is a good idea to explicitly close connections at the end of the interactive session. This is done using line magic:

In [23]: %gremlin.connection.close

Or, more simply:

In [24]: %gremlin.close

To close an individual connection, pass a valid connection string as an argument to %gremlin.connection.close:

In [25]: %gremlin.connection.close localhost

Configuration

GremlinMagic also supports the Configurable interface. It provides a range of connection configuration options. These options are displayed using the %config cell magic:

In [26]: %config GremlinMagic
GremlinMagic options
------------------
GremlinMagic.aliases=<Dict>
    Current: {'g': 'g'}
    Aliases for underlying graph
GremlinMagic.password=<Unicode>
    Current: ''
    Password used in SASL authentication
GremlinMagic.response_timeout=<Float>
    Current: None
    Timeout for server response
GremlinMagic.ssl_context=<Instance>
    Current: None
    `ssl.SSLContext` object for SSL
GremlinMagic.uri=<Unicode>
    Current: 'ws://localhost:8182/gremlin'
    Default database URI if none is defined inline
GremlinMagic.username=<Unicode>
    Current: ''
    Username used in SASL authentication

Changing this configuration is easy:

In [27]: %config GremlinMagic.username = 'davebshow'

In [28]: %config GremlinMagic.username
Out[28]: 'davebshow'

NOTE Configuration changes do not affect connections that have already been established. Please update configuration before performing other %gremlin line magic.

That’s it! I hope you enjoy using ipython-gremlin!