diff --git a/query/gremlin/build_iterator.go b/query/gremlin/build_iterator.go index 11fd453..5d285de 100644 --- a/query/gremlin/build_iterator.go +++ b/query/gremlin/build_iterator.go @@ -299,14 +299,19 @@ func buildIteratorTreeHelper(obj *otto.Object, ts graph.TripleStore, base graph. case "in": it = buildInOutIterator(obj, ts, subIt, true) case "not": - // arg, _ := obj.Get("_gremlin_values") - // firstArg, _ := arg.Object().Get("0") - // if !isVertexChain(firstArg.Object()) { - // return iterator.NewNull() - // } - // forbiddenIt := buildIteratorTree(firstArg.Object(), ts) + arg, _ := obj.Get("_gremlin_values") + firstArg, _ := arg.Object().Get("0") + if !isVertexChain(firstArg.Object()) { + return iterator.NewNull() + } - it = iterator.NewNot(ts, subIt) + toComplementIt := buildIteratorTree(firstArg.Object(), ts) + notIt := iterator.NewNot(ts, toComplementIt) + + and := iterator.NewAnd() + and.AddSubIterator(subIt) + and.AddSubIterator(notIt) + it = and case "loop": arg, _ := obj.Get("_gremlin_values") firstArg, _ := arg.Object().Get("0") diff --git a/query/gremlin/traversals.go b/query/gremlin/traversals.go index 83d3853..e22a5c6 100644 --- a/query/gremlin/traversals.go +++ b/query/gremlin/traversals.go @@ -39,7 +39,8 @@ func (wk *worker) embedTraversals(env *otto.Otto, obj *otto.Object) { obj.Set("Save", wk.gremlinFunc("save", obj, env)) obj.Set("SaveR", wk.gremlinFunc("saver", obj, env)) obj.Set("Loop", wk.gremlinFunc("loop", obj, env)) - obj.Set("Not", wk.gremlinFunc("not", obj, env)) + obj.Set("Except", wk.gremlinFunc("not", obj, env)) + obj.Set("Difference", wk.gremlinFunc("not", obj, env)) } func (wk *worker) gremlinFunc(kind string, prev *otto.Object, env *otto.Otto) func(otto.FunctionCall) otto.Value {