在单个或有效查询中将titan db中的图形加载指定的深度

时间:2016-03-17 22:21:19

标签: titan

我们正在使用titan db来存储图形信息。我们有cassandra + es作为后端存储和索引。我们正在尝试加载图表数据以表示webui中的图表。

这是我关注的方法。

    public JSONObject getGraph(long vertexId, final int depth) throws Exception {
            JSONObject json = new JSONObject();
            JSONArray vertices = new JSONArray();
            JSONArray edges = new JSONArray();
            final int currentDepth = 0;

            TitanGraph graph = GraphFactory.getInstance().getGraph();
            TitanTransaction tx = graph.newTransaction();
            try {
                GraphTraversalSource g = tx.traversal();
                Vertex parent = graphDao.getVertex(vertexId);
                loadGraph(g, parent, currentDepth + 1, depth, vertices, edges);
                json.put("vertices", vertices);
                json.put("edges", edges);
                return json;
            } catch (Throwable e) {
                log.error(e.getMessage(), e);
                if (tx != null) {
                    tx.rollback();
                }
                throw new Exception(e.getMessage(), e);
            } finally {
                if (tx != null) {
                    tx.close();
                }
            }
        }

        private void loadGraph(final GraphTraversalSource g, final Vertex vertex, final int currentDepth,
                final int maxDepth, final JSONArray vertices, final JSONArray edges) throws Exception {
            vertices.add(toJSONvertex));
            List<Edge> edgeList = g.V(vertex.id()).outE().toList();
            if (edgeList == null || edgeList.size() <= 0) {
                return;
            }
                for (Edge edge : edgeList) {
        Vertex child = edge.inVertex();
                edges.add(Schema.toJSON(vertex, edge, child));
                if (currentDepth < maxDepth) {
                    loadGraph(g, child, currentDepth + 1, maxDepth, vertices, edges);
                }
            }
        }

但是当树中存在更多节点时,这需要花费大量时间来处理深度3,这需要大约1分钟来加载数据。

请帮助我有没有更好的机制来有效加载图表?

2 个答案:

答案 0 :(得分:1)

您可能会在单次遍历执行中看到更好的性能执行完整查询 - 例如,g.V(vertex.id()).outV().outV().outE()深度3 - 但任何具有非常高的基数基数的顶点都将使此查询变慢,无论您​​如何执行它

答案 1 :(得分:1)

为了增加@Benjamin的答案,执行一次遍历而不是许多不断扩展的小事实将会更快。 Titan使用延迟加载,所以你应该利用它。

我建议的另一件事是多线程遍历每个遍历和写入。 Titan实际上非常好地支持同时写入。您可以使用Transactions实现此目的。