Gremlin查询以查找特定节点以任何方式连接到的整个子图

时间:2020-08-19 10:48:25

标签: recursion graph gremlin traversal gremlinpython

我是Gremlin的新手,正在使用gremlin-python遍历我的图表。该图由许多簇或子图组成,这些簇或子图是内部连接的,而不是与图中的任何其他簇相互连接的。

一个简单的例子是具有5个节点和3个边的图形:

  • Customer_1通过CreditCard_A边缘连接到1_HasCreditCard_A
  • Customer_2通过CreditCard_B边缘连接到2_HasCreditCard_B
  • Customer_3通过CreditCard_A边缘连接到3_HasCreditCard_A

我想要一个查询,该查询将返回所有节点(与输入或输出连接到查询的节点)和边缘的子图对象。然后,我可以将此子图存储为变量,然后对其进行不同的遍历以计算不同的事物。

此查询将需要递归,因为这些群集可能由彼此之间有许多(向内或向外)跳的节点组成。还有许多不同类型的节点和边,都必须返回它们。

例如:

  • 如果我在查询中指定了Customer_1,则结果子图将包含Customer_1Customer_3CreditCardA1_HasCreditCard_A和{{1 }}。
  • 如果我指定了3_HasCreditCard_A,则返回的子图将由Customer_2Customer_2CreditCard_B组成。
  • 如果我查询2_HasCreditCard_B,将返回与Customer_3查询返回的子图对象完全相同的子图对象。

我已经将Neo4J与Cypher结合使用,将Dgraph与GraphQL结合使用,发现在这两种语言中此任务相当容易,但是在理解gremlin方面却要付出更多的努力。

编辑:

this question中选择的答案应该可以达到我想要的效果,但无需通过将Customer_1更改为.both('created')来指定边类型。

但是,循环语法:.both()当然在Python中是无效的。此循环功能在.loop{true}{true}中可用吗?我什么都找不到。

编辑2:

我已经尝试过了,我认为它似乎按预期运行。

gremlin-python

这是我所寻找的有效解决方案吗?此结果中是否还可以包含查询的节点?

1 个答案:

答案 0 :(得分:2)

关于第二个编辑,这看起来像一个有效的解决方案,它返回连接到起始顶点的所有顶点。 一些小修正:

  • 您可以将bothE().otherV()更改为both()
  • 如果您还想获得起始顶点,则需要将emit步骤移到repeat之前
  • 我将添加一个dedup步骤以删除所有重复的顶点(到顶点的路径可能超过1条)
g.V(node_id).emit().repeat(both().simplePath()).dedup()

例如:https://gremlify.com/jngpuy3dwg9