SPARQL 对聚合值应用 MAX [重复]

2023-12-25

我有这样的疑问:

prefix : <http://test.example/> 

select  ?anotherUser  (COUNT(?anotherItem) as ?countOfSharedLikedItems) 
WHERE 
{
   values ?user {:ania}.
   ?anotherUser :likes ?anotherItem.

   filter (?anotherUser != ?user)
   filter exists {?user :likes ?anotherItem}
}
group by ?anotherUser
order by desc(?countOfSharedLikedItems)

运行在这些数据上:

@prefix : <http://test.example/> .

:alice :likes :beethoven.
:alice :likes :verdi.
:sofia :likes :beethoven.
:sofia :likes :verdi.
:sofia :likes :rossini.
:sofia :likes :mozart.
:ania :likes :verdi.
:ania :likes :beethoven.
:ania :likes :david.
:david :likes :ania.
:david :likes :beethoven.
:david :likes :verdi.
:antonino :likes :verdi.
:antonino :likes :mozart.
:weirdo :likes :katyperry.
:beethoven a :recommendable.
:verdi a :recommendable.
:rossini a :recommendable.
:katyperry a :recommendable.
:mozart a :recommendable.

它工作正常,我正在进行聚合并将值绑定到一个名为的变量countOfSharedLikedItems。现在我想获得该参数的最大值,我尝试了以下方法:

prefix : <http://test.example/> 

select  
   ?anotherUser 
   (MAX(?countOfSharedLikedItems) as ?max) 
   (COUNT(?anotherItem) as ?countOfSharedLikedItems)  
WHERE 
{
   values ?user { :ania }.
   ?anotherUser :likes ?anotherItem.

   filter (?anotherUser != ?user)
   filter exists { ?user :likes ?anotherItem }
}
group by ?anotherUser
order by desc(?countOfSharedLikedItems)

但变量的结果max总是空的。

我做错了什么?

Hint我确实需要在输出中包含三个变量,它们是anotherUser, countOfSharedLikedItems, and max。否则,我只需进行外部选择即可获得最大值,但我需要其中三个,这就是我问的原因,因为我自己无法做到

Update 1

我试过这个SILLY解决方案,它有效,但显然很愚蠢

prefix : <http://test.example/> 
select ?anotherUser ?countOfSharedLikedItems ?maxSharedLikedItems 
WHERE {
{
   select  
      ?anotherUser  
      (COUNT(?anotherItem) as ?countOfSharedLikedItems)  
   WHERE 
   {     
      values ?user { :ania }.
      ?anotherUser :likes ?anotherItem.

      filter (?anotherUser != ?user)
      filter exists { ?user :likes ?anotherItem }
   }
   group by ?anotherUser
   order by desc(?countOfSharedLikedItems)
}
{
   select (MAX(?countOfSharedLikedItems) as ?maxSharedLikedItems) 
   WHERE 
   {
       select  
          ?anotherUser  
          (COUNT(?anotherItem) as ?countOfSharedLikedItems)  
       WHERE 
       {
          values ?user { :ania }.
          ?anotherUser :likes ?anotherItem.

          filter (?anotherUser != ?user)
          filter exists { ?user :likes ?anotherItem }
       }
       group by ?anotherUser
   }
}
}

您能检查一下并提出另一个更好的解决方案吗?


最外层查询的结构在这些部分存在致命问题:

select  
   (MAX(?countOfSharedLikedItems) as ?max) 
   (COUNT(?anotherItem) as ?countOfSharedLikedItems)  
WHERE { ... }
group by ?anotherUser

你需要充分理解什么group by做。中的三元组where部分提供一堆结果行。例如,在类似的查询中

select * where {
  ?s ?p ?o 
}

结果是一堆行,每行都有每个变量的值。当您添加一个group by子句,您是说您想要将这些行划分为一组集合。例如,如果结果是

s1 p1 o1
s1 p2 o2
s2 p1 o2
s2 p1 o3
s3 p1 o2

然后按 ? 进行分组,然后将这些结果划分为如下所示:

s1
   [ p1 o1 ]
   [ p2 o2 ]

s2 
   [ p1 o2 ]
   [ p1 o3 ]

s3 
   [ p1 o2 ]

对于每个唯一的 s 值,您仍然有一堆行,每行提供一个 p 和一个 o 值。聚合函数对这些束进行操作。所以当你做类似的事情时

select ?s (max(?o) as ?oMax) where {
  ?s ?p ?o
}
group by ?s

the max聚合开始对每一组(即 [o1, o2]、[o2, o3] 和 [o2])起作用,并从每个组中生成一个值。所以像

select  
   (count(?o) as ?numO)
   (max(?numO) as ?oMax) 
group by ?s

没有意义。当您按 ? 进行分组时,计数会在每个组中进行,并且有一些值,因此您可以对它们进行计数。但max也尝试在每个束中进行操作,但是束没有任何 ?numO 的绑定可供查看。即使您可以使用来自的值计数(?o),只会有每束一个, so max只会返回该值。

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

SPARQL 对聚合值应用 MAX [重复] 的相关文章

