gpt4 book ai didi

Neo4j 索引和遗留数据

转载 作者:行者123 更新时间:2023-12-05 01:13:16 24 4
gpt4 key购买 nike

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

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

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

那么,我应该:

  • 在内部索引 Neo4j 图以使用 Cypher 查询消息 ID? (如果是这样,最好的方法是什么:用一些合适的咒语重新生成数据库以构建索引?在已经存在的数据库上构建索引?)
  • 将 Neo4j 节点 ID 存储在我的外部 Lucene 索引中并通过这些存储的 ID 检索节点?

  • 更新

    我一直试图让自动索引与 Gremlin 和嵌入式服务器一起工作,但没有运气。在 documentation它说

    The underlying database is auto-indexed, see Section 14.12, “Automatic Indexing” so the script can return the imported node by index lookup.



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

    Neo4j documentation on auto indexing说需要一堆配置。除了设置 node_auto_indexing = true ,你必须配置它

    To actually auto index something, you have to set which properties should get indexed. You do this by listing the property keys to index on. In the configuration file, use the node_keys_indexable and relationship_keys_indexable configuration keys. When using embedded mode, use the GraphDatabaseSettings.node_keys_indexable and GraphDatabaseSettings.relationship_keys_indexable configuration keys. In all cases, the value should be a comma separated list of property keys to index on.



    所以 Gremlin 应该设置 GraphDatabaseSettings参数?我尝试将 map 传入 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 包装器似乎无法反射(reflect)索引状态。表达式 g.idx('node_auto_index') (记录在 Gremlin Methods 中)返回 null。

    最佳答案

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

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

    /彼得

    关于Neo4j 索引和遗留数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13168771/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com