3

so with this Person, Company example:

type Person {
    name: string
    work_for: [Company]
}

type Company {
    name: string
    work_for: [Person]
}

work_for: [uid] @reverse @count .
name: string @index(fulltext, term) @count .

What would a query to find: All the companies that had any of "John James Sam" with total count of those names per company be constructed? I have tried:

  q(func: anyofterms(hashed, "Jame John Sam")){
        uid
    @groupby work_for{
      name
      count(uid)
    }
  }
}```

but that gives the person and the companies they worked for plus the count which is not the company and the number of people with those names that worked for it. Thanks in advance
dweeb
  • 539
  • 2
  • 6
  • 21

1 Answers1

2

Check if this works for you. (lets use my sample to get the bottom of this)

{
  var(func: anyofterms(name, "Alexei Jack Jose Zoe Ivy")) @groupby(works_for) {
   a as count(uid)
  }

  q(func: uid(a), orderdesc: val(a)) {
    name
    total_workers : val(a)
    workHere: ~works_for @groupby(name){
      count(uid)
    }
  }
}

The Result

This query is not perfect as it exploits an unimplemented feature for this in GroupBy. However, you can use this or expect the GroupBy function to be improved.

{
  "data": {
    "q": [
      {
        "name": "CompanyABC",
        "total_workers": 6,
        "workHere": [
          {
            "@groupby": [
              {
                "name": "Ivy",
                "count": 2
              },
              {
                "name": "Jack",
                "count": 2
              },
              {
                "name": "Zoe",
                "count": 2
              }
            ]
          }
        ]
      },
      {
        "name": "The other company",
        "total_workers": 4,
        "workHere": [
          {
            "@groupby": [
              {
                "name": "Alexei",
                "count": 2
              },
              {
                "name": "Jose",
                "count": 2
              }
            ]
          }
        ]
      }
    ]
  }
}

Using this dataset as reference: https://tour.dgraph.io/master/schema/2/

I've edited it and it looks like this:

{
  set {
    _:company1 <name> "CompanyABC" .
    _:company1 <dgraph.type> "Company" .
    _:company2 <name> "The other company" .
    _:company2 <dgraph.type> "Company" .

    _:company1 <industry> "Machinery" .

    _:company2 <industry> "High Tech" .

    _:jack <works_for> _:company1 .
    _:jack <dgraph.type> "Person" .

    _:ivy <works_for> _:company1 .
    _:ivy <dgraph.type> "Person" .

    _:zoe <works_for> _:company1 .
    _:zoe <dgraph.type> "Person" .

    _:jack <name> "Jack" .
    _:ivy <name> "Ivy" .
    _:zoe <name> "Zoe" .
    _:jose <name> "Jose" .
    _:alexei <name> "Alexei" .

    #duplicated

    _:jack2 <name> "Jack" .
        _:jack2 <works_for> _:company1 .
    _:jack2 <dgraph.type> "Person" .

    _:ivy2 <name> "Ivy" .
        _:ivy2 <works_for> _:company1 .
    _:ivy2 <dgraph.type> "Person" .

    _:zoe2 <name> "Zoe" .
        _:zoe2 <works_for> _:company1 .
    _:zoe2 <dgraph.type> "Person" .

    _:jose2 <name> "Jose" .
        _:jose2 <works_for> _:company2 .
    _:jose2 <dgraph.type> "Person" .

    _:alexei2 <name> "Alexei" .
        _:alexei2 <works_for> _:company2 .
    _:alexei2 <dgraph.type> "Person" .

        #duplicated end

    _:jose <works_for> _:company2 .
    _:jose <dgraph.type> "Person" .
    _:alexei <works_for> _:company2 .
    _:alexei <dgraph.type> "Person" .

    _:ivy <boss_of> _:jack .

    _:alexei <boss_of> _:jose .
  }
}