当前位置: 首页 > 知识库问答 >
问题:

使用gremlin添加不存在的边缘

曾嘉福
2023-03-14

我正在azure中使用cosmos图形数据库。

有人知道是否有一种方法可以在两个顶点之间添加一条边,只有当它不存在时(使用gremlin图查询)?

我可以在添加顶点时这样做,但不能使用边。我从这里获取了执行此操作的代码:

g.Inject(0).coalesce(__.V().has('id', 'idOne'), addV('User').property('id', 'idOne'))

谢谢

共有3个答案

俞涵涤
2023-03-14

我一直在研究类似的问题,试图避免顶点或边的重复。第一个是一个粗略的示例,说明如何检查以确保没有复制顶点:

            "g.V().has('word', 'name', '%s').fold()"
            ".coalesce(unfold(),"
            "addV('word')" 
            ".property('name', '%s')"
            ".property('pos', '%s')"
            ".property('pk', 'pk'))"
            % (re.escape(category_),re.escape(category_), re.escape(pos_))

第二个是我可以确保这不是任何方向的方向边的方法。我使用了两个合并语句,一个嵌套在另一个里面:

        "x = g.V().has('word', 'name', '%s').next()\n"
        "y = g.V().has('word', 'name', '%s').next()\n"
        "g.V(y).bothE('distance').has('weight', %f).fold()"
        ".coalesce("
        "unfold(),"
        "g.addE('distance').from(x).to(y).property('weight', %f)"
        ")"
        % (word_1, word_2, weight, weight)

因此,如果边存在y-

如果这里有人知道更简洁的解决方案,请告诉我。我对gremlin还是很陌生,希望有一个更清晰的答案。不过,这一条似乎就足够了。

当我实现之前提供的解决方案时,当我运行代码两次时,每次尝试都会产生一个边缘,因为它在创建新边缘之前只测试一个方向。

澹台举
2023-03-14

接受答案的性能并不好,因为它使用了inE(…),这是一个昂贵的操作。

这个查询是我在CosmosDB中工作时使用的:

g.E(edgeId).
fold().
coalesce(
   unfold(),
   g.V(sourceId).
   has('pk', sourcePk).
   as('source').
   V(destinationId).
   has('pk', destinationPk).
   addE(edgeLabel).
   from('source').
   property(T.id, edgeId)
)

这使用每个顶点的id和分区键进行廉价查找。

竺翰海
2023-03-14

可以处理边缘。该模式在概念上与顶点相同,并以coalesce()为中心。使用“现代”TinkerPop玩具图演示:

gremlin> g.V().has('person','name','vadas').as('v').
           V().has('software','name','ripple').
           coalesce(__.inE('created').where(outV().as('v')),
                    addE('created').from('v').property('weight',0.5))
==>e[13][2-created->5]

在这里,我们在“vadas”和“ripple”之间添加了一条边,但前提是它还不存在。这里的关键是检查coalesce()的第一个参数。

 类似资料:
  • 我试图理解方法的差异,以及在Gremlin Python中添加边(在现有顶点之间)的最佳语法。 在阅读了这里的几篇文章之后,我将发现的一些不同方法细分为几个问题。 非常感谢您提前提供任何反馈! 1)在创建边缘时,将属性添加到边缘的最佳顺序是什么:其中哪一个是更好的选择(以防有任何显着差异)? 2) “V()”的目的和正确用法是什么? 3) 使用“属性”和“属性”之间有什么区别: 4)当没有指定“.

  • 我有一个用户名数组(例如,)要添加到图中的“user”标签下。 现在我首先要检查用户名是否已经存在(),然后仅在“user”标签下添加username属性不匹配的内容。 此外,这可以在单个gremlin查询或groovy脚本中完成吗? 我正在使用titan graph数据库、tinkerpop3和gremlin REST服务器。

  • 我在我的应用程序中使用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使用 生成图形的脚本 在使用以下查询时,似乎遇到了循环

  • 问题内容: 我有许多固定大小的图像(例如500 * 500)。我想编写一个python脚本,将其调整为固定大小(例如800 * 800),但将原始图像保持在中心,并用固定颜色(例如黑色)填充多余的区域。 我正在使用PIL。我现在可以使用该功能调整图像的大小,但这会改变纵横比。有什么办法吗? 问题答案: 您可以创建具有所需新尺寸的新图像,然后将旧图像粘贴到中间,然后保存。如果需要,可以覆盖原始图像(