3

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

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

  • Customer_1CreditCard_A1_HasCreditCard_A边缘相连
  • Customer_2CreditCard_B2_HasCreditCard_B边缘相连
  • Customer_3CreditCard_A3_HasCreditCard_A边缘相连

我想要一个查询,它将返回所有节点和连接(输入或输出)到查询节点的边的子图对象。然后我可以将这个子图存储为一个变量,然后在它上面运行不同的遍历来计算不同的东西。

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

例如:

  • 如果我Customer_1在查询中指定,生成的子图将包含Customer_1Customer_3CreditCardA1_HasCreditCard_A3_HasCreditCard_A
  • 如果我指定Customer_2,返回的子图将由Customer_2, CreditCard_B,组成2_HasCreditCard_B
  • 如果我查询Customer_3,将返回与查询返回的完全相同的子图对象Customer_1

我已经将 Neo4J 与 Cypher 和 Dgraph 与 GraphQL 一起使用,并发现在这两种语言中这项任务非常容易,但在理解 gremlin 方面却更加困难。

编辑:

从,这个问题,选择的答案应该达到我想要的,但没有通过更改.both('created')为 just来指定边缘类型.both()

但是,循环语法:.loop{true}{true}当然在 Python 中是无效的。此循环功能是否可用gremlin-python?我找不到任何东西。

编辑2:

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

g.V(node_id).repeat(bothE().otherV().simplePath()).emit()

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

4

1 回答 1

2

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

  • 你可以 bothE().otherV()改变both()
  • 如果您还想获得起始顶点,则需要emitrepeat
  • 我会添加一个dedup步骤来删除所有重复的顶点(可以是多个顶点的路径)
g.V(node_id).emit().repeat(both().simplePath()).dedup()

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

于 2020-08-20T06:51:32.053 回答