Recursion Gremlin查询以查找特定节点以任何方式连接到的整个子图
我对Gremlin是全新的,我正在使用Recursion Gremlin查询以查找特定节点以任何方式连接到的整个子图,recursion,graph,gremlin,traversal,gremlinpython,Recursion,Graph,Gremlin,Traversal,Gremlinpython,我对Gremlin是全新的,我正在使用Gremlin-python遍历我的图形。该图由许多簇或子图组成,这些簇或子图是内部连通的,并且不与图中的任何其他簇相互连通 这方面的一个简单示例是具有5个节点和3条边的图: Customer\u 1通过1\u has CreditCard\u A边缘连接到CreditCard\u A Customer_2通过2\u has CreditCard_B边缘连接到CreditCard_B Customer\u 3通过3\u has CreditCard\u A
Gremlin-python
遍历我的图形。该图由许多簇或子图组成,这些簇或子图是内部连通的,并且不与图中的任何其他簇相互连通
这方面的一个简单示例是具有5个节点和3条边的图:
通过Customer\u 1
边缘连接到1\u has CreditCard\u A
CreditCard\u A
通过Customer_2
边缘连接到2\u has CreditCard_B
CreditCard_B
通过Customer\u 3
边缘连接到3\u has CreditCard\u A
CreditCard\u A
- 如果我在查询中指定了
,则生成的子图将包含Customer\u 1
,Customer\u 1
,Customer\u 3
,CreditCardA
和1\u HasCreditCard\u A
3\u HasCreditCard\u A
- 如果我指定了
,返回的子图将包括Customer\u 2
,Customer\u 2
,CreditCard\u B
2\u has CreditCard\u B
- 如果我查询
,将返回与Customer\u 3
查询返回的子图对象完全相同的子图对象Customer\u 1
.both('created')
更改为.both()
来指定边缘类型
但是,循环语法:.loop{true}{true}
在Python中当然是无效的。这个循环函数在gremlin python中可用吗?我什么也找不到
编辑2:
我已经试过了,我想它看起来像预期的那样工作
g.V(node_id).repeat(bothE().otherV().simplePath()).emit()
这是我所寻找的有效解决方案吗?是否也可以在此结果中包含查询的节点?关于第二次编辑,这看起来是一个有效的解决方案,可以返回连接到起始顶点的所有顶点。 一些小问题:
- 您可以将
更改为bothE().otherV()
bother()
- 如果您还想获得起始顶点,则需要在
重复之前移动
步骤发射
- 我会添加一个
步骤来删除所有重复的顶点(一个顶点可以有多条路径)dedup
exmaple:太好了,看起来它返回了正确的结果,但是当我对1运行以下两个查询时。查找整个图中
Customer
节点的总数和2。在返回的子图中找到Customer
节点的总数,结果分别是3(正确)和21(显然不是我想要的)。1. <代码>打印(g.V().hasLabel(“客户”).count().next())#返回32cluster=g.V(node_id).emit().repeat(both().simplePath()).dedup()
print(cluster.V().hasLabel(“Customer”).count().next())#returns 21
更详细地解释一下,我想要实现的是让答案中的查询返回一个完整的子图对象,然后我可以对其运行查询和遍历,就像它是原始的,整个图形本身被查询一样。这可能吗?换句话说,是否可以根据遍历结果创建图形对象?@KOB如果使用Tinkerpop,则可以使用子图步骤保存子图,如下所述:。您还可以在第一次查询中获取顶点的id,并在第二次查询中使用它们,在重复数据消除
之后添加id(),并在V(ids).hasLabel(“Customer”).count()中使用id。next()
g.V(node_id).emit().repeat(both().simplePath()).dedup()