2

リーフ ノードにデータが入力されるツリー データ構造があります。私がやりたいことは、このデータをツリーに合計することです。たとえば、ツリー内の任意のノードについて、その下にあるすべてのデータを合計します。

グラフデータベースを使用してこれを行う賢い方法はありますか?

4

2 に答える 2

1

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/

于 2013-03-23T20:48:54.130 に答える
1

以下は、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')
于 2013-04-01T10:23:24.167 に答える