sparql - 如何使用 SPARQL "MINUS" 作为 SQL "NOT IN" 等同于获取所有只在一个团队中打球的玩家
问题描述
我正在对 Lahman 棒球数据库中的数据进行 sparql 查询。这里有一些示例数据来展示我的查询需要做什么。
@prefix ma: <http://mydataset.com/ns/master#> .
ma:billybo01 ma:nameFirst "Billy" .
ma:billybo01 ma:nameLast "Bored" .
ma:chrisgow01 ma:nameFirst "Chris" .
ma:chrisgow01 ma:nameLast "Gowan" .
ma:bradlee01 ma:nameFirst "Brad" .
ma:bradlee01 ma:nameLast "Lee" .
@prefix teamQ2: <http://mydataset.com/ns/teamQ2#> .
@prefix yearQ2: <http://mydataset.com/ns/yearQ2#> .
@prefix ma: <http://mydataset.com/ns/master#> .
teamQ2:BS1 yearQ2:1871 ma:billybo01 .
teamQ2:BS1 yearQ2:1872 ma:billybo01 .
teamQ2:BS1 yearQ2:1873 ma:billybo01 .
teamQ2:LAN yearQ2:1874 ma:billybo01 .
teamQ2:LAN yearQ2:1871 ma:chrisgow01 .
teamQ2:LAN yearQ2:1872 ma:chrisgow01 .
teamQ2:BS1 yearQ2:1871 ma:bradlee01 .
teamQ2:BS1 yearQ2:1872 ma:bradlee01 .
我正在尝试获取只为 LAN 团队而不是其他团队效力的所有球员的名字和姓氏。我的尝试是我在下面展示的。我希望查询任何一年在团队 LAN 中的所有玩家,获取他们的 masterID,然后从该集合中减去曾经出现在 LAN 以外的团队中的所有玩家。然后我只需将 masterId 与最后的名字和姓氏相匹配。现在它正在返回数据,就好像MINUS
和FILTER !EXISTS
相互抵消一样,它只返回所有在局域网上玩的玩家。MINUS
除了或之外,我还需要使用其他东西FILTER !EXISTS
吗?
PREFIX ma: <http://mydataset.com/ns/master#>
PREFIX teamQ2: <http://mydataset.com/ns/teamQ2#>
SELECT DISTINCT ?nameFirst ?nameLast
WHERE
{
teamQ2:LAN ?yearID ?masterID .
MINUS{FILTER (
!EXISTS {
teamQ2:LAN ?yearID ?nonLANmasterID .
}
)}
?masterID ma:nameLast ?nameLast .
?masterID ma:nameFirst ?nameFirst .
}
ORDER BY ?nameLast ?nameFirst
解决方案
建模是一个相当不寻常的,但这里是基于您的描述的查询大纲:
找出所有的
teamQ2:LAN ?p ?o .
三元组。拒绝任何与属性-对象对
(FILTER NOT EXISTS)
不同的主题的匹配。(FILTER(?otherteam != teamQ2:LAN )
?p ?o
(这实际上是“在同一年没有为同一支球队效力,因为
?p
isyearQ2:1871
etc 包括了这一年。)
前缀马: 前缀团队Q2: 选择 * 在哪里 { teamQ2:LAN ?p ?masterID 。 过滤器不存在 { ?otherteam?p?masterID。 过滤器(?其他团队!= teamQ2:LAN) } ?masterID ma:nameLast ?nameLast 。 ?masterID ma:nameFirst ?nameFirst 。 }
在这种情况下,也可以这样做:
- 查找
teamQ2:LAN
. - 查找不属于
teamQ2:LAN
. MINUS
就?masterID
以上两点。
前缀马: 前缀团队Q2: 选择 * 在哪里 { teamQ2:LAN ?yearID ?masterID 。 减 { ?otherteam?yearID?masterID。 过滤器(?其他团队!= teamQ2:LAN) } ?masterID ma:nameLast ?nameLast 。 ?masterID ma:nameFirst ?nameFirst 。 }
我认为您应该考虑将数据及时记录为事件:
在“年”或三人组中“为球队效力”的球员:
ma:bradlee01 :playedForInYear [ :team teamQ2:BS1 ; : 1871 年]。 ma:bradlee01 :playedForInYear [ :team teamQ2:BS1 ; : 1872 年]。
推荐阅读
- json - 在 vue 循环中使用 Axios 从 .json 获取数据
- php - 当 PHP 文件位于 /opt/moddoc/ 时的 Apache 2.4、PHP-FPM、FastCGI 配置 - Apache 不处理 php 文件
- javascript - 如何在 JavaScript Canvas 中减慢我的精灵动画?
- go - Go 程序错误(Bettercap 2)取决于我在运行 ble 扫描时在 Ubuntu/Raspberry Pi OS 上使用的蓝牙加密狗
- python - Selenium Looped WebDriverWait
- php - 无法与主机 mailhog 建立连接
- java - 如何从Java中的单个目录下载多个文件
- toml - Chainlink 节点:作业类型“webhook”尚未在作业中注册。Spawner
- angular - 更新多个结果的多个复选框 - Angular Firebase 表单
- qt - QCPItemTracer 可以追踪 QCPCurve 吗?