我是SPARQL的新手。
我试图找到一种通常分析和RDF图的方法,这意味着例如主题的某个关系的平均数。 所以,如果我们有数据
[Alice likes Money]
[Bob has Money]
[Bob likes Diving]
[Bob likes Skiing]
"喜欢"的平均数量是多少?每个节点,(这里:1.5)。
我的第一个尝试是简单地编写一个脚本来迭代所有不同的对象并查询每个对象关系的计数。
有没有办法在SPARQL中直接执行此操作?
答案 0 :(得分:3)
是的,您可以使用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
的不同值,然后我们可以简单地除{{1}我们?likeCount
给我们每个节点的平均喜欢。