我有一个要查询的遗留数据集(安然数据表示为GraphML)。在一个相关问题的评论中,@StefanArmbruster建议我使用Cypher查询数据库。我的查询用例很简单:给定消息id (消息节点的属性),检索具有该id的节点,并检索该消息的发件人和收件人节点。
似乎要在Cypher中做到这一点,我首先必须创建节点的索引。在从graphML文件加载数据时,是否有一种自动执行此操作的方法?(我使用Gremlin加载数据并创建数据库。)
我还拥有数据的外部Lucene索引(我需要它用于其他目的)。有两个索引有意义吗?例如,我可以将Neo4J节点I索引到外部索引中,然后根据这些I查询图表。我担心的是这些ids的持久性。(类似地,Lucene文档ids不应被视为持久化。)
所以,我应该:
更新
我一直试图使自动索引与Gremlin和嵌入式服务器一起工作,但没有运气。在文档里写着
底层数据库是自动索引的,请参阅第14.12节“自动索引”,以便脚本可以通过索引查找返回导入的节点。
但是,当我在加载一个新数据库后检查该图表时,似乎没有索引存在。
关于自动索引的Neo4j文档说需要一堆配置。除了设置node_auto_indexing = true之外,还必须配置它
要真正地自动索引某项内容,您必须设置哪些属性应该被索引。您可以通过列出要索引的属性键来完成此操作。在配置文件中,使用node_keys_indexable和relationship_keys_indexable配置键。使用嵌入式模式时,请使用GraphDatabaseSettings.relationship_keys_indexable和GraphDatabaseSettings.node_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文档中给出的示例,以便我的数据库创建如下(在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方法中)返回null。
发布于 2012-11-01 05:11:05
自动索引是延迟创建的。也就是说,当您启用自动索引时,当您对第一个属性进行索引时,将首先创建实际的索引。在检查索引是否存在之前,请确保正在插入数据,否则它可能不会出现。
有关一些自动索引代码(使用编程配置),请参见https://github.com/neo4j-contrib/rabbithole/blob/master/src/test/java/org/neo4j/community/console/IndexTest.java (这是与Neo4j 1.8一起使用的)。
/peter
发布于 2012-11-01 00:21:42
您试过自动索引功能吗?这基本上是您要寻找的用例--不幸的是,在导入数据之前需要启用它。(否则,您必须删除/添加属性才能重新索引它们。)
http://docs.neo4j.org/chunked/milestone/auto-indexing.html
https://stackoverflow.com/questions/13168771
复制相似问题