I’m not sure the best way to explain this except by example. I have nodes of type A, B, and C.
- As have a uid list predicate that contains nodes of type B
- Bs have a uid predicate that contains nodes of type C
I want to know how many distinct As there are in my graph that transitively connect to Cs, and I want the uid of the Cs. I imagine there’s probably some way to build a query that uses value variables for this, and math(), but I haven’t figured it out yet. I’m on v21.03.0.
Example schema + data + query:
type A {
b
}
b: [uid] @reverse .
type B {
c
}
c: uid @reverse .
type C {
somethingdoesntmatter
}
somethingdoesntmatter: string .
<0x1> <dgraph.type> "A" .
<0x1> <b> <0x3> .
<0x2> <dgraph.type> "A" .
<0x2> <b> <0x4> .
<0x3> <dgraph.type> "B" .
<0x3> <c> <0x5> .
<0x4> <dgraph.type> "B" .
<0x4> <c> <0x5> .
<0x5> <dgraph.type> "C" .
<0x6> <dgraph.type> "C" .
<0x7> <dgraph.type> "C" .
and in this example the output would tell me that there are two A nodes (just the count) that reference the one C node (the uid 0x5).
I have tried this:
query {
foo(func: type(C)) {
cuid: uid
uid
~c {
count(~b)
}
}
}
which returns roughly:
{
"data": {
"foo": [
"cuid": "0x5",
"~c": [
{
"count(~b)": 1
},
{
"count(~b)": 1
}
]
]
}
}
I can sum up the “count(~b)” values in my client (values that will always be 1, FWIW) but that’s not scalable. If it instead returned "~c": 2
I’d be happy.