如何在gremlin JavaScript中正确使用mergeV中的基数?

eagi6jfj  于 2023-10-14  发布在  Java
关注(0)|答案(1)|浏览(107)

我正在尝试设置基数。例如,它可以与addV一起使用

await g.V(id1).property(single, 'timestamp', 10).next();

但是,当我尝试使用mergeV时,它不起作用

const properties = new Map([
            ['prop1', CardinalityValue.single('prop1value3')],
            ['prop2', CardinalityValue.single('prop2value3')]
        ]);
        const propertiesNoCard = new Map([
            ['prop1', 'prop1value3'],
            ['prop2', 'prop2value']
        ]);

        await g
            .mergeV(
                new Map([
                    [t.label, 'test'],
                    [t.id, 'testid']
                ])
            )
            .option(onCreate, propertiesNoCard)
            .option(onMatch, properties)
            .iterate();
ResponseError: Server error: {"code":"UnsupportedOperationException","requestId":"408e6686-68dc-4700-b2c5-9d816d2a7bdb","detailedMessage":"Unsupported property value type: org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal","message":"Unsupported property value type: org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal"} (499)

我之所以这样做是因为在gremlin源代码的gremlin-javascript/test/cucumber/gremlin.js中,有一些例子他们调用CardinalityValue.xxxhttps://github.com/apache/tinkerpop/blob/master/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js

function({g}) { return g.mergeV(new Map([["name","marko"]])).option(Merge.onMatch,new Map([["age",CardinalityValue.single(33)]])) }

如果我这样声明它,从Gremlin MergeV To Update an Existing Element's property and Single Cardinality得到,它就可以工作。

const properties = new Map([
            ['prop1', CardinalityValue.single('prop1value3')],
            ['prop2', CardinalityValue.single('prop2value3')]
        ]);
        const propertiesNoCard = new Map([
            ['prop1', 'prop1value3'],
            ['prop2', 'prop2value']
        ]);

        await g
            .mergeV(
                new Map([
                    [t.label, 'test'],
                    [t.id, 'testid']
                ])
            )
            .option(onCreate, propertiesNoCard)
            .option(
                onMatch,
                __.sideEffect(__.property(single, 'prop1', 'prop1val23').property(single, 'prop2', 'prop2val23')).constant(
                    new Map()
                )
            )
            .iterate();
rseugnpd

rseugnpd1#

从标签上看,您可能正在使用Amazon Neptune。在Apache TInkerPop 3.7.0版本中,添加了对基数的支持。Amazon Neptune目前支持TinkerPop 3.6.2版本。在Amazon Neptune升级到3.7.x TinkerPop版本之前,您可以使用以下示例模式作为解决方法。这是在1.2.1.0.R6引擎版本上使用Amazon Neptune进行测试的。这个例子是按照基本的Gremlin编写的,但是你应该能够在你的JavaScript代码中采用它。

g.mergeV([(T.id): 'test-1234', (T.label) : 'Test']).
    option(onCreate, ['name': 'name1']).
    option(onMatch, sideEffect(property(single,"name","name2")).constant([:]))

第一次创造了

g.V('test-1234).valueMap(true)

{<T.label: 4>: 'Test', 'name': ['name1'], <T.id: 1>: 'test-1234'}

然后,如果我们第二次运行上面的合并并检查顶点,则更新已经以单个基数的方式应用。

g.V('test-1234).valueMap(true)
{<T.label: 4>: 'Test', 'name': ['name2'], <T.id: 1>: 'test-1234'}

相关问题