Alternative IndexProvider für Neo4J 1.9.1

8

Ich verwende Lucene 4 in meiner Anwendung und möchte das nicht ändern. Ich versuche, Neo4J zu integrieren, das Lucene 3.5 als eine IndexProvider-Implementierung, neo4j-lucene-Index, bündelt.

Leider funktioniert der neo4j-lucene-index nicht, und mit dieser ausgeschlossenen Abhängigkeit hängt die App beim Start einfach auf unbestimmte Zeit. Ich habe versucht, neo4j-lucene4-Index, aber das scheint nicht sehr gut gepflegt werden und muss erheblich aktualisiert werden, um mit Neo4J 1.9.1 zu arbeiten. Die Änderungen gehen weit über mein Verständnis der Interna von Neo4J hinaus.

Allerdings kann ich sehen, dass IndexProvider steckbar sind, also hoffe ich, dass es eine Alternative zu Lucene gibt - ich kann sie im Moment nicht finden. Kann mir jemand in die richtige Richtung zeigen?

Es scheint seltsam, dass Lucene 4 schon so lange nicht mehr existiert und Neo4J es nicht unterstützt. Fehle ich etwas?

Momentan sieht mein POM für meine Neo4J-Konfiguration so aus:

%Vor%     
Mick Sear 04.07.2013, 12:08
quelle

3 Antworten

1

Es gab einige interne Änderungen von 1.8 - & gt; 1.9. Kurz gesagt, ein Indexanbieter muss eine KernelExtensionFactory über META-INF / services registrieren, siehe Ссылка

Diese KernelExtensionFactory ist der Einstiegspunkt. Überprüfe einfach die Lucene 3-basierte Implementierung in Ссылка .

    
Stefan Armbruster 04.07.2013 14:21
quelle
1

Vor einiger Zeit wurde ich auch mit diesem Problem konfrontiert: Ich arbeitete am Prototyping, und ich mochte den eingebetteten Modus von Neo4j sehr. Aber nachdem ich mich dazu entschlossen habe, Lucene 4 zu verwenden, bin ich auf Inkompatibilität gestoßen.

OSGi

Wie hier vorgeschlagen: How to benutze zwei Versionen von jar in meinem Java-Projekt - eine der möglichen Lösungen ist es, OSGi zu verwenden und es zu umbrechen Neo4j und Lucene 4 in verschiedene Bündel. Jedes Bundle wird einen separaten Classloader haben - also wird Neo4j in Runtime-Klassen von Lucene 3 verwendet, aber Sie können immer noch Lucene 4 für Ihre Zwecke verwenden.

Aber soweit ich am Prototyping gearbeitet habe - ich wollte keine Zeit für die Anpassung meines Projekts für die OSGi-Plattform allein wegen der Inkompatibilität zweier Komponenten aufwenden.

Maven-Schatten-Plugin

Also, ich habe das Problem mit Hilfe von Maven Shade Plugin gelöst.

Das Maven Shade Plugin bietet die Möglichkeit, alle Abhängigkeiten in einzelne "fette" JARs (auch "über JAR" genannt) zusammenzuführen.

Sie können also "Uber Neo4j-Abhängigkeit" generieren und in Ihrem Projekt verwenden - anstelle von "echter" Neo4j-Abhängigkeit.

Aber es gibt noch einen weiteren wichtigen Moment: Lucene 3 und Lucene 4 haben dieselbe Paketstruktur, und viele Klassen haben immer noch dieselben Namen. Dies kann zu Konflikten zwischen Klassen führen.

Um dieses Problem anzugehen, bietet Maven Shade Plugin die Möglichkeit, Klassen während der Erzeugung von "über JAR" zu verschieben: Ссылка

Sie können den Paketnamen angeben und während des Paketierens - Das Schatten-Plugin verschiebt die Klassen vom angegebenen Paket und seinen Unterpaketen in ein anderes Paket und schreibt den betroffenen Bytecode um.

Also, während der Erstellung von "über JAR" für Neo4j - können Sie Shade Plugin konfigurieren, um Klassen von Lucene 3 in ein anderes Paket zu verschieben, z. B .:

org.apache.lucene.* -> shaded_3_6_2.org.apache.lucene.*

(Zum Glück scheint es, dass Neo4j keine Reflexion verwendet, in Anwendung auf Lucene-Sachen).

Sie können also ein leeres Maven-Projekt mit folgendem pom.xml erstellen:

%Vor%

Beschriebene Konfiguration - bietet die Möglichkeit, "über JAR" für Neo4j mit umbenannten Paketen von Lucene 3 zu generieren (tun Sie einfach mvn install ).

Und schließlich können Sie dieses Zeug als Modul an Ihr Maven-Projekt anhängen.

Nach dieser Problemumgehung können Sie also sowohl: Neo4j als auch Lucene 4 in Ihrem Projekt verwenden.

Nur für den Fall, hier ist Link zum GitHub-Repository mit Maven-Konfiguration für die Erzeugung von "Uber JAR" für Neo4j: Ссылка

    
stemm 13.12.2014 21:30
quelle
0

Wenn es Ihnen egal ist, welchen Index Neo4j verwendet und Sie Maven verwenden, um Abhängigkeiten zu verwalten, können Sie Das Maven Shade-Plug-in für die Klassenverschiebung , um die Lucene-Abhängigkeit von Neo4j umzubenennen, damit es nicht mit anderen Abhängigkeiten zu neueren Versionen von Lucene kollidiert.

In meinem Fall erforderte das Verschieben von Neo4j-abhängigem Code in ein separates Maven-Projekt, da Shade auf ein ganzes Projekt / jar gleichzeitig wirkt. Wenn Sie also Ihre widersprüchlichen Lucene-Abhängigkeiten in verschiedenen Projekten finden, sollte das großartig funktionieren.

    
Austin 10.12.2014 22:52
quelle

Tags und Links