假设一个网络有两种节点,比如用户和地点,关系“已经进入”。这是一个二分网络,从中通常,诸如networkx之类的模块在两个方向中的任何一个方向上提供网络的“投影”,这样我们就可以生成地点网络(链接具有普通用户数量的权重)或者用户网络(链接具有公共场所数量的权重)。
我如何在Graph数据库中生成这样的网络?你能举例说明最常见的开源软件吗,比如OrientDB,Neo4j,FlockDB ......
更具体地说,如何用gremlin做到这一点?
在这种情况下(gremlin)我自己已经粘贴了一个答案,但它从幸存的节点开始,从要投射出来的节点开始会更有效,因为通常第一步是一些间隔子选择
g.V.filter{it.date=='3/3/2003'}.filter{it.type=='place'}....
这样我们才会对在某一天或某个其他时间段内在同一个地方相关的用户网络感兴趣。
答案 0 :(得分:1)
我可以建议Marko Rodriguez's blog因为包含许多关于此用例的示例。 Marko也是Gremlin的作者,OrientDB和Neo4J也符合它。
答案 1 :(得分:0)
从投影节点开始,我在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模式。