2017-05-23 3 views
2

Ich bin neu Gremlin und ich benutze Gremlin 3.0.2 mit Stardog 5.0. Ich habe diese Abfrage geschrieben, um Pfade zwischen zwei Entitäten in der Ontologie von schema.org zu finden. Im Folgenden finden Sie die Ausgabe -Filter die Gremlin Ergebnisse

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

==> [v [Kanal], v [rdf-Schema # Klasse]] ==> [v [Kanal], v [BodyOfWater], v [Relief ], v [Kontinent]] ==> [v [Kanal], v [BodyOfWater], v [rdf-schema # Klasse], v [Kontinent]] ==> [v [Canal], v [BodyOfWater] , v [Pond], v [rdf-schema # Klasse], v [Kontinent]] ==> [v [Kanal], v [BodyOfWater], v [OceanBodyOfWater], v [rdf-schema # Klasse], v [Kontinent]]

Ich bin nicht in der Lage, einen Weg zu finden, alle Wege zu eliminieren, die "rdf-sche Ma # Class "in ihnen. Bitte könnte jemand eine Lösung vorschlagen? Ich möchte die Filterung mit Gremlin machen. Vielen Dank!

Antwort

1

Ein Weg, dies zu tun wäre, einen Post-Filter auf den Pfad anzuwenden, der zurückgegeben wird. So zum Beispiel, wenn Sie so etwas wie dies haben:

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]] 

und wollten loswerden die Kante erhalten, können Sie etwas tun könnten:

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]] 

so dass neue Linie im Grunde sagt gerade, für Jedes Pfadelement, Entfalten Sie es, machen Sie einen Filter auf das Label für diejenigen, die nicht "erstellt" sind, und falten Sie den Pfad dann zurück zu einer Liste.