我们正在使用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分钟来加载数据。
请帮助我有没有更好的机制来有效加载图表?
答案 0 :(得分:1)
您可能会在单次遍历执行中看到更好的性能执行完整查询 - 例如,g.V(vertex.id()).outV().outV().outE()
深度3 - 但任何具有非常高的基数基数的顶点都将使此查询变慢,无论您如何执行它
答案 1 :(得分:1)
为了增加@Benjamin的答案,执行一次遍历而不是许多不断扩展的小事实将会更快。 Titan使用延迟加载,所以你应该利用它。
我建议的另一件事是多线程遍历每个遍历和写入。 Titan实际上非常好地支持同时写入。您可以使用Transactions实现此目的。