Фильтровать узлы по источнику Node gremlin

Допустим, у меня есть такие данные.

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

Чтобы было ясно, идентификатор 5 — это тот же узел с двумя ребрами.

Вот пример кода:

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)

person FARSOS BULSARA    schedule 15.02.2018    source источник
comment
вместо того, чтобы представлять графические данные таким образом, я бы предложил вам записать образцы данных в виде сценария гремлина, который можно запустить в консоли Gremlin. гораздо проще передать ваш пример таким образом и сэкономить людей, которые могли бы ответить на эту дополнительную задачу, позволяя им сосредоточиться на вашем решении.   -  person stephen mallette    schedule 15.02.2018


Ответы (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, поэтому выбранный путь будет включать эту часть пути в обоих случаях.

person stephen mallette    schedule 16.02.2018
comment
Когда я изменил запрос для работы с моими фактическими данными, он дал мне это The repeat()-traversal was not defined: RepeatStep(until([AndStep([[HasStep([id.eq(6)]), VertexStep(BOTH,vertex), HasStep([G3E_FNO.eq(5)])]])]),emit(false)) - person FARSOS BULSARA; 17.02.2018
comment
у вас должна быть синтаксическая ошибка в вашем определении repeat() каким-то образом. может быть, какие-то плохие скобки? - person stephen mallette; 17.02.2018
comment
Вы были правы, хотя теперь это ничего не возвращает. Было бы важно, если бы я сравнивал строки вместо чисел? - person FARSOS BULSARA; 17.02.2018
comment
если значение, хранящееся в базе данных, является строкой, тогда вам нужно использовать строки для ваших аргументов при обходе. - person stephen mallette; 17.02.2018