gremlin - 获取tinkerpop中保存的中间节点的路径

标签 gremlin tinkerpop

我有一个包含层次结构的图表,其中层次结构的最低节点包含许多关系。

您可以使用以下内容创建图形结构:

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”,然后在项目步骤中选择它并获取路径。然而,该路径似乎包含额外的元素,它包括再次返回到 level3 之前的“中间”和“最终”节点类型。我的期望:

==>[taxonomy:[level1,level2,level3],enzyme:n7]
==>[taxonomy:[level1,level2,level3],enzyme:n9]
==>[taxonomy:[level1,level2,level3],enzyme:n13]
==>[taxonomy:[level1,level2,level3],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().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> 

关于gremlin - 获取tinkerpop中保存的中间节点的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60780298/

相关文章:

java - 获取 TinkerVertex 属性中某个键对应的值

java - OrientDB 的 GremlinPipeline 问题

java - SimpleGraph PowerPoint 模块无法按预期工作

gremlin - 在tinkerpop gremlin 中,如何搜索属性值是参数子集的顶点?

过滤 gremlin 结果

java - Gremlin 驱动程序在使用多个端点初始化 ConnectionPool 时阻塞

java - gremlin 中的边缘时间戳

python - gremlin python - 向顶点添加多个但数量未知的属性

cassandra - DSE Graph with Java Driver,如何像 Titan 一样使用 Tinkerpop/Gremlin API 构建图表?

database - 为什么 Janus Graph 不被称为框架而 Apache TInkerPop 是?