2016-04-21 3 views
1

Ich habe eine Traversal wie folgt:Die bereitgestellten Start auf einen Wert Karte nicht

g.V().hasLabel("demoUser") 
.as("demoUser","socialProfile","followCount","requestCount") 
.select("demoUser","socialProfile","followCount","postCount") 
.by(__.valueMap()) 
.by(__.out("socialProfileOf").valueMap()) 
.by(__.in("followRequest").hasId(currentUserId).count()) 
.by(__.outE("postAuthorOf").count()) 

Ich versuche, einen Benutzer Vertex, ihre verknüpften sozialen Profil Kontrollpunkt zu wählen, und einige andere zählt. Das Problem ist, dass alle Benutzer möglicherweise keine socialProfile Kante haben. Wenn dies der Fall ist, schlägt die Traversal mit dem folgenden Fehler:

The provided start does not map to a value: v[8280]->[TitanVertexStep(OUT,[socialProfileOf],vertex), PropertyMapStep(value)]

habe ich this thread vom Gremlin Team. Ich habe versucht, die Logik innerhalb von .by() mit einem coalesce(), und auch ein .fold() an das Ende der Anweisung ohne Glück hinzuzufügen.

Wie mache ich diese Auswahl optional? Ich möchte eine socialProfile auswählen, wenn eine existiert, aber immer die demoUser auswählen.

Antwort

4

coalesce ist die richtige Wahl. Nehmen wir an, dass Personen, die in der modernen Graph haben entweder ein oder kein Projekt mit ihnen verbunden sind:

gremlin> g.V().hasLabel("person").as("user","project"). 
      select("user","project").by("name").by(coalesce(out("created").values("name"), 
                  constant("N/A"))) 
==>{user=marko, project=lop} 
==>{user=vadas, project=N/A} 
==>{user=josh, project=ripple} 
==>{user=peter, project=lop} 

Ein anderer Weg wäre völlig aus dem Ergebnis auszuschließen:

g.V().hasLabel("person").as("user","project").choose(out("created"), 
    select("user","project").by("name").by(out("created").values("name")), 
    select("user").by("name")) 

Aber offensichtlich wird dies nur aussehen Gut, wenn jede Verzweigung eine Map zurückgibt/mehr als eine Sache auswählt, sonst werden gemischte Ergebnistypen verwendet.

+0

'coalesce' hat perfekt funktioniert. – Fook

Verwandte Themen