You are looking at the docs for the unreleased `master` branch of Dgraph. The latest version is v21.12.

# Math on Value Variables

Value variables can be combined using mathematical functions. For example, this could be used to associate a score which is then used to order or perform other operations, such as might be used in building news feeds, simple recommendation systems, and so on.

Math statements must be enclosed within `math( <exp> )` and must be stored to a value variable.

The supported operators are as follows:

Operators Types accepted What it does
`+` `-` `*` `/` `%` `int`, `float` performs the corresponding operation
`min` `max` All types except `geo`, `bool` (binary functions) selects the min/max value among the two
`<` `>` `<=` `>=` `==` `!=` All types except `geo`, `bool` Returns true or false based on the values
`floor` `ceil` `ln` `exp` `sqrt` `int`, `float` (unary function) performs the corresponding operation
`since` `dateTime` Returns the number of seconds in float from the time specified
`pow(a, b)` `int`, `float` Returns `a to the power b`
`logbase(a,b)` `int`, `float` Returns `log(a)` to the base `b`
`cond(a, b, c)` first operand must be a Boolean selects `b` if `a` is true else `c`

Query Example: Form a score for each of Steven Spielberg’s movies as the sum of number of actors, number of genres and number of countries. List the top five such movies in order of decreasing score.

``````{
var(func:allofterms([email protected], "steven spielberg")) {
films as director.film {
p as count(starring)
q as count(genre)
r as count(country)
score as math(p + q + r)
}
}

TopMovies(func: uid(films), orderdesc: val(score), first: 5){
[email protected]
val(score)
}
}``````
``````curl -H "Content-Type: application/dql" localhost:8080/query -XPOST -d 'blahblah' | python -m json.tool | less
``````
``````package main

import (
"context"
"flag"
"fmt"
"log"

"github.com/dgraph-io/dgo/v2"
"github.com/dgraph-io/dgo/v2/protos/api"

)

var (
dgraph = flag.String("d", "127.0.0.1:9080", "Dgraph Alpha address")
)

func main() {
flag.Parse()
conn, err := grpc.Dial(*dgraph, grpc.WithInsecure())
if err != nil {
log.Fatal(err)
}
defer conn.Close()

dg := dgo.NewDgraphClient(api.NewDgraphClient(conn))

resp, err := dg.NewTxn().Query(context.Background(), `blahblah`)

if err != nil {
log.Fatal(err)
}
fmt.Printf("Response: %s\n", resp.Json)
}``````
``````import io.dgraph.DgraphClient;
import io.dgraph.DgraphGrpc;
import io.dgraph.DgraphGrpc.DgraphStub;
import io.dgraph.DgraphProto.Response;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;

import java.util.Map;

public class App {

public static void main(final String[] args) {
ManagedChannel channel =
DgraphStub stub = DgraphGrpc.newStub(channel);
DgraphClient dgraphClient = new DgraphClient(stub);

String query = "blahblah";

Response res = dgraphClient.newTransaction().query(query);

System.out.printf("Response: %s", res.getJson().toStringUtf8());
}
}

``````
``````import pydgraph
import json

def main():
client_stub = pydgraph.DgraphClientStub("localhost:9080")
client = pydgraph.DgraphClient(client_stub)
query = """blahblah"""

client_stub.close()

if __name__ == '__main__':
try:
main()
except Exception as e:
print('Error: {}'.format(e))

``````
``````const dgraph = require("dgraph-js");
const grpc = require("grpc");

async function main() {
const clientStub = new dgraph.DgraphClientStub("localhost:9080", grpc.credentials.createInsecure());
const dgraphClient = new dgraph.DgraphClient(clientStub);

const query = `blahblah`;
const response = await dgraphClient.newTxn().query(query);
console.log("Response: ", JSON.stringify(response.getJson()));

clientStub.close();
}

main().then().catch((e) => {
console.log("ERROR: ", e);
});
``````
``````const dgraph = require("dgraph-js-http");

async function main() {
const clientStub = new dgraph.DgraphClientStub("http://localhost:8080");
const dgraphClient = new dgraph.DgraphClient(clientStub);

const query = `blahblah`;
const response = await dgraphClient.newTxn().query(query);
console.log("Response: ", JSON.stringify(response.data));
}

main().then().catch((e) => {
console.log("ERROR: ", e);
});
``````

Value variables and aggregations of them can be used in filters.

Query Example: Calculate a score for each Steven Spielberg movie with a condition on release date to penalize movies that are more than 10 years old, filtering on the resulting score.

``````{
var(func:allofterms([email protected], "steven spielberg")) {
films as director.film {
p as count(starring)
q as count(genre)
date as initial_release_date
years as math(since(date)/(365*24*60*60))
score as math(cond(years > 10, 0, ln(p)+q-ln(years)))
}
}

TopMovies(func: uid(films), orderdesc: val(score)) @filter(gt(val(score), 2)){
[email protected]
val(score)
val(date)
}
}``````
``````curl -H "Content-Type: application/dql" localhost:8080/query -XPOST -d 'blahblah' | python -m json.tool | less
``````
``````package main

import (
"context"
"flag"
"fmt"
"log"

"github.com/dgraph-io/dgo/v2"
"github.com/dgraph-io/dgo/v2/protos/api"

)

var (
dgraph = flag.String("d", "127.0.0.1:9080", "Dgraph Alpha address")
)

