I would like to get all the non-uid predicates, and expand some specific edges. Say, for example, that on the example data from the docs I would like to get all the data about directors named Steve, as well as a list of their respective films. This seems to be a similar problem as this Github issue, but the solution outlined there doesn’t quite do what I need.
However, this returns the error Repeated subgraph: [director.film] while using expand(). The Github issue mentioned above suggests this as an alternative (slightly adapted for the example):
{
steven as var(func: allofterms(name@en, "Steven"))
directors(func: uid(steven)) {
expand(_all_)
}
films(func: uid(steven)) {
director.film {
expand(_all_)
}
}
}
However, what I don’t understand about this solution is how to match the director to the film, since this query returns the two requested things in separate entries. This is not addressed in the Github issue.
Dgraph metadata
dgraph version
Dgraph version : v21.03.0
Dgraph codename : rocket
Dgraph SHA-256 : b4e4c77011e2938e9da197395dbce91d0c6ebb83d383b190f5b70201836a773f
Commit SHA-1 : a77bbe8ae
Commit timestamp : 2021-04-07 21:36:38 +0530
Branch : HEAD
Go version : go1.16.2
jemalloc enabled : true
The problem with that is that it follows all the edges. In my case that would return much more data than I want, and would require me filtering the output afterwards.
I think the problem with the request is that everything is the same kind of edge to the query. You want all “predicates” (string|int|float|etc.) plus a few specific “edges” (uid) but DQL doesn’t know what predicates (S.P.O. context) are “predicates” and which ones are “edges”.
This is confusing to say because edge and predicate are often used interchangeably by Dgraph.
but the myFakeType would have to be pre-defined in the DQL schema correct? Would the node have to have this type or because you explicitly expand with it, it does not check that the node has the type and it just looks for the fields.
Oh, that is interesting, good to know! Thanks @amaster507 and @MichelDiz for the input. Sadly it still doesn’t quite solve my specific problem completely. This is because in my case I don’t know necessarily what type the first node has and, therefore, which fields it has. Therefore I really want to use expand(all) for the non-uid fields. For now I went with the expand(all) { expand(all) } and filter manually approach.