【问题标题】:graph DB equivalent of bipartite network projection?图 DB 等效于二分网络投影?
【发布时间】:2012-05-21 22:02:15
【问题描述】:

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

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

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

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

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

所以我们只对那些在给定日期或某个其他时间间隔在同一地点相关的用户网络感兴趣。

【问题讨论】:

  • 您是否使用oetl.sh 批量加载程序加载了二分图?如果是这样,您愿意分享一下方法吗?

标签: nosql neo4j flock orientdb gremlin


【解决方案1】:

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

【讨论】:

  • 感谢指点,博客很有意思,Marko在ArXiV的工作更精彩!
【解决方案2】:

从投影节点开始,我在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 模式。

【讨论】:

  • 顺便说一句,我对我的表达长度不太满意,它们很容易变成多行;我想我缺少一些语法糖。
猜你喜欢
  • 2019-04-29
  • 1970-01-01
  • 2011-11-21
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多