【发布时间】:2015-01-22 09:57:34
【问题描述】:
我有一个简单的图表,父母和孩子是顶点。 父母与他们的孩子有“isParentOf”关系。 顶点都有一个属性:“familyName”。
我想使用 gremlin 匹配所有孩子的 familyName 与他们不同的父母。
注意:我不能使用 Gremlin 的 Groovy 语法。我必须只使用纯 Java 代码。
【问题讨论】:
-
Gremlin2 还是 Gremlin3?
我有一个简单的图表,父母和孩子是顶点。 父母与他们的孩子有“isParentOf”关系。 顶点都有一个属性:“familyName”。
我想使用 gremlin 匹配所有孩子的 familyName 与他们不同的父母。
注意:我不能使用 Gremlin 的 Groovy 语法。我必须只使用纯 Java 代码。
【问题讨论】:
GremlinPipeline 应该如下所示:
问题出在最后一步。当此管道步骤只能访问(即来自上一步的内容)子级时,如何检索父级的“familyName”?
我的回答:
无法在过滤器的 PipeFunction 中访问 GremlinPipeline 的先前步骤。但是,如果您使用 PipesFunction 代替它是可能的(注意 's' !)。
我们看一下javadoc here:
public PipesFunction extends PipeFunction{
public AsMap getAsMap();
}
所以你应该像这样设置 GremlinPipeline:
像这样使用 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”顶点。
【讨论】: