graph-databases - Gremlin 迭代条件遍历

标签 graph-databases titan gremlin

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

  1. 一些顶点代表现实世界的项目和一些类型,即“城市”有一个顶点,而“伦敦”或“西雅图”等特定城市的顶点。每个顶点都可以有'is-a'边到它的类型顶点,即 "London"-(is-a)-> "city", "USA"-(is-a) -> “国家”
  2. 顶点也可以通过“in”关系链接,即 "London"-(in)-> "UK", "Seattle"-(in)->"Washington"
  3. 一些顶点也可能具有“国内”关系,即 "Seattle"->(in-country)->"USA",但有些可能没有。
  4. 可能有多个链接(即某些城市可能在两个国家之间有争议,因此有两个“国内”或“在”链接)- 在这种情况下,应返回多个国家。

任务是让每个顶点尝试找到它所在的国家(当然,它对于像“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”标签。我做错了吗?编写这种遍历查询的正确方法是什么?

最佳答案

我认为您不需要所有的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”标签从“城市”(即费尔法克斯)出发。显然,如果我幸运的话,我可以在“国内”上遍历,我就完成了。然后我循环回到 x 占位符,这样做时我仍然有不到 10 个循环,而我所在的当前顶点不是一个国家 - 否则我会跳出循环,因为我已到达我要发射的国家/地区顶点。我 dedup 因为您的架构允许通过多种方式到达给定“国内”和“在”的国家/地区。根据您的数据集,您可能还需要一些错误处理或其他内容,但我认为这应该会激发您提出最终解决方案。

关于graph-databases - Gremlin 迭代条件遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27389879/

相关文章:

titan - gremlin 中的 olap 和 oltp 查询

java - 通过 gremlin 服务器公开的 Titan 图的 ORM

graph-databases - Gremlin - 更新多条边的值

python - 在 python 中构造 janusgraph 的 get 查询

neo4j - 什么时候不使用neo4j?

logging - Neo4j 3.x 非托管扩展 slf4j 问题

使用 neo4j 进行分页(图数据库)

azure - Azure Cosmos DB 的图遍历性能

java - 使用 TITAN DB 手动安装 gremlin 服务器

graph-databases - 如何添加列表作为顶点或边 gremlin 的属性