I do like the approach of formally including openCypher / ASCII art into
Gremlin / TinkerPop. I'm reluctant to overload the match() step for that
purpose.

The match() step does have a similar purpose, but it has a fraught history.
I think it would work better from a number of angles to leave it as it is.

I'm more aligned with Joshua's recommendation. The use of the cypher()
step  (or perhaps an openCypher() step?) makes explicit the transition to
another language and processing approach.  This pairs nicely with the
sparql() step and provides an intuitive pattern to introduce other data
querying approaches ( sql(), gql(), prolog(), mmADT(), pigeon(), ... ).

I do rather like the idea of the overloads within the step, ways to "hook"
the Gremlin into whatever the query language is. That could provide
remarkable flexibility and opens up a whole suite of capabilities.

Overall, this is a really great idea which should help with
interoperability between TinkerPop and other graph frameworks.

Josh


On Thu, Feb 4, 2021 at 10:30 PM pieter gmail <pieter.mar...@gmail.com>
wrote:

> +1
>
> Cheers
> Pieter
>
> On Thu, 2021-02-04 at 17:15 -0800, Joshua Shinavier wrote:
> > Initial thought: if the ASCII art syntax is Cypher-like, why not make
> > it
> > openCypher proper? I.e. keep match() as it is, but generalize the
> > cypher()
> > step out of Neo4jGraph, with native Neo4j evaluation of Cypher as an
> > optimization.
> >
> > Josh
> >
> >
> > On Thu, Feb 4, 2021 at 2:17 PM David Bechberger <d...@bechberger.com>
> > wrote:
> >
> > > Over the years of working with Gremlin I have foudn the match()
> > > step is
> > > difficult to create traversals with and even more difficult to make
> > > it work
> > > efficently.  While the imperative style of programming in Gremlin
> > > provides
> > > a powerful path finding mechanism it really lacks an easy way to
> > > perform
> > > pattern matching queries.  It would be great if we could simplify
> > > the
> > > match() step to enable users to easily generate these pattern
> > > matching
> > > traversals.
> > >
> > > To accomplish this I was wondering what adding support for a subset
> > > of
> > > motif/ascii art patterns to the match step might look like.  These
> > > types of
> > > patterns are very easy for people to understand and I think the
> > > ability to
> > > combine these pattern matching syntax with the powerful path
> > > finding and
> > > formatting features of Gremlin would make a powerful combination.
> > >
> > > To accomplish this I am suggesting supporting a subset of potential
> > > patterns.  The two most common examples of this sort of pattern out
> > > there
> > > are the openCypher type style and the style used by GraphX.  I have
> > > provided a few examples below of what this syntax might look like:
> > >
> > > e.g. openCypher style
> > >
> > > Find me everything within one hop
> > > g.V().match("()-[]->()")
> > >
> > > Find me everything within one hop of a Person vertex
> > > g.V().match("(p:Person)-[]->()")
> > >
> > > Find me all Companies within one hop of a Person vertex
> > > g.V().match("(p:Person)-[]->(c:Company)")
> > >
> > > Find me all Companies within one hop of a Person vertex with an
> > > Employed_at
> > > edge
> > > g.V().match("(p:Person)-[e:employed_at]->(c:Company)")
> > >
> > >
> > > The other option would be to take more of a hybrid approach and use
> > > only
> > > the basic art/motifs like GraphX and apply the additional filtering
> > > in a
> > > hybrid type of mode like this:
> > >
> > > Find me all Companies within one hop of a Person vertex with an
> > > Employed_at
> > > edge
> > > g.V().match("(p)-[e]->(c)",
> > > __.as('p').hasLabel('Person'),
> > > __.as('e').hasLabel('employed_at'),
> > > __.as('c').hasLabel('Company'),
> > > )
> > >
> > > This also has the potential to enable some significantly more
> > > complex
> > > patterns like "Find me all Companies within one hop of a Person
> > > vertex with
> > > an Employed_at edge who also worked at Foo"
> > > g.V().match("(p)-[e]->(c)",
> > > __.as('p').hasLabel('Person').out('employed_at').has('Company',
> > > 'name',
> > > 'Foo'),
> > > __.as('e').hasLabel('employed_at'),
> > > __.as('c').hasLabel('Company'),
> > > )
> > >
> > > Thoughts?
> > >
> > > Dave
> > >
>
>

Reply via email to