Skip to content

Commit 24686b2

Browse files
committed
v1.3.0
1 parent d2445ad commit 24686b2

File tree

15 files changed

+318
-66
lines changed

15 files changed

+318
-66
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ a spatial index for neo4j 4.x.
77

88
create a spatial index
99
~~~java
10-
RTreeIndex rTreeIndex = RTreeIndexManager.createIndex(db, "index1", "geometry", 64);
10+
//5个参数依次是: neo4j的GraphDatabaseService实例 索引名(唯一) 空间属性名 rtree最大子节点数 最大缓存geometry对象数
11+
RTreeIndex rTreeIndex = RTreeIndexManager.createIndex(db, "index1", "geometry", 64, 1024);
1112
~~~
1213

1314

@@ -64,7 +65,7 @@ try (Transaction tx = db.beginTx()) {
6465

6566

6667
## install
67-
The latest version is `1.2.3`
68+
The latest version is `1.3.0`
6869

6970
maven import in your project
7071
```

README_zh.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77

88
新建空间索引
99
~~~java
10-
RTreeIndex rTreeIndex = RTreeIndexManager.createIndex(db, "index1", "geometry", 64);
10+
//5个参数依次是: neo4j的GraphDatabaseService实例 索引名(唯一) 空间属性名 rtree最大子节点数 最大缓存geometry对象数
11+
RTreeIndex rTreeIndex = RTreeIndexManager.createIndex(db, "index1", "geometry", 64, 1024);
1112
~~~
1213

1314

@@ -64,7 +65,7 @@ try (Transaction tx = db.beginTx()) {
6465

6566

6667
## install
67-
The latest version is `1.2.3`
68+
The latest version is `1.3.0`
6869

6970
maven import in your project
7071
```

pom.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
</properties>
1313
<groupId>org.wowtools</groupId>
1414
<artifactId>neo4j-rtree</artifactId>
15-
<version>1.2.3</version>
15+
<version>1.3.0</version>
1616
<name>neo4j-rtree</name>
1717

1818
<description>a spatial index for neo4j 4.x.</description>
@@ -61,7 +61,6 @@
6161
<groupId>org.wowtools</groupId>
6262
<artifactId>catframe-common</artifactId>
6363
<version>1.5</version>
64-
<scope>test</scope>
6564
</dependency>
6665
<dependency>
6766
<groupId>junit</groupId>

src/main/java/org/wowtools/neo4j/rtree/RTreeIndexManager.java

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
* The ASF licenses this file to You under the Apache License, Version 2.0
66
* (the "License"); you may not use this file except in compliance with
77
* the License. You may obtain a copy of the License at
8-
*
9-
* http://www.apache.org/licenses/LICENSE-2.0
10-
*
8+
* <p>
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
* <p>
1111
* Unless required by applicable law or agreed to in writing, software
1212
* distributed under the License is distributed on an "AS IS" BASIS,
1313
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -43,34 +43,36 @@ public class RTreeIndexManager {
4343
* @param indexName 索引名(唯一)
4444
* @param geometryFieldName node中的geometry字段名
4545
* @param maxNodeReferences 每个树节点上最多挂几个节点
46+
* @param geometryCacheSize geometry缓存数量,由于对外wkb缓存转到堆内并转geometry比较耗时,故这里加了一个lru的缓存以直接获取geometry
4647
* @return RTreeIndex
4748
*/
48-
public static synchronized RTreeIndex createIndex(GraphDatabaseService database, String indexName, String geometryFieldName, int maxNodeReferences) {
49+
public static synchronized RTreeIndex createIndex(GraphDatabaseService database, String indexName, String geometryFieldName, int maxNodeReferences, int geometryCacheSize) {
4950
//判断索引名是否唯一
5051
try (Transaction tx = database.beginTx()) {
5152
tx.findNodes(Constant.RtreeLabel.ReferenceNode, Constant.RtreeProperty.indexName, indexName).forEachRemaining((node) -> {
5253
throw new RuntimeException("index name(" + indexName + ") has been taken");
5354
});
5455
}
55-
return new RTreeIndex(indexName, geometryFieldName, database, new MyEnvelopeDecoder(), maxNodeReferences, true);
56+
return new RTreeIndex(indexName, geometryFieldName, database, new MyEnvelopeDecoder(), maxNodeReferences, geometryCacheSize, true);
5657
}
5758

5859
/**
5960
* 获取索引
6061
*
61-
* @param database db
62-
* @param indexName 索引名
62+
* @param database db
63+
* @param indexName 索引名
64+
* @param geometryCacheSize geometry缓存数量,由于对外wkb缓存转到堆内并转geometry比较耗时,故这里加了一个lru的缓存以直接获取geometry,可以和构造索引时不一致
6365
* @return RTreeIndex
6466
*/
65-
public static synchronized RTreeIndex getIndex(GraphDatabaseService database, String indexName) {
67+
public static synchronized RTreeIndex getIndex(GraphDatabaseService database, String indexName, int geometryCacheSize) {
6668
try (Transaction tx = database.beginTx()) {
6769
Node rootNode = tx.findNode(Constant.RtreeLabel.ReferenceNode, Constant.RtreeProperty.indexName, indexName);
6870
if (null == rootNode) {
6971
throw new RuntimeException("index (" + indexName + ") is nonexistent");
7072
}
7173
String geometryFieldName = (String) rootNode.getProperty(Constant.RtreeProperty.geometryFieldName);
7274
int maxNodeReferences = (int) rootNode.getProperty(Constant.RtreeProperty.maxNodeReferences);
73-
return new RTreeIndex(indexName, geometryFieldName, database, new MyEnvelopeDecoder(), maxNodeReferences, false);
75+
return new RTreeIndex(indexName, geometryFieldName, database, new MyEnvelopeDecoder(), maxNodeReferences, geometryCacheSize, false);
7476
}
7577
}
7678

@@ -81,9 +83,10 @@ public static synchronized RTreeIndex getIndex(GraphDatabaseService database, St
8183
* @param indexName 索引名(唯一)
8284
* @param geometryFieldName node中的geometry字段名,若已有索引,可能会和输入值不一致
8385
* @param maxNodeReferences 每个树节点上最多挂几个节点,若已有索引,可能会和输入值不一致
86+
* @param geometryCacheSize geometry缓存数量,由于对外wkb缓存转到堆内并转geometry比较耗时,故这里加了一个lru的缓存以直接获取geometry,可以和构造索引时不一致
8487
* @return RTreeIndex
8588
*/
86-
public static synchronized RTreeIndex getOrCreateIndex(GraphDatabaseService database, String indexName, String geometryFieldName, int maxNodeReferences) {
89+
public static synchronized RTreeIndex getOrCreateIndex(GraphDatabaseService database, String indexName, String geometryFieldName, int maxNodeReferences, int geometryCacheSize) {
8790
Node rootNode;
8891
try (Transaction tx = database.beginTx()) {
8992
rootNode = tx.findNode(Constant.RtreeLabel.ReferenceNode, Constant.RtreeProperty.indexName, indexName);
@@ -93,17 +96,17 @@ public static synchronized RTreeIndex getOrCreateIndex(GraphDatabaseService data
9396
}
9497
}
9598
if (null == rootNode) {
96-
return createIndex(database, indexName, geometryFieldName, maxNodeReferences);
99+
return createIndex(database, indexName, geometryFieldName, maxNodeReferences, geometryCacheSize);
97100
} else {
98-
return new RTreeIndex(indexName, geometryFieldName, database, new MyEnvelopeDecoder(), maxNodeReferences, false);
101+
return new RTreeIndex(indexName, geometryFieldName, database, new MyEnvelopeDecoder(), maxNodeReferences, geometryCacheSize, false);
99102
}
100103

101104
}
102105

103106
/**
104107
* 删除索引
105108
*
106-
* @param database db
109+
* @param database db
107110
* @param indexName index name
108111
*/
109112
public static synchronized void dropIndex(GraphDatabaseService database, String indexName) {

src/main/java/org/wowtools/neo4j/rtree/RtreeNearestQuery.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public interface NodeFilter {
4747
public static List<DistanceResult> queryNearestN(Transaction tx, RTreeIndex rTreeIndex, double x, double y, int n, NodeFilter nodeFilter) {
4848
Node rtreeNode = rTreeIndex.getIndexRoot(tx);
4949
NearestNeighbour nn =
50-
new NearestNeighbour(nodeFilter, n, rtreeNode, x, y, rTreeIndex.getGeometryFieldName());
50+
new NearestNeighbour(nodeFilter, n, rtreeNode, x, y, rTreeIndex);
5151
return nn.find();
5252
}
5353
}

src/main/java/org/wowtools/neo4j/rtree/RtreeQuery.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -250,13 +250,7 @@ private static void traverseRtree(Transaction tx, RTreeIndex rTreeIndex, RtreeNo
250250
//若有下级对象节点,返回结果
251251
for (Relationship relationship : rtreeNode.getRelationships(Direction.OUTGOING, Constant.Relationship.RTREE_REFERENCE)) {
252252
Node objNode = relationship.getEndNode();
253-
Geometry geometry;
254-
byte[] wkb = (byte[]) objNode.getProperty(rTreeIndex.getGeometryFieldName());
255-
try {
256-
geometry = wkbReader.read(wkb);
257-
} catch (ParseException e) {
258-
throw new RuntimeException("parse wkb error", e);
259-
}
253+
Geometry geometry = rTreeIndex.getObjNodeGeometry(objNode,wkbReader);
260254
visitor.vist(objNode, geometry);
261255
}
262256
}

src/main/java/org/wowtools/neo4j/rtree/nearest/NearestNeighbour.java

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99
import org.locationtech.jts.geom.Geometry;
1010
import org.locationtech.jts.geom.GeometryFactory;
1111
import org.locationtech.jts.geom.Point;
12-
import org.locationtech.jts.io.ParseException;
1312
import org.locationtech.jts.io.WKBReader;
1413
import org.neo4j.graphdb.Direction;
1514
import org.neo4j.graphdb.Node;
1615
import org.neo4j.graphdb.Relationship;
1716
import org.wowtools.neo4j.rtree.Constant;
1817
import org.wowtools.neo4j.rtree.RtreeNearestQuery;
18+
import org.wowtools.neo4j.rtree.spatial.RTreeIndex;
1919

2020
import java.util.*;
2121

@@ -27,16 +27,16 @@ public class NearestNeighbour {
2727
private final double x;
2828
private final double y;
2929
private final Point point;
30-
private final String getGeometryFieldName;
30+
private final RTreeIndex rTreeIndex;
3131
private final WKBReader wkbReader = new WKBReader();
3232

33-
public NearestNeighbour(RtreeNearestQuery.NodeFilter filter, int maxHits, Node root, double x, double y, String getGeometryFieldName) {
33+
public NearestNeighbour(RtreeNearestQuery.NodeFilter filter, int maxHits, Node root, double x, double y, RTreeIndex rTreeIndex) {
3434
this.filter = filter;
3535
this.maxHits = maxHits;
3636
this.root = root;
3737
this.x = x;
3838
this.y = y;
39-
this.getGeometryFieldName = getGeometryFieldName;
39+
this.rTreeIndex = rTreeIndex;
4040
point = new GeometryFactory().createPoint(new Coordinate(x, y));
4141
}
4242

@@ -64,6 +64,7 @@ public List<DistanceResult> find() {
6464

6565
/**
6666
* 访问索引上的非叶子节点
67+
*
6768
* @param node
6869
* @param drs
6970
* @param maxHits
@@ -88,6 +89,7 @@ private void nnExpandInternal(Node node,
8889

8990
/**
9091
* 访问索引上的叶子节点
92+
*
9193
* @param node
9294
* @param filter
9395
* @param drs
@@ -100,14 +102,8 @@ private void nnExpandLeaf(
100102
int maxHits) {
101103
for (Relationship relationship : node.getRelationships(Direction.OUTGOING, Constant.Relationship.RTREE_REFERENCE)) {
102104
Node objNode = relationship.getEndNode();
103-
Geometry geometry;
104-
byte[] wkb = (byte[]) objNode.getProperty(getGeometryFieldName);
105-
try {
106-
geometry = wkbReader.read(wkb);
107-
} catch (ParseException e) {
108-
throw new RuntimeException("parse wkb error", e);
109-
}
110-
if (filter.accept(objNode,geometry)) {
105+
Geometry geometry = rTreeIndex.getObjNodeGeometry(objNode, wkbReader);
106+
if (filter.accept(objNode, geometry)) {
111107
double dist = geometry.distance(point);
112108
int n = drs.size();
113109
if (n < maxHits || dist < drs.get(n - 1).getDist()) {

0 commit comments

Comments
 (0)