我一直在努力为我的项目使用Neo4j Spatial,但我无法让它工作。
由于文档和示例有限,我想出了如何将OSM映射加载到数据库。但要检查它是否已加载,我正在尝试执行空间查询。
尝试运行我的代码时出现此错误:
import.java:69: error: cannot access GremlinGroovyPipeline
.startIntersectSearch(layer, bbox)
^
class file for com.tinkerpop.gremlin.groovy.GremlinGroovyPipeline not found
我明白什么是错的(它找不到所需的库),但我不知道如何修复它。原因是当我运行Neo4j Spatial测试时,LayerTest.java和TestSpatial.java确实包含了GeoPipeline库,它的工作原理非常好。但是,当我创建我的简单java文件来测试Neo4j,并尝试执行依赖GeoPipeline库的命令时,我得到上面的错误。
我在github上阅读了关于Neo4j的说明并看到了这个说明:
注意:neo4j-spatial具有强制依赖性 来自com.tinkerpop.gremlin.groovy包的GremlinGroovyPipeline。 neo4j中的依赖是“提供”类型,因此在使用时 在您自己的Java项目中使用neo4j-spatial,请确保添加以下内容 依赖于你的pom.xml。
但是,我没有使用Maven来构建我的应用程序。这是一个简单的java文件,我想运行它来测试我是否知道一切是如何工作的。
这是我的java文件中的代码:
package org.neo4j.gis.spatial;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.geotools.data.DataStore;
import org.geotools.data.neo4j.Neo4jSpatialDataStore;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.neo4j.gis.spatial.osm.OSMDataset;
import org.neo4j.gis.spatial.osm.OSMDataset.Way;
import org.neo4j.gis.spatial.osm.OSMGeometryEncoder;
import org.neo4j.gis.spatial.osm.OSMImporter;
import org.neo4j.gis.spatial.osm.OSMLayer;
import org.neo4j.gis.spatial.osm.OSMRelation;
import org.neo4j.gis.spatial.pipes.osm.OSMGeoPipeline;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import org.neo4j.kernel.impl.batchinsert.BatchInserter;
import org.neo4j.kernel.impl.batchinsert.BatchInserterImpl;
import org.neo4j.kernel.EmbeddedGraphDatabase;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.gis.spatial.pipes.GeoPipeline;
class SpatialOsmImport {
public static void main(String[] args)
{
OSMImporter importer = new OSMImporter("ott.osm");
Map<String, String> config = new HashMap<String, String>();
config.put("neostore.nodestore.db.mapped_memory", "90M" );
config.put("dump_configuration", "true");
config.put("use_memory_mapped_buffers", "true");
BatchInserter batchInserter = new BatchInserterImpl("target/dependency", config);
importer.setCharset(Charset.forName("UTF-8"));
try{
importer.importFile(batchInserter, "ott.osm", false);
batchInserter.shutdown();
GraphDatabaseService db = new EmbeddedGraphDatabase("target/dependency");
importer.reIndex(db, 10000);
db.shutdown();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
GraphDatabaseService database = new EmbeddedGraphDatabase("target/dependency");
try{
SpatialDatabaseService spatialService = new SpatialDatabaseService(database);
Layer layer = spatialService.getLayer("layer_roads");
LayerIndexReader spatialIndex = layer.getIndex();
System.out.println("Have " + spatialIndex.count() + " geometries in " + spatialIndex.getBoundingBox());
Envelope bbox = new Envelope(-75.80, 45.19, -75.7, 45.23);
// Search searchQuery = new SearchIntersectWindow(bbox);
// spatialIndex.executeSearch(searchQuery);
// List<SpatialDatabaseRecord> results = searchQuery.getResults();
List<SpatialDatabaseRecord> results = GeoPipeline
.startIntersectSearch(layer, bbox)
.toSpatialDatabaseRecordList();
doGeometryTestsOnResults(bbox, results);
} finally {
database.shutdown();
}
}
private static void doGeometryTestsOnResults(Envelope bbox, List<SpatialDatabaseRecord> results) {
System.out.println("Found " + results.size() + " geometries in " + bbox);
Geometry geometry = results.get(0).getGeometry();
System.out.println("First geometry is " + geometry);
geometry.buffer(2);
}
}
现在非常简单,但我不能让它发挥作用。如何在我的应用程序中包含com.tinkerpop.gremlin.groovy.GremlinGroovyPipeline,这样可行吗?
我在Ubuntu 12.04和java版本“1.7.0_25”,Java(TM)SE运行时环境(版本1.7.0_25-b15)上运行所有内容。
非常感谢任何帮助。
答案 0 :(得分:0)
在可以将其包含在类路径中的位置获取所有必需依赖项的最佳方法是运行
mvn dependency:copy-dependencies
在neo4j-spatial中,找到要包含在target / deps中的库,请参阅http://maven.apache.org/plugins/maven-dependency-plugin/usage.html