2

我正在尝试在 nodejs 中为 cosmos db 编写流利的 gremlin 查询,即使它们是以字符串形式提交的。我已经阅读了文档,并且在一些 github 线程中看到了它,尽管尚不支持字节码,但可以将其作为脚本提交。

我到目前为止的代码:

配置客户端功能:


export const CosmosConn = async (): Promise<driver.Client> => {
    try {
        const cosmosKey: string = await GetSecret('cosmos-key');
        const cosmosEndpoint: string = await GetSecret('cosmos-endpoint');

        const authenticator: driver.auth.PlainTextSaslAuthenticator = new gremlin.driver.auth.PlainTextSaslAuthenticator(
            '/dbs/main/colls/main',
            cosmosKey
        );
        const client: driver.Client = new gremlin.driver.Client(cosmosEndpoint, {
            authenticator,
            traversalsource: 'g',
            rejectUnauthorized: true,
            mimeType: 'application/vnd.gremlin-v2.0+json'
        });

        return client;
    } catch (err) {
        console.error(err);
    }
};

现在下面这两个是临时的,因为我会为每个查询多次等待 CosmosConn,但这是针对 Azure 函数,所以我还没有优化:

export const Graph = async (query: gremlin.process.Bytecode): Promise<any> => {
    const db = await CosmosConn();
    const translator = new gremlin.process.Translator(
        new gremlin.process.AnonymousTraversalSource()
    );
    return db.submit(translator.translate(query));
};

export const getGremlin = async () => {
    const db = await CosmosConn();
    return gremlin.process.traversal().withRemote(db);
};

现在当我尝试使用它时:

    const g = await getGremlin();
        const query = g
            .V()
            .hasLabel('client')
            .getBytecode();

        const test = await Graph(query);

这当然会抛出一个错误:

Gremlin Query Syntax Error: Script compile error: Unexpected token: 'Object'; in input: '[objectObject'. @ line 1, column 9.

4

4 回答 4

1

您是否尝试打印translator.translate(query)之前提交的内容?

根据我的经验,翻译器对重要查询的支持非常有限。

根据微软的说法,他们计划在 12 月 19 日支持 fluent API,所以最好等待官方支持。

于 2019-11-12T14:21:06.273 回答
0

正是这些类型阻止了我以与 CosmosDB 一起使用的方式初始化我的翻译器。

    const translator = new gremlin.process.Translator('g' as any);

作品。

于 2019-11-26T17:22:07.760 回答
0

下面的 Dawn 是在 TypeScript 中使用 Translator 将字节码查询转换为 CosmosDB 的字符串查询的示例。我不推荐这种解决方案,就像另一个回应指出的那样:它是有限的。改用 AWS Neptune 或等到 MS 在 CosmosDB 中实施字节码查询。

async function test(): Promise<void> {
   // Connection:
   const traversal = Gremlin.process.AnonymousTraversalSource.traversal;
   const DriverRemoteConnection = Gremlin.driver.DriverRemoteConnection;
   const g = traversal().withRemote(new DriverRemoteConnection("ws://localhost:8182/gremlin"));

   // Create translator
   const translator = new Gremlin.process.Translator(g);

   // Convert bytecode query to string query for CosmosDB:
   console.log(translator.translate(g.V().hasLabel('person').values('name').getBytecode()))
}

test();
于 2019-12-25T22:00:07.713 回答
-1

这是测试用例的链接,以使 getbytecode 翻译工作。

https://github.com/apache/tinkerpop/blob/master/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/translator-test.js#L31

编辑:-

这是来自上述链接的示例测试用例

it('should produce valid script representation from bytecode glv steps', function () {
      const g = new graph.Graph().traversal();
      const script = new Translator('g').translate(g.V().out('created').getBytecode());
      assert.ok(script);
      assert.strictEqual(script, 'g.V().out(\'created\')');
});
于 2021-05-22T10:55:06.330 回答