リーフ ノードにデータが入力されるツリー データ構造があります。私がやりたいことは、このデータをツリーに合計することです。たとえば、ツリー内の任意のノードについて、その下にあるすべてのデータを合計します。
グラフデータベースを使用してこれを行う賢い方法はありますか?
リーフ ノードにデータが入力されるツリー データ構造があります。私がやりたいことは、このデータをツリーに合計することです。たとえば、ツリー内の任意のノードについて、その下にあるすべてのデータを合計します。
グラフデータベースを使用してこれを行う賢い方法はありますか?
cypher (neo4j) では、次のようなことができます。
start n=node:node_auto_index(id={id})
match n-[:parent_of*]->child
where not(child-[:parent_of]->()) // where the child doesn't have children (leaf)
return n, sum(child.val);
http://wes.skeweredrook.com/cypher-summing-data-up-a-tree-leaf-nodes/
以下は、Gremlin とaureliusgraphsメーリング リストに表示されたツリー データ サンプルを使用したソリューションです。
g = new TinkerGraph()
root = g.addVertex(['name':'root'])
c1 = g.addVertex(['name':'1', 'sortIndex':1])
c11 = g.addVertex(['name':'1.1', 'sortIndex':1])
c12 = g.addVertex(['name':'1.2', 'sortIndex':2])
c121 = g.addVertex(['name':'1.2.1','sortIndex':1])
c122 = g.addVertex(['name':'1.2.2','sortIndex':2])
c13 = g.addVertex(['name':'1.3', 'sortIndex':3])
c2 = g.addVertex(['name':'2', 'sortIndex':2])
c21 = g.addVertex(['name':'2.1', 'sortIndex':1])
c22 = g.addVertex(['name':'2.2', 'sortIndex':2])
c3 = g.addVertex(['name':'3', 'sortIndex':3])
c31 = g.addVertex(['name':'3.1', 'sortIndex':1])
c32 = g.addVertex(['name':'3.2', 'sortIndex':2])
g.addEdge(root, c1, 'has')
g.addEdge(root, c2, 'has')
g.addEdge(root, c3, 'has')
g.addEdge(c1, c11, 'has')
g.addEdge(c1, c12, 'has')
g.addEdge(c1, c13, 'has')
g.addEdge(c2, c21, 'has')
g.addEdge(c2, c22, 'has')
g.addEdge(c3, c31, 'has')
g.addEdge(c3, c32, 'has')
g.addEdge(c12, c121, 'has')
g.addEdge(c12, c122, 'has')
グラフを初期化する上記のコードは、 Gremlinプロンプトにうまく貼り付けられるはずです。グラフが確立されたら、次のコマンドを発行してツリーを走査し、数値 (この場合は sortIndex フィールド) を合計します。
gremlin> total=0;root.out.sideEffect{total+=it.sortIndex}.loop(2){true}
gremlin> total
==>21
上記のコードはtotal
変数を初期化し、root
頂点から走査を開始し、走査してsortIndex
フィールドの値を合計に追加します。次に、ツリーを使い果たすまで、その操作をループ/繰り返します (最終的true
にループの長さを制御します)。
便宜上 TinkerGraph を使用しましたが、このコードは、グラフの実装を次のように変更するだけで、Neo4j または OrientDB (この質問の他のタグとして見ました) で動作します。
g = new Neo4jGraph('/tmp/neo4j')
また
g = new OrientGraph('memory:/graph')