将数据汇总到树数据结构(在图数据库中)

时间:2013-03-23 18:57:07

标签: neo4j graph-databases orientdb

我有一个树数据结构,其中数据在叶节点处输入。我想要做的是将这些数据加到树上,例如对于树中的任何节点,总结其下的所有数据。

使用图形数据库有没有聪明的方法可以做到这一点?

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分: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')