Die Cypher-Abfrage von Neo4j Spatial 'Withindistance' wird leer zurückgegeben, während der REST-Aufruf Daten zurückgibt

8

Ich habe scheinbar eine korrekt konfigurierte räumliche Ebene und einen Index und kann einen Knoten erfolgreich mit dem findGeometriesWithinDistance-REST-API-Aufruf abfragen.

%Vor%

Jedoch, wenn ich mit Chiffre abfrage, bekomme ich keine Ergebnisse (Ich habe versucht, die Reihenfolge von 60.0 und 15.0 ohne Glück umzukehren):

%Vor%

Cyper kehrt zurück:

%Vor%

REST:

%Vor%

REST Aufrufe zum Reproduzieren: Ebene erstellen:

%Vor%

Index erstellen:

%Vor%

Knoten erstellen:

%Vor%

(Untersuchen Sie "self" und finden Sie nodeid)

Indexieren Sie den Knoten:

%Vor%

Finde:

%Vor%     
Troy Busot 31.07.2013, 09:34
quelle

2 Antworten

6

Ich habe das untersucht und es hängt mit einem Problem zusammen, das wir einige Male gesehen haben. Es gibt eine Inkonsistenz im Entwurf der räumlichen Bibliothek, da es zwei Möglichkeiten gibt, einen Knoten zum räumlichen Index hinzuzufügen. Die eine besteht darin, sie dem Layer hinzuzufügen (unter Verwendung des RND-Aufrufs addNodeToLayer), und dabei wird die zugrunde liegende Java-API verwendet, die den Knoten als Teil desselben Diagramms direkt mit dem RTree verbindet. Die andere Möglichkeit besteht darin, im Indexdiagramm einen Proxy-Knoten zu erstellen, sodass das Domänendiagramm nicht mit dem Indexdiagramm verbunden ist. Dieser zweite Ansatz wird nur von der IndexProvider-Schnittstelle verwendet (mit dem REST-Aufruf / db / data / index / node / geom).

Wenn Sie beide Methoden aufrufen, wird der Knoten zweimal hinzugefügt, einmal direkt und einmal per Proxy. Das Problem besteht darin, dass die Cypher-withDistance-Indexabfrage nur auf die IndexProvider-Schnittstelle zugreift und nur Knoten zurückgibt, die NICHT ebenfalls mit dem Index verbunden sind. Wenn Sie also den Knoten auf beide Arten hinzufügen, wird er nicht zurückgegeben.

Sie müssen also nur eine der beiden Möglichkeiten hinzufügen. Ich habe in Ihrer ursprünglichen E-Mail keine Erwähnung von addNodeToLayer gesehen, daher vermute ich, dass SDN möglicherweise addNodeToLayer aufruft (vielleicht kann Michael einen Kommentar abgeben). In diesem Fall können Sie den Anruf nicht verwenden.

Während meiner Tests konnte ich die Indexbeziehung mit Cypher folgendermaßen entfernen:

START n = Knoten (13065) MATCH (n) & lt; - [r: RTREE_REFERENCE] - () DELETE r

Ersetzen Sie die Nummer 13065 durch Ihre Knoten-ID für den ursprünglichen Knoten.

Ich habe folgendes im neo4j-Browser (in 2.1.2) gemacht:

%Vor%

Dies hat ein Diagramm erstellt, bei dem der Knoten nicht direkt mit dem Index verbunden ist. In diesem Fall funktioniert der REST-Aufruf 'findGeometriesWithinDistance' nicht (verwendet die Standard-Java-API), während die Chiffre 'inDistance' funktioniert. Ich habe mit diesem Befehl getestet:

%Vor%

Beachten Sie, dass diese API leider die Reihenfolge lat, lon anstelle des Standard-lon, lat. verwendet.

Dann habe ich auch der Ebene hinzugefügt (dh direkt zum Indexdiagramm hinzugefügt):

%Vor%

Wenn ich jetzt mit dem Chiffrierbefehl suche, bekomme ich immer noch die gleiche richtige Antwort, aber wenn ich mit dem REST-Befehl suche:

%Vor%

Ich finde, dass dies den Proxy-Knoten anstelle des ursprünglichen Knotens zurückgibt.

    
Craig Taverner 22.08.2014 11:57
quelle
3

Dies ist ein Fehler, siehe Ссылка wenn Sie wollen, fühlen Sie sich frei zu untersuchen, scheint die Iteration zu sein in SpatialRecordHits.java!

Stellen Sie in der Zwischenzeit sicher, dass Sie den Knoten zum Index hinzufügen, bevor Sie ihn über den Index abfragen, da dies die richtige Knotenstruktur erzeugt.

    
Peter Neubauer 31.07.2013 16:08
quelle

Tags und Links