随机推荐

  • 如何将文本字符串发送到服务?

    我有一个桌面应用程序和一项服务 如何将字符串从桌面应用程序发送到我的服务并在服务中处理它 我不想使用套接字 因为它可能被 Windows 防火墙阻止 如果您不想使用网络传输 那么执行跨会话 IPC 的最简单方法可能是使用命名管道 需要注意的
  • 有没有一个工具可以自动将make文件转换为sln/vcproj?

    Google 展示了许多用于获取 Visual Studio 格式 sln vcproj 文件并从中生成 make 文件的工具 但我找不到解决相反问题的文件 我有一个引用数百个 c 和 h 文件的 make 文件 并且 为了方便 调试 在
  • Ruby on Rails - 在特定日期时间自动触发事件

    我想触发一个事件 特别是在特定日期时间 这是我的模型之一中的一列 发送一封电子邮件并更新某些模型的属性 我已经四处搜寻 但还没有真正找到任何解决方案 有什么办法可以实现这一点吗 您可以将排队解决方案与调度程序一起使用 排队解决方案 Resq
  • 用 NA 填充时间序列中缺失的月份[重复]

    这个问题在这里已经有答案了 我有数据集 年月数字 2002 01 2 392909 2002 02 2 496800 2002 03 2 341897 2002 04 1 665625 2002 05 2 398261 2003 01 1
  • Chrome 扩展:异步查询选项卡

    我有两个变量被设置为函数的 返回值 这些函数是获取选项卡的 URL 和对实际选项卡对象的引用 并将它们存储在变量中 我有一些代码 function init var url getUrl var tab getTab function ge
  • 提取标签之间的字母

    谁能指导我如何提取标签之间的单词 例如 hello in C 我猜他是想在之间说一句话tags 您应该使用正则表达式来实现相同的目的
  • c#:如何确定可滚动控件的 ScrollBar 当前是否显示?

    有没有办法让我检查控件的滚动条当前是否显示 我想使用它 这样我就可以确定如何调整 Scrollable 控件的子级的大小 这在某种程度上取决于 ScrollBar 是否显示 Scrollable 控件可以动态调整大小 对于具有 AutoSc
  • 如何在 Swift 中传递具有关联类型(通用协议)的协议作为参数?

    我必须将接口作为参数传递给函数 接口是通用的 也称为具有关联的类型 我找不到一个好的方法来做到这一点 这是我的代码 protocol IObserver class typealias DelegateT class Observer IO
  • Ninject:单例绑定语法?

    我正在将 Ninject 2 0 用于 Net 3 5 框架 我在单例绑定方面遇到困难 我有课UserInputReader它实现了IInputReader 我只希望创建该类的一个实例 public class MasterEngineMo
  • 按可以为 None 的属性对列表进行排序

    我正在尝试使用对对象列表进行排序 my list sort key operator attrgetter attr name 但如果任何列表项有attr None代替attr whatever 然后我得到一个TypeError unord
  • @错误抑制运算符和set_error_handler

    我遵循良好的编程实践 并将 PHP 错误记录到文件中 而不是将其显示给用户 我用set error handler 为了那个原因 现在问题来了 例如 我有一个地方 file exists some file that is outside
  • 具有分类变量的 statsmodels 中的聚类标准误差 (Python)

    我想在使用分类变量和聚类标准误差的 statsmodels 中运行回归 我有一个数据集 其中包含机构 治疗 年份和入学情况 治疗是一个虚拟变量 机构是一个字符串 其他都是数字 我已确保删除所有空值 df dropna reg model s
  • 在r中将地图叠加在3D曲面地图之上

    我使用 rgl surface 创建了一个 3d 地图 主要遵循 Shane 在中的回答this https stackoverflow com questions 1896419 plotting a 3d surface plot wi
  • 如何在firefoxQuantum(浏览器版本57)中安装sqlite管理器插件

    我尝试在 Firefox 中安装 sqlite 管理器插件 但它显示错误 您的 Firefox Quantum 浏览器不兼容 我的 Firefox 浏览器版本是 57 0 4 此扩展取决于嵌入的 sqlite 引擎的接口 在火狐浏览器中 由
  • 使用 webdriver 的 Chrome 和 IE 驱动程序配置文件

    我的项目需要某些 cookie 才能访问该应用程序 对于 Firefox 驱动程序 我使用 firefox 配置文件 我用于手动测试的 ff 配置文件 因为它具有我想要的所有 cookie 来运行脚本 如何在 Chrome 和 IE 浏览器
  • Illustrator/SVG 到 JavaScript 的工作流程? (模板库?)

    在 Illustrator 中 另存为 SVG 时 这是典型的结果
  • 无法使用 YAML Spring Profile 禁用 @Cacheable

    我创建了一个名为 mycache 的缓存 该缓存应用于我的服务中的方法 例如 Cacheable value mycache public String getValue String something breakpoint here 我
  • WKT中如何处理Circle?

    我有一个 json 对象 区域 圆形 28 625360369528934 77 2227479486792 3135 6 如何使用WKTreader解析它 你需要回到写下它的人那里并解释一下CIRCLE不属于WKT标准 http www
  • 存储设置的最佳实践

    我有一个相当大的 C 应用程序 在 Windows 上 没有计划其他平台 它当前将所有设置 甚至某种地址 存储在 Windows 注册表中 有时这很不方便 因为用户很难更改注册表中的条目 我希望对设置进行版本控制 以便设置始终与当前代码匹配
  • SPARQL 对聚合值应用 MAX [重复]

    这个问题在这里已经有答案了 我有这样的疑问 prefix