28: def suggest(resource)
29: $activerdflog.debug "starting suggestions for #{size} triples"
30: time = Time.now
31:
32: predicates = []
33: own_predicates = resource.direct_predicates
34:
35: construct_occurrence_matrix
36: construct_cooccurrence_matrix
37:
38: own_predicates.each do |p|
39: predicates << p if occurrence(p) > 1
40: end
41:
42:
43: candidates = predicates.collect {|p| cooccurring(p) }
44: return nil if candidates.empty?
45:
46:
47: candidates = candidates.inject {|intersect, n| intersect & n }.flatten
48: candidates = candidates - own_predicates
49:
50: suggestions = candidates.collect do |candidate|
51: score = predicates.inject(1.0) do |score, p|
52: score * cooccurrence(candidate, p) / occurrence(p)
53: end
54: [candidate, score]
55: end
56: $activerdflog.debug "suggestions for #{resource} took #{Time.now-time}s"
57: suggestions
58: end