尝试使用Neo4j CSV Batch Importer导入SDN中的节点,提供java.lang.IllegalStateException:
java.lang.IllegalStateException: No primary SDN label exists .. (i.e one with starting with _)
这是在通过密码查询添加新标签之后:
match (n:Movie) set n:_Movie;
检查通过SDN创建的节点显示它们具有相同的标签。运行时的结果
match (n) where id(n)={nodeId} return labels(n) as labels;
在LabelBasedStrategyCypher.java中找到的对于两者都是相同的:
["Movie","_Movie"]
通过SDN保存和检索节点没有任何问题。我必须遗漏一些东西,因为我觉得设置appropiate labels应该足够了。
我在使用Oracle Java 1.8.0_05的arch linux x64上运行SDN 3.0.2.RELEASE和neo4j 2.0.3
编辑:我的CSV文件如下所示。 appId仅用于确保节点与我们之前存储的节点相同,如the internal nodeId is Garbage collected,并且新节点可以在删除旧节点后获取旧节点ID。 nodeId用于实际查找和连接关系等。
appId:int l:label title:string:movies year:int
1 Movie Dinosaur Planet 2003
2 Movie Isle of Man TT 2004 Review 2004
EDIT2:
我做了更多测试,检查LabelBasedNodeTypeRepresentationStrategy的来源,看看出了什么问题。运行抛出Exception的readAliasFrom()方法不会返回任何错误:
String query = "start n=node({id}) return n";
Node node = null;
for(Node n : neo4jTemplate.query(query,params).to(Node.class)){
node = n;
}
// when running the readAliasFrom method manually the label is returned correctly
LabelBasedNodeTypeRepresentationStrategy strategy = new
LabelBasedNodeTypeRepresentationStrategy(neo4jTemplate.getGraphDatabase());
System.out.println("strategy returns: " +(String)strategy.readAliasFrom(node));
// trying to convert the node to a movie object, however throws the Illegal State Exception
Movie movie = null;
movie = neo4jTemplate.convert(node,Movie.class);
因此,_Movie标签存在,手动运行readAliasFrom()方法不会抛出异常,但尝试将节点转换为Movie。从SDN创建的节点没有这些问题,即使它们看起来与我相同。