当前位置: 首页 > 知识库问答 >
问题:

Neo4j SDN 4节点自动索引

蒋俊人
2023-03-14

我正在从SDN3迁移到SDN4,从NEO4J2.3迁移到3.0。1.

我有以下搜索密码查询:

@Query(value = "START d=node:node_auto_index({autoIndexQuery}) MATCH (d:Decision) RETURN d")
Page<Decision> searchDecisions(@Param("autoIndexQuery") String autoIndexQuery, Pageable page);

在我的测试中,ParamautoIndexQuery等于以下Lucene查询:

(name:rdbma~0.33)^3 OR description:rdbma OR (name:mosyl~0.33)^3 OR description:mosyl

就是现在

decisionRepository.searchDecisions(autoIndexQuery, new PageRequest(page, size));

返回null

但在SDN 3和Neo4j 2.3上运行良好,并返回决策节点。

这是我的Neo4jTestConfig:

@Configuration
@EnableNeo4jRepositories(basePackages = "com.example")
@EnableTransactionManagement
public class Neo4jTestConfig extends Neo4jConfiguration implements BeanFactoryAware {

    private static final String NEO4J_EMBEDDED_DATABASE_PATH_PROPERTY = "neo4j.embedded.database.path";

    @Resource
    private Environment environment;

    private BeanFactory beanFactory;

    @SuppressWarnings("deprecation")
    @Bean(destroyMethod = "shutdown")
    public GraphDatabaseService graphDatabaseService() {

        // @formatter:off
        GraphDatabaseService graphDb = new GraphDatabaseFactory()
                .newEmbeddedDatabaseBuilder(new File(environment.getProperty(NEO4J_EMBEDDED_DATABASE_PATH_PROPERTY)))       
                .setConfig(GraphDatabaseSettings.node_keys_indexable, "name,description")
                .setConfig(GraphDatabaseSettings.node_auto_indexing, "true").
                newGraphDatabase();         
        // @formatter:on

        return graphDb;
    }

    /**
     * Hook into the application lifecycle and register listeners that perform
     * behaviour across types of entities during this life cycle
     * 
     */
    @EventListener
    public void handleBeforeSaveEvent(BeforeSaveEvent event) {
        Object entity = event.getEntity();
        if (entity instanceof BaseEntity) {
            BaseEntity baseEntity = (BaseEntity) entity;
            if (baseEntity.getCreateDate() == null) {
                baseEntity.setCreateDate(new Date());
            } else {
                baseEntity.setUpdateDate(new Date());
            }
        }
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    public BeanFactory getBeanFactory() {
        return beanFactory;
    }

    @Bean
    public org.neo4j.ogm.config.Configuration getConfiguration() {
        // @formatter:off
        org.neo4j.ogm.config.Configuration config = new org.neo4j.ogm.config.Configuration();
        config.driverConfiguration()
            .setDriverClassName("org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver");
        // @formatter:on
        return config;
    }

    @Override
    public SessionFactory getSessionFactory() {
        return new SessionFactory(getConfiguration(), "com.example");
    }

}

我的配置可能有什么问题?如何使其在SDN 4上工作?

更新

此外,我发现以下答案无法使用InProcessServer()SDN 4配置节点自动索引,但在我的类路径中找不到ServerControls和TestServerBuilders。

这是我的数据库索引配置:

@Transactional
public class SearchDaoImpl implements SearchDao {

    @Autowired
    private DecisionRepository decisionRepository;

