gpt4 book ai didi

javascript - `repeat` 步骤内的 Gremlin DSL 使用错误

转载 作者:行者123 更新时间:2023-12-03 01:36:42 25 4
gpt4 key购买 nike

我们正在使用 gremlin-javascript 并且最近开始定义 DSL 来简化我们的查询。

我不确定我是否忽略了一些警告,但是当尝试在 repeat 步骤中使用 DSL 方法时,我始终收到 (...).someDslFunction is not a function 错误,但在 repeat 之外使用相同的 DSL 函数可以正常工作。

以下是产生此问题的简短(人为的)DSL 定义:

class CustomDSLTraversal extends GraphTraversal {
constructor(graph, traversalStrategies, bytecode) {
super(graph, traversalStrategies, bytecode);
}

hasNotLabel(...args) {
return this.not(__.hasLabel(...args));
}

filterNotLabel(...args) {
return this.filter(__.hasNotLabel(...args));
}
}

class CustomDSLTraversalSource extends GraphTraversalSource {
constructor(graph, traversalStrategies, bytecode) {
super(graph, traversalStrategies, bytecode, CustomDSLTraversalSource, CustomDSLTraversal);
}
}

const statics = {
hasNotLabel: (...args) => callOnEmptyTraversal('hasNotLabel', args),
...gremlin.process.statics
};

const __ = statics;
const g = traversal(CustomDSLTraversalSource).withRemote(connection);

这里有它的两个用途,第一个可以正常工作,第二个会导致 __.outE().(...).filterNotLabel is not a function 错误。

g.V('foo').outE().filterNotLabel('x', 'y').otherV(); // No errors
g.V('foo').repeat(__.outE().filterNotLabel('x', 'y').otherV()).times(1); // Error

// __.outE(...).filterNotLabel is not a function

编辑:感谢@stephen指出现在如此明显的问题:

我重新定义了 callOnEmptyTraversal 以与我们的 DSL 一起使用,并愚蠢地将标准 TinkerPop 匿名遍历解构为我们的自定义遍历。这些显然正在调用原始的callOnEmptyTraversal,它确实使用了基础GraphTraversal的实例。

function callOnEmptyTraversal(fn, args) {
const g = new CustomDSLTraversal(null, null, new Bytecode());
return g[fn].apply(g, args);
}

const statics = {
hasNotLabel: (...args) => callOnEmptyTraversal('hasNotLabel', args),
mapToObject: (...args) => callOnEmptyTraversal('mapToObject', args),
...gremlin.process.statics // Whoops
};

const __ = statics;

解决方案:以防万一其他人遇到这种情况。这就是我解决将 DSL 匿名遍历生成与标准 TinkerPop 生成合并的问题的方法:

function callOnEmptyTraversal(fn, args) {
const g = new CustomDSLTraversal(null, null, new Bytecode());
return g[fn].apply(g, args);
}

function mapToCallOnEmptyTraversal(s, fn) {
s[fn] = (...args) => callOnEmptyTraversal(fn, args);
return s;
}

const statics = ['hasNotLabel', 'mapToObject']
.concat(Object.keys(gremlin.process.statics))
.reduce(mapToCallOnEmptyTraversal, {});

const __ = statics;

最佳答案

我认为问题是因为您以 __ 开始遍历,这是匿名遍历的标准 TinkerPop 生成。因此,您会创建一个 GraphTraversal,而不是您的 CustomDSLTraversalSource。 TinkerPop gremlin-javascript documentation指出:

steps that are made available on a GraphTraversal should also be made available as spawns for anonymous traversals

因此,您可能应该拥有自己的 __ 版本,它返回 CustomDSLTraversalSource。如果您想更明确地了解哪里出了问题,请参阅 in the code callOnEmptyTraversal() 返回 GraphTraversal ,显然您的 DSL 方法在该类上不可用。

关于javascript - `repeat` 步骤内的 Gremlin DSL 使用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60071987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com