Hi Sara,
first your graph:
g = TinkerGraph.open().traversal()
g.addV().property("name", "A").as("a").
addV().property("name", "B").as("b").
addV().property("name", "C").as("c").
addV().property("name", "D").as("d").
addV().property("name", "E").as("e").
addV("dimon").property("name", "F").as("f").
addV().property("name", "G").as("g").property("date", 20160818).
addV().property("name", "H").as("h").property("date", 20160817).
addE("rel").from("a").to("b").
addE("rel").from("a").to("c").
addE("rel").from("a").to("d").
addE("rel").from("a").to("e").
addE("rel").from("c").to("f").
addE("occured_at").from("d").to("g").
addE("occured_at").from("e").to("h").iterate()
.., and here are the query use-cases:
gremlin> // D and E have a valid date
gremlin> g.V().has("name", "A").out("rel").union(
gremlin> where(out("occured_at").has("date", gte(20160817))),
gremlin> __.not(outE("occured_at")).coalesce(out().hasLabel("dimon"), identity())
gremlin> ).valueMap()
==>[name:[B]]
==>[name:[F]]
==>[name:[D]]
==>[name:[E]]
gremlin>
gremlin> // only E has a valid date
gremlin> g.V().has("name", "A").out("rel").union(
gremlin> where(out("occured_at").has("date", lte(20160817))),
gremlin> __.not(outE("occured_at")).coalesce(out().hasLabel("dimon"), identity())
gremlin> ).valueMap()
==>[name:[B]]
==>[name:[F]]
==>[name:[E]]
gremlin>
gremlin> // only D has a valid date
gremlin> g.V().has("name", "A").out("rel").union(
gremlin> where(out("occured_at").has("date", gt(20160817))),
gremlin> __.not(outE("occured_at")).coalesce(out().hasLabel("dimon"), identity())
gremlin> ).valueMap()
==>[name:[B]]
==>[name:[F]]
==>[name:[D]]
gremlin>
gremlin> // neither D nor E have a valid date
gremlin> g.V().has("name", "A").out("rel").union(
gremlin> where(out("occured_at").has("date", lt(20160817))),
gremlin> __.not(outE("occured_at")).coalesce(out().hasLabel("dimon"), identity())
gremlin> ).valueMap()
==>[name:[B]]
==>[name:[F]]
gremlin>