Gremlin.NET查询编译错误:找不到任何方法';hasNext';

Gremlin.NET查询编译错误:找不到任何方法';hasNext';,gremlin,Gremlin,行:g.V('1').out('knows').hasId('2').hasNext() 这一行在Gremlin控制台中工作 我没有在文档中读到hasNext在Gremlin.NET中不存在的内容。我是否遗漏了什么,或者在Gremlin.NET中是否有其他方法可以做到这一点?它还不存在: 主要原因与以下事实有关:hasNext()是一个Java迭代器语义,未应用于.NET。像.NET这样的Gremlin语言变体(GLV)在如何解释语言方面有一定的自由度,以便为使用它的开发人员提供最自在的感觉。

行:
g.V('1').out('knows').hasId('2').hasNext()

这一行在Gremlin控制台中工作

我没有在文档中读到hasNext在Gremlin.NET中不存在的内容。我是否遗漏了什么,或者在Gremlin.NET中是否有其他方法可以做到这一点?

它还不存在:

主要原因与以下事实有关:
hasNext()
是一个Java
迭代器
语义,未应用于.NET。像.NET这样的Gremlin语言变体(GLV)在如何解释语言方面有一定的自由度,以便为使用它的开发人员提供最自在的感觉。换句话说,如果您使用的是.NET GLV,您不应该觉得自己是在用Java编写代码,而应该感觉自己是在用标准的.NET语义编写代码

也就是说,正如我在上面提到的问题中所说的那样,可以认为类似于
hasNext()
的东西是作为查询语言的Gremlin的一种常见形式,因此应该在所有glv中都可用。所以,当我们遇到这些选项时,我们会考虑这些选项。

对于.NET,我想您应该尝试检查所讨论的
Current

它还不存在:

主要原因与以下事实有关:
hasNext()
是一个Java
迭代器
语义,未应用于.NET。像.NET这样的Gremlin语言变体(GLV)在如何解释语言方面有一定的自由度,以便为使用它的开发人员提供最自在的感觉。换句话说,如果您使用的是.NET GLV,您不应该觉得自己是在用Java编写代码,而应该感觉自己是在用标准的.NET语义编写代码

也就是说,正如我在上面提到的问题中所说的那样,可以认为类似于
hasNext()
的东西是作为查询语言的Gremlin的一种常见形式,因此应该在所有glv中都可用。所以,当我们遇到这些选项时,我们会考虑这些选项。


对于.NET,我想您应该尝试检查所讨论的
Current

这个方法现在在Gremlin.NET中确实缺失了。虽然文件中未明确说明,但文件:

  • ITraversal.Next()
  • ITraversal.NextTraverser()的
  • ITraversal.ToList()
  • ITraversal.ToSet()
  • ITraversal.Iterate()
hasNext
也是这样一个终端步骤,但正如您所见,它在该列表中缺失

对于这种情况,我能想到的唯一解决方法是使用
count
步骤,然后在应用程序中检查返回的计数是否大于零:

var count = g.V("1").Out("knows").HasId("2").Count().Next();
var exists = count > 0;
在某些情况下,限制进入
计数
步骤的顶点数量也是有意义的,因为您对确切的计数不感兴趣,只想知道是否至少存在一个顶点:

g.V("1").Out("knows").HasId("2").Limit<Vertex>(1).Count().Next();
g.V(“1”).Out(“知道”).HasId(“2”).Limit(1.Count().Next();

这也是该功能的票证中建议的解决方法:。

目前Gremlin.Net中确实缺少此方法。虽然文件中未明确说明,但文件:

  • ITraversal.Next()
  • ITraversal.NextTraverser()的
  • ITraversal.ToList()
  • ITraversal.ToSet()
  • ITraversal.Iterate()
hasNext
也是这样一个终端步骤,但正如您所见,它在该列表中缺失

对于这种情况,我能想到的唯一解决方法是使用
count
步骤,然后在应用程序中检查返回的计数是否大于零:

var count = g.V("1").Out("knows").HasId("2").Count().Next();
var exists = count > 0;
在某些情况下,限制进入
计数
步骤的顶点数量也是有意义的,因为您对确切的计数不感兴趣,只想知道是否至少存在一个顶点:

g.V("1").Out("knows").HasId("2").Limit<Vertex>(1).Count().Next();
g.V(“1”).Out(“知道”).HasId(“2”).Limit(1.Count().Next();

这也是此功能的问题单中建议的解决方法:。

为什么检查
Current
不起作用?难道不是
ITraversal
只是一个
IEnumerator
,因此遵循相同的迭代语义吗?我写了我的答案,没有先看你的答案,老实说,我根本没有想过手动枚举。但是在这些情况下可能应该使用
MoveNext()
,因为
Current
不会启动枚举,因此一开始将
null
MoveNext()
将枚举数移动到下一个元素,如果存在元素,则返回
true
。所以,它看起来是这样的:
var exists=g.V(“1”).Out(“知道”).HasId(“2”).MoveNext()。谢谢你们两位。我觉得我在这里做错了什么,只要添加
MoveNext()
Next()
,我就会得到一个空引用异常。这是一行:
var test=g.V(“1”).Out(“test”).HasId(“2”).MoveNext()你的答案中的示例代码也给了我一个空参考。是的-
MoveNext()
+
Current
就是允许使用
hasNext()的概念的原因。
就是我的意思。Cool您是否使用远程连接正确构建了图形遍历源
g
?您确定顶点ID是图形数据库中的字符串吗?最后,空引用异常的堆栈跟踪将非常有用。可能在StackOverflow中为此创建一个线程,因为注释不太适合调试问题。为什么检查
Current
不起作用?难道不是
ITraversal
只是一个
IEnumerator
,因此遵循相同的迭代语义吗?我写了我的答案,没有先看你的答案,老实说,我根本没有想过手动枚举。但是在这些情况下可能应该使用
MoveNext()
,因为
Current
不会启动枚举,因此在fir时将
null