背景
いくつかのフォーラムやニュースでは、最近見たのNeo4j処理グラフィックス、優れたデータベースを。いくつかはそうも技術的準備金であることを自分自身を与える、関連文書の下に見えたために時間を割いて、リレーショナルクエリに参加行うことが適していると言われています。
プロセス
研究掘り下げる前に、学習用文書のビットを見つけるために、インターネット上の最初は他人の肩の上に立って、常に最速、最も効果的な学習で、他人をまとめました。
いくつかの基本的な概念の数字の場合:
- ノード:ノード
- 関係:関係は、つまり、グラフのエッジは、注意がエッジを向けられています
- プロパティ:プロパティは、ノード/関係のプロパティを設定することができます
- トラバーサル:グラフトラバーサルツール
- インデックス:インデックス
ノード(ノード)
- 各ノードは、複数のノードとの間の複数の関係(リレーションシップ)を有することができます
- 単一ノードは、属性のプロパティのキー(キー、値)を複数設けてもよいです
関係(リレーションシップ)
- それぞれの関係は、startNodeとエンドノードが含まれます
- 各関係は、属性のプロパティの複数のキー(キー、値)を提供することができます
- 関係の種類との対応関係(RelationshipType)定義することができる
* DynamicRelationshipType動的関係タイプ
* XXXRelationshipType静的関係タイプ(RelationshipTypeは、インターフェイスを実装)
トラバーサル(横断)
クロス: http://wiki.neo4j.org/content/Traversal
例:
- トラバーサーTRAV = swedenNode.traverse(Order.DEPTH_FIRST、StopEvaluator.END_OF_GRAPH、
- 新しい ReturnableEvaluator()
- {
- パブリックブール isReturnableNode(TraversalPositionのPOS)
- {
- 返す !pos.isStartNodeを()&& pos.lastRelationshipTraversed()ISTYPE(CUSTOMER_TO_ORDER)。
- }
- }、
- LIVES_IN、Direction.INCOMING、
- CUSTOMER_TO_ORDER、Direction.OUTGOING)。
- //トラバーサーを反復... <スパンのスタイル=「空白:ノーマル;」>
- </ span>の
Traverser trav = swedenNode.traverse(Order.DEPTH_FIRST, StopEvaluator.END_OF_GRAPH,
new ReturnableEvaluator()
{
public boolean isReturnableNode( TraversalPosition pos )
{
return !pos.isStartNode() && pos.lastRelationshipTraversed().isType( CUSTOMER_TO_ORDER );
}
},
LIVES_IN, Direction.INCOMING,
CUSTOMER_TO_ORDER, Direction.OUTGOING );
// iterate over traverser...
注文:トラバーサルアルゴリズムは、図に対応します。
- DEPTH_FIRST:深さ優先探索は、最初のノードを見つけることです、再帰的にはバックトラックの前にいない、適切なノードの後まで見下ろしれ
- BREADTH_FIRST:BFS
- OUTGOING:エッジ
- INCOMING:エッジ
- BOTH:Guming Siのイー
- DEPTH_ONE:複数の深さ停止した後、
- END_OF_GRAPH:なし適切な結果と停止
- ALL_BUT_START_NODE:最初のノードを除外
- ALL:すべてのノードを返します
- ノード情報
- 入ってくるの関係に関する情報
- 検索の深さ
- 条件を満たしたノードのこれまで数
Indexs(インデックス)
それは自然な順序で、各ノード/関係/プロパティについて独立のNeo4jに格納されています。そのような人のノードに対応する主キーの名前に基づいてリレーショナルデータベースクエリのためとして、いくつかのシナリオをサポートするために、通常のトラバーサルは難しいが、このような需要を満たすために、人々はこのことを解決するために使用されていません。したがって、それは、インデックスの概念につながるのNeo4j。
インデックスの初期のバージョンはIndexServiceを使用することです(http://wiki.neo4j.org/content/Indexing_with_IndexService)
例:
- GraphDatabaseService graphDb = 新しい EmbeddedGraphDatabase( "パス/に/のNeo4j-DB" )。
- IndexService指数= 新しい LuceneIndexService(graphDb)。
- ノードアンディ= graphDb.createNode()。
- ノードラリー= graphDb.createNode()。
- andy.setProperty( 「名前」、 「アンディ・ウォシャウスキー」 )。
- andy.setProperty( "タイトル" 、 "ディレクター" );
- larry.setProperty( 「名前」、 「ラリー・ウォシャウスキー」 )。
- larry.setProperty( "タイトル" 、 "ディレクター" );
- index.index(アンディ、 "名前" 、andy.getProperty( "名前" ));
- index.index(アンディ、 "タイトル" 、andy.getProperty( "タイトル" ));
- index.index(ラリー、 "名前" 、larry.getProperty( "名前" ));
- index.index(ラリー、 "タイトル" 、larry.getProperty( "タイトル" ));
GraphDatabaseService graphDb = new EmbeddedGraphDatabase( "path/to/neo4j-db" ); IndexService index = new LuceneIndexService( graphDb ); Node andy = graphDb.createNode(); Node larry = graphDb.createNode(); andy.setProperty( "name", "Andy Wachowski" ); andy.setProperty( "title", "Director" ); larry.setProperty( "name", "Larry Wachowski" ); larry.setProperty( "title", "Director" ); index.index( andy, "name", andy.getProperty( "name" ) ); index.index( andy, "title", andy.getProperty( "title" ) ); index.index( larry, "name", larry.getProperty( "name" ) ); index.index( larry, "title", larry.getProperty( "title" ) );
外付け部品としてIndexServiceは、拡張定義です。
今、公式ドキュメントは、統合されたインデックスフレームワークを使用することをお勧めします
- 公式文書: http://docs.neo4j.org/chunked/stable/indexing.html
- 移行シナリオ: http://wiki.neo4j.org/content/Transitioning_To_Index_Framework
- IndexManagerインデックス= graphDb.index()。
- インデックス<ノード>俳優たち= index.forNodes( "俳優" );
- インデックス<ノード>映画= index.forNodes( "映画" );
- RelationshipIndex役割= index.forRelationships( "ロール" )。
IndexManager index = graphDb.index(); Index<Node> actors = index.forNodes( "actors" ); Index<Node> movies = index.forNodes( "movies" ); RelationshipIndex roles = index.forRelationships( "roles" );
クエリ構文(Cypheクエリ言語)
Neo4jクエリ言語の構文解析のセットを達成するために、グラフ理論に基づいた独自の検索アルゴリズムは、(最大、合計、minは、カウントなど)いくつかの一般的な集約関数を提供します。
構文例:
- クエリに参加:
- N START =(1 )マッチ(N) - [:BLOCKS] - >(X) リターン X
- ここで、条件:
- 起動N =(2 、 1 )ここで、(n.age < 30 とn.name = "トビアス" )か否(n.name = "トビアス" ) 戻り N
- 集計機能:
- 起動N =(2 、3 、4 ) リターン 平均(n.property)
- 注文:
- (開始はn = 1 、2 、3 ) リターン n.name DESCによってN順序
- ページング:
- (開始はn = 1 、2 、3 、4 、5 ) リターン n.nameによってN順序スキップ 1つの リミット 2
Join查询: start n=(1) match (n)-[:BLOCKS]->(x) return x Where条件: start n=(2, 1) where (n.age < 30 and n.name = "Tobias") or not(n.name = "Tobias") return n 聚合函数: start n=(2,3,4) return avg(n.property) Order: start n=(1,2,3) return n order by n.name DESC 分页: start n=(1,2,3,4,5) return n order by n.name skip 1 limit 2
コールの例:
- デシベル= 新しい ImpermanentGraphDatabase();
- エンジン= 新しい ExecutionEngine(DB)。
- CypherParserパーサー= 新しい CypherParser();
- ExecutionEngineエンジン= 新しい ExecutionEngine(DB)。
- クエリのクエリ= parser.parse( "N START =(0)ここで、1 = 1戻りN" );
- ExecutionResult結果= engine.execute(クエリ)。
- assertThat(result.columns()、hasItem( "N" ));
- 反復子<ノード> n_column = result.columnAs( "N" )。
- assertThat(asIterable(n_column)、hasItem(db.getNodeById(0 )))。
- assertThat(result.toString()、containsString("ノード[0]" ));
db = new ImpermanentGraphDatabase(); engine = new ExecutionEngine( db ); CypherParser parser = new CypherParser(); ExecutionEngine engine = new ExecutionEngine(db); Query query = parser.parse( "start n=(0) where 1=1 return n" ); ExecutionResult result = engine.execute( query ); assertThat( result.columns(), hasItem( "n" ) ); Iterator<Node> n_column = result.columnAs( "n" ); assertThat( asIterable( n_column ), hasItem(db.getNodeById(0)) ); assertThat( result.toString(), containsString("Node[0]") );
他の
拡張性
まだプログラムの対応する拡張が表示されません
可用性(HAメカニズム)
ハのNeo4j現在の単純なメカニズムをサポートし、それが飼育係によって管理されています。
そのメカニズムは非常に単純で、飼育係によってのNeo4jサーバーのハートビート検出のための責任があります。
1.発見はマスターした後にハングアップ、選挙(選挙を実現するために数えソースコードを見ていないが、新しいマスターとして最小のIDを取り、対応するSERVERIDによると、非常にシンプルになります)を開始。
2.全てのスレーブマスタに新しいブロードキャストを挿入し、選挙プロセスのこの時間は、(すべてが例外を返す)に対応する書き込み要求受け付けない
マスタスレーブが通信するように3.新しいマシンは、クラスタに参加し、同期2データ・コンテンツ・プロバイダ(新しいマスターTID比の現在のスレーブが手動介入を必要とするデータの競合を生成する場合)
問題:
適時1.飼育係のハートビート検出、3分のデフォルトの遅延(そこにパケットのリトライため)
マスターの選択時には2、書き込み要求は(選挙の時期のマスターが比較的最後になりますが、クライアントは十分に友好的ではないが)例外を返します直接処理することはできません
改善のポイント:
1. 1回のフェイルオーバーの再試行を制御するためのメカニズムを提供し、クライアントAPIを提供します。
Consoleページ
Neo4jは、次のような効果があり、独立したのNeo4j展開サーバーで展開埋め込み、スタンドアロン展開の二つのモードをサポートしています。
グラフィックス管理の背景には、ノード間の関係の側面を見ることができます
残りのインタフェースAPIは、グラフィックスとは、いくつかの方法に、純粋なデータを提供しています:
その他のドキュメント
- http://wiki.neo4j.org/content/FAQ
- http://wiki.neo4j.org/content/Getting_Started_With_Neo4j_Server
- Neo4j-手動stable.pdf
オリジナル住所ます。https://www.iteye.com/blog/agapple-1128400