在neo4j节点属性值上添加索引

时间:2014-09-11 02:40:27

标签: neo4j

我已将freebase转储导入neo4j。但目前我因为db的大小而面临获取查询的问题。导入时,我只创建了节点索引并将 URI 属性编入索引,以便为每个节点编制索引。对于每个节点,我添加了多个属性,如label_en,type_content_type_en。

props.put(URI_PROPERTY, subject.stringValue());

Long subjectNode = db.createNode(props);

tmpIndex.put(subject.stringValue(), subjectNode);

nodeIndex.add(subjectNode, props);

现在我的密码查询是这样的。哪个是超时的。我无法在label_en属性上添加索引。有人可以帮忙吗?

match (n)-[r*0..1]->(a) where n.label_en=~'Hibernate.*' return n, a

更新

BatchInserter db = BatchInserters.inserter("ttl.db", config);
BatchInserterIndexProvider indexProvider = new LuceneBatchInserterIndexProvider(db);
BatchInserterIndex index = indexProvider.nodeIndex("ttlIndex", MapUtil.stringMap("type", "exact"));

问题:当我在nodeindex中添加了节点时,我添加了属性 URI

props.put(URI_PROPERTY, subject.stringValue());
Long subjectNode = db.createNode(props);
nodeIndex.add(subjectNode, props);

稍后在代码中我向节点添加了另一个属性(命名为label_en)。但我没有添加或更新nodeindex。所以根据我的理解,lucene没有索引label_en属性。我的图已经构建,所以我试图在我的节点的label_en属性上添加索引,因为我的查询在label_en上。

1 个答案:

答案 0 :(得分:1)

您的代码示例缺少创建索引的方式。但我很确定您正在使用的遗留索引是基于Apache Lucene。

您的Cypher查询正在使用正则表达式运算符=~。这不是你如何使用遗留索引;这似乎是迫使cypher忽略遗留索引,并让java层在label_en属性的每个可能值上运行该正则表达式。

相反,对于Cypher,你应该use a START clause and use the legacy indexing query language

对你来说,这看起来像这样:

START n=node:my_index_name("label_en:Hibernate.*")
MATCH (n)-[r*0..1]->(a)
RETURN n, a;

注意字符串label_en:Hibernate.* - 这是一个Lucene查询字符串,用于检查该特定字符串的属性名称。 Cypher / neo4j没有解释那个;它将它传递给Lucene。

您的代码未提供索引的名称。在创建旧索引时,您必须将上面的my_index_name更改为您命名的内容。