使用 Gremlin 在二部图上随机游走

2023-12-30

我想根据给定的用户偏好(用户喜欢的项目)基于使用groovy中的gremlin在有向二分图上进行随机游走来对项目进行排名。

该图具有以下基本结构:

[用户1] ---'喜欢'---> [项目A] [项目B]

此后我提出的查询:

def runRankQuery(def userVertex) {
    def m = [:]
    def c = 0
    while (c < 1000) {
        userVertex
            .out('likes')   // get all liked items of current or similar user
            .shuffle[0]     // select randomly one liked item
            .groupCount(m)  // update counts for selected item
            .in('likes')    // get all users who also liked item
            .shuffle[0]     // select randomly one user that liked item
            .loop(5){Math.random() < 0.5}   // follow liked edge of new user (feed new user in loop) 
                                            // OR abort query (restart from original user, outer loop)      
            .iterate()
        c++
    }
    m = m.sort {a, b -> b.value <=> a.value}
    println "intermediate result $m"
    m.keySet().removeAll(userVertex.out('likes').toList())
    // EDIT (makes no sense - remove): m.each{k,v -> m[k] = v / m.values().sum()}
    // EDIT (makes no sense - remove): m.sort {-it.value }
    return m.keySet() as List;
}

但是,此代码没有找到新项目(上面示例中的[ItemB]),但是only给定用户喜欢的项目(例如 [ItemS])。

  • 我需要更改什么才能为新用户(例如 [User2])提供循环步骤返回到“out('likes')”步骤以便继续行走?

  • 一旦此代码运行,是否可以将其视为“个性化 PageRank”的实现?


这里是运行示例的代码:

g = new TinkerGraph()

user1 = g.addVertex()
user1.name ='User1'
user2 = g.addVertex()
user2.name ='User2'
itemA = g.addVertex()
itemA.name ='ItemA'
itemB = g.addVertex()
itemB.name ='ItemB'

g.addEdge(user1, itemA, 'likes')
g.addEdge(user2, itemA, 'likes')
g.addEdge(user2, itemB, 'likes')

println runRankQuery(user1)

和输出:

intermediate result [v[2]:1000]
[]
==>null
gremlin> g.v(2).name
==>ItemA
gremlin> 

我发现这是一个非常奇怪的问题。我发现了几个非常奇怪的问题,这些问题不容易解释,最后,我不确定为什么它们是这样的。对我来说最奇怪的两件事是:

  1. 不知道是不是有问题shuffle步。在您的情况下,它似乎没有正确随机化。我似乎无法在这种情况之外重现问题,所以我不确定它是否与您的数据大小或其他内容有关。
  2. 我在使用时遇到了奇怪的问题Math.random()打破循环。

不管怎样,我认为我已经通过我的更改捕获了您的代码的本质,这些更改似乎可以满足您的要求:

runRankQuery = { userVertex ->
    def m = [:]
    def c = 0
    def rand = new java.util.Random()
    while (c < 1000) {
        def max = rand.nextInt(10) + 1
        userVertex._().as('x')
            .out('likes')   
            .gather.transform{it[rand.nextInt(it.size())]}
            .groupCount(m) 
            .in('likes')    
            .gather.transform{it[rand.nextInt(it.size())]}
            .loop('x'){it.loops < max}  
            .iterate()
        c++
    }
    println "intermediate result $m"
    m.keySet().removeAll(userVertex.out('likes').toList())
    m.each{k,v -> m[k] = v / m.values().sum()}
    m.sort {-it.value }
    return m.keySet() as List;
}

我更换了shuffle使用我自己的“洗牌”品牌,从收集的列表中随机选择一个顶点。我也随机选了一个max循环而不是依赖Math.random()。当我现在运行这个时,我想我得到了您正在寻找的结果:

gremlin> runRankQuery(user1)                                       
intermediate result [v[2]:1787, v[3]:326]
==>v[3]
gremlin> runRankQuery(user1)
intermediate result [v[2]:1848, v[3]:330]
==>v[3]
gremlin> runRankQuery(user1)
intermediate result [v[2]:1899, v[3]:339]
==>v[3]
gremlin> runRankQuery(user1)
intermediate result [v[2]:1852, v[3]:360]
==>v[3]

你可能还会得到Math.random()在一些迭代中,它的表现对我来说是可预测的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Gremlin 在二部图上随机游走 的相关文章

