如何使用JavaAPI将复杂的lambda函数传递给gremlin服务器?

如何使用JavaAPI将复杂的lambda函数传递给gremlin服务器?,gremlin,graph-databases,tinkerpop,tinkerpop3,gremlin-server,Gremlin,Graph Databases,Tinkerpop,Tinkerpop3,Gremlin Server,我正试图以一个间隔遍历这个图。每个边都有一个属性(“间隔”),用于存储间隔。我正在使用withSack将间隔的交点传播到下一步。如果没有交叉点,则遍历应停止 例如: V1 e1 V2 e2 V3 e3 V4 O----------------------O----------------------O----------------------O ^ [[1,3],[5,7]]

我正试图以一个间隔遍历这个图。每个边都有一个属性(“间隔”),用于存储间隔。我正在使用
withSack
将间隔的交点传播到下一步。如果没有交叉点,则遍历应停止

例如:

V1          e1         V2         e2          V3         e3          V4

O----------------------O----------------------O----------------------O
^
    [[1,3],[5,7]]              [[4,6]]                [[7,9]]
     e1.interval             e2.interval            e3.interval
如果我以[2,8]的间隔从V1开始遍历,我希望它返回

V1: [[2,3],[5,7]]
V2: [[5,6]]
请注意,V3和V4不包括在内,因为e2上的相交间隔在6处停止

我正在使用Tinkerpop Java API,为此,我定义了一个返回区间交点的方法,并尝试使用
和ack(Lambda.biFunction(…)
。该函数有一个带花括号(
{}
)的while循环,我认为这会导致gremlin服务器的脚本引擎出现问题。我得到的例外是:

Script28.groovy: 1: expecting '}', found 'return' @ line 1, column 520.
   get(j).get(1)) i++; else j++;}return int
我将函数作为字符串传递给
(Lambda.biFunction(…)
,如下所示:

"x, y -> " +
"List<List<Long>> intersections = new ArrayList();" +
"if (x.isEmpty() || y.isEmpty()) return new ArrayList<>();" +
"int i = 0, j = 0;" +
"while (i < x.size() && j < y.size()) {" +
"long low = Math.max(x.get(i).get(0), y.get(j).get(0));" +
"long high = Math.min(x.get(i).get(1), y.get(j).get(1));" +
"if (low <= high) intersections.add(Arrays.asList(low, high));" +
"if (x.get(i).get(1) < y.get(j).get(1)) i++; else j++;" +
"}" +
"return intersections;";
“x,y->”+
“列表交点=新建ArrayList();”+
“如果(x.isEmpty()| | y.isEmpty())返回新的ArrayList();”+
int i=0,j=0+
“而(i“如果(lowlambda的字符串需要匹配a。对于多行和多参数脚本,需要在其周围用大括号括起来:

withSack(Lambda.biFunction(
"{ x, y -> " +
"  intersections = []\n" +
"  if (x.isEmpty() || y.isEmpty()) return []\n" +
"  i = 0\n" +
"  j = 0\n" +
"  while (i < x.size() && j < y.size()) {\n" +
"    def low = Math.max(x[i][0], y[j][0])\n" +
"    def high = Math.min(x[i][1], y[j][1])\n" +
"    if (low <= high) intersections.add(Arrays.asList(low, high))\n" +
"    if (x[i][1] < y[j][1]) i++; else j++\n" +
"  }\n" +
"  return intersections\n" +
"}"))
带ack(Lambda.biFunction(
{x,y->+
“交叉口=[]\n”+
“如果(x.isEmpty()| | y.isEmpty())返回[]\n”+
“i=0\n”+
“j=0\n”+
“而(i“if(low)谢谢你的回答。我得到了同样的例外:
预期为'}',在第1行第158.x,y列找到了'if'->crossions=[]if(x.isEm
。但是,我已经将相同的函数写入groovy脚本文件,该文件在服务器启动时由
ScriptFileGremlinPlugin
初始化。然后我可以在查询中调用该函数。哦……我去掉了分号,但没有添加换行符。更新了答案。也许这会解决它。就像这样简单。只是groovy计算中的语法错误。
withSack(Lambda.biFunction(
"{ x, y -> " +
"  intersections = []\n" +
"  if (x.isEmpty() || y.isEmpty()) return []\n" +
"  i = 0\n" +
"  j = 0\n" +
"  while (i < x.size() && j < y.size()) {\n" +
"    def low = Math.max(x[i][0], y[j][0])\n" +
"    def high = Math.min(x[i][1], y[j][1])\n" +
"    if (low <= high) intersections.add(Arrays.asList(low, high))\n" +
"    if (x[i][1] < y[j][1]) i++; else j++\n" +
"  }\n" +
"  return intersections\n" +
"}"))