2013-07-04 13 views
8

私は自分のアプリケーションでLucene 4を使用しており、これを変更したくありません。私は、Neo4Jを、IndexProvider実装のneo4j-lucene-indexとしてLucene 3.5をバンドルするように統合しようとしています。他のIndexProvider for Neo4J 1.9.1

残念ながら、neo4j-lucene-indexは機能しません。その依存関係を除いて、起動時に無期限にハングアップします。私はneo4j-lucene4-indexを試しましたが、それは非常にうまく維持されないようで、Neo4J 1.9.1で作業するためにはかなり更新する必要があります。この変更は、Neo4Jの内部についての私の理解を超えたものになります。

しかし、私はIndexProvidersがプラガブルであることがわかります。だから私はLuceneの既存の代替があることを望んでいます - 私は現時点でそれを見つけることができません。誰かが私を正しい方向に向けることができますか?

Lucene 4がこれほど長い間外出していて、Neo4Jがそれをサポートしていないのは奇妙なことです。何か不足していますか?

は現在、私のPOMは私のNeo4jの設定のために次のようになります。

<dependency> 
    <groupId>org.springframework.data</groupId> 
    <artifactId>spring-data-neo4j</artifactId> 
    <version>2.2.1.RELEASE</version> 
    <exclusions> 
     <exclusion> 
     <artifactId>neo4j</artifactId> 
     <groupId>org.neo4j</groupId> 
     </exclusion> 
     <exclusion> 
     <artifactId>neo4j-cypher</artifactId> 
     <groupId>org.neo4j</groupId> 
     </exclusion> 
    </exclusions> 
</dependency> 
<dependency> 
    <groupId>org.neo4j</groupId> 
    <artifactId>neo4j-kernel</artifactId> 
    <version>1.9.1</version> 
    <exclusion> 
     <groupId>org.neo4j</groupId> 
     <artifactId>neo4j-lucene-index</artifactId> 
    </exclusion> 
</dependency> 

<dependency> 
    <groupId>org.neo4j.app</groupId> 
    <artifactId>neo4j-server</artifactId> 
    <version>1.9.1</version> 
    <exclusions> 
     <exclusion> 
     <artifactId>neo4j</artifactId> 
     <groupId>org.neo4j</groupId> 
     </exclusion> 
     <exclusion> 
     <artifactId>neo4j-cypher</artifactId> 
     <groupId>org.neo4j</groupId> 
     </exclusion> 
     <exclusion> 
     <groupId>org.neo4j</groupId> 
     <artifactId>neo4j-lucene-index</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

    <!-- A temporary dependency until Neo4J builds in support for Lucene 4. 
    Looks like they're planning to incorporate this project anyway This project 
    is available on GitHub, and needs to be built with: mvn license:format mvn 
    install to install into your local repo. 
     <dependency> 
      <groupId>com.keatext</groupId> 
      <artifactId>neo4j-lucene4-index</artifactId> 
      <version>1.9.M01-SNAPSHOT</version> 
     </dependency>--> 

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>5.0.1.Final</version> 
</dependency> 
+1

我々はいくつかのテストを行なったし、Lucene4が3.6よりも私たちのユースケースのためにはるかに遅いれたことが、なぜそれがです:

念のため、ここでのNeo4jのための「ユーバーJAR」を生成するためのMavenの構成でGitHubのリポジトリへのリンクです優先順位付けされていません。 –

+0

おかげでマイケル、面白いです。私の使用事例では、関連するデータの周りを走査するために、既存のMongoDBデータと組み合わせたいと思う。私たちは現時点でLucene 4を使用していますが、おそらく私の内部検索要件のために3.6へのダウングレードの影響を検討すべきです。私は比較の前後に適用できるいくつかのパフォーマンステストスクリプトを持っています –

答えて

1

が1.8から内部的にいくつかの変更がありました - > 1.9。要するに、インデックス・プロバイダーは、META-INF /サービス経由でKernelExtensionFactoryを登録する必要があり、https://github.com/neo4j/neo4j/blob/master/community/lucene-index/src/main/resources/META-INF/services/org.neo4j.kernel.extension.KernelExtensionFactory

を参照してください。このKernelExtensionFactoryはちょうどhttps://github.com/neo4j/neo4j/tree/master/community/lucene-indexでLuceneの3ベースの実装をチェックアウト、エントリポイントです。

+0

