Neo4j索引和遗留数据

时间:2012-10-31 23:13:05

标签: neo4j cypher gremlin

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

似乎要在Cypher中执行此操作,我首先必须创建节点的索引。从graphML文件加载数据时,有没有办法自动执行此操作? (我曾使用Gremlin加载数据并创建数据库。)

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

所以,我应该:

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

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

  3. 更新

    我一直在尝试使用Gremlin和嵌入式服务器进行自动索引,但没有运气。在documentation中说

      

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

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

    Neo4j documentation on auto indexing表示需要进行大量配置。除了设置node_auto_indexing = true之外,您还必须对其进行配置

      

    要实际自动索引某些内容,您必须设置哪些属性   应该索引。您可以通过列出索引的属性键来完成此操作   上。在配置文件中,使用node_keys_indexable和   relationship_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");
    

    但这对索引创建没有明显影响。

    更新2

    我不是通过Gremlin配置数据库,而是使用Neo4j documentation中给出的示例,以便我的数据库创建就像这样(在Groovy中):

    protected Neo4jGraph getGraph(String graphDBname, String databaseName) {
        boolean populateDB = !new File(graphDBName).exists();
        if(populateDB)
            println "creating database";
        else
            println "opening database";
    
        GraphDatabaseService graphDB = new GraphDatabaseFactory().
            newEmbeddedDatabaseBuilder( graphDBName ).
            setConfig( GraphDatabaseSettings.node_keys_indexable, "emailID" ).
            setConfig( GraphDatabaseSettings.node_auto_indexing, "true" ).
            setConfig( GraphDatabaseSettings.dump_configuration, "true").
            newGraphDatabase();
        Neo4jGraph g = new Neo4jGraph(graphDB);
    
        if (populateDB) {
            println "Populating graph"
            g.loadGraphML(databaseName);
        }
    
        return g;
    }
    

    我的检索就像这样:

    ReadableIndex<Node> autoNodeIndex = graph.rawGraph.index()
        .getNodeAutoIndexer()
        .getAutoIndex();
    def node = autoNodeIndex.get( "emailID", "<2614099.1075839927264.JavaMail.evans@thyme>" ).getSingle();
    

    这似乎有效。但请注意,getIndices()对象上的Neo4jGraph调用仍返回空列表。所以结果是我可以正确地运用Neo4j API,但Gremlin包装器似乎无法反映索引状态。表达式g.idx('node_auto_index')(记录在Gremlin Methods中)返回null。

2 个答案:

答案 0 :(得分:2)

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

对于某些自动索引代码(使用编程配置),请参阅例如https://github.com/neo4j-contrib/rabbithole/blob/master/src/test/java/org/neo4j/community/console/IndexTest.java(这与Neo4j 1.8合作

/彼得

答案 1 :(得分:0)

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

http://docs.neo4j.org/chunked/milestone/auto-indexing.html