Как сгруппировать и считать dgraph - PullRequest
0 голосов
/ 09 октября 2019

так с этим Person, Company примером:

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 .

Что бы найти запрос: All the companies that had any of "John James Sam" with total count of those names per company будет построен? Я пробовал:

  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

1 Ответ

0 голосов
/ 03 ноября 2019

Проверьте, работает ли это для вас. (давайте воспользуемся моим примером, чтобы получить нижнюю часть этого)

{
  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)
    }
  }
}

Результат

Этот запрос не идеален, поскольку он использует невыполненную функцию для этого в GroupBy. Однако вы можете использовать это или ожидать улучшения функции GroupBy.

{
  "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
              }
            ]
          }
        ]
      }
    ]
  }
}

Использование этого набора данных в качестве справочного материала: https://tour.dgraph.io/master/schema/2/

Я отредактировал его, и это выглядит так:

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