我是gremlin的新手。我有一个图表,机场作为节点和航班作为边缘,到达时间和出发时间作为边缘属性。现在我正在尝试使用tinkerpop 3.1来获得1次中途停留,2次中途停留,3次中途停留,原始机场,目的地机场和出发时间。我使用下面的查询让它停留1次。 我正在努力概括这个查询以使用重复和匹配来查找n个连接。任何帮助表示赞赏。
示例图表脚本
graph = TinkerFactory.createModern()
g = graph.traversal()
g.addV('airport').property('name','PDX').as('PDX').
addV('airport').property('name','JFK').as('JFK').
addV('airport').property('name','PHX').as('PHX').
addV('airport').property('name','ORD').as('ORD').
addV('airport').property('name','IAD').as('IAD').
addE('flight').property('depTime',9).property('arrTime',10).from('PDX').to('JFK').
addE('flight').property('depTime',10).property('arrTime',11).from('PDX').to('PHX').
addE('flight').property('depTime',12).property('arrTime',13).from('PDX').to('ORD').
addE('flight').property('depTime',13).property('arrTime',14).from('PDX').to('IAD').
addE('flight').property('depTime',11).property('arrTime',14).from('JFK').to('IAD').
addE('flight').property('depTime',10).property('arrTime',12).from('PHX').to('IAD').
addE('flight').property('depTime',14).property('arrTime',15).from('ORD').to('IAD').iterate()
Gremlin query
g.V().has("airport","name","PDX").outE().has("depTime",gt(6)).
match(
__.as('e1').values('arrTime').as('e1Arr'),
__.as('e1').outV().as('v1'),
__.as('e1').inV().as('v2'),
__.as('v2').outE().as('e2'),
__.as('e2').values('depTime').as('e2Dep')).
where('e2Dep',gt('e1Arr')).select('e2').inV().as("v3").has("airport","name","IAD").
select("v1","e1","v2","e2","v3").by("name").by(valueMap()).by("name").by(valueMap()).by("name");
答案 0 :(得分:2)
我没有图表来测试它,但是这个查询应该可以解决问题:
g.V().has("airport","name","PDX").outE().has("depTime", gt("09:30")).as("e").inV().
emit().
repeat(outE().filter(project("a","b").by("depTime").by(select(last, "e").by("arrTime")).
where("a", gt("b"))).as("e").inV()).times(2).
has("name", "IAD").path().by("name").by(valueMap())
如果数据集是相对静态的,我建议创建快捷方式,例如预先计算route
个顶点,它们与所有站点有连接。例如:
g.V().has("airport","name","PDX").as("a0").
V().has("airport","name","JFK").as("a1").
V().has("airport","name","IAD").as("a2").
addV("route").property("from", "PDX").
property("to", "IAD").
property("stops", 2).
property("depTime", 9).
property("arrTime", 14).as("r").
addE("stop").from("r").to("a0").property("n", 0).
addE("stop").from("r").to("a1").property("n", 1).
addE("stop").from("r").to("a2").property("n", 2).iterate()
这些路线顶点将允许您非常快速地找到任何长度的路线。第一个查询的结果可用于创建路径顶点;但是,由于它超时,您必须增加超时+内存或将其作为OLAP查询运行。后者是首选,但在查询中需要进行一些调整:
gremlin> g.V().has("airport","name","PDX").outE("flight").has("depTime", gt(9)).as("e").
values("depTime").as("d").select("e").inV().
emit().
repeat(outE("flight").filter(project("a","b").by("depTime").by(select(last, "d")).
where("a", gt("b"))).as("e").
values("depTime").as("d").select(last, "e").inV()).times(2).
has("name", "IAD").path()
==>[v[0],e[13][0-flight->8],13,e[13][0-flight->8],v[8]]
==>[v[0],e[12][0-flight->6],12,e[12][0-flight->6],v[6],e[16][6-flight->8],14,e[16][6-flight->8],v[8]]