Gremlin添加关系函数给异常

时间:2019-01-06 17:36:22

标签: gremlin

请参见以下代码:

peopleObj.forEach( item=>{
        let user = item.user;
        let event = item.event;
        var userNode = g.addV('user');
        Object.keys(user).forEach(att=>{
            console.log('att: ' + att+", val: "+ user[att]);
            userNode.property(att, user[att]);
        });

        userNode.next();
        console.log('created userNode');
        eventNode = g.addV('event');
        Object.keys(event).forEach(att=>{
            console.log('att: ' + att+", val: "+ event[att]);
            eventNode.property(att, event[att]);
        });
        eventNode.next();
        console.log('created eventNode');


        // const names = await g.V().hasLabel('event').values('name').toList();
        // console.log(names);

        var u_p = g.V().hasLabel('user').has('name',user.name).next();
        var e_p = g.V().hasLabel('event').has('name',event.name).next();

        var r1 = g.V(u_p).addE('triggers').to(e_p);
        r1.next();

}

在控制台中运行它时,我看到以下错误:

(node:30272) UnhandledPromiseRejectionWarning: Error: Server error: Could not locate method: DefaultGraphTraversal.to([{}]) (599)
    at DriverRemoteConnection._handleMessage (/Users/frankhe/projects/aws/sam-app/hello-world/node_modules/gremlin/lib/driver/driver-remote-connection.js:180:9)

我遵循了Gremlin V3文档,为什么可以添加节点,但是不能在此处添加边?

Gremlin中还有另一个问题,在创建之前检查存在性的最佳方法是什么?如果您看代码,我只是直接创建事件,但是我需要避免重复的事件,我尝试按照文档中的说明使用await,但是nodeJS中根本没有await。谁能告诉我Gremlin提供的最佳方法?

谢谢。

答案: 我的gremlin nodejs是:

“ gremlin”:“ ^ 3.3.4”

我的gremlin服务器是 apache-tinkerpop-gremlin-server-3.3.4

最重要的问题是无论我怎么做,我总是遇到这个错误:

Server error: Could not locate method: DefaultGraphTraversal.to([{}])

我已经更改为异步方式,但是没有用。谁能给我展示一个在Gremlin上使用nodeJS的工作示例?

谢谢

简化版在这里:

var g1 = graph.traversal().withRemote(new DriverRemoteConnection('ws://localhost:8182/gremlin'));

    var v1 = g1.addV('user').property('name','Frank').next(()=>{
        console.log('created1')
        var v2 = g1.addV('event').property('name','Event1').next(()=>{
            console.log('created2')
            g1.V(v1).addE('trigger').to(v2).property('weight',0.75).iterate();
        });
    });

但是在控制台中。我从未见过他记录过created1的信息。

您能在nodeJS中给我一个工作示例吗?

2 个答案:

答案 0 :(得分:1)

您正在将同步执行和异步执行混合在同一代码中。

考虑使用时:

userNode.next();
console.log('created userNode');

该消息不正确。 next()返回一个Promise,该异步解析(请参阅:RemoteConnection Submission)。

正确的用法是:

userNode.next().then(() => console.log('created userNode'));

或者,如果您使用的是async functions

await userNode.next();
console.log('created userNode');

答案 1 :(得分:0)

只需删除.next()g.V(v1)调用,现在示例运行良好:

const v1 = await g.addV('person').property('name','marko');
const v2 = await g.addV('person').property('name','stephen');
await v1.addE('knows').to(v2).property('weight',0.75).iterate();

我正在使用:gremlin@3.4.1