2

我想编写一个 SPARQL 查询来查找一组向量的 k 个最近邻居。要查找单个向量的 100 个最近邻居的平均标签,我可以使用以下查询:

PREFIX : <ml://>
PREFIX vector: <ml://vector/>
PREFIX feature: <ml://feature/>

SELECT (AVG(?label) as ?prediction)
WHERE {
  {
    SELECT ?other_vector (COUNT(?common_feature) as ?similarity)
    WHERE { vector:0 :has ?common_feature . 
      ?other_vector :has ?common_feature .
    } GROUP BY ?other_vector ORDER BY DESC(?similarity) LIMIT 100
  }
  ?other_vector :hasLabel ?label .
}

有没有办法在单个查询中对多个向量执行此操作?

4

1 回答 1

0

除非我忽略了某些东西,否则您可以通过用vector:0变量替换 URI 来做到这一点,如下所示:

SELECT ?vector (AVG(?label) as ?prediction)
WHERE {
  {
    SELECT ?vector ?other_vector (COUNT(?common_feature) as ?similarity)
    WHERE { ?vector :has ?common_feature . 
      ?other_vector :has ?common_feature .
      FILTER(?vector != ?other_vector)
    } GROUP BY ?other_vector ORDER BY DESC(?similarity) LIMIT 100
  }
  ?other_vector :hasLabel ?label .
}

我添加了一个过滤条件来检查?vector?other_vector不相等,是否有必要当然取决于你:)

如果您需要限制要查找匹配项的向量列表,可以使用VALUES子句来限制可能的绑定?vector

VALUES ?vector { vector:0 vector:1 ... } 
于 2013-01-28T22:46:39.057 回答