2

私はまた、GIS データベースとしてエクスポートしたい Neo4J 上の Grails アプリに取り組んでいます。

GeoServer/uDig で neo4j を使用する方法の例を見ると、空間統合は組み込みの neo4j データベースを介してのみ行われているようです。

私のNeo4JをREST経由で利用できるようにセットアップして、さまざまな場所からNeo4Jにインターフェースできるようにすることが可能かどうかを知っている人はいますか?

一見、それが可能であるように見えます:

// Works with this embedded database
//def graphDb = new GraphDatabaseFactory().newEmbeddedDatabase("/tmp/foo.db");

// Doesn't work with this REST database
graphDb = new RestGraphDatabase("http://localhost:7474/db/data");

Transaction tx = graphDb.beginTx()

SpatialDatabaseService spatialService = new SpatialDatabaseService(graphDb)
SimplePointLayer layer = spatialService.createSimplePointLayer("points")

組み込みデータベースを使用すると、空間インデックスが適切に作成されます。ただし、REST データベースでは、null ポインターを取得するだけです。

Caused by NullPointerException: null
->>  149 | createCompiler in org.neo4j.cypher.ExecutionEngine
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|     48 | <init>    in     ''
|     59 | createInnerEngine in org.neo4j.cypher.javacompat.ExecutionEngine
|     43 | <init>    in     ''
|     41 | getReferenceNode in org.neo4j.gis.spatial.utilities.ReferenceNodes
|     78 | getSpatialRoot in org.neo4j.gis.spatial.SpatialDatabaseService
|    114 | getLayer  in     ''
|    259 | containsLayer in     ''
|    303 | createLayer in     ''
|    287 | createSimplePointLayer in     ''
|    267 | createSimplePointLayer in     ''
|     37 | <init>    in net.foo.db.neo4j.Neo4JService

SpatialDatabaseService は GraphDatabaseService を使用するため、REST で動作しない理由について混乱しています。

これはバグですか、それとも機能ですか (それとも私の誤解ですか?)

もちろん、create indexAPI を使用して空間インデックスを作成することもできます。

graphDb.index().forNodes( "points", ["provider": "spatial", "geometry_type": "point", "lat": "lat", "lon":"lon"])

それは機能しますが、そのように新しいレイヤーを作成することはできません。

4

2 に答える 2

1

RestGraphDatabase は、すべての機能を提供しない偽のデータベースです。理論的には機能させることができますが、おそらく埋め込まれた各操作が http 要求としてネットワーク経由で送信されるため、非常に無駄になります。

Spatial をプラグインとしてサーバーにインストールし、プラグイン REST メソッドを介してアクセスします。

参照: http://neo4j-contrib.github.io/spatial/#spatial-server-plugin

于 2014-10-30T02:54:39.823 に答える
0

この Grail アプリなどで何をしているのかはよくわかりませんが、例外の外観から、次のようなことをしようとしているようです:

ExecutionEngine executionEngine = new ExecutionEngine(graphDatabaseService);

ここで、ExecutionEngine は cypher.javacompat からのもので、GraphDatabaseService は RestGraphDatabase を指しています。

ExecutionEngine は、埋め込み型のデータベースからのみ取得できる内部カーネル API に基づいて構築されています。

RestGraphDatabase で Cypher クエリを実行するには、その RestAPI を getRestAPI から取得し、そのクエリ メソッドを使用する必要があります。

この Google グループの投稿では、これについて説明しています: https://groups.google.com/forum/#!topic/neo4j/Q6lsOakSgyA

以下は、RestGraphDatabase を使用してクエリを作成および実行する、私が作成したサンプル プログラムです。お役に立てれば。

package rash.experiments.neo4j;

import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.RelationshipType;
import org.neo4j.graphdb.Transaction;
import org.neo4j.rest.graphdb.RestGraphDatabase;
import org.neo4j.rest.graphdb.query.RestCypherQueryEngine;
import org.neo4j.rest.graphdb.util.QueryResult;

public class Neo4JRestTest
{
    private static enum RelType implements RelationshipType
    {
        KNOWS
    }

    public static void main(String args[])
    {
        RestGraphDatabase graphDatabaseService = new RestGraphDatabase("http://10.20.230.12:7474/db/data/");
        RestCypherQueryEngine executionEngine = new RestCypherQueryEngine(graphDatabaseService.getRestAPI());

        try(Transaction transaction = graphDatabaseService.beginTx())
        {
            Node rash = graphDatabaseService.createNode();
            rash.setProperty("userId", 4);
            rash.setProperty("username", "rash");
            rash.setProperty("name", "Rahul Chaudhary");

            Node honey = graphDatabaseService.createNode();
            honey.setProperty("userId", 5);
            honey.setProperty("username", "honey");
            honey.setProperty("name", "Honey Anant");

            Relationship knowsRelationship = rash.createRelationshipTo(honey, RelType.KNOWS);
            knowsRelationship.setProperty("since", 2011);

            transaction.success();
        }

        try(Transaction transaction = graphDatabaseService.beginTx())
        {
            QueryResult<Map<String,Object>> executionResult = executionEngine.query("match (node) return node", null);
            Iterator<Map<String, Object>> resourceIterator = executionResult.iterator();

            while(resourceIterator.hasNext())
            {
                Set<Entry<String, Object>> map = resourceIterator.next().entrySet();
                for(Entry<String, Object> entry : map)
                {
                    Node node = (Node) entry.getValue();
                    System.out.println("UserId: " + node.getProperty("userId"));
                    System.out.println("Username: " + node.getProperty("username"));
                    System.out.println();
                }

                System.out.println("--------------------------\n");
            }

            transaction.success();
        }
    }
}
于 2015-02-25T22:09:29.563 に答える