【问题标题】:How to create Gremlin query that only updates defined properties?如何创建仅更新已定义属性的 Gremlin 查询?
【发布时间】:2021-04-21 16:06:25
【问题描述】:

我想创建一个 Gremlin 查询,它只更新我在 JavaScript 领域中未定义的顶点属性。实际顶点的属性已定义,但我的 updateUser 函数实际上可能无法同时获取 firstName 和 lastName 参数。

假设我有具有 'firstName' 和 'lastName' 属性的 'user' 顶点。当我调用我的更新函数时,我可以指定用户的新名字、用户的新姓氏,或者两者都指定。当我想更新两个属性时,我创建了一个可以处理该场景的查询:

const updateUser = async (id, firstName, lastName) => {

    const { id, firstName, lastName } = userData

    return client.submit(`g.V().hasLabel(label).has('id', id).property(Cardinality.single, 'firstName', firstName).property(Cardinality.single, 'lastName', lastName)`, {
        label: 'user',
        id: id,
        firstName: firstName,
        lastName: lastName
    }).catch(error => {
        throw new Error(error)
    })

}

问题是,例如,当 firstName 变量未定义时,我收到以下错误:“无法在当前上下文中解析符号 'firstName'”。我希望能够只更新其中一个值。如何指定我要忽略未定义的值?

【问题讨论】:

    标签: javascript graph gremlin tinkerpop


    【解决方案1】:

    在构建遍历字符串和绑定对象时可以考虑是否定义了firstNamelastName

    这里有一些未经测试的代码来解释我的意思。

    let traversal = `g.V().hasLabel(label).has('id', id)`;
    const bindings = {
      label: 'user',
      id: id
    };
    
    if (firstName) {
      traversal += `.property(Cardinality.single, 'firstName', firstName)`;
      bindings.firstName = firstName;
    }
    if (lastName) {
      traversal += `.property(Cardinality.single, 'lastName', lastName)`;
      bindings.lastName = lastName;
    }
    
    client.submit(traversal, bindings);
    

    如果您使用的是支持 Gremlin 字节码的数据库,您的代码会更加优雅。

    traversal = g.V().hasLabel(label).has('id', id);
    if (firstName) {
      traversal = traversal.property(Cardinality.single, 'firstName', firstName);
    }
    if (lastName) {
      traversal = traversal.property(Cardinality.single, 'lastName', lastName);
    }
    

    【讨论】:

    • 感谢您的回答,虽然我不是这个意思。属性已定义,但它们可能在 JavaScript 代码中未定义。我已经把问题重新表述清楚了
    • 感谢@szeb 的澄清!我看到您将遍历作为字符串提交给服​​务器,而不是使用流畅的 API 并将字节码提交给服务器。您这样做是因为您的服务器不支持 Gremlin 字节码吗?如果您必须将遍历作为字符串发送,那么答案可能会使用字符串连接。
    • 是的,我正在使用 CosmosDB,还不支持流畅的 API 调用 (docs.microsoft.com/en-us/azure/cosmos-db/gremlin-api-faq)
    猜你喜欢
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2020-09-05
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多