Gremlin查询最后一个值的groupcount

时间:2017-02-03 04:00:10

标签: titan gremlin

我有一组带有两组顶点的titan图形,一组用于UserID,另一组用于Products。 UserID和Product顶点之间的边缘包含" Dates"什么时候购买产品。我正在寻找一个gremlin查询,它可以通过最后购买的产品给我一组用户ID

例如,如果有下面的数据

UserID,Date,Product
A,2016-01-01,'Razor'
A,2016-01-02,'Toothpaste'
B,2016-02-01,'Toothpaste'
B,2016-02-02,'Razor'
C,2016-01-04,'Toothpaste'

我正在寻找下面的输出

Product, Count
'Toothpaste',2
'Razor',1

感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

此解决方案适用于您的示例数据:

  

gV()。hasLabel('Product')。as('p')。inE('Purchase')。order()。by('Date',decr).outV()。dedup()。select ( 'p')。groupCount()由( '姓名')

这是算法:

  • 从产品开始
  • 遍历购买边
  • 按日期降序排列边缘
  • 遍历用户
  • 重写用户;由于排序
  • ,每个用户只会保留最近的边缘
  • 跳回产品
  • 按产品名称分组

这是一个Gremlin控制台转储,显示它正在运行:

gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> a = graph.addVertex(T.label, 'User', 'UserID', 'A')
==>v[0]
gremlin> b = graph.addVertex(T.label, 'User', 'UserID', 'B')
==>v[2]
gremlin> c = graph.addVertex(T.label, 'User', 'UserID', 'C')
==>v[4]
gremlin> r = graph.addVertex(T.label, 'Product', 'Name', 'Razor')
==>v[6]
gremlin> t = graph.addVertex(T.label, 'Product', 'Name', 'Toothpaste')
==>v[8]
gremlin> a.addEdge('Purchase', r, 'Date', new Date(2016, 0, 1))
==>e[10][0-Purchase->6]
gremlin> a.addEdge('Purchase', t, 'Date', new Date(2016, 0, 2))
==>e[11][0-Purchase->8]
gremlin> b.addEdge('Purchase', t, 'Date', new Date(2016, 1, 1))
==>e[12][2-Purchase->8]
gremlin> b.addEdge('Purchase', r, 'Date', new Date(2016, 1, 2))
==>e[13][2-Purchase->6]
gremlin> c.addEdge('Purchase', t, 'Date', new Date(2016, 0, 4))
==>e[14][4-Purchase->8]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:5 edges:5], standard]
gremlin> g.V().hasLabel('Product').as('p').inE('Purchase').order().by('Date', decr).outV().dedup().select('p').groupCount().by('Name')
==>[Toothpaste:2,Razor:1]

答案 1 :(得分:2)

以下查询在OLTP和OLAP中有效,并且不会触及超出必要的顶点:

$('li').click(function() {  
    //toggles something 
});

$("li").keydown(function(e){
    if(e.which === 13){
        $(this).click();
    }
});

此外,当您在vector<int> *vpoint = new vector(); 上创建以顶点为中心的索引时,Titan可以完美地优化此查询。