Upserting a parent with multiple children

Oh, I just noticed the issue. You have to use an alias when using the same edge multiple times in the same block.

Here is the solution

upsert {
  query {
    q(func: eq(name, "parent1")) {
      v as uid
      name
      has_child @filter(eq(name, "child1")){
        v2 as uid
      }
      has_child2: has_child @filter(eq(name, "child2")){
        v3 as uid
      }
    }
  }

  mutation {
    set {
      uid(v) <name> "parent1" .
      uid(v) <has_child> uid(v2) .
      uid(v) <has_child> uid(v3) .
      uid(v2) <name> "child1" .
      uid(v3) <name> "child2" .
    }
  }
}