比较Gremlin中的属性

时间:2015-01-22 09:57:34

标签: gremlin tinkerpop

我有一个简单的图表,父母和孩子是顶点。 父母与子女有“isParentOf”的关系。 顶点都有一个属性:“familyName”。

我想使用gremlin来匹配孩子的姓氏​​与他们不同的所有父母。

注意:我不能使用Gremlin的Groovy语法。我必须只使用纯Java代码。

1 个答案:

答案 0 :(得分:0)

GremlinPipeline应如下所示:

  • 找到所有父母
  • 关注" isParentOf"关系并得到所有孩子
  • 通过PipeFunction过滤子节点,该函数比较父节点" familyName"与孩子的姓氏​​"

问题出在最后一步。当这个管道步骤只能访问(来自上一步,也就是说)孩子的时候,如何检索父母" familyName"?

我的回答:

无法在过滤器的PipeFunction中访问GremlinPipeline的先前步骤。但是如果你使用PipesFunction就可以了(请注意' s'!)。

让我们看一下javadoc here

public PipesFunction extends PipeFunction{
   public AsMap getAsMap();
}

所以你应该像这样设置GremlinPipeline:

  1. 找到所有父母
  2. 将该步骤命名为" theParent"
  3. 关注" isParentOf"关系并得到所有孩子
  4. 使用像这样的PipesFunction过滤孩子:

    .filter(new PipesFunction<Vertex,Boolean>() 
    {
    
       public Boolean compute(Vertex child) {
          return parentHasDifferentFamilyName(child);
       }
    
       private Boolean parentHasDifferentFamilyName(child){
          Vertex theParent = getAsMap().get("theParent");
          String theParentFamilyName = theParent.getProperty("familyName");
          String childFamilyName = child.getParameter("familyName");
          return !(childFamilyName.equals(parentFamilyName));
       }
    
     })
    
  5. 注意:在步骤4中,我们可以检索&#34; theParent&#34;顶点得益于getAsMap()方法,并且感谢第2步(隐含地填充了&#34; As&#34; map)。