    @PostConstruct
    public void init() {
        EmbeddedDriver embeddedDriver = (EmbeddedDriver) Components.driver();
        GraphDatabaseService databaseService = embeddedDriver.getGraphDatabaseService();
        try (Transaction t = databaseService.beginTx()) {
            Index<Node> autoIndex = databaseService.index().forNodes("node_auto_index");
            databaseService.index().setConfiguration(autoIndex, "type", "fulltext");
            databaseService.index().setConfiguration(autoIndex, "to_lower_case", "true");
            databaseService.index().setConfiguration(autoIndex, "analyzer", StandardAnalyzerV36.class.getName());
            t.success();
        }
    }
...
}

现在我不知道在我的代码中哪里是添加的正确位置

Components.setDriver(new EmbeddedDriver(graphDatabaseService()));

如下面的答案所示

更新2

@SuppressWarnings("deprecation")
@Bean(destroyMethod = "shutdown")
public GraphDatabaseService graphDatabaseService() {

    // @formatter:off
    GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory()
            .newEmbeddedDatabaseBuilder(new File(environment.getProperty(NEO4J_EMBEDDED_DATABASE_PATH_PROPERTY)))       
            .setConfig(GraphDatabaseSettings.node_keys_indexable, "name,description")
            .setConfig(GraphDatabaseSettings.node_auto_indexing, "true").
            newGraphDatabase();         
    // @formatter:on        

    Components.setDriver(new EmbeddedDriver(graphDatabaseService));

    return graphDatabaseService;
}

@Override
public SessionFactory getSessionFactory() {
    return new SessionFactory("com.example");
}

以下配置失败:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getSession' defined in com.techbook.domain.configuration.Neo4jTestConfig: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.neo4j.ogm.session.Session]: Factory method 'getSession' threw exception; nested exception is org.neo4j.ogm.exception.ServiceNotFoundException: Driver: null
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599)

共有1个答案

傅星光
2023-03-14

通过设置driver class name属性,EmbeddedDriver将创建GraphDatabaseService的私有实例,这不是您想要的,因为您自己正在初始化它。相反,您需要告诉Components类显式使用您提供的驱动程序:

组件。setDriver(新的嵌入式驱动程序(graphDatabaseService())

这将按照您的预期连接组件。

 类似资料:
  • 在基于UNIX的操作系统中,每个文件都由一个Inode索引。 Inode是创建文件系统时创建的特殊磁盘块。 文件系统中的文件或目录数量取决于文件系统中的Inode数量。 Inode包含以下信息 - 文件的属性(权限,时间戳,所有权详细信息等) 包含指向文件的前12个块的指针的多个直接块。 指向索引块的单个间接指针。 如果文件不能被直接块完全索引,则使用单个间接指针。 指向磁盘块的双重间接指针,该磁

  • 索引节点 在SFS文件系统中,需要记录文件内容的存储位置以及文件名与文件内容的对应关系。sfs_disk_inode记录了文件或目录的内容存储的索引信息,该数据结构在硬盘里储存,需要时读入内存。sfs_disk_entry表示一个目录中的一个文件或目录,包含该项所对应inode的位置和文件名,同样也在硬盘里储存,需要时读入内存。 磁盘索引节点 SFS中的磁盘索引节点代表了一个实际位于磁盘上的文件。

  • neo4j旧索引和自动索引与新标签基模式索引以及旧索引自动索引和新索引方法之间的差异部分回答了这个问题 我还不能评论他们,在这里写一个新的帖子。在我的数据库中,我有一个遗留索引“topic”和标签“topic”。 我知道: 模式匹配(n: Label)将扫描节点; b.模式START(n: Index)将搜索遗留索引 c.自动索引是一种遗留索引,应该给我与(b)相同的结果,但在我的情况下没有 d.

  • 本文向大家介绍详解Linux索引节点inode,包括了详解Linux索引节点inode的使用技巧和注意事项,需要的朋友参考一下 1.inode简介 理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块

  • 在Windows AWS服务器上,我有一个节点应用程序,我正在使用PM2启动该应用程序 我已经尝试了npms:“pm2-windows-startup”和“pm2-windows-service” 但是在我重新启动AWS实例并运行 列表中没有节点应用程序。.. null 我的PM2文件包含: 2017-03-13 07:37:48:=================================

  • 我有JSON节点,有数据,但没有位置。我想自动创建基于边缘和父json的图形,而不给出位置。它做到了这一点,但所有节点都在彼此的顶部。 https://stackblitz.com/edit/angular-kpnys1?file=src%2fapp%2fdemo_test.json