func main() {
flag.Parse()
conn, err := grpc.Dial(*dgraph, grpc.WithInsecure())
if err != nil {
log.Fatal(err)
}
defer conn.Close()

dg := dgo.NewDgraphClient(api.NewDgraphClient(conn))

resp, err := dg.NewTxn().Query(context.Background(), `blahblah`)

if err != nil {
log.Fatal(err)
}
fmt.Printf("Response: %s\n", resp.Json)
}``````
``````import io.dgraph.DgraphClient;
import io.dgraph.DgraphGrpc;
import io.dgraph.DgraphGrpc.DgraphStub;
import io.dgraph.DgraphProto.Response;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;

import java.util.Map;

public class App {

public static void main(final String[] args) {
ManagedChannel channel =
DgraphStub stub = DgraphGrpc.newStub(channel);
DgraphClient dgraphClient = new DgraphClient(stub);

String query = "blahblah";

Response res = dgraphClient.newTransaction().query(query);

System.out.printf("Response: %s", res.getJson().toStringUtf8());
}
}

``````
``````import pydgraph
import json

def main():
client_stub = pydgraph.DgraphClientStub("localhost:9080")
client = pydgraph.DgraphClient(client_stub)
query = """blahblah"""

client_stub.close()

if __name__ == '__main__':
try:
main()
except Exception as e:
print('Error: {}'.format(e))

``````
``````const dgraph = require("dgraph-js");
const grpc = require("grpc");

async function main() {
const clientStub = new dgraph.DgraphClientStub("localhost:9080", grpc.credentials.createInsecure());
const dgraphClient = new dgraph.DgraphClient(clientStub);

const query = `blahblah`;
const response = await dgraphClient.newTxn().query(query);
console.log("Response: ", JSON.stringify(response.getJson()));

clientStub.close();
}

main().then().catch((e) => {
console.log("ERROR: ", e);
});
``````
``````const dgraph = require("dgraph-js-http");

async function main() {
const clientStub = new dgraph.DgraphClientStub("http://localhost:8080");
const dgraphClient = new dgraph.DgraphClient(clientStub);

const query = `blahblah`;
const response = await dgraphClient.newTxn().query(query);
console.log("Response: ", JSON.stringify(response.data));
}

main().then().catch((e) => {
console.log("ERROR: ", e);
});
``````

Values calculated with math operations are stored to value variables and so can be aggregated.

Query Example: Compute a score for each Steven Spielberg movie and then aggregate the score.

``````{
steven as var(func:eq([email protected], "Steven Spielberg")) @filter(has(director.film)) {
director.film {
p as count(starring)
q as count(genre)
r as count(country)
score as math(p + q + r)
}
directorScore as sum(val(score))
}

score(func: uid(steven)){
[email protected]
val(directorScore)
}
}``````
``````curl -H "Content-Type: application/dql" localhost:8080/query -XPOST -d 'blahblah' | python -m json.tool | less
``````
``````package main

import (
"context"
"flag"
"fmt"
"log"

"github.com/dgraph-io/dgo/v2"
"github.com/dgraph-io/dgo/v2/protos/api"

)

var (
dgraph = flag.String("d", "127.0.0.1:9080", "Dgraph Alpha address")
)

func main() {
flag.Parse()
conn, err := grpc.Dial(*dgraph, grpc.WithInsecure())
if err != nil {
log.Fatal(err)
}
defer conn.Close()

dg := dgo.NewDgraphClient(api.NewDgraphClient(conn))

resp, err := dg.NewTxn().Query(context.Background(), `blahblah`)

if err != nil {
log.Fatal(err)
}
fmt.Printf("Response: %s\n", resp.Json)
}``````
``````import io.dgraph.DgraphClient;
import io.dgraph.DgraphGrpc;
import io.dgraph.DgraphGrpc.DgraphStub;
import io.dgraph.DgraphProto.Response;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;

import java.util.Map;

public class App {

public static void main(final String[] args) {
ManagedChannel channel =
DgraphStub stub = DgraphGrpc.newStub(channel);
DgraphClient dgraphClient = new DgraphClient(stub);

String query = "blahblah";

Response res = dgraphClient.newTransaction().query(query);

System.out.printf("Response: %s", res.getJson().toStringUtf8());
}
}

``````
``````import pydgraph
import json

def main():
client_stub = pydgraph.DgraphClientStub("localhost:9080")
client = pydgraph.DgraphClient(client_stub)
query = """blahblah"""

client_stub.close()

if __name__ == '__main__':
try:
main()
except Exception as e:
print('Error: {}'.format(e))

``````
``````const dgraph = require("dgraph-js");
const grpc = require("grpc");

async function main() {
const clientStub = new dgraph.DgraphClientStub("localhost:9080", grpc.credentials.createInsecure());
const dgraphClient = new dgraph.DgraphClient(clientStub);

const query = `blahblah`;
const response = await dgraphClient.newTxn().query(query);
console.log("Response: ", JSON.stringify(response.getJson()));

clientStub.close();
}

main().then().catch((e) => {
console.log("ERROR: ", e);
});
``````
``````const dgraph = require("dgraph-js-http");

async function main() {
const clientStub = new dgraph.DgraphClientStub("http://localhost:8080");
const dgraphClient = new dgraph.DgraphClient(clientStub);

const query = `blahblah`;
const response = await dgraphClient.newTxn().query(query);
console.log("Response: ", JSON.stringify(response.data));
}

main().then().catch((e) => {
console.log("ERROR: ", e);
});
``````