只有在可以添加边的情况下,如何才能添加新的顶点?
How can I add a new Vertex only if it is possible to add an Edge too?
我需要添加一个带边的新顶点。
我的代码是这样的:
g.V().addV("Vertex").addE("MyEdge").to(V().has("OtherVertex", "name", "test"))
如果V().has("OtherVertex", "name", "test")
return 一个顶点,一切正常。我的问题是,如果 OtherVertex
不存在,Gremlin 会添加新的无边顶点。我只想在可以创建边的情况下添加新的顶点。
我正在使用 Gremlin-server 进行开发。我的猜测是,我可以尝试使用 Transactions
,但我不确定 AWS Neptune 现在是否支持它。
有什么建议吗?
谢谢。
我想,避免交易,我意识到我可以先 select OtherVertex
。如果不存在,查询将不会创建新的顶点:
g.V().has("OtherVertex", "name", "test").as('t').addV("Vertex").as('v').addE("MyEdge").from('v').to('t')
正如您所写,这是正确的方法:
g.V().has("OtherVertex", "name", "test").as('t').
addV("Vertex").as('v').addE("MyEdge").from('v').to('t')
我只想添加一些与您最初尝试相关的内容:
g.V().addV("Vertex")
我想你只是想从以下开始:
g.addV("Vertex")
如果你选择前者,你会产生一些意想不到的问题:
gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.V().addV('person')
gremlin> g.V().addV('person')
gremlin> g
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
请注意,空图表不会添加任何内容。那是因为 V()
returns 没有顶点,因此管道中没有任何东西可以触发 addV()
。假设您有一些数据:
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().addV('person')
==>v[13]
==>v[14]
==>v[15]
==>v[16]
==>v[17]
==>v[18]
gremlin> g.V().addV('person')
==>v[19]
==>v[20]
==>v[21]
==>v[22]
==>v[23]
==>v[24]
==>v[25]
==>v[26]
==>v[27]
==>v[28]
==>v[29]
==>v[30]
现在,有一个更糟糕的问题,因为我们为每个现有顶点添加一个顶点,因为 V()
现在 returns 每次执行图中的所有顶点。
作为最后的说明,请参阅此 Gremlin Recipe 以了解执行获取或创建类型操作的方法,因为它与您现在正在执行的这种条件突变有关。
我需要添加一个带边的新顶点。 我的代码是这样的:
g.V().addV("Vertex").addE("MyEdge").to(V().has("OtherVertex", "name", "test"))
如果V().has("OtherVertex", "name", "test")
return 一个顶点,一切正常。我的问题是,如果 OtherVertex
不存在,Gremlin 会添加新的无边顶点。我只想在可以创建边的情况下添加新的顶点。
我正在使用 Gremlin-server 进行开发。我的猜测是,我可以尝试使用 Transactions
,但我不确定 AWS Neptune 现在是否支持它。
有什么建议吗? 谢谢。
我想,避免交易,我意识到我可以先 select OtherVertex
。如果不存在,查询将不会创建新的顶点:
g.V().has("OtherVertex", "name", "test").as('t').addV("Vertex").as('v').addE("MyEdge").from('v').to('t')
正如您所写,这是正确的方法:
g.V().has("OtherVertex", "name", "test").as('t').
addV("Vertex").as('v').addE("MyEdge").from('v').to('t')
我只想添加一些与您最初尝试相关的内容:
g.V().addV("Vertex")
我想你只是想从以下开始:
g.addV("Vertex")
如果你选择前者,你会产生一些意想不到的问题:
gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.V().addV('person')
gremlin> g.V().addV('person')
gremlin> g
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
请注意,空图表不会添加任何内容。那是因为 V()
returns 没有顶点,因此管道中没有任何东西可以触发 addV()
。假设您有一些数据:
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().addV('person')
==>v[13]
==>v[14]
==>v[15]
==>v[16]
==>v[17]
==>v[18]
gremlin> g.V().addV('person')
==>v[19]
==>v[20]
==>v[21]
==>v[22]
==>v[23]
==>v[24]
==>v[25]
==>v[26]
==>v[27]
==>v[28]
==>v[29]
==>v[30]
现在,有一个更糟糕的问题,因为我们为每个现有顶点添加一个顶点,因为 V()
现在 returns 每次执行图中的所有顶点。
作为最后的说明,请参阅此 Gremlin Recipe 以了解执行获取或创建类型操作的方法,因为它与您现在正在执行的这种条件突变有关。