Python 3.x 了解使用Gremlin Python添加边的不同方法

Python 3.x 了解使用Gremlin Python添加边的不同方法,python-3.x,gremlin,tinkerpop3,janusgraph,Python 3.x,Gremlin,Tinkerpop3,Janusgraph,我试图理解gremlinpython中方法的差异,以及添加边(在现有顶点之间)的最佳语法 在阅读了这里的几篇文章之后,我将我发现的一些不同方法细分为几个问题 非常感谢您提前提供反馈 1) 在创建边缘时,向边缘添加属性的最佳顺序是什么:哪一个是更好的选择(以防有任何显著差异) 2) “_uu.V()”的用途和正确用法是什么 3) 使用“属性”和“属性”有什么区别: 4) 当没有指定“.to()”顶点时会发生什么情况,在本例中,也使用“_uu.V()”: 5) 在遍历结束时添加“.profile()

我试图理解gremlinpython中方法的差异,以及添加边(在现有顶点之间)的最佳语法

在阅读了这里的几篇文章之后,我将我发现的一些不同方法细分为几个问题

非常感谢您提前提供反馈

1) 在创建边缘时,向边缘添加属性的最佳顺序是什么:哪一个是更好的选择(以防有任何显著差异)

2) “_uu.V()”的用途和正确用法是什么

3) 使用“属性”和“属性”有什么区别:

4) 当没有指定“.to()”顶点时会发生什么情况,在本例中,也使用“_uu.V()”:

5) 在遍历结束时添加“.profile()”的原因是什么:

g.V('Alice').as_('v').V('Bob').coalesce(inE('spokeWith')
 .where(outV().as_('v')).addE('spokeWith')
 .property('date', 'xyz').from_('v'))
 .profile()
6) 在添加边的同时使用“合并”步骤的正确用法是什么,以及通常的附加优势是什么,就像在5^^处的遍历中使用它一样

7) 还有几个一般性问题:

  • 同时查找标签的好处是什么,例如“g.V()”有(“标签1”、“prop1”、“prop1”\u val”)。如(“a”)[等]”
  • 在几个步骤中将遍历分配给变量(例如“t=g.V()…”)之后,在最后只调用一次“t.iterate()”就足够了,还是应该每次都这样做
  • 在脚本中的哪个点应该调用“tx.commit()”:在多次遍历结束时只调用一次就足够了吗
1) 在创建边时,向边添加特性的最佳顺序是什么

我不认为操作上存在“最佳顺序”,但我个人认为最好是看到
from()
to()
紧跟
addE()

2) “_uu.V()”的用途和正确用法是什么

不能以这种方式使用中间遍历
V()。这样做基本上是说“在图中用
T.id
中不存在的“a”找到顶点。”在您的例子中,“a”是一个步骤标签,仅位于该遍历的范围内

3) 使用“属性”和“属性”有什么区别:

这是一个巨大的差异。
property(k,v)
是一个变异步骤,通过使用指定值添加/更新属性键来修改流中的图形元素。
properties(k…)
获取由提供的键指定的属性列表(即读取操作)

4) 当没有指定“.to()”顶点时会发生什么情况,在本例中,也使用“\uuuu.V()”

为什么不启动Gremlin控制台并查看:

gremlin> g.addV().addE('self')
==>e[17][16-self->16]
gremlin> g.addV().as('z').addE('self').property('x','y').from('z').to(V().has('person','name','nobody'))
The provided traverser does not map to a value: v[20]->[TinkerGraphStep(vertex,[~label.eq(person), name.eq(nobody)])]
Type ':help' or ':h' for help.
Display stack trace? [yN]
5) 在遍历结束时添加“.profile()”的原因是什么:

g.V('Alice').as_('v').V('Bob').coalesce(inE('spokeWith')
 .where(outV().as_('v')).addE('spokeWith')
 .property('date', 'xyz').from_('v'))
 .profile()
与分析代码或解释SQL查询的原因相同,您需要更详细地了解代码在做什么。您可能需要查看索引使用是否正确,或者找出执行哪一步所花费的时间最长,以查看是否可以更好地优化遍历

6) 在添加边的同时使用“合并”步骤的正确用法是什么,以及通常的附加优势是什么,就像在5^^处的遍历中使用它一样

除非我误读了它,否则我看不出有任何理由像在5中使用的那样使用
coalesce()
,因为它没有第二个参数。当您想要“获取或创建”或“上传”元素时,通常在添加顶点/边的上下文中使用
coalesce()
,您可以阅读更多关于这方面的内容

同时查找标签的好处是什么,例如“g.V()”有(“标签1”、“prop1”、“prop1”\u val”)。如(“a”)[等]”

在执行
has()
时,最好包含顶点标签,然后显式地为正在搜索的键命名。在示例中,您使用了“prop1”-如果“prop1”不是全局唯一键,并且您只需要“LABEL1”顶点,但“LABEL2”顶点也有“prop1”“那么你可能得不到你想要的。我想如果你使用全局唯一的键名,那么这不是问题,但我认为如果你想最大限度地提高你的小精灵的可移植性,你可能会想进入实践,因为我认为有一些图形系统需要标签的规范

在几个步骤中将遍历分配给变量(例如“t=g.V()…”)之后,在最后只调用一次“t.iterate()”就足够了,还是应该每次都这样做

iterate()
是一个终止步骤。您通常调用它来生成遍历可能产生的任何副作用。一旦“迭代”,您真的不能再次调用它,因为迭代是一个单向操作,一旦遍历器对象耗尽,就再也没有剩余的
iterate()

在脚本中的哪个点应该调用“tx.commit()”:在多次遍历结束时只调用一次就足够了吗


如果您遵循最佳实践,则根本不需要调用
commit()
。Gremlin Server为您管理事务。一个请求(即遍历)基本上就是一个事务。您唯一需要调用
commit()的时间
是指如果您选择在会话或真正的长时间运行脚本的上下文中自己管理事务。如果您正在构建新的应用程序,您应该避免使用这些选项中的任何一个,而只需利用它们。

感谢您提供了这个广泛的答案,Stephen,这真的很有帮助。
g.V().property("prop1", "prop1_val").as_("a")
 .V().property("prop2", "prop2_val").as_("b")
 .addE("some_relationship").to(__.V()
 .has("prop2", "prop2_val"))
g.V('Alice').as_('v').V('Bob').coalesce(inE('spokeWith')
 .where(outV().as_('v')).addE('spokeWith')
 .property('date', 'xyz').from_('v'))
 .profile()
gremlin> g.addV().addE('self')
==>e[17][16-self->16]
gremlin> g.addV().as('z').addE('self').property('x','y').from('z').to(V().has('person','name','nobody'))
The provided traverser does not map to a value: v[20]->[TinkerGraphStep(vertex,[~label.eq(person), name.eq(nobody)])]
Type ':help' or ':h' for help.
Display stack trace? [yN]