JavaでNeo4jを組み込んでノードと関係をCreate / Deleteする

環境の構築や、簡単な試行は以前書いた記事へ。
[Java組み込みでNeo4jを使う](http://qiita.com/mikoto3510/items/e2c05459bb498f4e56d7)

基本的な手順としては
1.コード書く
2.サーバ立ち上がってない状態で実行
3.サーバ立ち上げてブラウザで確認
を繰り返してうまく動いてるかやってみてます。

ノード・関係のCreateは上記のページでやっちゃってるので、それを再記します。

```Create.java
package com.example;
 
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.graphdb.DynamicLabel; 

/**
 * ノードと関係のCreate
 */
public class Create {
 
    public enum MyRelationshipTypes implements RelationshipType {
        KNOWS
    }
 
    public static void main(String[] args) {
        GraphDatabaseService graphDb = new GraphDatabaseFactory().newEmbeddedDatabase("data/graphdb");

        Transaction tx = graphDb.beginTx();
        try {
        	
        	//２つのノードと１つの関係を作成
            Node firstNode = graphDb.createNode();
            Node secondNode = graphDb.createNode();
            Relationship relationship = firstNode.createRelationshipTo(secondNode, MyRelationshipTypes.KNOWS);
 
            //それぞれのノードにラベルを追加
            Label firstLabel = DynamicLabel.label("bird");
            firstNode.addLabel(firstLabel);
            Label secondLabel = DynamicLabel.label("little bird");
            secondNode.addLabel(secondLabel);
            
            //それぞれのノードにプロパティを追加
            firstNode.setProperty("message", "haine ");
            secondNode.setProperty("message", "pooh");
            relationship.setProperty("message", "like ");
            tx.success();

            //コンソールに印字
            System.out.print(firstNode.getProperty("message"));
            System.out.print(relationship.getProperty("message"));
            System.out.print(secondNode.getProperty("message"));
        }
        finally {
            tx.close();
            graphDb.shutdown();
        }
    }
}
```


次に、Delete。

まずはIDを指定して削除する方法。
Deleteをするためには、まず検索をしてどのノード、どの関係をDeleteするか指定しなければいけない。
ブラウザで削除するノード・関係のIDを確認しておく。

**なお、ノードを削除する際にはそのノードから出ている関係が全て削除されていないとエラーが出る模様**

```DeleteById.java
package com.example;
 
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;

/**
 * IDの検索をしてノード・関係を削除する
 */
public class DeleteById {
 
    public enum MyRelationshipTypes implements RelationshipType {
        KNOWS,
        LIKES;
    }
 
    public static void main(String[] args) {
        GraphDatabaseService graphDb = new GraphDatabaseFactory().newEmbeddedDatabase("data/graphdb");
       
        Transaction tx = graphDb.beginTx();
        try {
        	
        	//２つのノードと１つの関係を作成
            Node firstNode;
            Node secondNode;
            Relationship relationship;
            
            //ノードのIDを指定して検索
            firstNode = graphDb.getNodeById(2);
            secondNode = graphDb.getNodeById(3);
            relationship = graphDb.getRelationshipById(1);
            
            //確認のためにコンソールにいろいろ表示
            System.out.println("relation=" + relationship.getProperty("message"));
            System.out.println("label=" + firstNode.getLabels());    
            System.out.println(firstNode.getSingleRelationship( MyRelationshipTypes.LIKES, Direction.OUTGOING ));         
            
            //関係とノードの削除
            relationship.delete();
            firstNode.delete();
            secondNode.delete();
            
            tx.success();
        }
        finally {
            tx.close();
            graphDb.shutdown();
        }
    }
}
```

次に、ノードを指定して、そのノードから出ている（または入ってくる）関係を削除する方法。

```DeleteByRelation.java
package com.example;
 
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;

/**
 * 関係を検索し削除
 */
public class DeleteByRelation {
 
    public enum MyRelationshipTypes implements RelationshipType {
        KNOWS,
        LIKES;
    }
 
    public static void main(String[] args) {
        GraphDatabaseService graphDb = new GraphDatabaseFactory().newEmbeddedDatabase("data/graphdb");
       
        Transaction tx = graphDb.beginTx();
        try {
        	
        	//２つのノードと１つの関係を作成
            Node firstNode;
            Node secondNode;
            
            //ノードのIDを指定
            firstNode = graphDb.getNodeById(0);
            secondNode = graphDb.getNodeById(1);
            
            //指定したノードから出ている関係を削除
            firstNode.getSingleRelationship(MyRelationshipTypes.KNOWS, Direction.OUTGOING).delete();
            firstNode.delete();
            secondNode.delete();
            
            tx.success();
        }
        finally {
            //tx.finish();
            tx.close();
            graphDb.shutdown();
        }
    }
}
```

`firstNode.getSingleRelationship(MyRelationshipTypes.KNOWS, Direction.OUTGOING).delete();`
はfirstノードからKNOWSという関係が出ているという意味を示す。
逆に入ってくる関係を削除したければ
`firstNode.getSingleRelationship(MyRelationshipTypes.KNOWS, Direction.INCOMING).delete();`
に変えれば良い。


検索の仕方によってさまざまなノード・関係をとってこれるようになれば、あとは同じ方法で削除できるはず。



以降、いろいろ試しながら有用なのがあったら追記していく予定。