我正在尝试将以下示例转换为Gremlin.net(c#)
https://kelvinlawrence.net/book/Gremlin-Graph-Guide.html#btree
示例在Groovy中
t=g.V().hasLabel('root').repeat(out()).emit().tree().by('data').next()
文档声明t的类型应为
class org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree
但是我在gremlin.net中找不到等价类型
Gremlin.Process.Traversal下只有一个Strategy命名空间,在其他地方似乎找不到任何树类型。
我正在使用Gremlin.net运行Gremlin Server和一个c#项目。
public void Test()
{
using(GremlinClient client = GetClient())
{
using (DriverRemoteConnection conn = GetDriverRemoteConnection(client))
{
Graph graph = new Graph();
GraphTraversalSource g = graph.Traversal().WithRemote(conn);
// Builds a small ordered Binary (BST) Tree
g.AddV("root").Property("data", 9).As("root")
.AddV("node").Property("data", 5).As("b")
.AddV("node").Property("data", 2).As("c")
.AddV("node").Property("data", 11).As("d")
.AddV("node").Property("data", 15).As("e")
.AddV("node").Property("data", 10).As("f")
.AddV("node").Property("data", 1).As("g")
.AddV("node").Property("data", 8).As("h")
.AddV("node").Property("data", 22).As("i")
.AddV("node").Property("data", 16).As("j")
.AddE("left").From("root").To("b")
.AddE("left").From("b").To("c")
.AddE("right").From("root").To("d")
.AddE("right").From("d").To("e")
.AddE("right").From("e").To("i")
.AddE("left").From("i").To("j")
.AddE("left").From("d").To("f")
.AddE("right").From("b").To("h")
.AddE("left").From("c").To("g").Iterate();
//the .Tree() step requires either a string argument (I believe as a step label), or can be used taking a Generic .Tree<someType>() but I do not know what type to declare to match the example.
var tree = g.V().HasLabel("root").Repeat(__.Out()).Emit().Tree("a").By("data").Next();
Type x = tree.GetType();
// x == {Gremlin.Net.Structure.Vertex}
}
}
}
我想念什么?
答案 0 :(得分:2)
我认为您遇到了在完整的Gremlin虚拟机(即Java)范围内开发的Gremlin与作为Gremlin语言变体的Gremlin之间存在的剩余矛盾之一-在您的情况下为Gremlin.NET。我不认为tree()
在任何GLV中都没有完全支持。有趣的是,您证明自己正在收回Vertex
,因为我不希望Gremlin.NET甚至不知道如何对g:Tree进行反序列化,因为我本来会期望某种形式的序列化错误。即使这样做,.NET中也没有Tree
对象可将其反序列化为对象。
我似乎回想起tree()
和序列化方面的问题更加严重,并且扎根在Jackson库中的某些问题中,但是这些问题有可能在最近的一段时间内都得到解决。
请注意,您将在subgraph()
步骤中遇到类似的局限性,因为GLV端没有Graph
对象可以反序列化为对象。我想知道在这些情况下我们是否至少不能默认返回原始JSON本身。手动解析不会很有趣,但是在某些用例中可能总比没有好。
我已创建此问题以进行持续跟踪TINKERPOP-2063。