Sitelet https://github.com/ArcadeData/arcadedb/commit/f18533836c2e8c5aaf3e6b0a4fb7a214fe8f6406
Skip to content

Commit f185338

Browse files
committed
2 parents 777c592 + 7502cd6 commit f185338

6 files changed

Lines changed: 103 additions & 62 deletions

File tree

‎gremlin/src/main/java/com/arcadedb/gremlin/ArcadeFilterByIndexStep.java‎

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -81,25 +81,28 @@ public ArcadeFilterByIndexStep(final Traversal.Admin traversal, final Class retu
8181
}
8282
}
8383

84-
final Iterator<Identifiable> rawIterator = resultSet.iterator();
8584

86-
iteratorSupplier = () -> new Iterator<>() {
87-
@Override
88-
public boolean hasNext() {
89-
return rawIterator.hasNext();
90-
}
91-
92-
@Override
93-
public E next() {
94-
final Record rec = rawIterator.next().getRecord();
95-
if (rec instanceof com.arcadedb.graph.Vertex)
96-
return (E) new ArcadeVertex(graph, rec.asVertex());
97-
else if (rec instanceof com.arcadedb.graph.Edge)
98-
return (E) new ArcadeEdge(graph, rec.asEdge());
99-
else
100-
throw new IllegalStateException("Record of type '" + rec.getClass() + "' is not a graph element");
101-
}
102-
};
85+
iteratorSupplier = () -> {
86+
final Iterator<Identifiable> rawIterator = resultSet.iterator();
87+
88+
return new Iterator<>() {
89+
@Override
90+
public boolean hasNext() {
91+
return rawIterator.hasNext();
92+
}
93+
94+
@Override
95+
public E next() {
96+
final Record rec = rawIterator.next().getRecord();
97+
if (rec instanceof com.arcadedb.graph.Vertex)
98+
return (E) new ArcadeVertex(graph, rec.asVertex());
99+
else if (rec instanceof com.arcadedb.graph.Edge)
100+
return (E) new ArcadeEdge(graph, rec.asEdge());
101+
else
102+
throw new IllegalStateException("Record of type '" + rec.getClass() + "' is not a graph element");
103+
}
104+
};
105+
};
103106
}
104107

