Well, if you want to get it duplicated, you can just do union(outE(), inE()), that's easy and inexpensive. However, any way to get rid of the duplicates can be expensive:
- local(bothE().dedup()) // needs to keep track of all edges; requires internal memory structures - union(outE(), __.as("a").inE().not(where(outV().as("a")))) // enables partial path tracking; again that requires internal memory structures If we / providers implement the deduplication though, we wouldn't require any extra memory structures. Returning the duplicates makes sense to me from an engineering perspective, but not from a user perspective. Cheers, Daniel On Wed, Oct 25, 2017 at 6:53 PM, Robert Dale <robd...@gmail.com> wrote: > I think that bothE() == union(outE(),inE()) and outE().count() + > inE().count() == bothE().count(). If you don't want the self-referencing > edge to be returned twice, then either make it a unidirected edge (if > supported) so that it would still satisfy the two previous condition or > dedup(). In either case, it's left to the user to determine what edges are > returned. > > Also, I think it makes sense that g.E() == g.V().outE(). It should not be > g.V().inE() due to potential for unidirected edges. > > > Robert Dale > > On Wed, Oct 25, 2017 at 9:32 AM, Daniel Kuppitz <m...@gremlin.guru> wrote: > > > IMO it should return the edge only once. > > > > Cheers, > > Daniel > > > > > > On Wed, Oct 25, 2017 at 5:47 AM, Stephen Mallette <spmalle...@gmail.com> > > wrote: > > > > > The test suite doesn't seem to enforce behavior related to > self-relating > > > edges. TinkerGraph does this: > > > > > > gremlin> g = TinkerGraph.open().traversal() > > > ==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard] > > > gremlin> g.addV().as('a').addE('self').to('a') > > > ==>e[1][0-self->0] > > > gremlin> g.E() > > > ==>e[1][0-self->0] > > > gremlin> g.V().bothE().count() > > > ==>2 > > > > > > Should bothE() return 2 in this case or 1? I think that we've said in > the > > > past that g.E() is the same as g.V().outE() or g.V().inE(), but not > > > necessarily g.V().bothE(). Thoughts? > > > > > >