2013-03-14 51 views
1

我正在用java寫一個neo4j演示代碼。以下是我創建節點,索引它們並打印其屬性的代碼的一部分。neo4j:Java錯誤:找不到NodeImpl的屬性#0

String NODE_KEY = "UserID"; 
String NODE_PROPERTIES = "UserProperties"; 

createAndIndexUser(String userID){ 
    Node node = graphDB.createNode(); 
    node.setProperty(NODE_KEY, nodeID); 
    neo4jGraph.nodeIndex.add(node, NODE_KEY, userID); 
    return node; 
} 

for(int i=0 ; i<100 ; i++){ 
    String userID = "userID_"+i; 
    Node node = createAndIndexUser(userID); 
    node.setProperty(NODE_PROPERTIES, strNodeProperties); 
} 

Iterable<Node> allNodes = GlobalGraphOperations.at(graphDB).getAllNodes(); 

for(Node n: allNodes){ 
    System.out.println("n.getPropertyKeys: "+n.getPropertyKeys()); 
    System.out.println(n.getProperty(NODE_KEY)); 
} 

當我執行該代碼,第一的println輸出爲:

n.getPropertyKeys: [] 

而對於第二次的println我得到一個錯誤:

Exception in thread "main" org.neo4j.graphdb.NotFoundException: 'UserID' property not found for NodeImpl#0. 

在哪裏,我是什麼做錯了?爲什麼它不打印n.getProperty(NODE_KEY)上的所有PROPERTIES鍵?

是否有任何其他方式獲取所有節點並打印其屬性?

回答

5

除了您在createAndIndexUser中添加的節點之外,圖中還有哪些節點?請記住,Neo4j的圖形總是有ID爲0嘗試修改你的循環到像一個虛擬節點:

for(Node n: allNodes){ 
    System.out.println("n.getPropertyKeys: "+n.getPropertyKeys()); 
    if(n.hasProperty(NODE_KEY)) 
     System.out.println(n.getProperty(NODE_KEY)); 
    else 
     System.out.println("Node " + n.getId() + " does not contain property " + NODE_KEY); 
} 

事實上,如果你真的想可以肯定,你可以繼續創建的節點列表上面,並檢查那些從getAllNodes()得到的結果。

+0

謝謝@KelseyRider。有效。但是,爲什麼創建虛擬節點?是否有可能避免它? – 2013-03-14 10:04:35

+1

我認爲它是作爲「參考節點」自動創建的。您可以刪除它,但不能重新創建它。圍繞它的網絡有很多討論,例如http://stackoverflow.com/questions/7186832/recreate-reference-node-in-a-neo4j-database – Kricket 2013-03-14 10:24:55

0

這是參考節點,如果您不使用它,您可以刪除它。

另外n.getProperty(NODE_KEY,null)是相當實用的。