groovy - 在gremlin控制台上,为什么谓词'eq'在'is'内返回false而直接比较返回true?
问题描述
在带有 step 的 gremlin 版本 3.4.0 上is
,谓词未按预期工作。
如果我执行以下操作,它将返回真实
gremlin>3.is(3)
==>true
gremlin>[3].getAt(0).is(3)
==>true
虽然使用谓词的相同比较不起作用并返回 false
gremlin>3.is(eq(3))
==>false
gremlin>[3].getAt(0).is(eq(3))
==>false
正是我想检查节点属性值的长度并根据最大长度进行验证。
gremlin>g.V(0).values('name').next().length().is(lte(20))
==>false
上面的代码总是返回 false 是名称等于test_name
(长度为 9)。如果我进行直接比较(如下所示),它会返回 true
gremlin>g.V(0).values('name').next().length().is(9)
==>true
我在这里做错了什么?
解决方案
您正在混合 Groovy 和 Gremlin。当你这样做时:
gremlin>3.is(3)
==>true
gremlin>[3].getAt(0).is(3)
==>true
您没有使用 Gremlin,因此这不是is()
步骤。在这种情况下,您正在使用 Groovy 的方法进行引用相等检查。is()
当您在问题中进一步深入时,这进一步解释了您的结果,如下所示:
gremlin>g.V(0).values('name').next().length().is(lte(20))
==>false
因为一旦你这样做了,next()
你就不再在做 Gremlin。后面没有任何内容代表 Gremlin 步骤,它只是 Groovy 代码。您正在调用该String.length()
方法,然后调用 Groovyis()
运算符并比较int
返回的 from length()
to lte(20)
which 是P
这样的一个实例:
gremlin> "xyz".length().is(lte(20))
==>false
如果您想使用 Gremlin 检查字符串的长度,那么我不确定除了使用 lambda 之外是否还有其他方法:
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().values('name').filter{it.get().length()<=4}
==>lop
==>josh
推荐阅读
- botframework - Microsoft 团队免费帐户:此卡操作已禁用,因为 BOT 已被您的管理员阻止
- windows - 如何执行 ubuntu.exe 并使用一个命令导航到直接文件夹?
- google-cloud-platform - 在 GCP 上调整永久磁盘大小时,如何触发文件系统调整大小?
- ruby-on-rails - Rails:如何删除默认版本的捆绑程序?
- java - 声纳的 Spring Boot 配置问题
- python - 数组用零填充
- reactjs - 如何根据用户登录凭据重定向到反应应用程序中的不同页面?就像所有用户都有相同的页面和
- r - 使用 rvest 下载 Kaggle 数据集
- excel - 以 .xls 格式保存表格以替代 docmd.sendObject acSendTable
- reactjs - Jest、Enzyme、React、Next.js、Typescript .default 不是构造函数