作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
条件:
vadas
是否在 2 跳
内连接到 lop
vadas
是否在 3 跳
内连接到 peter
vadas
是否在 1 跳
中连接到 does-not-exists
(不会给出任何结果的搜索)具有预期结果的虚拟搜索
条件 1
AND 2
=> [vadas-marko-lop, vadas-marko-lop-peter]
条件 1
或 3
=> [vadas-marko-lop]
我能得到什么
1
AND 2
gremlin> g.V().has("person", "name", "vadas").as("from")
.select("from").as("to1").repeat(both().as("to1")).times(2).emit().has("software", "name", "lop")
.select("from").as("to2").repeat(both().as("to2")).times(3).emit().has("person", "name", "peter")
.project("a", "b")
.by(select(all, "to1").unfold().values("name").fold())
.by(select(all, "to2").unfold().values("name").fold())
==>[a:[vadas,marko,lop],b:[vadas,marko,lop,peter]]
1
或 2
gremlin> g.V().has("person", "name", "vadas").as("nodes")
.union(repeat(both().as("nodes")).times(2).emit().has("software", "name", "lop"),
out().has("x", "y", "does-not-exist").as("nodes"))
.project("a")
.by(select(all, "nodes").unfold().values("name").fold())
==>[a:[vadas,marko,lop]]
那么如何实现这一点我有两种不同的查询格式,有没有办法编写一种可以同时执行这两种查询格式的查询格式?
这没有用,这里有什么问题吗?不返回已经遍历的节点
g.V().has("person", "name", "vadas").as("nodes")
.or(
repeat(both().as("nodes")).times(2).emit().has("software", "name", "lop"),
repeat(both().as("nodes")).times(3).emit().has("person", "name", "peter")
)
.project("a").by(select(all, "nodes").unfold().values("name").fold())
==>[a:[vadas]]
// Expect paths to be printed here vadas..lop, vadas...peter
最佳答案
我不知道我是否理解您的需求,但如果您只需要查询模板之类的东西,那么这可能会有所帮助:
gremlin> conditions = [
......1> [filter: {has("software", "name", "lop")}, distance: 2],
......2> [filter: {has("person", "name", "peter")}, distance: 3],
......3> [filter: {has("x", "y", "does-not-exist")}, distance: 1]]
==>[filter:groovysh_evaluate$_run_closure1@378bd86d,distance:2]
==>[filter:groovysh_evaluate$_run_closure2@2189e7a7,distance:3]
==>[filter:groovysh_evaluate$_run_closure3@69b2f8e5,distance:1]
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().has("person", "name", "vadas").
......1> union(repeat(both().simplePath()).
......2> times(conditions[0].distance).
......3> emit().
......4> filter(conditions[0].filter()).store("x"),
......5> repeat(both().simplePath()).
......6> times(conditions[1].distance).
......7> emit().
......8> filter(conditions[1].filter()).store("x")).
......9> barrier().
.....10> filter(select("x").
.....11> and(unfold().filter(conditions[0].filter()),
.....12> unfold().filter(conditions[1].filter()))).
.....13> path().
.....14> by("name")
==>[vadas,marko,lop]
==>[vadas,marko,lop,peter]
gremlin> g.V().has("person", "name", "vadas").
......1> union(repeat(both().simplePath()).
......2> times(conditions[0].distance).
......3> emit().
......4> filter(conditions[0].filter()).store("x"),
......5> repeat(both().simplePath()).
......6> times(conditions[2].distance).
......7> emit().
......8> filter(conditions[2].filter()).store("x")).
......9> barrier().
.....10> filter(select("x").
.....11> or(unfold().filter(conditions[0].filter()),
.....12> unfold().filter(conditions[2].filter()))).
.....13> path().
.....14> by("name")
==>[vadas,marko,lop]
再多一点抽象应该可以更清楚地表明这两个查询仅在 1 个步骤中有所不同(and
与 or
):
apply = { condition ->
repeat(both().simplePath()).
times(condition.distance).
emit().
filter(condition.filter()).store("x")
}
verify = { condition ->
unfold().filter(condition.filter())
}
// condition 1 AND 2
g.V().has("person", "name", "vadas").
union(apply(conditions[0]),
apply(conditions[1])).
barrier().
filter(select("x").
and(verify(conditions[0]),
verify(conditions[1]))).
path().
by("name")
// condition 1 OR 3
g.V().has("person", "name", "vadas").
union(apply(conditions[0]),
apply(conditions[2])).
barrier().
filter(select("x").
or(verify(conditions[0]),
verify(conditions[2]))).
path().
by("name")
关于gremlin - TinkerPop:组合和过滤多个遍历的通用查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52287461/
我是一名优秀的程序员,十分优秀!