首页 文章

Gremlin迭代条件遍历

提问于
浏览
2

我有一个具有以下结构的图表:

  • 一些顶点表示真实世界的项目和某些类型,即"city"的顶点和特定城市的顶点,如"London"或"Seattle" . 每个顶点可以具有'is-a'边缘到其类型顶点,即 "London" -(is-a)-> "city""USA" -(is-a)-> "country" .

  • 顶点也可以通过"in"关系链接,即 "London" -(in)-> "UK""Seattle" -(in)->"Washington" .

  • 某些顶点也可能有"in-country"关系,即 "Seattle"->(in-country)->"USA" ,但有些可能没有 .

  • 可能有多个链接(即某个城市可以在两个国家之间存在争议,因此有两个"in-country"或"in"链接) - 在这种情况下,应返回多个国家/地区 .

任务是让每个顶点尝试找到它所在的国家(当然,对于像“city”这样的通用顶点它是没有意义的,但在这种情况下它应该只生成null) . 所以我试着这样做:

v.as('loopstep').ifThenElse{it.out('is-a').has('ID', 'country').hasNext()}{
 it
}{
 it.ifThenElse{it.out('in-country').hasNext()}{
    it.out('in-country')
 }{
    it.out('in').loop('loopstep'){it.loops < 10 }
 }
}

但是在循环中产生NPE,例如:

java.lang.NullPointerException
    at com.tinkerpop.pipes.branch.LoopPipe.getLoops(LoopPipe.java:75)

看起来循环看不到“loopstep”标签 . 我做错了吗?编写此类遍历查询的正确方法是什么?

1 回答

  • 2

    我认为你不需要所有 ifThenElse 的东西 . 假设我现在你的模型正确,我想你只需要这个:

    gremlin> g = new TinkerGraph()                                                                     
    ==>tinkergraph[vertices:0 edges:0]
    gremlin> g = new TinkerGraph()                                                                     
    ==>tinkergraph[vertices:0 edges:0]
    gremlin> usa = g.addVertex([name:"USA"])
    ==>v[0]
    gremlin> va = g.addVertex([name:"VA"])    
    ==>v[1]
    gremlin> fairfax = g.addVertex([name:"Fairfax"])
    ==>v[2]
    gremlin> country = g.addVertex([ID:"country"])
    ==>v[3]
    gremlin> state = g.addVertex([ID:"state"])
    ==>v[4]
    gremlin> city = g.addVertex([ID:"city"])
    ==>v[5]
    gremlin> g.addEdge(null, fairfax, va, "in")
    ==>e[6][2-in->1]
    gremlin> g.addEdge(null, fairfax, city, "is-a")
    ==>e[7][2-is-a->5]
    gremlin> g.addEdge(null, va, usa, "in")    
    ==>e[8][1-in->0]
    gremlin> g.addEdge(null, va, state, "is-a")
    ==>e[9][1-is-a->4]
    gremlin> g.addEdge(null, fairfax, usa, "in-country")
    ==>e[10][2-in-country->0]
    gremlin> g.addEdge(null, usa, country, "is-a")
    ==>e[11][0-is-a->3]
    gremlin> fairfax.as('x').out('in','in-country').loop('x'){it.loops<10 && it.object.out('is-a').ID.next()!='country'}.dedup.name
    ==>USA
    

    挑选最后一行,你可以使用"in"或"in-country"标签从"city"(即费尔法克斯)走出去 . 显然,如果我完成了'm lucky I get to traverse on 805177 and I' . 然后我循环回 x 占位符,这样做的同时我仍然有少于10个循环而当前顶点我是一个国家 - 否则我突然离开循环因为我已到达我要发出的国家顶点 . 我 dedup 因为您的架构允许多种方式到达给定"in-country"和"in"的国家/地区 . 根据您的数据集,您可能还需要一些错误处理或其他内容,但我认为这应该会激发您提出最终解决方案 .

相关问题