繁体   English   中英

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

[英]Gremlin query to find the entire sub-graph that a specific node is connected in any way to

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

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

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

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

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

例如:

  • 如果我在查询中指定Customer_1 ,则生成的子图将包含Customer_1Customer_3CreditCardA1_HasCreditCard_A3_HasCreditCard_A
  • 如果我指定Customer_2 ,则返回的子图将包含Customer_2CreditCard_B2_HasCreditCard_B
  • 如果我查询Customer_3 ,将返回与Customer_1查询返回的完全相同的子图 object。

我已经使用了 Neo4J 和 Cypher 和 Dgraph 和 GraphQL 并发现在这两种语言中这项任务很容易,但是在理解 grem 方面我有点挣扎。

编辑:

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

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

编辑2:

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM