假设一个网络有两种类型的节点,比如用户和地点,它们的关系是“一直在”。这是一个二分网络,通常由一个模块(如networkx )在两个方向中的任何一个方向上提供网络的“投影”,以便我们可以产生地点网络(具有共同用户数量的链接作为权重)或用户网络(具有具有共同位置数量的链接作为权重)。
如何在图形数据库中生成这样的网络?你能提供最常见的开源软件的例子吗,比如OrientDB,Neo4j,FlockDB...
更具体地说,如何使用gremlin做到这一点?
在这种情况下(gremlin),我自己粘贴了一个答案,但它是从幸存的节点开始的,从要投影出来的节点开始会更有效率,因为通常第一步是一些间隔子选择
g.V.filter{it.date=='3/3/2003'}.filter{it.type=='place'}....因此,我们只对在给定一天或某个其他时间间隔内在同一地点有关联的用户网络感兴趣。
发布于 2012-05-22 21:12:49
我之所以推荐Marko Rodriguez's blog,是因为它包含了许多关于此用例的示例。Marko也是Gremlin的作者,OrientDB和Neo4J都遵守它。
发布于 2012-05-24 01:16:24
从projection节点开始,我在gremlin中找到了一种方法(此外,它还可以在OrientDB REST接口中工作)
g.V.filter{it.type=='user'}.as('a').out('checkedIn_at').in('checkedIn_at')
.as('b').simplePath.select(['a','b']).groupCount(){it.name}.cap()因为这是一个答案,所以我自己回答自己:-D
在某些情况下,你有一个巨大的数据库,其中的图形是一个子选择。我更喜欢从下面这样的内容开始回答
g.V.filter{it.date=='3/3/2003'}.filter{it.type=='place'}....我的猜测是
...sideEffect{x=it}.in.as('a').transform{x}.in.as('b').select(['a','b'])
.groupCount(){it.name}.cap()现存的问题是,这些模式不允许任意的投影函数。我认为,一种解决方案是列出每对用户的公共顶点,利用groupBy的多功能性:
g.V.filter{it.type=='place'}.sideEffect{x=it}.out.as('a').transform{x}.out
.as('b').select(['a','b']).groupBy{[it[0],it[1]]}{x}.cap带有用于后处理的第三个参数的groupBy允许大量的MapReduce模式。
https://stackoverflow.com/questions/10693269
复制相似问题