JanusGraph
This tutorial describes how to set up JanusGraph to work with YugabyteDB and use the Gremlin console to load some data and run some graph commands.
Prerequisites
To use JanusGraph with YugabyteDB, you need the following:
-
Install YugabyteDB and start a single node local cluster. Refer to Quick start.
-
JanusGraph. You can download from the JanusGraph downloads page. This tutorial uses v0.6.2.
$ wget https://github.com/JanusGraph/janusgraph/releases/download/v0.6.2/janusgraph-0.6.2.zip $ unzip janusgraph-0.6.2.zip $ cd janusgraph-0.6.2/lib
-
Download cassandra-driver-core-3.8.0-yb-6.jar and copy it into
janusgraph-0.6.2/lib
.Rename the existing Cassandra driver:
mv cassandra-driver-core-3.1.4.jar cassandra-driver-core-3.1.4.jar.orig
Run JanusGraph with YugabyteDB
Start the Gremlin console by running the following:
$ ./bin/gremlin.sh
You should see output similar to the following:
\,,,/
(o o)
-----oOOo-(3)-oOOo-----
plugin activated: janusgraph.imports
plugin activated: tinkerpop.server
plugin activated: tinkerpop.utilities
plugin activated: tinkerpop.hadoop
plugin activated: tinkerpop.spark
plugin activated: tinkerpop.tinkergraph
gremlin>
Use the YCQL configuration to initialize JanusGraph to talk to YugabyteDB.
gremlin> graph = JanusGraphFactory.open('conf/janusgraph-cql.properties')
==>standardjanusgraph[cql:[127.0.0.1]]
Open the YugabyteDB Admin console to verify that the janusgraph
keyspace and the necessary tables were created by navigating to http://localhost:7000/ (replace localhost
with the IP address of any master node in a remote deployment). You should see the following:
Load sample data
You can load the sample data that JanusGraph ships with - the Graph of the Gods. You can do this by running the following:
gremlin> GraphOfTheGodsFactory.loadWithoutMixedIndex(graph,true)
==>null
gremlin> g = graph.traversal()
==>graphtraversalsource[standardjanusgraph[cql:[127.0.0.1]], standard]
For reference, the following illustration shows the data loaded by the Graph of the Gods. For more information about the dataset, refer to Basic usage in the JanusGraph documentation.
Examples
The following examples are derived from the examples in the JanusGraph documentation.
Graph traversal
Queries about Hercules
Retrieve the Saturn vertex.
gremlin> saturn = g.V().has('name', 'saturn').next()
==>v[4168]
Who is Saturn's grandchild?
gremlin> g.V(saturn).in('father').in('father').values('name')
==>hercules
Retrieve the Hercules vertex.
gremlin> hercules = g.V(saturn).repeat(__.in('father')).times(2).next()
==>v[4120]
Who were the parents of Hercules?
gremlin> g.V(hercules).out('father', 'mother').values('name')
==>jupiter
==>alcmene
Were the parents of Hercules gods or humans?
gremlin> g.V(hercules).out('father', 'mother').label()
==>god
==>human
Who did Hercules battle?
gremlin> g.V(hercules).out('battled').valueMap()
==>[name:[hydra]]
==>[name:[nemean]]
==>[name:[cerberus]]
Who did Hercules battle after time 1?
gremlin> g.V(hercules).outE('battled').has('time', gt(1)).inV().values('name')
==>cerberus
==>hydra
Complex graph traversal
Retrieve the Pluto vertex.
gremlin> pluto = g.V().has('name', 'pluto').next()
==>v[8416]
Who are Pluto's cohabitants?
gremlin> g.V(pluto).out('lives').in('lives').values('name')
==>pluto
==>cerberus
Pluto can't be his own cohabitant:
gremlin> g.V(pluto).out('lives').in('lives').where(is(neq(pluto))).values('name')
==>cerberus
gremlin> g.V(pluto).as('x').out('lives').in('lives').where(neq('x')).values('name')
==>cerberus
Queries about Pluto's Brothers
Where do Pluto's brothers live?
gremlin> g.V(pluto).out('brother').out('lives').values('name')
==>sea
==>sky
Which brother lives in which place?
gremlin> g.V(pluto).out('brother').as('god').out('lives').as('place').select('god', 'place')
==>[god:v[4248],place:v[4320]]
==>[god:v[8240],place:v[4144]]
What is the name of the brother and the name of the place?
gremlin> g.V(pluto).out('brother').as('god').out('lives').as('place').select('god', 'place').by('name')
==>[god:neptune,place:sea]
==>[god:jupiter,place:sky]
Global graph index
Show all events that occurred in 50 kilometers of Athens (latitude:37.97 and long:23.72).
gremlin> g.E().has('place', geoWithin(Geoshape.circle(37.97, 23.72, 50)))
==>e[4cj-36g-7x1-6c8][4120-battled->8216]
==>e[3yb-36g-7x1-9io][4120-battled->12336]
For events that occurred in 50 kilometers of Athens, show who battled whom.
gremlin> g.E().has('place', geoWithin(Geoshape.circle(37.97, 23.72, 50))).as('source').inV().as('god2').select('source').outV().as('god1').select('god1', 'god2').by('name')
==>[god1:hercules,god2:hydra]
==>[god1:hercules,god2:nemean]