【问题标题】:how to match un-linked vertexes in Gremlin in connected graph如何在连通图中匹配 Gremlin 中未链接的顶点
【发布时间】:2019-04-03 17:51:37
【问题描述】:

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

people 节点有四个属性:name、age、state、registered。 规则节点具有三个属性:年龄、状态、注册..不同的规则节点将具有不同的属性值,例如 (registered=true, state=WA, age > 22) 等。

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

【问题讨论】:

    标签: graph gremlin


    【解决方案1】:

    在 cmets 中给出附加信息的示例图可能如下所示:

    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]]]
    

    【讨论】:

    • 谢谢。是的,匹配条件需要超越简单的等式,例如大于和小于。例如,某些人物节点只能链接到指定年龄
    • 但是规则属性是什么样子的呢?它是像字符串 '< 22' 还是像 predicate=ltage=22 这样的两个单独的属性?
    • 啊,好问题。对于规则上的年龄属性,它实际上称为最小年龄,因此任何人的年龄在指定时都需要大于此值。对于状态属性,它通常是一个多基数列表,如[“WA”,“CA”,“OR],所以只有像这些状态的人才能符合规则。
    • 好的,我将根据这些新信息重写我的答案。
    • 谢谢,我想就是这样。这句话是我不知道的..where(lte('person')).by('minimumAge').by('age')..
    猜你喜欢
    • 2021-11-06
    • 2016-12-30
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    相关资源
    最近更新 更多