替代IndexProvider for Neo4J 1.9.1

时间:2013-07-04 12:08:51

标签: lucene neo4j

我在我的应用程序中使用Lucene 4并且不想改变它。我试图整合Neo4J,它将Lucene 3.5捆绑为一个IndexProvider实现,neo4j-lucene-index。

不幸的是,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>

3 个答案:

答案 0 :(得分:1)

1.8内部发生了一些变化 - > 1.9。简而言之,索引提供者必须通过META-INF / services注册KernelExtensionFactory,参见https://github.com/neo4j/neo4j/blob/master/community/lucene-index/src/main/resources/META-INF/services/org.neo4j.kernel.extension.KernelExtensionFactory

这个KernelExtensionFactory是入口点,只需检查基于Lucene 3的实现https://github.com/neo4j/neo4j/tree/master/community/lucene-index

答案 1 :(得分:1)

前段时间,我也遇到过这个问题:我正在进行原型设计,我真的很喜欢Neo4j的嵌入式模式。但是,一旦我决定使用Lucene 4 - 我就遇到了不兼容问题。

<强>的OSGi

正如这里建议的那样:How to use two versions of jar in my java project - 可能的解决方案之一是使用OSGi,并将Neo4j和Lucene 4包装到不同的包中。每个bundle都有单独的类加载器 - 所以Neo4j将在Lucene 3的运行时类中使用,但你仍然可以使用Lucene 4来实现你的目的。

但是,就我原型设计工作而言 - 由于两个组件不兼容的唯一原因,我不想花时间调整我的OSGi平台项目。

Maven Shade插件

所以,我在Maven Shade Plugin的帮助下解决了问题。

Maven Shade插件提供了将所有依赖项合并为单个&#34; fat&#34; JAR(也称为&#34; uber JAR&#34;)。

因此,您可以生成&#34; uber Neo4j依赖&#34;,并在您的项目中使用它 - 而不是&#34;真实&#34; Neo4j依赖。

但还有一个重要时刻:Lucene 3和Lucene 4具有相同的包结构,并且许多类仍具有相同的名称。因此,这可能会导致类加载冲突。

为了解决这个问题,Maven Shade插件提供了在生成&#34; uber JAR&#34;:http://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html

期间重新定位类的功能。

您可以指定包名称,并且在打包期间 - Shade插件会将类从指定包及其子包移动到其他包中,并将重写受影响的字节码

所以,在编写&#34; uber JAR&#34;对于Neo4j - 您可以配置Shade Plugin将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>

描述的配置 - 提供生成&#34; uber JAR&#34;对于Neo4j,重命名的Lucene 3包(只做mvn install)。

最后,您可以将这些内容作为模块附加到您的maven项目中。

因此,在此解决方法之后 - 您将能够在项目中使用Neo4j和Lucene 4。

以防万一,这里链接到带有maven配置的GitHub存储库,用于生成&#34; uber JAR&#34;对于Neo4j:https://github.com/lagodiuk/neo4j-uber-jar

答案 2 :(得分:0)

如果您不关心Neo4j使用的索引,并且您正在使用Maven来管理依赖关系,则可以使用the Maven Shade plugin's class relocation feature重命名Neo4j的Lucene依赖关系,以便它不会使用#39 ; t与新版Lucene的其他依赖项冲突。

在我的情况下,这需要将依赖于Neo4j的代码移动到单独的Maven项目中,因为Shade会立即对整个项目/ jar进行操作。因此,如果您可以将冲突的Lucene依赖项放入不同的项目中,那么这应该很有用。