Намиране на k най-близки съседи със SPARQL заявка

Бих искал да напиша една 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 .
}

Има ли начин да направите това за множество вектори в една заявка?


person Abraham D Flaxman    schedule 28.01.2013    source източник


Отговори (1)


Освен ако не пропускам нещо, можете да направите това, като замените URI vector:0 с променлива, така:

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 ... } 
person Jeen Broekstra    schedule 28.01.2013
comment
Благодаря ти за помощта. Ако разбирам това правилно, не мисля, че това решава проблема ми обаче. Синтактично, ?vector не може да се появи в SELECT, тъй като не е включен в GROUP BY. Но просто добавянето му, както е ГРУПИРАНЕ ПО ?vector ?other_vector ще използва 100-те най-сходни вектора като цяло, докато аз искам 100-те най-сходни за всеки вектор в моя списък. - person Abraham D Flaxman; 29.01.2013
comment
Това не е проблем, можете да добавите клаузата за стойности към вътрешния избор, за да ограничите ?vector до вашия списък. - person Jeen Broekstra; 29.01.2013
comment
Като алтернатива можете да оставите променливата ?vector извън проекцията, просто предположих, че имате нужда от нея, за да можете да корелирате резултатите. - person Jeen Broekstra; 29.01.2013
comment
Мисля, че сте разбрали погрешно проблема или може би съм го изразил неясно. За случая k=2, ако v има съседи от най-близкия до най-отдалечения (a,b,c) и u има съседи (d,e,f), бих искал резултати (v,a), (v,b) , (u,d), (u,e). Но след коригиране на синтаксиса във вашата заявка, ако v е по-близо до c, отколкото u е до d, резултатите ще бъдат (v,a), (v,b), (v,c), (u,d). С други думи, предизвикателството е да се получат k съседи за всеки вектор в списъка. - person Abraham D Flaxman; 29.01.2013