Recursion 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是全新的,我正在使用
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
    查询返回的子图对象完全相同的子图对象
我使用了Neo4J和Cypher,Dgraph和GraphQL,发现在这两种语言中,这项任务相当简单,但我在理解小精灵方面还有点困难

编辑:

从中,所选答案应达到我想要的效果,但无需通过将
.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())#返回3
2
cluster=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()