2016-10-11 3 views
0

私は主なデータベースとしてNeo4jを使用して小さなWebアプリケーションを構築しています。私のすべてのノード(〜700,000)は、共通のプロパティ、例えばnameを持っています。私はJava(Jax-rs)を使ってNeo4jサーバーのためのアンマネージド拡張をビルドしました。Neo4jにアルファベット順に並べられたノード名のリストはどのように保存するのですか?

私がしたいのは、nameがいくつかのパターンに一致するノードをすばやく取得できるようにすることです。私はすべてのノード(既にソートされている)のリストを保存するほうが簡単だと考えましたが、私の問題はどうすればいいのですか? WebAppの場合、これは関連性のあるNode.jsとReact(Reduxアーキテクチャ)を使用しています。

まず第一に、私は私のNeo4jの管理対象外の拡張子を使用する必要があり、かつ

  1. は、他のすべてのノードのリストに等しいプロパティを持つノードを作成し、そのノードのプロパティ

  2. に基づいて、私の計算を行うのいずれか
  3. アンマネージド拡張を使用してサーバー上のファイルにアクセスし、そのファイルを読み書きして必要なものを取得します。 Nその場合は、私がのNeo4jのAPIを使用することはありませんが、私は他の可能性はMongoDBのような他のデータベースを使用してノードから、このいずれかに接続することです

を実行している他のデータベースを持っている必要はないでしょう。 js。また、Node.jsから直接ファイルを読み書きすることもできます。

これは私が今考えることのできるオプションです。私は十分明確であることを望みます。ベストプラクティスは何でしょうか?あなたの助けのための

おかげで、要求ごととして

+0

どのようなパターンですか? 'name'プロパティにインデックスを付けることができます。これにより、不等式、開始点、メンバシップチェックなど、多くの種類のパターンに一致するノードをすばやく見つけることができます。 –

+0

私は、ストレージ自体をソートする必要があるのは混乱しています(これを達成するには、コンテンツ間にリレーションシップツリーを構築する必要があります)。 Cypherでは、データを照会して結果を並べ替えることができます。また、私はneo4jデータにアクセスするための第一歩として、なぜ2番目のデータベース(ここではmongodb)を使用することを考えているのか分かりません。これはソートに関連していますか?あなたが何を求めているのかは分かりません。あなたの質問を編集して実行しようとしているクエリのタイプを示したら、それは意味をなさないでしょう。 –

+0

@ToreEschlimanインデックス作成について考えましたが、このような種類のパターンマッチングを簡単に実行できることを知らなかったので、ありがとうございました。私が構築したいのは一種のリアルタイムプロセスであり、マッチング全体が速くなければなりません...私のアプリが成長すれば、このメソッドのパフォーマンスに問題はありますか? –

答えて

0

、複雑なクエリのためのリーフノードを使用してグラフを事前に播種(確かに不自然な)例:あなたは、ユーザーがすべてのノードを見つけるために照会できるようにしたいとしましょうnameプロパティはすべて小文字です(仮名を示しています)。このための基本クエリでEXPLAINを実行すると、NodeByLabelScan、または悪いことにAllNodesScanがインデックスにこの操作を実行できないことがわかります。

MERGE (a:DataNode) 
SET a = {input} 
WITH COLLECT(a) AS datanodes 
WITH datanodes, [b IN datanodes WHERE b.name = lower(b.name)] AS lowers 
FOREACH(lower IN lowers| 
    MERGE (q:QueryLeaf {condition:'all_lowercase', match: True}) 
    MERGE (q) - [:INCLUDES] -> (lower)) 

そして、あなたがでてくる「小文字の」クエリを取得するときに:あなたは、ノードを追加するときに、あなたはそれらのnameプロパティは、この条件を満たしているかどうかを意味するリーフノードとの関係でそれらをMERGEになります。

MATCH (q:QueryLeaf {condition:'all_lowercase', match: True}) 
WITH q 
MATCH (a:DataNode) <- [:INCLUDES] - (q) 
WITH a 

残りの質問については、

これは、クエリを実行するたびにではなく、データをロードするときに処理を1回行います。あなたのデータがかなり静的であるなら、余分な複雑さと時間を費やして書くことは価値があるでしょう。

関連する問題