分析RDF图:某种关系的平均数

Analyzing RDF Graph: average number of certain relation

我是 SPARQL 的新手。

我正在尝试找到一种方法来对 RDF 图进行一般分析,这意味着例如某个主题的特定关系的平均数。 所以如果我们有数据

[Alice         likes     Money]
[Bob           has       Money]
[Bob           likes     Diving] 
[Bob           likes     Skiing]

每个节点 "likes" 的平均数量是多少,(此处:1.5)。

我的第一个尝试是简单地编写一个脚本来迭代所有不同的对象并查询每个对象的点赞关系计数。

有没有办法直接在 SPARQL 中执行此操作?

是的,您可以使用 GROUP BY 和聚合来处理这种事情。有关此概述,请参阅规范中的 Aggregates

如果你想获得每个节点的点赞数,你可以这样做:

PREFIX : <http://example.org/ns#>

SELECT ?node (COUNT(*) AS ?likes)
WHERE
{
  ?s :likes ?node
}
GROUP BY ?node

在这里,我们按 ?node 分组并执行 COUNT(*),它简单地计算组中解决方案的数量。这为我们提供了单个查询中每个不同 ?node 值的点赞数。

如果我们想找到每个节点的平均点赞数,我们也可以使用聚合来做到这一点:

PREFIX : <http://example.org/ns#>

SELECT 
 (COUNT(*) AS ?likeCount) 
 (COUNT(DISTINCT ?node) AS ?nodeCount) 
 (?likeCount / ?nodeCount AS ?avgLikesPerNode)
WHERE
{
  ?s :likes ?node .
}

这里我们再次使用 COUNT(*) 来获取喜欢的总数,然后我们使用 COUNT(DISTINCT ?node) 来计算 ?node 的不同值,然后我们可以简单地除以我们的 ?likeCount 通过我们的 ?nodeCount 给我们每个节点的平均喜欢。