Gremlin query to traverse the whole graph
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
add a comment |
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
add a comment |
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
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
gremlin datastax-enterprise-graph
asked Nov 12 '18 at 21:16
GlideGlide
6,771195283
6,771195283
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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.
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
add a comment |
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.
add a comment |
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.
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.
answered Nov 13 '18 at 11:04
stephen mallettestephen mallette
25.4k32776
25.4k32776
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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