105108
public String toString() {

‎gremlin/src/main/java/com/arcadedb/gremlin/ArcadeFilterByTypeStep.java‎

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -85,36 +85,43 @@ public ArcadeFilterByTypeStep(final Traversal.Admin traversal, final Class retur
8585
if (!(type instanceof VertexType))
8686
throw new IllegalArgumentException("Type '" + this.typeName + "' is not a vertex type");
8787

88-
final Iterator<Record> rawIterator =
89-
bucketName == null ? database.iterateType(this.typeName, true) : database.iterateBucket(bucketName);
90-
iteratorSupplier = () -> new Iterator<>() {
91-
@Override
92-
public boolean hasNext() {
93-
return rawIterator.hasNext();
94-
}
88+
iteratorSupplier = () -> {
89+
final Iterator<Record> rawIterator = bucketName == null ?
90+
database.iterateType(this.typeName, true) :
91+
database.iterateBucket(bucketName);
92+
return new Iterator<>() {
93+
@Override
94+
public boolean hasNext() {
95+
return rawIterator.hasNext();
96+
}
9597

96-
@Override
97-
public E next() {
98-
return (E) new ArcadeVertex(graph, rawIterator.next().asVertex());
99-
}
98+
@Override
99+
public E next() {
100+
return (E) new ArcadeVertex(graph, rawIterator.next().asVertex());
101+
}
102+
};
100103
};
101104

102105
} else if (Edge.class.isAssignableFrom(this.returnClass)) {
103106
if (!(type instanceof EdgeType))
104107
throw new IllegalArgumentException("Type '" + this.typeName + "' is not an edge type");
105108

106-
final Iterator<Record> rawIterator =
107-
bucketName == null ? database.iterateType(this.typeName, true) : database.iterateBucket(bucketName);
108-
iteratorSupplier = () -> new Iterator<>() {
109-
@Override
110-
public boolean hasNext() {
111-
return rawIterator.hasNext();
112-
}
113109

114-
@Override
115-
public E next() {
116-
return (E) new ArcadeEdge(graph, rawIterator.next().asEdge());
117-
}
110+
iteratorSupplier = () -> {
111+
final Iterator<Record> rawIterator = bucketName == null ?
112+
database.iterateType(this.typeName, true) :
113+
database.iterateBucket(bucketName);
114+
return new Iterator<>() {
115+
@Override
116+
public boolean hasNext() {
117+
return rawIterator.hasNext();
118+
}
119+
120+
@Override
121+
public E next() {
122+
return (E) new ArcadeEdge(graph, rawIterator.next().asEdge());
123+
}
124+
};
118125
};
119126
} else
120127
throw new IllegalArgumentException("Unsupported returning class '" + returnClass + "'");

‎gremlin/src/main/java/com/arcadedb/gremlin/service/VectorNeighborsFactory.java‎

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919
package com.arcadedb.gremlin.service;
2020

2121
import com.arcadedb.database.Identifiable;
22+
import com.arcadedb.database.RID;
2223
import com.arcadedb.gremlin.ArcadeGraph;
23-
import com.arcadedb.index.vector.HnswVectorIndex;
24+
import com.arcadedb.index.TypeIndex;
25+
import com.arcadedb.index.vector.LSMVectorIndex;
2426
import com.arcadedb.utility.Pair;
2527
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
2628
import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
@@ -38,7 +40,8 @@
3840
*
3941
* @author Luca Garulli (l.garulli@arcadedata.com)
4042
*/
41-
public class VectorNeighborsFactory extends ArcadeServiceRegistry.ArcadeServiceFactory<Vertex, List<Map>> implements Service<Vertex, List<Map>> {
43+
public class VectorNeighborsFactory extends ArcadeServiceRegistry.ArcadeServiceFactory<Vertex, List<Map>>
44+
implements Service<Vertex, List<Map>> {
4245

4346
public static final String NAME = "arcadedb#vectorNeighbors";
4447

@@ -73,18 +76,23 @@ public Service<Vertex, List<Map>> createService(final boolean isStart, final Map
7376

7477
public CloseableIterator<List<Map>> execute(final ServiceCallContext ctx, final Map params) {
7578
final String indexName = (String) params.get("indexName");
76-
final Object vector = params.get("vector");
79+
final Object vectorParam = params.get("vector");
80+
7781
Integer limit = (Integer) params.get("limit");
7882
if (limit == null)
7983
limit = -1;
80-
81-
final HnswVectorIndex persistentIndex = (HnswVectorIndex) graph.getDatabase().getSchema().getIndexByName(indexName);
82-
final List<Pair<Identifiable, ? extends Number>> neighbors = persistentIndex.findNeighborsFromVector(vector, limit);
83-
84-
final List<Map> result = new ArrayList<>(neighbors.size());
85-
for (Pair<Identifiable, ? extends Number> n : neighbors)
86-
result.add(Map.of("vertex", graph.getVertexFromRecord(n.getFirst()), "distance", n.getSecond()));
87-
return CloseableIterator.of(List.of(result).iterator());
84+
if (vectorParam instanceof float[] vector) {
85+
86+
TypeIndex indexByName = (TypeIndex) graph.getDatabase().getSchema().getIndexByName(indexName);
87+
final LSMVectorIndex persistentIndex = (LSMVectorIndex) indexByName.getIndexesOnBuckets()[0];
88+
final List<Pair<RID, Float>> neighbors = persistentIndex.findNeighborsFromVector(vector, limit);
89+
90+
final List<Map> result = new ArrayList<>(neighbors.size());
91+
for (Pair<RID, Float> n : neighbors)
92+
result.add(Map.of("vertex", graph.getVertexFromRecord(n.getFirst()), "distance", n.getSecond()));
93+
return CloseableIterator.of(List.of(result).iterator());
94+
}
95+
else return CloseableIterator.empty();
8896
}
8997

9098
@Override

‎gremlin/src/test/java/com/arcadedb/gremlin/VectorGremlinIT.java‎

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,17 @@
2020

2121
import com.arcadedb.database.Database;
2222
import com.arcadedb.database.DatabaseFactory;
23-
import com.arcadedb.database.Identifiable;
2423
import com.arcadedb.database.RID;
2524
import com.arcadedb.graph.ImmutableVertex;
2625
import com.arcadedb.query.sql.executor.Result;
2726
import com.arcadedb.query.sql.executor.ResultSet;
2827
import com.arcadedb.utility.FileUtils;
29-
import com.arcadedb.utility.Pair;
3028
import org.junit.jupiter.api.Test;
3129

32-
import java.io.*;
33-
import java.util.*;
30+
import java.io.File;
31+
import java.util.ArrayList;
32+
import java.util.List;
33+
import java.util.Map;
3434

3535
import static org.assertj.core.api.Assertions.assertThat;
3636

@@ -54,9 +54,22 @@ void importDocuments() {
5454

5555
assertThat(db.countType("Word", true)).isEqualTo(10);
5656

57-
final float[] vector = new float[100];
58-
59-
ResultSet resultSet = db.query("sql", "select vectorNeighbors('Word[name,vector]', ?,?) as neighbors", vector, 10);
57+
final float[] vector = {
58+
0.41344f, -0.40603f, 0.33597f, -0.36816f, -0.83081f, 0.017751f, -0.25325f, 0.70141f, 0.80453f, 1.8683f, 0.090854f,
59+
-1.0312f, -0.48193f,
60+
0.37293f, -0.30705f, 0.61617f, -0.040523f, -0.10005f, -0.67102f, -0.075665f, -1.2193f, 0.19714f, -0.85279f, -0.30502f,
61+
-0.50188f,
62+
-0.74649f, -0.25207f, -0.28968f, 0.14505f, -0.054608f, -0.44494f, 0.52489f, 1.2581f, 0.33759f, 1.8549f, -0.42854f,
63+
-0.11269f,
64+
-0.49523f, 0.29345f, 0.1934f, -2.104f, -0.16325f, 0.18264f, 0.15553f, 0.23637f, 0.0076311f, -1.8425f, -0.75107f, 0.44849f,
65+
0.2597f, 0.12551f, -0.31736f, -0.53202f, 0.40523f, 0.29191f, 0.12471f, -0.19319f, 0.18022f, 1.4314f, -0.14817f, -0.35196f,
66+
0.21997f, 0.12066f, -0.14021f, -0.22512f, -0.6414f, -0.20043f, -1.4553f, -0.15688f, 0.47271f, 0.33006f, -0.12094f,
67+
0.035584f, 0.50094f, 0.39446f, 0.23234f, 0.58614f, 0.027875f, -0.26279f, -0.44492f, 1.1477f, -0.40976f, -0.031541f,
68+
0.57674f, -0.32274f, -0.54373f, 0.041997f, 0.44756f, 0.070903f, -0.2283f, -0.22984f, 0.29805f, 0.39809f, 0.65451f,
69+
-0.59439f, 0.75782f, 1.1569f, 0.60621f, -0.75041f, -0.84309f
70+
};
71+
72+
ResultSet resultSet = db.query("sql", "select vectorNeighbors('Word[vector]', ?,?) as neighbors", vector, 10);
6073
assertThat(resultSet.hasNext()).isTrue();
6174
final List<RID> approximateResults = new ArrayList<>();
6275
while (resultSet.hasNext()) {
@@ -73,7 +86,7 @@ void importDocuments() {
7386
assertThat(approximateResults).hasSize(10);
7487

7588
resultSet = db.query("gremlin",
76-
"g.call('arcadedb#vectorNeighbors', [ 'indexName': 'Word[name,vector]', 'vector': vector, 'limit': 10 ] )", "vector",
89+
"g.call('arcadedb#vectorNeighbors', [ 'indexName': 'Word[vector]', 'vector': vector, 'limit': 10 ] )", "vector",
7790
vector);
7891
assertThat(resultSet.hasNext()).isTrue();
7992
final List<RID> approximateResultsFromGremlin = new ArrayList<>();

‎integration/src/test/java/com/arcadedb/integration/importer/GloVeImporterIT.java‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@
2121
import com.arcadedb.database.Database;
2222
import com.arcadedb.database.DatabaseFactory;
2323
import com.arcadedb.database.Identifiable;
24-
import com.arcadedb.integration.TestHelper;
2524
import com.arcadedb.query.sql.executor.Result;
2625
import com.arcadedb.query.sql.executor.ResultSet;
2726
import com.arcadedb.utility.FileUtils;
2827
import com.arcadedb.utility.Pair;
28+
import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
29+
import org.junit.jupiter.api.Order;
2930
import org.junit.jupiter.api.Test;
31+
import org.junit.jupiter.api.TestMethodOrder;
3032

3133
import java.io.File;
3234
import java.util.ArrayList;
@@ -35,8 +37,10 @@
3537

3638
import static org.assertj.core.api.Assertions.assertThat;
3739

40+
@TestMethodOrder(OrderAnnotation.class)
3841
class GloVeImporterIT {
3942
@Test
43+
@Order(1)
4044
void importDocuments() {
4145
final String databasePath = "target/databases/test-glove";
4246

@@ -80,7 +84,7 @@ void importDocuments() {
8084

8185
// Verify results
8286
assertThat(approximateResults).isNotEmpty();
83-
87+
db.close();
8488
} finally {
8589
// db.drop();
8690
// TestHelper.checkActiveDatabases();
@@ -89,10 +93,10 @@ void importDocuments() {
8993
}
9094

9195
@Test
96+
@Order(2)
9297
void query() {
9398
final String databasePath = "target/databases/test-glove";
9499

95-
96100
final DatabaseFactory databaseFactory = new DatabaseFactory(databasePath);
97101

98102
final Database db = databaseFactory.open();

‎postgresw/pom.xml‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@
4444
<version>${project.parent.version}</version>
4545
<scope>provided</scope>
4646
</dependency>
47+
<dependency>
48+
<groupId>com.arcadedb</groupId>
49+
<artifactId>arcadedb-gremlin</artifactId>
50+
<version>${project.parent.version}</version>
51+
<scope>provided</scope>
52+
</dependency>
4753
<dependency>
4854
<groupId>org.postgresql</groupId>
4955
<artifactId>postgresql</artifactId>

0 commit comments

Comments
 (0)