私は組み込みのデフォルトの実装がないことに驚いています。リンクありがとう、私はそれらをチェックします。私たちのアプリケーションの概念を証明するために、今のところ信じられないほどシンプルなものがほしいだけです。 –

+0

Neo4jはインデックス作成を実装の詳細として扱い、Lucene4のみの機能に依存しません。 –

0

Mavenを使用して依存関係を管理する場合、Neo4jのLucene依存関係の名前を変更してLuceneの新しいバージョンの他の依存関係と競合しないように、the Maven Shade plugin's class relocation featureを使用できます。

私の場合、Shadeはプロジェクト/ jar全体に対して一度に作用するため、Neo4j依存コードを別のMavenプロジェクトに移動する必要がありました。だから、矛盾するLuceneの依存関係をさまざまなプロジェクトに組み込むことができれば、これはうまくいくはずです。

1

私はプロトタイプ作成に取り組んでいましたが、Neo4jの組み込みモードが本当に好きでした。しかし、いったんLucene 4を使用することに決めたら、私は非互換性の問題に遭遇しました。

のOSGi

ここで示唆されたよう:How to use two versions of jar in my java project - 可能な解決策の一つがOSGiを使用し、異なる束にのNeo4jとLuceneの4をラップすることです。各バンドルには別々のクラスローダーがあるので、Neo4jはLucene 3のランタイムクラスで使用しますが、Lucene 4を使用することはできます。

しかし、私が試作していた限り、2つのコンポーネントの非互換性の理由の1つでOSGiプラットフォームのための私のプロジェクトの適応に時間を費やしたくなかった。

Mavenのシェードプラグイン

だから、私はMaven Shade Pluginの助けを借りて問題を解決しました。

Maven Shade Pluginは、すべての依存関係を1つの "fat" JAR(「uber JAR」とも呼ばれます)にマージする機能を提供します。

したがって、 "本当の" Neo4j依存関係ではなく、 "uber Neo4j依存関係"を生成してプロジェクトで使用することができます。

しかし、さらに重要な瞬間があります:Lucene 3とLucene 4は同じパッケージ構造を持ち、多くのクラスは同じ名前を持っています。したがって、クラスローディングの競合が発生する可能性があります。

はこの問題に対処するために、Mavenのシェードプラグインは、「ユーバーJAR」の生成中のクラスを再配置する機能を提供します。あなたは、パッケージ名を指定することができ、およびパッケージングの間

http://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html - シェードプラグインは、指定されたからクラスを移動しますパッケージとそのサブパッケージを別のパッケージに変更し、影響を受けるバイトコードを書き換えます。

だから、のNeo4jのための「ユーバーJAR」の構成時に - あなたには、いくつかの他のパッケージにLuceneの3のクラスを移動するためにシェードプラグインを設定することができ、例えば:

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

(幸いにも、それはと思われるのNeo4j Luceneものへの応用では反射を使用しない)。

だから、あなたはpom.xmlと次のように空のMavenプロジェクトを作成することができます

<project 
    xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>my.hack</groupId> 
    <artifactId>uber-neo4j</artifactId> 
    <version>1.9.3</version> 
    <packaging>jar</packaging> 
    <name>uber-neo4j</name> 

    <properties> 
     <neo4j-version>1.9.3</neo4j-version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.neo4j</groupId> 
      <artifactId>neo4j</artifactId> 
      <version>${neo4j-version}</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-shade-plugin</artifactId> 
       <version>2.3</version> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
         <configuration> 
          <createDependencyReducedPom>false</createDependencyReducedPom> 
          <relocations> 
           <relocation> 
            <pattern>org.apache.lucene</pattern> 
            <shadedPattern>shaded_lucene_3_6_2.org.apache.lucene</shadedPattern> 
           </relocation> 
          </relocations> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

    <repositories> 
     <repository> 
      <id>neo4j-repo</id> 
      <name>Neo4j Repository</name> 
      <url>http://m2.neo4j.org/content/repositories/releases</url> 
     </repository> 
    </repositories> 
</project> 

説明した構成は - Luceneの3(ちょうどmvn installを行う)の名前を変更したパッケージとのNeo4jのための「ユーバーJAR」を生成する機能を提供します。

最後に、このものをモジュールとしてあなたのMavenプロジェクトに添付することができます。

この回避策を実行した後、プロジェクトでNeo4jとLucene 4の両方を使用することができます。 https://github.com/lagodiuk/neo4j-uber-jar

関連する問題