1

グラフ データベースに 500,000 個のノードを作成しようとしています。後で必要に応じてエッジを追加する予定です。各ノードに格納されるデータを表す 500,000 行のテキスト ファイルがあります。

from bulbs.neo4jserver import Graph, Config, NEO4J_URI
config = Config(NEO4J_URI)
g = Graph(config)

def get_or_create_node(text, crsqid):
    v = g.vertices.index.lookup(crsqid=crsqid)
    if v==None:
            v = g.vertices.create(crsqid=crsqid)
            print text + " - node created"
    v.text = text
    v.save()
    return v

次に、テキスト ファイルの各行をループします。

count = 1
with open('titles-sorted.txt') as f:
    for line in f:
        get_or_create_node(line, count)
        count += 1

これはひどく遅いです。これにより、10 分で 5000 ノードが得られます。これは改善できますか?ありがとう

4

2 に答える 2

0

そこにトランザクション コードが表示されず、トランザクション コードが確立されたり、トランザクションの成功が通知されたりしません。それを調べる必要があります-ノードの作成ごとに1つのトランザクションを実行している場合、それは遅くなります。おそらく、1 つのトランザクションを作成し、数千のノードを挿入してから、バッチ全体をコミットする必要があります。

私は電球に詳しくないので、この python フレームワークでそれを行う方法を説明することはできませんが、ここから始めましょう:このページでは、いくつかの python/neo バインディングを使用して、このようなコーディング スタイルを使用できることを提案しています。 :

with db.transaction:
  foo()

また、大量のデータをロードしようとしていてパフォーマンスが必要な場合は、このページで一括インポートに関する情報を確認してください。独自のスクリプトで実行することが最もパフォーマンスが高いとは考えにくいです。代わりに、スクリプトを使用して暗号クエリを生成し、neo4j-shell にパイプすることを検討してください。

最後に考慮すべきことはインデックスです。crsqid でインデックスを作成しているようです。そのインデックスを削除すると、作成が速くなる可能性があります。ID がどのように分散されているかはわかりませんが、get_or_create() パターンを使用するよりも、レコードをバッチに分割して存在するかどうかをテストする方がよい場合があります。

于 2014-01-03T15:24:51.507 に答える
0

REST を介して 50 万ノードを個別にバッチロードすることは理想的ではありません。Michael のバッチ ローダーまたは Gremlin シェルを使用します。Gremlin シェルからこれを行う方法の例については、Marko の映画の推奨ブログ投稿を参照してください。

于 2014-01-08T22:36:24.760 に答える