我的项目中使用了AWS的Neptune图数据库,它使用Gremlin语法来进行图查询。我试图执行一个场景,其中需要根据边缘上的属性过滤从顶点发出的出边。让我们称之为属性'x'。该属性'x'的值采用'abc :: xyz :: ref'的形式。这是为了在边缘上存储多个值,因为Neptune不允许在边缘上有多个值。我必须使用三种组合和精确匹配进行包含检查:
- 'abc ::'
- ':: abc'
- ':: abc ::'
- 与“abc”完全匹配
我尝试在Java代码中的gremlin中使用filter命令。以下代码在TinkerGraph中内存中工作正常,但当我将其连接到Neptune并运行相同的查询时,它会抛出一些解析异常。
String valueToCheck = "abc";
List<String> listOfValuesToCheck = new ArrayList<>();
listOfValuesToCheck.add("::abc");
listOfValuesToCheck.add("abc::");
listOfValuesToCheck.add("::abc::");
GraphTraversal<Vertex, Map<Object, Object>> gt24 = g.V().outE().has("x").filter(it -> {
String value = String.valueOf(it.get().value("x"));
if(value.equals(valueToCheck)){
return true;
}else {
for(String s: listOfValuesToCheck){
if(value.contains(s){
return true;
}
}
}
}).valueMap().with(WithOptions.tokens);
while (gt24.hasNext()) {
System.out.println(gt24.next());
}
有人知道为什么 Neptune 发生这种情况吗?是否有更好的方法可以与 Neptune 兼容且能够正常工作?
我见过另外一个例子,其中 Neptune 没有抛出错误,但也没有返回任何结果,而同样的操作在 TinkerGraph 上可以正常工作。
y - Edge 上的属性
z - Vertex 上的属性
GraphTraversal<Vertex, Map<String, Object>> gt13 = g.V(1, 2).project("id", "summary").by(T.id)
.by(__.outE().has("y", "e").inV().group().by("z"));
.has()
步骤。请参阅:https://docs.aws.amazon.com/neptune/latest/userguide/full-text-search-gremlin.html - Joshua