0

Titan を使用してグラフ データベースを作成する次のコードがあります。

public class TitanMassiveInsertion {

private TitanGraph titanGraph = null;
private BatchGraph<TitanGraph> batchGraph = null;

public static void main(String args[]) {
    TitanMassiveInsertion test = new TitanMassiveInsertion();
    test.startup("data/titanDB");
    test.createGraph("data/flickrEdges.txt");
    test.shutdown();
}
public void startup(String titanDBDir) {
    System.out.println("The Titan database is now starting . . . .");
    BaseConfiguration config = new BaseConfiguration();
    Configuration storage = config.subset(GraphDatabaseConfiguration.STORAGE_NAMESPACE);
    storage.setProperty(GraphDatabaseConfiguration.STORAGE_BACKEND_KEY, "local");
    storage.setProperty(GraphDatabaseConfiguration.STORAGE_DIRECTORY_KEY, titanDBDir);
    storage.setProperty(GraphDatabaseConfiguration.STORAGE_BATCH_KEY, true);
    Configuration index = storage.subset(GraphDatabaseConfiguration.INDEX_NAMESPACE).subset("nodes");
    index.setProperty(INDEX_BACKEND_KEY, "elasticsearch");
    index.setProperty("local-mode", true);
    index.setProperty("client-only", false);
    index.setProperty(STORAGE_DIRECTORY_KEY, titanDBDir + File.separator + "es");

    titanGraph = TitanFactory.open(config);
    titanGraph.makeKey("nodeId").dataType(String.class).indexed(Vertex.class).make();
    titanGraph.makeLabel("similar").oneToOne().make();
    titanGraph.commit();
    batchGraph = new BatchGraph<TitanGraph>(titanGraph, VertexIDType.STRING, 1000);
    batchGraph.setVertexIdKey("nodeId");
    batchGraph.setLoadingFromScratch(true);

}

public void shutdown() {
    System.out.println("The Titan database is now shuting down . . . .");
    if(titanGraph != null) {
        batchGraph.shutdown();
        titanGraph.shutdown();
        batchGraph = null;
        titanGraph = null;
    }
}

public void createGraph(String datasetDir) {
    System.out.println("Creating the Titan database . . . .");      
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(datasetDir)));
        String line;
        int lineCounter = 1;
        int nodeCounter = 0;
        Vertex srcVertex, dstVertex;
        while((line = reader.readLine()) != null) {
            if(lineCounter > 4) {
                String[] parts = line.split("\t");

                srcVertex = batchGraph.getVertex(parts[0]);
                if(srcVertex == null) {
                    srcVertex = batchGraph.addVertex(parts[0]);
                    srcVertex.setProperty("nodeId", parts[0]);
                    nodeCounter++;
                }
                dstVertex = batchGraph.getVertex(parts[1]);
                if(dstVertex == null) {
                    dstVertex = batchGraph.addVertex(parts[1]);
                    dstVertex.setProperty("nodeId", parts[1]);
                    nodeCounter++;
                }
                Edge edge = batchGraph.addEdge(null, srcVertex, dstVertex, "similar");

                //System.out.println(edge);
                System.out.println(nodeCounter);
            }
            lineCounter++;
        }
        reader.close();
    }
    catch(IOException ioe) {
        ioe.printStackTrace();
    }
}
}

グラフ データベースの作成後、コードをテストしてすべて問題がないことを確認したいので、次のテスト コードで頂点を出力しようとしています。

TitanGraph graph = TitanFactory.open("data/titanDB");
    for(Vertex v : graph.getVertices()) {
        System.out.println(v.getProperty("nodeId"));
    }
    graph.shutdown();

しかし、それは何も出力せず、無限ループにスタックしているようです。Vertex v : graph.query().vertices()チュートリアルが示唆するように、私も試し ましたが、問題が存在します。一方System.out.println(graph.getVertices("nodeId", "2604051056"));、適切な出力が得られたとき。getVertices() 関数に問題はありますか?

4

1 に答える 1

1

デフォルトでBerkeleyJEを意味する「ローカル」ストレージバックエンドを使用しています。BerkeleyJE ではデフォルトでトランザクションが有効になっています。これは、適切な分離を提供するために、触れるすべてのデータ要素を追跡する必要があることを意味します。ただし、基本的にすべてのデータを頂点スキャンで操作する場合、これはコストがかかります。

したがって、トランザクションを無効にしてみてください

storage.transactions = false
于 2013-12-05T19:45:57.880 に答える