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" .
}
}
}