过滤gremlin结果

时间:2017-05-23 10:39:28

标签: filter gremlin

我是Gremlin的新手,我正在使用Stardog 5.0的Gremlin 3.0.2。我写了这个查询来找出schema.org本体中两个实体之间的路径。以下是输出 -

gremlin>`g.V().hasLabel('Canal').repeat(both().simplePath()).until(g.V().hasLabel('Continent')).path().limit(5)`
  

==> [v [Canal],v [rdf-schema#Class]]   ==> [v [运河],v [BodyOfWater],v [地貌],v [大陆]]   ==> [v [Canal],v [BodyOfWater],v [rdf-schema#Class],v [Continent]]   ==> [v [Canal],v [BodyOfWater],v [Pond],v [rdf-schema#Class],v [Continent]]   ==> [v [Canal],v [BodyOfWater],v [OceanBodyOfWater],v [rdf-schema#Class],v [Continent]]

我无法找到消除所有路径的方法" rdf-schema#Class"在他们中。请有人建议解决方案吗?我想用Gremlin进行过滤。谢谢!

1 个答案:

答案 0 :(得分:2)

一种方法是将后置过滤器应用于返回的路径。例如,如果你有这样的事情:

gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().outE('created').inV().path()
==>[v[1],e[9][1-created->3],v[3]]
==>[v[4],e[10][4-created->5],v[5]]
==>[v[4],e[11][4-created->3],v[3]]
==>[v[6],e[12][6-created->3],v[3]]

想要摆脱优势,你可以这样做:

gremlin> g.V().outE('created').inV().path().
......1>   local(unfold().filter(__.not(hasLabel('created'))).fold())
==>[v[1],v[3]]
==>[v[4],v[5]]
==>[v[4],v[3]]
==>[v[6],v[3]]

所以新行基本上只是说,对于每个路径项,展开它,在标签上为那些没有“创建”的路径做一些过滤,然后将路径折回到列表。