tinkerpop 源码是JanusGraph 源码解析的第一步,我们需要大概有个了解。

demo 编写

我们可以直接复制来自 tinkerpop 官方的源码:

public static void main(String[] args) {

    TinkerGraph graph = TinkerGraph.open();
    GraphTraversalSource g = graph.traversal();

    Vertex v = g.addV().property("name","marko").property("nam","marko a. rodriguez").next();

    GraphTraversal<Vertex, Long> name = g.V(v).properties("name").count();
    v.property(list, "name", "m. a. rodriguez");
    g.V(v).properties("name").count();
    g.V(v).properties();
    g.V(v).properties("name");
    g.V(v).properties("name").hasValue("marko");
    g.V(v).properties("name").hasValue("marko").property("acl","private"); //
    g.V(v).properties("name").hasValue("marko a. rodriguez");
    g.V(v).properties("name").hasValue("marko a. rodriguez").property("acl","public");
    g.V(v).properties("name").has("acl","public").value();
    g.V(v).properties("name").has("acl","public").drop(); //4\
    g.V(v).properties("name").has("acl","public").value();
    g.V(v).properties("name").has("acl","private").value();
    g.V(v).properties();
    g.V(v).properties().properties(); //5\
    g.V(v).properties().property("date",2014) ;//6\
    g.V(v).properties().property("creator","stephen");
    g.V(v).properties().properties();
    g.V(v).properties("name").valueMap();
    g.V(v).property("name","okram"); //7\
    g.V(v).properties("name");
    g.V(v).values("name"); //8
}

然后从第一行开始 打断点,debug。首先注意 TinkerGraph 是一个很简单的图数据库,超级简单。

TinkerGraph

TinkerGraph.open() 方法会新建一个 TinkerGraph:

private TinkerGraph(final Configuration configuration) {
    this.configuration = configuration;
    vertexIdManager = selectIdManager(configuration, GREMLIN_TINKERGRAPH_VERTEX_ID_MANAGER, Vertex.class);
    edgeIdManager = selectIdManager(configuration, GREMLIN_TINKERGRAPH_EDGE_ID_MANAGER, Edge.class);
    vertexPropertyIdManager = selectIdManager(configuration, GREMLIN_TINKERGRAPH_VERTEX_PROPERTY_ID_MANAGER, VertexProperty.class);
    defaultVertexPropertyCardinality = VertexProperty.Cardinality.valueOf(
            configuration.getString(GREMLIN_TINKERGRAPH_DEFAULT_VERTEX_PROPERTY_CARDINALITY, VertexProperty.Cardinality.single.name()));

    graphLocation = configuration.getString(GREMLIN_TINKERGRAPH_GRAPH_LOCATION, null);
    graphFormat = configuration.getString(GREMLIN_TINKERGRAPH_GRAPH_FORMAT, null);

    if ((graphLocation != null && null == graphFormat) || (null == graphLocation && graphFormat != null))
        throw new IllegalStateException(String.format("The %s and %s must both be specified if either is present",
                GREMLIN_TINKERGRAPH_GRAPH_LOCATION, GREMLIN_TINKERGRAPH_GRAPH_FORMAT));

    if (graphLocation != null) loadGraph();
}

这里的 configuration 类似一个map。然后有几个 IDManager 和其他变量赋值。

然后是 GraphTraversalSource g = graph.traversal(); 这一句仅仅是 return new GraphTraversalSource(this);

public GraphTraversalSource(final Graph graph) {
    this(graph, TraversalStrategies.GlobalCache.getStrategies(graph.getClass()));
}

这时候我们取看一下几个特殊的类: Traversal Traversal.Admin 。 他们两个都是接口,而且 Admin 是继承自 Traversal。 Traversal 代表遍历,主要方法包括 next, asNext,iterator toList 等,可以看成一个迭代器,而 Admin 的主要方法和他没有什么关系。

GraphTraversal extends Traversal , 新增加了很多和 gremlin 相关的方法。这属于 tinkerpop 的内容

然后是 addVertex

public Vertex addVertex(final Object... keyValues) {
    ElementHelper.legalPropertyKeyValueArray(keyValues);
    Object idValue = vertexIdManager.convert(ElementHelper.getIdValue(keyValues).orElse(null));
    final String label = ElementHelper.getLabelValue(keyValues).orElse(Vertex.DEFAULT_LABEL);

    if (null != idValue) {
        if (this.vertices.containsKey(idValue))
            throw Exceptions.vertexWithIdAlreadyExists(idValue);
    } else {
        idValue = vertexIdManager.getNextId(this);
    }

    final Vertex vertex = new TinkerVertex(idValue, label, this);
    this.vertices.put(vertex.id(), vertex);

    ElementHelper.attachProperties(vertex, VertexProperty.Cardinality.list, keyValues);
    return vertex;
}

我们可以看出源码十分简单,而且 property 等方法就更简单了,所以 TinkerGraph 可以用来进行后续的分析。这样有关图操作部分就不会有理解难度。