【问题标题】:Dgraph query with variable UID具有可变 UID 的 Dgraph 查询
【发布时间】:2020-01-16 23:50:47
【问题描述】:

以下代码旨在向 Dgraph 服务器查询与特定节点关联的值,类似于在关系数据库中通过主键查找行。

const dgraph = require("dgraph-js");
const grpc = require("grpc");
const clientStub = new dgraph.DgraphClientStub( grpc.credentials.createInsecure() );
const dgraphClient = new dgraph.DgraphClient(clientStub);

const lookupNode = `query nodeValues($id:uid) {
    nodeValues(func: uid($id)) {
        value1,
        value2,
        value3
    }
}`;
const res = await dgraphClient.newTxn().queryWithVars(query, {$id: "0x13");

这会在执行时引发Error: 2 UNKNOWN: Type "uid" not supported。如果将$id 变量键入为stringint,则找不到任何结果。如何通过UID查询带变量的节点?

【问题讨论】:

  • 您是否在 ratel 中运行过相同的查询并返回结果?也可能节点上不存在字段?

标签: node.js dgraph


【解决方案1】:

在这种情况下$id 查询变量的类型应该是string。查看您拥有的实际输出会很有帮助。不过,我认为您的示例中的异步函数存在问题。下面的代码给了我想要的输出{ nodeValues: [ { value1: 'value1' } ] }

const dgraph = require("dgraph-js");
const grpc = require("grpc");
const clientStub = async () => new dgraph.DgraphClientStub("localhost:9080", grpc.credentials.createInsecure());
const dgraphClient = async (clientStub) => new dgraph.DgraphClient(clientStub);

async function createData(dgraphClient) {
    const txn = dgraphClient.newTxn();
    try {
        const p = {uid: "0x13", value1: "value1"};
        const mu = new dgraph.Mutation();
        mu.setSetJson(p);
        await txn.mutate(mu);
        await txn.commit();
    } finally {
        await txn.discard();
    }
}

const lookupNode = `query nodeValues($id:string) {
    nodeValues(func: uid($id)) {
        value1,
        value2,
        value3
    }
}`;
const res = async (dgraphClient) => {
    const response = await dgraphClient.newTxn().queryWithVars(lookupNode, {$id: "0x13"});
    return response.getJson();
};

const main = async () => {
    const stub = await clientStub();
    const client = await dgraphClient(stub);
    await createData(client);
    return await res(client);
};

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

基于官方支持的客户端的示例:https://github.com/dgraph-io/dgraph-js/blob/master/examples/simple/index.js

【讨论】:

    【解决方案2】:
    const dgraph = require("dgraph-js");
    const grpc = require("grpc");
    const clientStub = new dgraph.DgraphClientStub( grpc.credentials.createInsecure() );
    const dgraphClient = new dgraph.DgraphClient(clientStub);
    
    const lookupNode = `query nodeValues(**$id:string**) {
        nodeValues(func: uid($id)) {
            value1,
            value2,
            value3
        }
    }`;
    const res = await dgraphClient.newTxn().queryWithVars(query, {$id: "0x13");
    

    使用 String 作为您的 uid 的数据类型 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      相关资源
      最近更新 更多