如何在连接图中的Gremlin中匹配未链接的顶点

时间:2019-04-03 17:51:38

标签: graph gremlin

我有一个简单的图形,其中包含尚未链接的人员节点(假设超过1万个人员节点)和规则节点(大约少数规则),在这两种类型的节点之间不存在边。我想做的是通过匹配Gremlin中的属性值在它们之间创建边缘。

人物节点具有四个属性:名称,年龄,州,已注册。 规则节点具有三个属性:年龄,状态,已注册。不同的规则节点将具有不同的属性值,例如(registered = true,state = WA,age> 22)等。

我如何编写一个gremlin来将具有匹配属性值的所有人员节点链接到每个规则节点?

1 个答案:

答案 0 :(得分:1)

在注释中提供了其他信息的示例图可能如下所示:

g = TinkerGraph.open().traversal()
g.addV('person').
    property('name','daniel').
    property('age',37).
    property('state','AZ').
  addV('person').
    property('name','howell').
    property('age',25).
    property('state','WA').
  addV('person').
    property('name','john').
    property('age',19).
    property('state','NV').
  addV('rule').
    property('state','WA').
    property('state','CA').
    property('state','OR').
    property('minimumAge',22).
  addV('rule').
    property('state','AZ').
    property('state','FL').
    property('state','TX').
    property('minimumAge',19).
  iterate()

我不确定age > 22是否是故意的,但让我们假设您实际上只是在寻找相等匹配;那么您的查询将是:

g.V().hasLabel('people').as('person').
  V().hasLabel('rule').
    where(eq('person')).
      by(values('age','state','registered').fold()).
  addE('hasRule').
    from('person')

要匹配personrule的顶点,您将执行与此类似的操作(根据需要添加更多规则):

g.V().hasLabel('person').as('person').
  V().hasLabel('rule').
    where(lte('person')).by('minimumAge').by('age').
    filter(values('state').where(eq('person')).by().by('state')).
  addE('hasRule').
    from('person').iterate()

此查询将在示例图中添加2条边(john没有规则,因为他还太小):

gremlin> g.V().outE().inV().path().by('name').by(label).by(valueMap())
==>[daniel,hasRule,[minimumAge:[19],state:[AZ,FL,TX]]]
==>[howell,hasRule,[minimumAge:[22],state:[WA,CA,OR]]]