【问题标题】:Comparing properties in Gremlin比较 Gremlin 的属性
【发布时间】:2015-01-22 09:57:34
【问题描述】:

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

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

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

【问题讨论】:

  • Gremlin2 还是 Gremlin3?

标签: gremlin tinkerpop


【解决方案1】:

GremlinPipeline 应该如下所示:

  • 找到所有父母
  • 遵循“isParentOf”关系并获取所有孩子
  • 通过将父级的“familyName”与子级的“familyName”进行比较的 PipeFunction 过滤子级

问题出在最后一步。当此管道步骤只能访问(即来自上一步的内容)子级时,如何检索父级的“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));
       }
    
     })
    

注意:在第 4 步中,由于 getAsMap() 方法和第 2 步(隐式填充了“As”映射),我们可以检索“theParent”顶点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多