Gremlin query to traverse the whole graph










0















Is it possible to write a Gremlin query, given a vertex, recursively traverse the whole graph connected to that node?



For example,



 watched director
user1 -------> movie_1 <------ chris nolan
^
user2------------|
watched


Given movie_1, return all vertices connected to movie_1 (user1, user2, chris nolan), then return vertices connected to user1, user2, chris nolan and so on.










share|improve this question


























    0















    Is it possible to write a Gremlin query, given a vertex, recursively traverse the whole graph connected to that node?



    For example,



     watched director
    user1 -------> movie_1 <------ chris nolan
    ^
    user2------------|
    watched


    Given movie_1, return all vertices connected to movie_1 (user1, user2, chris nolan), then return vertices connected to user1, user2, chris nolan and so on.










    share|improve this question
























      0












      0








      0








      Is it possible to write a Gremlin query, given a vertex, recursively traverse the whole graph connected to that node?



      For example,



       watched director
      user1 -------> movie_1 <------ chris nolan
      ^
      user2------------|
      watched


      Given movie_1, return all vertices connected to movie_1 (user1, user2, chris nolan), then return vertices connected to user1, user2, chris nolan and so on.










      share|improve this question














      Is it possible to write a Gremlin query, given a vertex, recursively traverse the whole graph connected to that node?



      For example,



       watched director
      user1 -------> movie_1 <------ chris nolan
      ^
      user2------------|
      watched


      Given movie_1, return all vertices connected to movie_1 (user1, user2, chris nolan), then return vertices connected to user1, user2, chris nolan and so on.







      gremlin datastax-enterprise-graph






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 12 '18 at 21:16









      GlideGlide

      6,771195283




      6,771195283






















          1 Answer
          1






          active

          oldest

          votes


















          3














          You would likely use some variation of repeat() step to accomplish what you want (i.e. traverse an arbitrary number of steps away from a starting vertex). When asking questions about Gremlin it's nice to have asciiart diagrams of the graph but it's even better to have a simple Gremlin script that creates the graph itself like this:



          g.addV('movie').property('name','movie-1').as('m').
          addV('user').property('name','user-1').as('u1').
          addV('user').property('name','user-2').as('u2').
          addV('person').property('name','chris nolan').as('d').
          addE('watched').from('u1').to('m').
          addE('watched').from('u2').to('m').
          addE('directed').from('d').to('m').iterate()


          Then, to start at "movie-1" and traverse to arbitrary depth, just do:



          gremlin> g.V().has('movie','name','movie-1').
          ......1> repeat(__.in()).
          ......2> emit().
          ......3> valueMap(true)
          ==>[id:2,label:user,name:[user-1]]
          ==>[id:4,label:user,name:[user-2]]
          ==>[id:6,label:person,name:[chris nolan]]


          That will continue to traverse on incoming edges until it hits vertices without any, emitting all vertices found along the way. Obviously, if you your edges don't all traverse in, then you'll need to alter the pattern within repeat() to traverse both(), but you'll want to try to avoid cycles in the process or the repeat() will traverse indefinitely. Use of simplePath() might be helpful there but ultimately your approach to loop termination will be defined by your graph structure.



          Note that this could be an expensive query depending on the traversal depth.






          share|improve this answer






















            Your Answer






            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "1"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53270245%2fgremlin-query-to-traverse-the-whole-graph%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            3














            You would likely use some variation of repeat() step to accomplish what you want (i.e. traverse an arbitrary number of steps away from a starting vertex). When asking questions about Gremlin it's nice to have asciiart diagrams of the graph but it's even better to have a simple Gremlin script that creates the graph itself like this:



            g.addV('movie').property('name','movie-1').as('m').
            addV('user').property('name','user-1').as('u1').
            addV('user').property('name','user-2').as('u2').
            addV('person').property('name','chris nolan').as('d').
            addE('watched').from('u1').to('m').
            addE('watched').from('u2').to('m').
            addE('directed').from('d').to('m').iterate()


            Then, to start at "movie-1" and traverse to arbitrary depth, just do:



            gremlin> g.V().has('movie','name','movie-1').
            ......1> repeat(__.in()).
            ......2> emit().
            ......3> valueMap(true)
            ==>[id:2,label:user,name:[user-1]]
            ==>[id:4,label:user,name:[user-2]]
            ==>[id:6,label:person,name:[chris nolan]]


            That will continue to traverse on incoming edges until it hits vertices without any, emitting all vertices found along the way. Obviously, if you your edges don't all traverse in, then you'll need to alter the pattern within repeat() to traverse both(), but you'll want to try to avoid cycles in the process or the repeat() will traverse indefinitely. Use of simplePath() might be helpful there but ultimately your approach to loop termination will be defined by your graph structure.



            Note that this could be an expensive query depending on the traversal depth.






            share|improve this answer



























              3














              You would likely use some variation of repeat() step to accomplish what you want (i.e. traverse an arbitrary number of steps away from a starting vertex). When asking questions about Gremlin it's nice to have asciiart diagrams of the graph but it's even better to have a simple Gremlin script that creates the graph itself like this:



              g.addV('movie').property('name','movie-1').as('m').
              addV('user').property('name','user-1').as('u1').
              addV('user').property('name','user-2').as('u2').
              addV('person').property('name','chris nolan').as('d').
              addE('watched').from('u1').to('m').
              addE('watched').from('u2').to('m').
              addE('directed').from('d').to('m').iterate()


              Then, to start at "movie-1" and traverse to arbitrary depth, just do:



              gremlin> g.V().has('movie','name','movie-1').
              ......1> repeat(__.in()).
              ......2> emit().
              ......3> valueMap(true)
              ==>[id:2,label:user,name:[user-1]]
              ==>[id:4,label:user,name:[user-2]]
              ==>[id:6,label:person,name:[chris nolan]]


              That will continue to traverse on incoming edges until it hits vertices without any, emitting all vertices found along the way. Obviously, if you your edges don't all traverse in, then you'll need to alter the pattern within repeat() to traverse both(), but you'll want to try to avoid cycles in the process or the repeat() will traverse indefinitely. Use of simplePath() might be helpful there but ultimately your approach to loop termination will be defined by your graph structure.



              Note that this could be an expensive query depending on the traversal depth.






              share|improve this answer

























                3












                3








                3







                You would likely use some variation of repeat() step to accomplish what you want (i.e. traverse an arbitrary number of steps away from a starting vertex). When asking questions about Gremlin it's nice to have asciiart diagrams of the graph but it's even better to have a simple Gremlin script that creates the graph itself like this:



                g.addV('movie').property('name','movie-1').as('m').
                addV('user').property('name','user-1').as('u1').
                addV('user').property('name','user-2').as('u2').
                addV('person').property('name','chris nolan').as('d').
                addE('watched').from('u1').to('m').
                addE('watched').from('u2').to('m').
                addE('directed').from('d').to('m').iterate()


                Then, to start at "movie-1" and traverse to arbitrary depth, just do:



                gremlin> g.V().has('movie','name','movie-1').
                ......1> repeat(__.in()).
                ......2> emit().
                ......3> valueMap(true)
                ==>[id:2,label:user,name:[user-1]]
                ==>[id:4,label:user,name:[user-2]]
                ==>[id:6,label:person,name:[chris nolan]]


                That will continue to traverse on incoming edges until it hits vertices without any, emitting all vertices found along the way. Obviously, if you your edges don't all traverse in, then you'll need to alter the pattern within repeat() to traverse both(), but you'll want to try to avoid cycles in the process or the repeat() will traverse indefinitely. Use of simplePath() might be helpful there but ultimately your approach to loop termination will be defined by your graph structure.



                Note that this could be an expensive query depending on the traversal depth.






                share|improve this answer













                You would likely use some variation of repeat() step to accomplish what you want (i.e. traverse an arbitrary number of steps away from a starting vertex). When asking questions about Gremlin it's nice to have asciiart diagrams of the graph but it's even better to have a simple Gremlin script that creates the graph itself like this:



                g.addV('movie').property('name','movie-1').as('m').
                addV('user').property('name','user-1').as('u1').
                addV('user').property('name','user-2').as('u2').
                addV('person').property('name','chris nolan').as('d').
                addE('watched').from('u1').to('m').
                addE('watched').from('u2').to('m').
                addE('directed').from('d').to('m').iterate()


                Then, to start at "movie-1" and traverse to arbitrary depth, just do:



                gremlin> g.V().has('movie','name','movie-1').
                ......1> repeat(__.in()).
                ......2> emit().
                ......3> valueMap(true)
                ==>[id:2,label:user,name:[user-1]]
                ==>[id:4,label:user,name:[user-2]]
                ==>[id:6,label:person,name:[chris nolan]]


                That will continue to traverse on incoming edges until it hits vertices without any, emitting all vertices found along the way. Obviously, if you your edges don't all traverse in, then you'll need to alter the pattern within repeat() to traverse both(), but you'll want to try to avoid cycles in the process or the repeat() will traverse indefinitely. Use of simplePath() might be helpful there but ultimately your approach to loop termination will be defined by your graph structure.



                Note that this could be an expensive query depending on the traversal depth.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 13 '18 at 11:04









                stephen mallettestephen mallette

                25.4k32776




                25.4k32776



























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53270245%2fgremlin-query-to-traverse-the-whole-graph%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Use pre created SQLite database for Android project in kotlin

                    Darth Vader #20

                    Ondo