Groovy &引用;“超级节点”;在泰坦

Groovy &引用;“超级节点”;在泰坦,groovy,cassandra,graph-databases,titan,Groovy,Cassandra,Graph Databases,Titan,我正在开发一个应用程序,它可以很好地与graph数据库()配合使用,只是它在多个边的顶点上存在问题,例如 上面的超级节点链接指向Titan作者的一篇博客文章,解释了解决问题的方法。解决方案似乎是通过过滤边来减少顶点的数量 不幸的是,我想要groupCount边或顶点的属性。例如,我有100万用户,每个用户都属于一个国家。如何快速计算每个国家的用户数 到目前为止,我所尝试的内容可以在这个精巧的groovy脚本中显示出来: g = TitanFactory.open('titan.propertie

我正在开发一个应用程序,它可以很好地与graph数据库()配合使用,只是它在多个边的顶点上存在问题,例如

上面的超级节点链接指向Titan作者的一篇博客文章,解释了解决问题的方法。解决方案似乎是通过过滤边来减少顶点的数量

不幸的是,我想要
groupCount
边或顶点的属性。例如,我有100万用户,每个用户都属于一个国家。如何快速计算每个国家的用户数

到目前为止,我所尝试的内容可以在这个精巧的groovy脚本中显示出来:

g = TitanFactory.open('titan.properties')  // Cassandra
r = new Random(100)
people = 1e6

def newKey(g, name, type) {
    return g
        .makeType()
        .name(name)
        .simple()
        .functional()
        .indexed()
        .dataType(type)
        .makePropertyKey()
}

def newLabel(g, name, key) {
    return g
        .makeType()
        .name(name)
        .primaryKey(key)
        .makeEdgeLabel()
}

country = newKey(g, 'country', String.class)
newLabel(g, 'lives', country)

g.stopTransaction(SUCCESS)

root = g.addVertex()
countries = ['AU', 'US', 'CN', 'NZ', 'UK', 'PL', 'RU', 'NL', 'FR', 'SP', 'IT']

(1..people).each {
    country = countries[(r.nextFloat() * countries.size()).toInteger()]
    g.startTransaction()
    person = g.addVertex([name: 'John the #' + it])
    g.addEdge(g.getVertex(root.id), person, 'lives', [country: country])
    g.stopTransaction(SUCCESS)
}

t0 = new Date().time

m = [:]    
root = g.getVertex(root.id)
root.outE('lives').country.groupCount(m).iterate()

t1 = new Date().time

println "groupCount seconds: " + ((t1 - t0) / 1000)
基本上只有一个根节点(因为Titan没有“所有”节点查找),通过具有
国家属性的边链接到多个
个人
。当我在一百万个顶点上运行groupCount()时,需要一分钟

我意识到Titan可能在每个边上迭代并收集计数,但有没有办法让Titan或任何其他图形数据库更快地运行此功能?索引本身是否可以计数,以便不必遍历?我的索引正确吗?

如果您将“国家”作为“生命”标签,那么您可以更快地检索特定国家的所有人。但是,在您的例子中,您感兴趣的是一个组计数,它要求检索根节点的所有边,以便在这些边上进行迭代并提取国家

因此,此分析查询更适合于图形分析框架。它不需要根顶点,因为它通过完整的数据库扫描来执行groupcount,从而避免了超级节点问题。Faunus还使用Gremlin作为查询语言,因此您只需稍微修改查询:

g.V.country.groupCount.cap...
嗯,, 马蒂亚斯