// uniqueMorphism removes duplicate values from current path. func uniqueMorphism() morphism { return morphism{ Name: "unique", Reversal: func(ctx *pathContext) (morphism, *pathContext) { return uniqueMorphism(), ctx }, Apply: func(qs graph.QuadStore, in graph.Iterator, ctx *pathContext) (graph.Iterator, *pathContext) { return iterator.NewUnique(in), ctx }, } }
// predicatesMorphism iterates to the uniqified set of predicates from // the given set of nodes in the path. func predicatesMorphism(isIn bool) morphism { m := morphism{ Name: "out_predicates", Reversal: func(ctx *context) (morphism, *context) { panic("not implemented: need a function from predicates to their associated edges") }, Apply: func(qs graph.QuadStore, in graph.Iterator, ctx *context) (graph.Iterator, *context) { dir := quad.Subject if isIn { dir = quad.Object } lto := iterator.NewLinksTo(qs, in, dir) hasa := iterator.NewHasA(qs, lto, quad.Predicate) return iterator.NewUnique(hasa), ctx }, } if isIn { m.Name = "in_predicates" } return m }