2

假设一个网络有两种节点,比如用户和地点,关系为“一直在”。这是一个二分网络,通常由 networkx 之类的模块提供网络在两个方向中的任何一个方向的“投影”,这样我们就可以生成地点网络(链接的权重与普通用户的数量相同)或用户网络(链接的权重与公共场所的数量相同)。

我应该如何在 Graph 数据库中生成这样的网络?您能否提供最常见的开源示例,例如 OrientDB、Neo4j、FlockDB ......

更具体地说,如何用 gremlin 做到这一点?

在这种情况下(gremlin)我自己已经粘贴了一个答案,但是它从幸存的节点开始,从将要被投影的节点开始会更有效,因为通常第一步是一些间隔子选择

g.V.filter{it.date=='3/3/2003'}.filter{it.type=='place'}....

所以我们只对那些在某一天或某个其他时间段都在同一个地方相关的用户网络感兴趣。

4

2 回答 2

1

我可以推荐Marko Rodriguez 的博客,因为其中包含许多关于此用例的示例。Marko 也是 Gremlin 的作者,OrientDB和 Neo4J 都符合它。

于 2012-05-22T13:12:49.157 回答
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 模式。

于 2012-05-23T17:16:24.160 回答