Gremlin 按源节点小精灵筛选节点

Gremlin 按源节点小精灵筛选节点,gremlin,tinkerpop,janusgraph,Gremlin,Tinkerpop,Janusgraph,假设我有这样的数据 (id:1)->(id:2)->(id:3)->(id:4)->(id:5)->(id:6)->(id:9)->(id:10) (id:5)->(id:7)->(id:8)->(id:6) 要清楚,Id 5是具有2条边的同一节点 下面是一个代码示例: g.addV('person').property('id',1).as('1'). addV('person').property('id',2).as('2'

假设我有这样的数据

(id:1)->(id:2)->(id:3)->(id:4)->(id:5)->(id:6)->(id:9)->(id:10)
(id:5)->(id:7)->(id:8)->(id:6)
要清楚,Id 5是具有2条边的同一节点

下面是一个代码示例:

g.addV('person').property('id',1).as('1').
  addV('person').property('id',2).as('2').
  addV('person').property('id',3).as('3').
  addV('person').property('id',4).as('4').
  addV('person').property('id',5).as('5').
  addV('person').property('id',6).as('6').
  addV('person').property('id',7).as('7').
  addV('person').property('id',8).as('8').
  addV('person').property('id',9).as('9').
  addV('person').property('id',10).as('10').
  addE('connection').from('1').to('2').
  addE('connection').from('2').to('3').
  addE('connection').from('3').to('4').
  addE('connection').from('4').to('5').
  addE('connection').from('5').to('6').
  addE('connection').from('6').to('9').
  addE('connection').from('9').to('10').
  addE('connection').from('5').to('7').
  addE('connection').from('7').to('8').
  addE('connection').from('8').to('6').iterate()
我需要遍历该图,并排除6在任何方向上与5有连接的任何节点。所以我会回来:

(id:1)->(id:2)->(id:3)->(id:4)->(id:5)->(id:6)
(id:1)->(id:2)->(id:3)->(id:4)->(id:5)->(id:7)->(id:8)->(id:6)

我不确定我是否完全理解您的问题,但听起来您希望在看到遇到顶点6且顶点6的边到顶点5的图案时立即停止遍历-如果是这样,则有一种方法可以做到这一点:

gremlin> g.V().has('id',1).
......1>   repeat(both().simplePath()).
......2>     until(and(has('id',6),
......3>               both().has('id',5))).
......4>   path().by('id')
==>[1,2,3,4,5,6]
==>[1,2,3,4,5,7,8,6]

请注意,由于遍历从顶点1开始,因此我与您在回答中描述的输出不完全匹配,因此在这两种情况下,所采用的路径将包括该部分路径。

我不确定我是否完全理解您的问题,但听起来,当您看到遇到顶点6且顶点6的边到顶点5的图案时,您希望立即停止遍历-如果是这样,则有一种方法可以做到这一点:

gremlin> g.V().has('id',1).
......1>   repeat(both().simplePath()).
......2>     until(and(has('id',6),
......3>               both().has('id',5))).
......4>   path().by('id')
==>[1,2,3,4,5,6]
==>[1,2,3,4,5,7,8,6]

请注意,由于遍历从顶点1开始,因此我没有完全匹配您在回答中描述的输出,因此在这两种情况下,所采用的路径都将包括该部分路径。

我建议您将示例数据编写为可以在gremlin控制台中运行的gremlin脚本,而不是以这种方式显示图形数据。以这种方式传达示例更容易,并节省了可能回答此额外任务的人员,使他们能够专注于您的解决方案。与其以这种方式呈现图形数据,我建议您将示例数据编写为可以在gremlin控制台中运行的gremlin脚本。以这种方式传达您的示例更容易,并节省了可能回答该额外任务的人员,使他们能够专注于您的解决方案。当我修改查询以处理实际数据时,它给了我以下信息:
repeat()-遍历没有定义:RepeatStep(直到([AndStep([id.eq(6)])、VertexStep(两者,vertex)、hastep([G3E_FNO.eq(5)])]])]),emit(false))
您的repeat()定义中一定有语法错误。也许是一些错误的括号?你是对的,但现在它什么也不返回。如果我比较的是字符串而不是数字,这有关系吗?如果数据库中存储的值是字符串,那么在遍历中需要使用字符串作为参数。当我修改查询以处理实际数据时,它给了我以下信息
repeat()-遍历未定义:RepeatStep(直到([AndStep([id.eq(6)]),VertexStep(两个,顶点),hastep([G3E_FNO.eq(5)])]]),emit(false))
您对repeat()的定义中一定有语法错误。也许是一些错误的括号?你是对的,但现在它什么也不返回。如果我比较的是字符串而不是数字,这有关系吗?如果存储在数据库中的值是字符串,那么在遍历中需要使用字符串作为参数。