如何使用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" +
"}"))