Gremlin JS 3.4.0 中的 .project().by() 问题
Issue with .project().by() in Gremlin JS 3.4.0
我看到 .project().by()
遍历在 Gremlin JS 3.4.0
下返回 {}
。当我降级到 3.2.10
时,它们可以正常工作。
gremlin> g.addV("trip").property(single, "trackName", "Ohio")
==>v[1]
In Gremlin JS `3.4.0`:
const result = await g.V("1").project("trackName").by("trackName").next();
结果:
{
"value": {},
"done": false
}
但是当我降级到 Gremlin 3.2.10
结果是正确的:
{
"value": {
"trackName": "Ohio"
},
"done": false
}
我需要更改在 3.4.0
中使用 project
的方式吗?
编辑:针对不同版本的测试结果。我 运行 每次测试一个 gremlin 版本,捕获结果,然后提升版本并再次 运行 测试。我只是 运行 一个 Neptune 实例,所以我们可以确定这是相同的数据。
失败的测试意味着它以以下形式返回数据:
"results": {
"value": {},
"done": false
}
为了控制台测试,我删除了最后的 .next()
。
我测试的环境是:
AWS Lambda 节点 8.10
AWS 海王星 1.0.1.0
编辑 2:添加 Neptune 测试期间使用的 JS 文件。
index.js
const gremlin = require("gremlin");
const { DriverRemoteConnection } = gremlin.driver;
const { Graph } = gremlin.structure;
const initGremlinClient = () => {
try {
const dc = new DriverRemoteConnection(
`ws://my-cluster.XXXXXXX.us-east-1.neptune.amazonaws.com:8182/gremlin`,
{}
);
const graph = new Graph();
return {
g: graph.traversal().withRemote(dc),
closeGremlinConnection: () => dc.close()
};
} catch (error) {
console.log("[GREMLIN INIT ERROR]", error);
throw new Error(error);
}
};
exports.handler = async event => {
const { g, closeGremlinConnection } = initGremlinClient();
const result = await g
.addV("test")
.property("myProp", "myValue")
.project("myProp")
.by("myProp")
.next();
closeGremlinConnection();
return result;
};
package.json
{
"name": "gremlinTest",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"gremlin": "3.4.0"
}
}
我与 AWS 团队的某个人进行了交谈。有一个错误影响 Gremlin ^3.3.5
和 Lambda 之间的互操作性。具体来说,问题在于底层的 GraphSON v3 引擎以及 Lambda 如何解析 JSON.
临时解决方法是在实例化时回退到 GraphSON v2 DriverRemoteConnection
:
const dc = new DriverRemoteConnection(
`ws://my-neptune-cluster.us-east-1.neptune.amazonaws.com:8182/gremlin`,
{ mimeType: "application/vnd.gremlin-v2.0+json" } // Fall back to GraphSON v2
);
编辑:此问题自 gremlin@3.4.6
起仍然存在。
我看到 .project().by()
遍历在 Gremlin JS 3.4.0
下返回 {}
。当我降级到 3.2.10
时,它们可以正常工作。
gremlin> g.addV("trip").property(single, "trackName", "Ohio")
==>v[1]
In Gremlin JS `3.4.0`:
const result = await g.V("1").project("trackName").by("trackName").next();
结果:
{
"value": {},
"done": false
}
但是当我降级到 Gremlin 3.2.10
结果是正确的:
{
"value": {
"trackName": "Ohio"
},
"done": false
}
我需要更改在 3.4.0
中使用 project
的方式吗?
编辑:针对不同版本的测试结果。我 运行 每次测试一个 gremlin 版本,捕获结果,然后提升版本并再次 运行 测试。我只是 运行 一个 Neptune 实例,所以我们可以确定这是相同的数据。
失败的测试意味着它以以下形式返回数据:
"results": {
"value": {},
"done": false
}
为了控制台测试,我删除了最后的 .next()
。
我测试的环境是:
AWS Lambda 节点 8.10
AWS 海王星 1.0.1.0
编辑 2:添加 Neptune 测试期间使用的 JS 文件。
index.js
const gremlin = require("gremlin");
const { DriverRemoteConnection } = gremlin.driver;
const { Graph } = gremlin.structure;
const initGremlinClient = () => {
try {
const dc = new DriverRemoteConnection(
`ws://my-cluster.XXXXXXX.us-east-1.neptune.amazonaws.com:8182/gremlin`,
{}
);
const graph = new Graph();
return {
g: graph.traversal().withRemote(dc),
closeGremlinConnection: () => dc.close()
};
} catch (error) {
console.log("[GREMLIN INIT ERROR]", error);
throw new Error(error);
}
};
exports.handler = async event => {
const { g, closeGremlinConnection } = initGremlinClient();
const result = await g
.addV("test")
.property("myProp", "myValue")
.project("myProp")
.by("myProp")
.next();
closeGremlinConnection();
return result;
};
package.json
{
"name": "gremlinTest",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"gremlin": "3.4.0"
}
}
我与 AWS 团队的某个人进行了交谈。有一个错误影响 Gremlin ^3.3.5
和 Lambda 之间的互操作性。具体来说,问题在于底层的 GraphSON v3 引擎以及 Lambda 如何解析 JSON.
临时解决方法是在实例化时回退到 GraphSON v2 DriverRemoteConnection
:
const dc = new DriverRemoteConnection(
`ws://my-neptune-cluster.us-east-1.neptune.amazonaws.com:8182/gremlin`,
{ mimeType: "application/vnd.gremlin-v2.0+json" } // Fall back to GraphSON v2
);
编辑:此问题自 gremlin@3.4.6
起仍然存在。