Azure Cosmos + Gremlin NodeJS,如何将流畅的查询作为脚本提交(不是字节码——我知道它还不支持)
Azure Cosmos + Gremlin NodeJS, how to submit fluent query as script (not bytecode -- i know its not supported yet)
我正在尝试在 nodejs 中为 cosmos db 编写流畅的 gremlin 查询,即使它们是作为字符串提交的。我已经阅读了文档,并且在几个 github 线程中看到它提到虽然字节码尚不支持,但可以将其作为 scrip 提交。
我目前的代码:
配置客户端功能:
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.
您是否尝试在提交前打印 translator.translate(query)
?
根据我的经验,翻译器对重要查询的支持非常有限。
根据 Microsoft 的说法,他们计划在 12 月 19 日支持 Fluent API,因此最好等待官方支持。
是这些类型阻止我以与 CosmosDB 一起使用的方式初始化我的翻译器。
const translator = new gremlin.process.Translator('g' as any);
有效。
下面的黎明是在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();
这里是 link 测试用例以使 getbytecode 翻译工作。
编辑:-
这是上面的示例测试用例link
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\')');
});
我正在尝试在 nodejs 中为 cosmos db 编写流畅的 gremlin 查询,即使它们是作为字符串提交的。我已经阅读了文档,并且在几个 github 线程中看到它提到虽然字节码尚不支持,但可以将其作为 scrip 提交。
我目前的代码:
配置客户端功能:
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.
您是否尝试在提交前打印 translator.translate(query)
?
根据我的经验,翻译器对重要查询的支持非常有限。
根据 Microsoft 的说法,他们计划在 12 月 19 日支持 Fluent API,因此最好等待官方支持。
是这些类型阻止我以与 CosmosDB 一起使用的方式初始化我的翻译器。
const translator = new gremlin.process.Translator('g' as any);
有效。
下面的黎明是在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();
这里是 link 测试用例以使 getbytecode 翻译工作。
编辑:-
这是上面的示例测试用例link
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\')');
});