Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j索引和遗留数据_Neo4j_Cypher_Gremlin - Fatal编程技术网

Neo4j索引和遗留数据

Neo4j索引和遗留数据,neo4j,cypher,gremlin,Neo4j,Cypher,Gremlin,我有一个要查询的遗留数据集(表示为GraphML)。在一个相关问题中,建议我使用Cypher查询数据库。我的查询用例很简单:给定消息id(消息节点的属性),检索具有该id的节点,还检索该消息的发送方和接收方节点 似乎要在Cypher中实现这一点,我首先必须创建一个节点索引。当从graphML文件加载数据时,是否有方法自动执行此操作?(我曾使用Gremlin加载数据并创建数据库。) 我还有一个数据的外部Lucene索引(我需要它用于其他目的)。有两个索引有意义吗?例如,我可以将Neo4J节点ID索

我有一个要查询的遗留数据集(表示为GraphML)。在一个相关问题中,建议我使用Cypher查询数据库。我的查询用例很简单:给定消息id(消息节点的属性),检索具有该id的节点,还检索该消息的发送方和接收方节点

似乎要在Cypher中实现这一点,我首先必须创建一个节点索引。当从graphML文件加载数据时,是否有方法自动执行此操作?(我曾使用Gremlin加载数据并创建数据库。)

我还有一个数据的外部Lucene索引(我需要它用于其他目的)。有两个索引有意义吗?例如,我可以将Neo4J节点ID索引到我的外部索引中,然后根据这些ID查询图形。我关心的是这些ID的持久性。(类似地,Lucene文档ID不应被视为持久的。)

那么,我是否应该:

  • 对Neo4j图进行内部索引,以使用Cypher查询消息ID?(如果是这样,那么最好的方法是什么:用一些合适的咒语重新生成数据库以建立索引?在已经存在的数据库上建立索引?)

  • 在我的外部Lucene索引中存储Neo4j节点ID,并通过这些存储的ID检索节点

  • 更新

    我一直在尝试让自动索引与Gremlin和嵌入式服务器一起工作,但没有成功。上面说

    底层数据库是自动索引的,请参见第14.12节“自动索引”,以便脚本可以通过索引查找返回导入的节点

    但是,当我在加载新数据库后检查图形时,似乎不存在索引

    报告说需要一系列配置。除了设置
    node\u auto\u index=true
    ,还必须对其进行配置

    要实际自动索引某些内容,必须设置哪些属性 应该被索引。为此,可以列出要索引的属性键 在…上在配置文件中,使用节点_keys_indexable和 关系键\可索引配置键。当使用嵌入式 模式下,使用GraphDatabaseSettings.node_keys_indexable和 GraphDatabaseSettings.relationship_keys_indexable配置键。 在所有情况下,该值都应该是以逗号分隔的属性列表 索引的键

    那么Gremlin应该设置
    GraphDatabaseSettings
    参数吗?我尝试将一个映射传递到Neo4jGraph构造函数,如下所示:

        Map<String,String> config = [
            'node_auto_indexing':'true',
            'node_keys_indexable': 'emailID'
            ]
        Neo4jGraph g = new Neo4jGraph(graphDB, config);
        g.loadGraphML("../databases/data.graphml");
    
    ReadableIndex<Node> autoNodeIndex = graph.rawGraph.index()
        .getNodeAutoIndexer()
        .getAutoIndex();
    def node = autoNodeIndex.get( "emailID", "<2614099.1075839927264.JavaMail.evans@thyme>" ).getSingle();
    
    我的检索是这样做的:

        Map<String,String> config = [
            'node_auto_indexing':'true',
            'node_keys_indexable': 'emailID'
            ]
        Neo4jGraph g = new Neo4jGraph(graphDB, config);
        g.loadGraphML("../databases/data.graphml");
    
    ReadableIndex<Node> autoNodeIndex = graph.rawGraph.index()
        .getNodeAutoIndexer()
        .getAutoIndex();
    def node = autoNodeIndex.get( "emailID", "<2614099.1075839927264.JavaMail.evans@thyme>" ).getSingle();
    
    ReadableIndex autoNodeIndex=graph.rawGraph.index()
    .getNodeAutoIndexer()文件
    .getAutoIndex();
    def node=autoNodeIndex.get(“emailID”,即“”).getSingle();
    

    这似乎奏效了。但是,请注意,
    Neo4jGraph
    对象上的
    getindex()
    调用仍然返回空列表。因此,结果是我可以正确地使用neo4japi,但Gremlin包装器似乎无法反映索引状态。表达式
    g.idx('node\u auto\u index')
    (中有说明)返回null。

    您尝试过自动索引功能吗?它基本上就是您正在寻找的用例——不幸的是,在导入数据之前需要启用它。(否则,必须删除/添加属性以重新为其编制索引。)


    自动索引是惰性创建的。也就是说,当您启用自动索引时,实际索引将在您为第一个属性编制索引时首先创建。确保在检查索引是否存在之前插入数据,否则它可能不会显示

    有关一些自动索引代码(使用编程配置),请参见例如(这是与Neo4j 1.8一起使用的)


    /peter

    我一直在这条路上慢慢走,但没走多远。我更新了问题,以反映我目前缺乏进展。嗯,不幸的是,我没有在embedded上做太多工作。REST服务很简单。我会看看是否能找到人来回答这个问题。在创建
    Neo4jGraph
    instance,我从graphml文件加载数据。加载成功,因为我可以遍历图形,但通过
    getIndexs()枚举索引
    结果是一个空列表。因此,我不认为自动索引被列出,因为它是内置的。你能用它搜索资料吗?是的,事实证明,自动索引确实有效。它确实认为它没有在其他索引中被枚举是违反直觉的。