我试图理解方法的差异,以及在Gremlin Python中添加边(在现有顶点之间)的最佳语法。
在阅读了这里的几篇文章之后,我将发现的一些不同方法细分为几个问题。
非常感谢您提前提供任何反馈!
1)在创建边缘时,将属性添加到边缘的最佳顺序是什么:其中哪一个是更好的选择(以防有任何显着差异)?
g.V().property("prop1", "prop1_val").as_("a")
.V().property("prop2", "prop2_val").as_("b")
.addE("some_relationship")
# rest of traversal option 1:
.property("prop1_val_weight", 0.1d)
.from_("a").to("b")
# rest of traversal option 2:
.from_("a").to("b")
.property("prop1_val_weight", 0.1d)
2) “V()”的目的和正确用法是什么?
g.V().property("prop1", "prop1_val")
.as_("a").V().property("prop2", "prop2_val")
.as_("b").addE("some_relationship")
.property("prop1_val_weight", 0.1d)
# AND THEN:
.from_("a").to("b")
# VERSUS:
.from_(__.V("a")).to(__.V("b"))
3) 使用“属性”和“属性”之间有什么区别:
g.V().property("prop1", "prop1_val").as_("a")
# VERSUS:
g.V().properties("prop1", "prop1_val").as_("a")
# REST OF THE TRAVERSAL:
.V().property("prop2", "prop2_val").as_("b")
.addE("some_relationship")
.property("prop1_val_weight", 0.1d)
.from_("a").to("b")
4)当没有指定“. to()”顶点/顶点时会发生什么,在这种情况下,也使用 " __. V()”:
g.V().property("prop1", "prop1_val").as_("a")
.V().property("prop2", "prop2_val").as_("b")
.addE("some_relationship").to(__.V()
.has("prop2", "prop2_val"))
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) 还有几个一般性问题:
1)在创建边缘时,向边缘添加属性的最佳顺序是什么
我不认为操作上存在“最佳顺序”,但就我个人而言,我认为最好是看到from()
和to()
立即跟随addE()
。
2) “V()”的目的和正确用法是什么?
不能以这种方式使用中间遍历。这样做基本上是说“在图中用T.id
的“a”找到一个不存在的顶点。”在你的例子中,“a”是一个步骤标签,仅位于该遍历的范围内。
3) 使用“属性”和“属性”之间有什么区别:
这是一个巨大的差异<代码>属性(k,v)是一个变异步骤,通过添加/更新具有指定值的属性键来修改流中的图形元素<代码>属性(k…)获取由提供的键指定的属性列表(即读取操作)。
4) 当没有指定“.to()”顶点时会发生什么情况,在这种情况下,也可以使用“_uu.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()”的原因是什么:
与分析代码或解释SQL查询的原因相同——以更详细地了解代码的作用。也许你需要看看索引是否被正确使用,或者找出执行哪一步花费的时间最长,看看你是否可以更好地优化遍历。
6)在添加边的同时使用“合并”步骤的正确用法是什么,以及通常的附加优势,就像它在5^^的遍历中使用的一样?
除非我误读了它,否则我认为没有任何理由使用它,因为它在5中使用,因为没有第二个参数。当您想要“获取或创建”或“向上插入”元素时,通常在添加顶点/边的上下文中使用coalesce()
——您可以在此处阅读更多信息。
同时查找标签的优点是什么,例如“g.V()。has(“LABEL1”,“prop1”,“prop1\u val”)。as_(“a”)[等]”
在执行has()时,最好包含顶点标签,然后显式命名要搜索的键的名称空间。在示例中,您使用了“prop1”-如果“prop1”不是全局唯一键,并且您只需要“LABEL1”顶点,但“LABEL2”顶点也有“prop1”值,那么您可能无法获得想要的结果。我想,如果你使用全局唯一的键名,那么这不是问题,但我认为如果你想最大限度地提高你的小精灵的可移植性,你可能想进入实践,因为我认为有一些图形系统需要标签的规范。
在几个步骤中将遍历分配给变量(例如“t=g.V()…”)之后,最后只调用一次“t.iterate()”就足够了吗?还是应该每次都这样做?
iterate()
是终止步骤。您通常调用它来生成遍历可能产生的任何副作用。一旦“迭代”,您真的不能再次调用它,因为迭代是单向操作,并且一旦遍历器对象耗尽,就没有什么可以再次调用了。
在脚本中的哪个点应该调用“tx.commit()”:在多次遍历结束时只调用一次就足够了吗?
如果您遵循最佳实践,您根本不会调用提交()
。Gremlin Server为您管理您的事务。一个请求(即遍历)基本上是一个事务。您唯一需要调用提交()
的时候是如果您选择在会话或真正长时间运行的脚本的上下文中自己管理事务。如果您正在html" target="_blank">构建一个新应用程序,您应该避免这些选项中的任何一个,而只是使用基于字节码的遍历。
我正在azure中使用cosmos图形数据库。 有人知道是否有一种方法可以在两个顶点之间添加一条边,只有当它不存在时(使用gremlin图查询)? 我可以在添加顶点时这样做,但不能使用边。我从这里获取了执行此操作的代码: 谢谢
问题内容: 我有许多固定大小的图像(例如500 * 500)。我想编写一个python脚本,将其调整为固定大小(例如800 * 800),但将原始图像保持在中心,并用固定颜色(例如黑色)填充多余的区域。 我正在使用PIL。我现在可以使用该功能调整图像的大小,但这会改变纵横比。有什么办法吗? 问题答案: 您可以创建具有所需新尺寸的新图像,然后将旧图像粘贴到中间,然后保存。如果需要,可以覆盖原始图像(
我在我的应用程序中使用gremlin REST服务器,我想在单个查询中为一个顶点创建多个边。我有从哪里创建边缘到单个顶点的顶点ID列表。 对于eg-g.V(12,13,14,15)。添加(“使用”,g.V(100)) 我已经尝试了许多遍历步骤,但无法使其工作。
我的场景是在单个查询中在顶点之间添加多条边: 假设下面的节点:这些是我拥有的标签和ID 用户: 4100 歌曲: 4200 4355 4676 我必须在这些顶点之间建立边 我们通常可以通过在节点之间创建单条边来实现。如果我们想一次在50多个顶点之间创建边,这不是一种有效的方法。我正在使用Tinkerpop 3.0.1。
我试图通过遍历特定边缘的标签来返回从特定顶点开始的顶点和边缘,我正在寻找的结果是顶点,遍历叶节点所有边缘的边缘 [示例图]https://i.stack.imgur.com/5yQTW.png 预期结果: ap1包含p1 ap2包含p1 p1使用f1包含ap1 f2包含f1 f3包含f2 f3使用f4包含ap2 f5包含f4 f6包含f5 f6使用 生成图形的脚本 在使用以下查询时,似乎遇到了循环
我有一个用户名数组(例如,)要添加到图中的“user”标签下。 现在我首先要检查用户名是否已经存在(),然后仅在“user”标签下添加username属性不匹配的内容。 此外,这可以在单个gremlin查询或groovy脚本中完成吗? 我正在使用titan graph数据库、tinkerpop3和gremlin REST服务器。