получение пути для сохраненного промежуточного узла в tinkerpop - PullRequest
2 голосов
/ 20 марта 2020

У меня есть граф, который содержит иерархическую структуру, в которой самые низкие узлы иерархии содержат много связей из него.

Вы можете создать структуру графа с помощью следующего:

n1 = g.addV('level1').property('name', 'n1').next()
n2 = g.addV('level2').property('name', 'n2').next()
n3 = g.addV('level2').property('name', 'n3').next()
n4 = g.addV('level3').property('val', 'n4').next()
n5 = g.addV('level3').property('val', 'n5').next()

g.addE('contains').from(n1).to(n2).next()
g.addE('contains').from(n1).to(n3).next()
g.addE('contains').from(n2).to(n4).next()
g.addE('contains').from(n3).to(n5).next()

n6 = g.addV('intermediate').property('name', 'n6').next()
n7 = g.addV('final').property('name', 'n7').next()
g.addE('partof').from(n6).to(n4).next()
g.addE('isa').from(n6).to(n7).next()

n8 = g.addV('intermediate').property('name', 'n8').next()
n9 = g.addV('final').property('name', 'n9').next()
g.addE('partof').from(n8).to(n4).next()
g.addE('isa').from(n8).to(n9).next()

n10 = g.addV('intermediate').property('name', 'n10').next()
n11 = g.addV('final').property('name', 'n11').next()
g.addE('partof').from(n10).to(n5).next()
g.addE('isa').from(n10).to(n11).next()

n12 = g.addV('intermediate').property('name', 'n12').next()
n13 = g.addV('final').property('name', 'n13').next()
g.addE('partof').from(n12).to(n5).next()
g.addE('isa').from(n12).to(n13).next()

Затем я использовал запрос, чтобы попытаться получить путь к узлу «level3», а затем продолжил, чтобы получить список «конечных» узлов и спроектировать его так, чтобы я получил таблицу «таксономии», которая содержит путь к level3 и имя «конечного» узла.

g.V().hasLabel('level1').until(hasLabel('level3')).repeat(out('contains')).as('a').
    in('partof').hasLabel('intermediate').out('isa').hasLabel('final').
    project('taxonomy', 'enzyme').
        by(select('a').path().by(__.label())).
        by(values('name'))
==>[taxonomy:[level1,level2,level3,intermediate,final,level3],enzyme:n7]
==>[taxonomy:[level1,level2,level3,intermediate,final,level3],enzyme:n9]
==>[taxonomy:[level1,level2,level3,intermediate,final,level3],enzyme:n13]
==>[taxonomy:[level1,level2,level3,intermediate,final,level3],enzyme:n11]

В приведенном выше запросе я сохраняю узел «level3» как «a», а затем на шаге проекта выбираю его и получаю путь. Однако путь, кажется, содержит дополнительные элементы, он включает в себя «промежуточный» и «конечный» типы узлов, прежде чем вернуться на уровень 3 снова. Что я ожидал:

==>[taxonomy:[level1,level2,level3],enzyme:n7]
==>[taxonomy:[level1,level2,level3],enzyme:n9]
==>[taxonomy:[level1,level2,level3],enzyme:n13]
==>[taxonomy:[level1,level2,level3],enzyme:n11]

Это ожидаемое поведение шага пути? Есть ли способ переформулировать этот запрос, чтобы получить ожидаемый результат?

1 Ответ

3 голосов
/ 20 марта 2020

Вы можете использовать шаг from или to, чтобы изменить начало пути.

gremlin>  

g.V().hasLabel('level1').until(hasLabel('level3')).repeat(out('contains')).as('a').
......1>     in('partof').hasLabel('intermediate').out('isa').hasLabel('final').
......2>     project('taxonomy', 'enzyme').
......3>         by(path().from('a').by(__.label())).
......4>         by(values('name'))  

==>[taxonomy:[level3,intermediate,final],enzyme:n7]
==>[taxonomy:[level3,intermediate,final],enzyme:n9]
==>[taxonomy:[level3,intermediate,final],enzyme:n13]
==>[taxonomy:[level3,intermediate,final],enzyme:n11]

Вот запрос с from, замененным на to.

gremlin>  g.V().hasLabel('level1').until(hasLabel('level3')).repeat(out('contains')).as('a').
......1>     in('partof').hasLabel('intermediate').out('isa').hasLabel('final').
......2>     project('taxonomy', 'enzyme').
......3>         by(path().to('a').by(__.label())).
......4>         by(values('name'))  
==>[taxonomy:[level1,level2,level3],enzyme:n7]
==>[taxonomy:[level1,level2,level3],enzyme:n9]
==>[taxonomy:[level1,level2,level3],enzyme:n13]
==>[taxonomy:[level1,level2,level3],enzyme:n11]
gremlin> 
...