使用 Gremlin 语法时,Amazon Neptune 有哪些限制?

3

我的项目中使用了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"));
2个回答

2

2

Neptune不支持lambda步骤。

您应该尝试用其他Gremlin步骤替换您的lambda代码。

g.V().outE().has("x").or(
        __.has('prop', 'abc'),
        __.has('prop', TextP.containing('abc::')),
        __.has('prop', TextP.containing('::abc')),
    ).valueMap().with(WithOptions.tokens)

example: https://gremlify.com/sjrd9lrwfr


在这里,您还可以利用 Neptune 中的全文搜索来避免多个 .has() 步骤。请参阅:https://docs.aws.amazon.com/neptune/latest/userguide/full-text-search-gremlin.html - Joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接