为什么Gremlin idx返回null,尽管DB不为空?

时间:2012-01-21 19:55:02

标签: neo4j graph-databases gremlin

我正在使用以下方式打开图表:

g = new Neo4jGraph('...path...');

然后使用:

添加顶点
myVertex = g.addVertex(['type':'X', 'Y':Z]);

我可以看到db之后有一个顶点(使用Gephi) 但是当我跑步时:

if (g.idx(T.v) != null )

它总是返回false。 索引应该以某种方式打开吗? Gremlin是否需要特定的Neo4j版本?

添加一些日志信息:

...
==>v[22092]
==>v[22093]
==>v[22094]
==>v[22095]
gremlin> g.idx(T.v)
==>null
gremlin> g.idx("vertices")
==>null
gremlin> g.indices
gremlin>

在Gremlin 1.3上试过这个 - 结果相同。所以我想这是我缺少的东西。

2 个答案:

答案 0 :(得分:2)

我认为用Gremlin在Neo4j中创建索引可能会被打破。证据包括针对neo4jblueprintsthe REST plugin提出的问题。即使情况并非如此,Gremlin并没有真正拥有Neo4j中索引的一流权限 - 例如,我上次检查时无法创建全文索引。不确定它是否甚至可以在Neo中创建关系指数。

我使用了Gremlin / Groovy代码段found in the Neo4j docs

neo4j = g.getRawGraph()
idxManager = neo4j.index()
personIndex = idxManager.forNodes('vertices')

我意识到这打破了Gremlin的漂亮抽象层,但之后你可以使用像g.idx('vertices')这样的Gremlin方法来度过你的一天。

编辑:

要在对Gremlin“可见”索引更改之前获取索引,请尝试以下操作:

import com.tinkerpop.blueprints.pgm.impls.neo4j.Neo4jIndex;
ind = new Neo4jIndex('vertices', Vertex.class, g)

这与我在评论中链接的要点相比,优势在于ind是一个Gremlin指数,可以应用通常的Gremlin处理的一半。 OTOH,评论中的要点可以完全访问原始索引。

答案 1 :(得分:0)

如何在Neo4j Web控制台中使用Gremlin创建Neo4j索引:

gremlin> g.createManualIndex('test2', Vertex.class)
==> MANUAL[test2:Vertex]
gremlin> test2=g.idx('test2')
==> MANUAL[test2:Vertex]
gremlin> hendy=g.v(1673)
==> v[1673]
gremlin> hendy.name
==> Hendy Irawan
gremlin> test2.put('name', 'Hendy Irawan', hendy)
==>
gremlin> test2.get('name', 'Hendy Irawan')
==> v[1673]

注意:g.createAutomaticIndex()不会执行大多数人期望的操作,它会创建一个Neo4j手动索引,由Blueprints自动更新以使用{为所有节点(即Vertex类)编制索引{1}}属性。

取自:https://github.com/neo4j/community/issues/397#issuecomment-5024341

参考:https://github.com/tinkerpop/blueprints/wiki/Graph-Indices