blob: 61cc7a8964e3f56fde6a88eb4096b39159c490f7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.tinkerpop.gremlin.tinkergraph.structure;
import org.apache.commons.configuration2.BaseConfiguration;
import org.apache.commons.configuration2.Configuration;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
import java.io.File;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import static org.apache.tinkerpop.gremlin.structure.io.IoCore.gryo;
/**
* Helps create a variety of different toy graphs for testing and learning purposes.
*
* @author Marko A. Rodriguez (http://markorodriguez.com)
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
public final class TinkerFactory {
private TinkerFactory() {}
/**
* Create the "classic" graph which was the original toy graph from TinkerPop 2.x.
*/
public static TinkerGraph createClassic() {
final Configuration conf = new BaseConfiguration();
conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_ID_MANAGER, TinkerGraph.DefaultIdManager.INTEGER.name());
conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_EDGE_ID_MANAGER, TinkerGraph.DefaultIdManager.INTEGER.name());
conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_PROPERTY_ID_MANAGER, TinkerGraph.DefaultIdManager.INTEGER.name());
final TinkerGraph g = TinkerGraph.open(conf);
generateClassic(g);
return g;
}
/**
* Generate the graph in {@link #createClassic()} into an existing graph.
*/
public static void generateClassic(final TinkerGraph g) {
final Vertex marko = g.addVertex(T.id, 1, "name", "marko", "age", 29);
final Vertex vadas = g.addVertex(T.id, 2, "name", "vadas", "age", 27);
final Vertex lop = g.addVertex(T.id, 3, "name", "lop", "lang", "java");
final Vertex josh = g.addVertex(T.id, 4, "name", "josh", "age", 32);
final Vertex ripple = g.addVertex(T.id, 5, "name", "ripple", "lang", "java");
final Vertex peter = g.addVertex(T.id, 6, "name", "peter", "age", 35);
marko.addEdge("knows", vadas, T.id, 7, "weight", 0.5f);
marko.addEdge("knows", josh, T.id, 8, "weight", 1.0f);
marko.addEdge("created", lop, T.id, 9, "weight", 0.4f);
josh.addEdge("created", ripple, T.id, 10, "weight", 1.0f);
josh.addEdge("created", lop, T.id, 11, "weight", 0.4f);
peter.addEdge("created", lop, T.id, 12, "weight", 0.2f);
}
/**
* Create the "modern" graph which has the same structure as the "classic" graph from TinkerPop 2.x but includes
* 3.x features like vertex labels.
*/
public static TinkerGraph createModern() {
final TinkerGraph g = getTinkerGraphWithNumberManager();
generateModern(g);
return g;
}
/**
* Generate the graph in {@link #createModern()} into an existing graph.
*/
public static void generateModern(final TinkerGraph g) {
final Vertex marko = g.addVertex(T.id, 1, T.label, "person", "name", "marko", "age", 29);
final Vertex vadas = g.addVertex(T.id, 2, T.label, "person", "name", "vadas", "age", 27);
final Vertex lop = g.addVertex(T.id, 3, T.label, "software", "name", "lop", "lang", "java");
final Vertex josh = g.addVertex(T.id, 4, T.label, "person", "name", "josh", "age", 32);
final Vertex ripple = g.addVertex(T.id, 5, T.label, "software", "name", "ripple", "lang", "java");
final Vertex peter = g.addVertex(T.id, 6, T.label, "person", "name", "peter", "age", 35);
marko.addEdge("knows", vadas, T.id, 7, "weight", 0.5d);
marko.addEdge("knows", josh, T.id, 8, "weight", 1.0d);
marko.addEdge("created", lop, T.id, 9, "weight", 0.4d);
josh.addEdge("created", ripple, T.id, 10, "weight", 1.0d);
josh.addEdge("created", lop, T.id, 11, "weight", 0.4d);
peter.addEdge("created", lop, T.id, 12, "weight", 0.2d);
}
/**
* Create the "the crew" graph which is a TinkerPop 3.x toy graph showcasing many 3.x features like meta-properties,
* multi-properties and graph variables.
*/
public static TinkerGraph createTheCrew() {
final Configuration conf = getNumberIdManagerConfiguration();
conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_DEFAULT_VERTEX_PROPERTY_CARDINALITY, VertexProperty.Cardinality.list.name());
final TinkerGraph g = TinkerGraph.open(conf);
generateTheCrew(g);
return g;
}
/**
* Generate the graph in {@link #createTheCrew()} into an existing graph.
*/
public static void generateTheCrew(final TinkerGraph g) {
final Vertex marko = g.addVertex(T.id, 1, T.label, "person", "name", "marko");
final Vertex stephen = g.addVertex(T.id, 7, T.label, "person", "name", "stephen");
final Vertex matthias = g.addVertex(T.id, 8, T.label, "person", "name", "matthias");
final Vertex daniel = g.addVertex(T.id, 9, T.label, "person", "name", "daniel");
final Vertex gremlin = g.addVertex(T.id, 10, T.label, "software", "name", "gremlin");
final Vertex tinkergraph = g.addVertex(T.id, 11, T.label, "software", "name", "tinkergraph");
marko.property(VertexProperty.Cardinality.list, "location", "san diego", "startTime", 1997, "endTime", 2001);
marko.property(VertexProperty.Cardinality.list, "location", "santa cruz", "startTime", 2001, "endTime", 2004);
marko.property(VertexProperty.Cardinality.list, "location", "brussels", "startTime", 2004, "endTime", 2005);
marko.property(VertexProperty.Cardinality.list, "location", "santa fe", "startTime", 2005);
stephen.property(VertexProperty.Cardinality.list, "location", "centreville", "startTime", 1990, "endTime", 2000);
stephen.property(VertexProperty.Cardinality.list, "location", "dulles", "startTime", 2000, "endTime", 2006);
stephen.property(VertexProperty.Cardinality.list, "location", "purcellville", "startTime", 2006);
matthias.property(VertexProperty.Cardinality.list, "location", "bremen", "startTime", 2004, "endTime", 2007);
matthias.property(VertexProperty.Cardinality.list, "location", "baltimore", "startTime", 2007, "endTime", 2011);
matthias.property(VertexProperty.Cardinality.list, "location", "oakland", "startTime", 2011, "endTime", 2014);
matthias.property(VertexProperty.Cardinality.list, "location", "seattle", "startTime", 2014);
daniel.property(VertexProperty.Cardinality.list, "location", "spremberg", "startTime", 1982, "endTime", 2005);
daniel.property(VertexProperty.Cardinality.list, "location", "kaiserslautern", "startTime", 2005, "endTime", 2009);
daniel.property(VertexProperty.Cardinality.list, "location", "aachen", "startTime", 2009);
marko.addEdge("develops", gremlin, T.id, 13, "since", 2009);
marko.addEdge("develops", tinkergraph, T.id, 14, "since", 2010);
marko.addEdge("uses", gremlin, T.id, 15, "skill", 4);
marko.addEdge("uses", tinkergraph, T.id, 16, "skill", 5);
stephen.addEdge("develops", gremlin, T.id, 17, "since", 2010);
stephen.addEdge("develops", tinkergraph, T.id, 18, "since", 2011);
stephen.addEdge("uses", gremlin, T.id, 19, "skill", 5);
stephen.addEdge("uses", tinkergraph, T.id, 20, "skill", 4);
matthias.addEdge("develops", gremlin, T.id, 21, "since", 2012);
matthias.addEdge("uses", gremlin, T.id, 22, "skill", 3);
matthias.addEdge("uses", tinkergraph, T.id, 23, "skill", 3);
daniel.addEdge("uses", gremlin, T.id, 24, "skill", 5);
daniel.addEdge("uses", tinkergraph, T.id, 25, "skill", 3);
gremlin.addEdge("traverses", tinkergraph, T.id, 26);
g.variables().set("creator", "marko");
g.variables().set("lastModified", 2014);
g.variables().set("comment", "this graph was created to provide examples and test coverage for tinkerpop3 api advances");
}
/**
* Creates the "kitchen sink" graph which is a collection of structures (e.g. self-loops) that aren't represented
* in other graphs and are useful for various testing scenarios.
*/
public static TinkerGraph createKitchenSink() {
final TinkerGraph g = getTinkerGraphWithNumberManager();
generateKitchenSink(g);
return g;
}
/**
* Generate the graph in {@link #createKitchenSink()} into an existing graph.
*/
public static void generateKitchenSink(final TinkerGraph graph) {
final GraphTraversalSource g = graph.traversal();
g.addV("loops").property(T.id, 1000).property("name", "loop").as("me").
addE("self").to("me").property(T.id, 1001).
iterate();
g.addV("message").property(T.id, 2000).property("name", "a").as("a").
addV("message").property(T.id, 2001).property("name", "b").as("b").
addE("link").from("a").to("b").property(T.id, 2002).
addE("link").from("a").to("a").property(T.id, 2003).iterate();
}
/**
* Creates the "grateful dead" graph which is a larger graph than most of the toy graphs but has real-world
* structure and application and is therefore useful for demonstrating more complex traversals.
*/
public static TinkerGraph createGratefulDead() {
final TinkerGraph g = getTinkerGraphWithNumberManager();
generateGratefulDead(g);
return g;
}
/**
* Generate the graph in {@link #createGratefulDead()} into an existing graph.
*/
public static void generateGratefulDead(final TinkerGraph graph) {
final InputStream stream = TinkerFactory.class.getResourceAsStream("grateful-dead.kryo");
try {
graph.io(gryo()).reader().create().readGraph(stream, graph);
} catch (Exception ex) {
throw new IllegalStateException(ex);
}
}
private static TinkerGraph getTinkerGraphWithNumberManager() {
final Configuration conf = getNumberIdManagerConfiguration();
return TinkerGraph.open(conf);
}
private static Configuration getNumberIdManagerConfiguration() {
final Configuration conf = new BaseConfiguration();
conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_ID_MANAGER, TinkerGraph.DefaultIdManager.INTEGER.name());
conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_EDGE_ID_MANAGER, TinkerGraph.DefaultIdManager.INTEGER.name());
conf.setProperty(TinkerGraph.GREMLIN_TINKERGRAPH_VERTEX_PROPERTY_ID_MANAGER, TinkerGraph.DefaultIdManager.LONG.name());
return conf;
}
}