随机推荐

  • 如何在 TinyMCE v4 中实现tinymce.Shortcuts

    我想向我的 TinyMCE 编辑器添加键盘快捷键 这是我的初始化代码 tinymce init selector textarea menubar false mode exact plugins advlist autolink list
  • 如何:Spring 摆脱 @Validate 以进行自动控制器验证?

    我知道关于 Valid注释指示 spring 根据 JSR 303 验证控制器参数 如下例所示 GetMapping test public TestDTO testDTO Valid TestDTO testDTO return test
  • 从 XPath 字符串中删除或替换某些文本

    是否可以删除或替换 XPath 字符串上的文本 使用 XPath 我得到 urlhttp www http www我想删除http www http www 所以相同的 XPath 查询只会返回一个链接 而不返回http www http
  • 单个语句中的多个 mongodb 更新运算符?

    我可以将 pushAll 和 inc 合并在一个语句中吗 在合并之前 这工作正常 db createCollection test db test insert name albert bugs db test update name al
  • Firefox 在使用溢出时忽略填充:滚动

    使用时overflow scroll结合padding CSS 属性 Firefox 中缺少元素底部的填充 但适用于 Chrome 和 Safari container height 100px padding 50px border so
  • 如何查找 MongoDB Collection 中特定文档的大小?

    我在 MongoDB 集合中有 100k 个文档 document id 789736363828292 有 20k 文档 记录 我想找到该特定文档使用的内存 请帮我在 MongoDB 控制台中找到内存大小 以 MB 为单位 您可以使用Ob
  • 如何在标题中获取黄瓜场景变量?

    我希望能够通过使用标题本身中的示例让我的场景大纲标题包含更多信息 Scenario Outline A
  • 如何使面板居中?

    即使表单的大小发生变化 如何使面板居于表单中心 使用 C Windows 应用程序 使用设计器将面板放置在窗体的中心 然后清除Anchor属性 因此它不锚定到任何边缘 这将在调整表单大小时使其保持居中 而无需调整面板本身的大小 如果由于某种
  • 图搜索和树搜索有什么区别?

    有什么区别图搜索 and 树搜索有关 DFS A 搜索的版本人工智能 从现有的答案来看 这个概念似乎存在很多混乱 问题始终是图表 树搜索和图搜索之间的区别并不在于问题图是树还是一般图 始终假设您正在处理一般图表 区别在于遍历模式用于搜索图形
  • Google 地图 API v3 - 灰显或删除状态?

    是否可以将我不想从地图上看到的状态灰显 甚至更好地一起删除 搜索时无法找到任何明确的答案 我试图仅显示德克萨斯州地图并在其上放置标记 Thanks 你在寻找类似的东西吗这个 v2 示例 http maps forum nu gm texas
  • MSChart:饼图标签重叠问题

    我用过MSChart Control在我的一个VB NET项目 我决定将如下表所示的数据显示为饼图 但标签相互重叠 为了摆脱它 我已经尝试过 智能标签 属性如下图所示 Chart1 Series Default SmartLabelStyl
  • 如何防止标签栏控制器中的视图控制器旋转?

    我有一个管理 4 个选项卡的选项卡栏控制器 我对选项卡栏控制器进行了子类化 以便 shouldAutorotateToInterfaceOrientation 方法仅允许选项卡之一中的特定视图控制器旋转 一切工作几乎正常 其余选项卡中的控制
  • Oracle 数据库:DBMS_ALERT 在 Java 应用程序中的使用

    我有一个 java 应用程序服务器 使用 JDBC 与 oracle 11 2 数据库服务器进行通信 客户端的请求被发送到应用程序服务器 该应用程序服务器运行调用数据库中的第一个存储过程的java方法 我希望 java 方法在调用存储过程后
  • Python中线程之间的通信(不使用全局变量)

    假设我们有一个主线程 它为测试模块启动两个线程 test a 和 test b 无论测试模块执行完毕还是遇到任何错误 警告或者想要更新某些其他信息 两个测试模块线程都会保持其状态 主线程如何访问这些信息并采取相应的行动 例如 如果 test
  • 在R中获取Windows系统文件夹(用户主目录,“我的文档”等)路径

    我想获取用户主文件夹的完整路径 通常类似于 C Users USERNAME 或 我的文档 文件夹 但无法找到从 R 脚本执行此操作的方法 有什么解决办法吗 我想你想要 path expand
  • C# WPF 应用程序 .NET 4.5 设置鼠标位置 [重复]

    这个问题在这里已经有答案了 第一次在这里问问题 我在这里找到的解决方案似乎由于某种原因不起作用 我的应用程序需要在窗口激活时设置鼠标位置 我设置了该功能 但无法使光标属性发挥作用 由于某种原因 我无法使用 Cursor Position 或
  • 使用 SSH.NET 连接到 OpenSSH 7.4p1 失败,并显示“服务器响应在该位置包含空字符”,但在 WinSCP 中可以正常工作

    我正在尝试使用 SSH NET 2020 0 0 连接到 SFTP 服务器 我的代码看起来很简单 try var x new ConnectionInfo FtpIpAddress 22 FtpUser new PasswordAuthen
  • Scala 复制具有泛型类型的案例类

    我有两节课PixelObject ImageRefObject还有更多 但这里只是这两个类来简化事情 它们都是a的子类trait Object包含一个 uid 我需要通用方法 它将使用给定的新实例复制案例类实例uid 我需要它的原因是因为我
  • 使用 DotNetNuke 设置单独的 ASP.NET 应用程序

    我在 Windows Server 2008 64 位系统上安装了 DotNetNuke v5 1 4 社区版 使用 SQL Server 2008 64 位作为后端数据库 并且我想从中引用一个单独的 ASP NET 应用程序 我计划通过
  • 使用 Gremlin 在二部图上随机游走

    我想根据给定的用户偏好 用户喜欢的项目 基于使用groovy中的gremlin在有向二分图上进行随机游走来对项目进行排名 该图具有以下基本结构 用户1 喜欢 gt 项目A 项目B 此后我提出的查询 def runRankQuery def