在 gremlin-node.js/gremlin-server 中设置属性不起作用

问题描述

我想使用 gremlin 的 javascript 驱动程序从 node.js 后端在 gremlin-server 中创建一个图形。当我添加了两个属性一个 id 和一个用户名时,id 有效,但不存储用户名代码如下:

const gremlin = require('gremlin');

const traversal = gremlin.process.AnonymousTraversalSource.traversal;
const DriverRemoteConnection = gremlin.driver.DriverRemoteConnection;

const g = traversal().withRemote(new DriverRemoteConnection('ws://localhost:8182/gremlin'));

const { t: { id } } = gremlin.process;
const { cardinality: { single} } = gremlin.process;

    async function createuser(userid,username) {
        const vertex = await
            g.addV('User')
            .property(id,userid)
            .property(single,'username',username)
            .iterate();
        return vertex;
    }
await createuser(1001,"testuser")

输出是(当我用 g.V(1001).listAll(); 搜索节点时)属性总是 undefined

[Vertex { id: 1001,label: 'User',properties: undefined }]

gremlin 服务器使用以下命令通过 docker 加载/运行:

  • docker pull tinkerpop/gremlin-server
  • docker run -d -p 8182:8182 --name gremlin tinkerpop/gremlin-server
  • node.js 中的 gremlin-driver 有一个版本:"gremlin": "^3.4.10",

我已经尝试过使用和不使用上面的单数基数,添加了更多的属性,但非工作正常。互联网搜索显示了一些带有 .property 步骤的 gremlin-console(groovy) 工作示例,但没有提示 gremlin 和 gremlin-server 的组合 node.js-driver。

解决方法

我想您的代码运行良好并且属性存在。问题是从查询返回的图形元素只是“引用”——这意味着,它们只包含 id 和标签,没有属性。您应该使用 Map 之类的步骤将结果转换为使用 elementMap() 之类的通用容器。您可以在不同地方的文档中找到更多关于此的讨论,但也许从 this 开始,如果您更感兴趣的是为什么会这样以及改变它会涉及哪些挑战,请参阅 {{ 3}}。