Hi,

With the latest work on where() and its ability to support both local and 
global scoping, we have been able to get rid of except()/retain() as where() is 
more general and the less steps, the better.

gremlin> g.V(1).as('a').out('created').in('created').
                      where(neq('a')).values('name') // marko's collaborators
==>josh
==>peter
gremlin> g.V(1).as('a').out('created').in('created').
                      where(out('created').count().is(gt(1))).values('name') // 
marko's collaborators that have created more than one project
==>josh

        http://tinkerpop.incubator.apache.org/docs/3.0.0-SNAPSHOT/#where-step

Enjoy,
Marko.

http://markorodriguez.com

On May 7, 2015, at 2:49 PM, Marko Rodriguez <[email protected]> wrote:

> Hi,
> 
> Matt Frantz had this idea the other day:
>       https://issues.apache.org/jira/browse/TINKERPOP3-652
> 
> I was anti it at first cause then match() looks like this:
> 
>       g.V.match(…).select(local,'a','b')
> 
> Gross… However, it makes sense as select() was too overloaded with both 
> global analysis (Path) and local analysis (Map<String,Object>). To rectify 
> the ugliness of select(local,'a','b'), I made an interface called Scoping 
> which allows a step to recommend a Scope. Thus, MatchStep's recommend scope 
> is Scope.local. There is a ScopingStrategy that then uses scope 
> recommendations.
> 
>       
> https://github.com/apache/incubator-tinkerpop/blob/master/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ScopingStrategy.java
> 
> So, now we are back to:
> 
>       g.V.match(…).select('a','b')
> 
> So thats good. However, check out what you can do now that both select() and 
> where() can be scoped.
> 
> gremlin> g = TinkerFactory.createModern().traversal()
> ==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
> gremlin> // no except() needed any more! thats huge. i have always hated 
> except/retain and now they can go away.
> gremlin> 
> g.V(1).as('a').out('created').in('created').as('b').where('a',neq('b')).values('name')
> ==>josh
> ==>peter
> gremlin> 
> g.V(1).as('a').out('created').in('created').as('b').where('a',neq('b')).select().by('name')
> ==>[a:marko, b:josh]
> ==>[a:marko, b:peter]
> gremlin> 
> g.V(1).as('a').out('created').in('created').as('b').select().by('name').where('a',neq('b'))
> ==>[a:marko, b:josh]
> ==>[a:marko, b:peter]
> 
> …where() can operate on current object Maps or it can operate on global Paths 
> (similar to select()). The last two examples are crazy cause of 
> ScopeStrategy. Check the toString():
> 
> gremlin> 
> g.V(1).as('a').out('created').in('created').as('b').where('a',neq('b')).select().by('name').iterate().toString()
> ==>[TinkerGraphStep([1],vertex)@[a], VertexStep(OUT,[created],vertex), 
> VertexStep(IN,[created],vertex)@[b], WhereStep(global,a,neq,b), 
> SelectStep(global,[value(name)])]
> gremlin> 
> g.V(1).as('a').out('created').in('created').as('b').select().by('name').where('a',neq('b')).iterate().toString()
> ==>[TinkerGraphStep([1],vertex)@[a], VertexStep(OUT,[created],vertex), 
> VertexStep(IN,[created],vertex)@[b], SelectStep(global,[value(name)]), 
> WhereStep(local,a,neq,b)]
> 
> Notice in the second example how the WhereStep uses local. Why? Cause 
> SelectStep projects down to a Map. No need to do double path analysis. Neato.
> 
> Enjoy,
> Marko.
> 
> http://markorodriguez.com
> 

Reply via email to