Reputation: 942
I want to use Java API to manipulate graph on a remote server, the server actually hosts in localhost. The code I use to connect server is:
JanusGraphFactory.Builder b = JanusGraphFactory.build();
b.set("hosts", "[localhost]");
JanusGraph graph = b.open();
But after I run the program, it throws exception like this:
Exception in thread "main" java.lang.IllegalStateException: Need to set configuration value: root.storage.backend
So how can I connect to a remote JanusGraph server using Java API?
Upvotes: 14
Views: 8781
Reputation: 522
Most of the answers are now outdated.
To remote connect any TinkerPop3 graph database, we need to make cluster object.
Using this cluster object, we can get graphTraversalSource
.
To release the connection pool, both objects need to close when the program ends.
private static Cluster cluster;
private static GraphTraversalSource gts;
private static void init() {
cluster = Cluster.build()
.addContactPoint(uri)
.port(port)
.serializer(Serializers.GRYO_V3D0)
.maxInProcessPerConnection(32)
.maxSimultaneousUsagePerConnection(32)
.maxContentLength(10000000)
.maxWaitForConnection(10)
.minConnectionPoolSize(poolSize)
.maxConnectionPoolSize(poolSize+5)
.create();
gts = AnonymousTraversalSource
.traversal()
.withRemote(DriverRemoteConnection.using(cluster));
}
public GraphTraversalSource getConnection() {
return gts;
}
public static void finalise() throws Exception {
gts.close();
cluster.close();
}
GraphTraversalSource
is a thread-safe object and should ideally be a singleton.
Each graphTraversalSource
object keeps its connection pool within its context.
Upvotes: 6
Reputation: 13845
Use the following code:
JanusGraphFactory.Builder config = JanusGraphFactory.build();
config.set("storage.backend", "cassandrathrift");
config.set("storage.cassandra.keyspace", "graph1");
config.set("storage.hostname", "127.0.0.1");
JanusGraph graph = config.open();
Upvotes: 0
Reputation: 339
Check RemoteGraph in janusgraph examples.
You can find under Class RemoteGraphApp how you can connect to remote janusgraph server (Cluster).
conf = new PropertiesConfiguration(propFileName);
// using the remote driver for schema
try {
cluster = Cluster.open(conf.getString("gremlin.remote.driver.clusterFile"));
client = cluster.connect();
} catch (Exception e) {
throw new ConfigurationException(e);
}
// using the remote graph for queries
graph = EmptyGraph.instance();
g = graph.traversal().withRemote(conf);
where the cluster config file contains:
hosts: [127.0.0.1]
port: 8182
serializer: {
className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0,
config: {
ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry]
}
}
Upvotes: 1
Reputation: 119
Here is a simple way:
graph = JanusGraphFactory.open("conf/janusgraph-cassandra-solr.properties")
juno = graph.addVertex() //Automatically opens a new transaction
juno.property("name", "juno")
graph.tx().commit() //Commits transaction
Janus uses an existing storage solution like cassandra, hbase, berkelydb to store data.
You can connect by 2 ways: 1 - Connect to the remote gremlin server and execute traversal/queries remotely. This is by using the Cluster and EmptyGraph of tinkerpop gremlin 2 - Connect directly from your application using the technique i suggested int his post above.
Pros/Cons of connecting to the remote gremlin server
Pros
Cons
BY connecting directly from your client code (avoiding the remote connection) you get much more control.
Also, you can use the JanusGraph instance directly in your code, which is still gremlin complaint, to take full advantage of the JanusGraph API's.
Upvotes: 5
Reputation: 384
The documentation I've found suggests to create an EmtpyGraph and get a remote traversal from that one:
EmptyGraph.instance().traversal().withRemote(config);
where config is your a configuration object with the remote properties, e.g:
config.setProperty("clusterConfiguration.hosts", HOST);
config.setProperty("clusterConfiguration.port", PORT);
config.setProperty("clusterConfiguration.serializer.className", "org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0");
config.setProperty("clusterConfiguration.serializer.config.ioRegistries", ioRegistries); // (e.g. [ org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry) ]
config.setProperty("gremlin.remote.remoteConnectionClass", "org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection");
config.setProperty("gremlin.remote.driver.sourceName", "g");
However, I've run into issues using JanusGraph specific features (for example committing a transaction) with this since the graph instance is the EmptyGraph itself, not a JanusGraph. So, try:
GraphTraversalSource g = JanusGraphFactory.open("inmemory").traversal().withRemote(config);
This will give you a traversal source to the remote gremlin-server, and you can do things like g.addV("vertexLabel")....; , g.tx().commit(); and so on.
Upvotes: 9
Reputation: 381
Try this:
JanusGraphFactory.Builder builder = JanusGraphFactory.build().
set("storage.hostname", "localhost").
set('storage.backend', 'cassandra') //or whatever you are using as backend
builder.open();
Upvotes: 2