TinkerPop无法检测具有相同标签的顶点,如果不存在则添加



嗨,所以我使用以下代码:

public Graph graph ;
private HashMap<String, Node> nodes ;
private HashMap<Node, Double> inDegree = new HashMap<Node, Double>();
private HashMap<Node, Double> outDegree = new HashMap<Node, Double>();
private GraphTraversalSource g ;
public TinkerTopGraph(Graph graph) {
this.graph = graph;
this.nodes = new HashMap<String, Node>();
graph = TinkerGraph.open();
g = traversal().withEmbedded(graph);
}
public  void addEdge(Node sourceNode, Node destinationNode){
} 
}

在函数"内部"中;addEdge";我试着做了这个:

g.V().hasLabel(sourceNode.toString()).tryNext().orElse(g.addV().next());
g.V().hasLabel(destinationNode.toString()).tryNext().orElse(g.addV(destinationNode.toString()).next());  

问题是,当GraphTraversalSource中已经有一个顶点与其中一个节点具有相同的字符串时,它不会检测到它。我尝试了不同的工艺,我在这里找到。例如,我也尝试过:

g.V().has(sourceNode.toString()).tryNext().orElse(g.addV().next());
g.V().has(destinationNode.toString()).tryNext().orElse(g.addV(destinationNode.toString()).next()); 

我认为这与上面的相同,因为我只使用标签。我也试过这个:

g.V().has(sourceNode.toString()).fold().coalesce(unfold(),addV(sourceNode.toString()))
g.V().has(destinationNode.toString()).fold().coalesce(unfold(),addV(destinationNode.toString()))

但这个问题是,它抛出了一个警告,并且根本没有添加任何顶点。我也厌倦了使用:

g.V().has(node.toString).tryNext().orElseGet{
g.addV(node.toString()).next()}

但在这种情况下,命令orElseGet{}不起作用,并要求在其中输入一个供应商类型。如何将顶点类型命令更改为供应商类型?

我该怎么做才能检查带有标签的垂直线是否已经存在,如果不存在,则添加它?

使用航线数据集,这对我来说很好。

List<Vertex> v =
g.V().has("code","AUS").fold().coalesce(unfold(),addV("airport").property("code","AUS")).toList();
System.out.println(v);

运行时,输出为现有顶点的ID,这是正确的。

[v[3]]

类似地,当顶点不存在时

List<Vertex> v =
g.V().has("code","XYZ").fold().coalesce(unfold(),addV("airport").property("code","XYZ")).toList();
System.out.println(v);

正确创建具有系统指定ID的新顶点。

[v[2cc139cc-8645-9991-4631-6df40d47571c]]

如果使用-Xlint:unchecked进行编译,您将看到一条警告,但代码可以正常工作。Java Generics和Gremlin并不总是能很好地配合使用,使用@SuppressWarnings(“unchecked”)忽略或覆盖警告通常就足够了。有时可以在查询中创建适当的通用标记,但考虑到Gremlin结果的可变性质,这并不总是可能的。

X.java:62: warning: [unchecked] unchecked generic array creation for varargs parameter of type Traversal<?,Vertex>[]
g.V().has("code","XYZ").fold().coalesce(unfold(),addV("airport").property("code","XYZ")).toList();
^

最后要注意的是,您问题中的coalesce示例不包括终端步骤。注意在我上面的例子中toList的使用。如果没有终端步骤,将不会对服务器执行查询,因此不会创建任何内容。

相关内容

最新更新