问题描述
我是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_1
,Customer_3
,CreditCardA
,1_HasCreditCard_A
和{{1 }}。 - 如果我指定了
3_HasCreditCard_A
,则返回的子图将由Customer_2
,Customer_2
,CreditCard_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
这是我所寻找的有效解决方案吗?此结果中是否还可以包含查询的节点?
解决方法
关于第二个编辑,这看起来像一个有效的解决方案,它返回连接到起始顶点的所有顶点。 一些小修正:
- 您可以将
bothE().otherV()
更改为both()
- 如果您还想获得起始顶点,则需要将
emit
步骤移到repeat
之前 - 我将添加一个
dedup
步骤以删除所有重复的顶点(到顶点的路径可能超过1条)
g.V(node_id).emit().repeat(both().simplePath()).dedup()