我的应用程序具有英文过滤器,我需要将这些过滤器转换为Gremlin查询。每个过滤器包括三个部分:
顶点类型
#1中顶点的出线边缘标签
来自#2中的边的传入顶点的名称
任何部分都可以使用字符串“ any”,表示结果中可以包含任何类型,标签或名称。
以现代玩具图为例,我有以下两个过滤器:
人->创建->任何
人->知道-> vadas
以上两个过滤器的评估结果应为:
marko->创建-> lop
marko->知道-> vadas
而以下两个过滤器:
人->任何->乔什
人->创建->砍
应评估为以下方面:
marko->知道-> josh
marko->创建-> lop
我想出的最接近上面期望结果的查询是:
g.E().and(outV().outE().has(label, "created"), outV().outE().has(label, "knows").inV().has("name", "vadas"), outV().has(label, "person"))
上面查询的问题在于,它返回从marko出来的所有三个边缘,而不仅仅是两个所需的边缘。如何改善查询以仅返回如上所述的两个边?
最佳答案
该解决方案采用将过滤器与返回结果的遍历分离的方法。
gremlin> Gremlin.version()
==>3.3.3
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().
......1> and(
......2> outE('created'),
......3> out('knows').has('name', 'vadas')
......4> ).
......5> union(
......6> outE('created').inV(),
......7> outE('knows').inV().has('name', 'vadas')
......8> ).
......9> path().by('name').by(label)
==>[marko,created,lop]
==>[marko,knows,vadas]
gremlin> g.V().
......1> and(
......2> out().has('name', 'josh'),
......3> out('created').has('name', 'lop')
......4> ).
......5> union(
......6> outE().inV().has('name', 'josh'),
......7> outE('created').inV().has('name', 'lop')
......8> ).
......9> path().by('name').by(label)
==>[marko,knows,josh]
==>[marko,created,lop]
关于java - Gremlin的边共享相同的顶点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51586308/