2012-05-17 6 views
0

Я пытаюсь создать узлы и отношения в базе данных Neo4j. Узлы создаются, потому что я могу распечатать идентификатор узла, но они не сохраняются. Следующий этап моей программы - подсчитать количество узлов в индексе и дать ошибку NullPointerExpection. Я использую Gephi для визуализации графика, и он не показывает ни узлов, ни отношений. Как восстановить узлы? Может быть, потому, что у меня есть другой метод (не показан из-за длины), который заключен в транзакцию, которая вызывает эти методы создания узлов? СпасибоУзлы и отношения не сохраняются

Вот часть кода:

public class Neo4JGraphDbClass { 

private String graphLocation = "D:\\testdb" ; 

private GraphDatabaseService graphDb ; 
private IndexManager graphIndex ; 

private Index<Node> property1; 
private Index<Node> special_nodes ; 

public Neo4JGraphDbClass() {} 
public void createGraphDb() { 
    graphDb = new EmbeddedGraphDatabase(graphLocation) ; 
    graphIndex = graphDb.index(); 
    property1 = graphIndex.forNodes("PROPERTY1"); 
    special_nodes = graphIndex.forNodes("SPECIAL_NODES"); 
} 

public Node createAndIndex(Integer[] property1) { 
    Transaction transaction0 = graphDb.beginTx(); 
    try { 
     Node node = graphDb.createNode(); 
     node.setProperty("PROPERTY1",property1) ; 
     property1.putIfAbsent(node, "PROPERTY1", property1); 
     System.out.println(node.getId()); 
     transaction0.success(); 
     return node; 
    } finally { 
     transaction0.finish(); 
    } 
} 

public Node createSpecialNodes(Integer name) { 
    Transaction transaction1 = graphDb.beginTx(); 
    try { 
     Node node = graphDb.createNode(); 
     node.setProperty("SPECIAL_NODE", name); 
     special_nodes.add(node, "SPECIAL_NODE", name); 
     transaction1.success(); 
     return node; 
    } 
    finally { 
     transaction1.finish(); 
    } 
} 
public void addNodesToGraph(Integer preName, ArrayList<Integer[]> preProperty1) { 
    //stuff to change preName into name and preProperty into property 
Transaction transaction = graphDb.beginTx(); 
    try { 
     Node specialNode = createSpecialNodes(name) ; 
     Node previousNode = graphDb.getReferenceNode(); 
     for (int i = 0; i < property1.size(); i++) { 
      Node currentNode = createAndIndex(property1.get(i)); 
      previousNode.createRelationshipTo(currentNode, RelTypes.NEXT_MEASURE); 
      currentNode.createRelationshipTo(specialNode,RelTypes.SAMPLE); 
      previousNode = currentNode; } 
     transaction.success(); 
    } 
    finally { 
     transaction.finish(); 
    } 
} 

public Integer countIndex() { 
    Integer hitSize; 
    Transaction tx = graphDb.beginTx(); 
    try { 
     IndexHits<Node> hits = graphIndex.forNodes("PROPERTY1").get("PROPERTY1", "*"); 
     hitSize = hits.size(); 
     tx.success(); 
    } 
    finally { 
     tx.finish(); 
    } 
    return hitSize; 
} 

public Integer indexSize(Integer lookup) throws NullPointerException{ 
    Integer hitSize; 

    Transaction tx2 = graphDb.beginTx(); 
    try { 

     IndexHits<Node> hits = graphIndex.forNodes("PROPERTY1").query(lookup); 
     hitSize = hits.size(); 
     tx2.success(); 
    } 
    finally { 
     tx2.finish(); 
    } 
    return hitSize; 
} 
+0

Вы уверены, что совершили внешнюю транзакцию? Почему бы не показать метод упаковки? – Andres

+0

Да, я совершаю внешнюю транзакцию. Я не показывал метод упаковки, потому что тогда мне пришлось бы объяснить материал non-Neo4j и риск сделать уже запутанный вопрос хуже. – blue

+0

Можете ли вы показать способ упаковки? Этот код выглядит хорошо. –

ответ

0

код выглядит нормально. Как выглядит ваш запрос, например, как вы пришли к выводу, что данные не сохраняются?

+0

Я выполнил запрос, чтобы подсчитать все проиндексированные узлы в моем индексе property1, который возвратил 0. Также запрос для поиска определенного целого (term) и он возвратил исключение nullpointer. Короче говоря, я использовал Gephi, чтобы узнать, есть ли там узлы/отношения. И я ничего не получил. Поэтому я проверяю Gephi с другой базой данных neo4j, которую я имею, и узлы/отношения были там. – blue

+0

Вы не можете делать index.get ("property1", "*"), используйте для этого запрос (...). Какая строка запроса привела к NPE? –

+0

Спасибо. Я поменяю это на запрос. Запрос представляет собой целое число из 6 цифр, 583392, а свойство представляет собой массив целых чисел. – blue

Смежные вопросы