2016-11-16 14 views
1

このコードを使用してneo4j demo.dbフォルダにノードとリレーションシップを作成しようとしています。 neo4jでこのdbフォルダを開くと、ゼロノードとリレーションが表示されます。 relations.xlsファイルを提供しています。neo4j dbフォルダ内のノードとリレーションシップを作成しないと、Javaを使用して空の.dbフォルダが作成されます

public class TestAut { 


    private static final File DB_PATH = new File("databases/demo.db"); 
    private static GraphDatabaseService graphDb; 

    private static String [] r1={"PARTNERS_JV_WITH","EXEC_JOINS","EXEC_QUITS","INVESTS_IN_TECH_IP","ACQUIRES","LAUNCHES_NEW_PRODUCT_SERVICE","LAUNCHES", 
      "ACQUIRE_TALENT","DOWNSIZES_TALENT","ENTER_NEW_MARKET","DELIVERS_VALUE","OPENS_NEW_CENTER"}; 
    private static String [] r2={"PARTNERS_JV_WITH","EXEC_JOINS","EXEC_QUITS","INVESTS_IN_TECH_IP","ACQUIRES","LAUNCHES_NEW_PRODUCT_SERVICE","LAUNCHES", 
      "ACQUIRE_TALENT","DOWNSIZES_TALENT","ENTER_NEW_MARKET","DELIVERS_VALUE","OPENS_NEW_CENTER"}; 
    private static Relations relations; 
    public static void main(String args[]) {//throws FileNotFoundException { 
     String fileName = "relations.xls"; 


     Workbook workbook; 

     startDb(); 
     relations=new Relations(r1,r2); 
     System.out.println (fileName); 
     BufferedReader br; 
     try { 
      br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); 



     br.close(); 

     workbook = Workbook.getWorkbook(new File(fileName)); 
     for(int i=0;i<workbook.getNumberOfSheets();i++) { 
      Sheet sheet=workbook.getSheet(i); 
      for(int j=0;j<sheet.getRows();j++) { 
       Cell cell[]=sheet.getRow(j); 
       for(int k=0;k<cell.length;k++) 
        System.out.print(cell[k].getContents()+" "); 
       System.out.print("\n"); 
       createNodesAndRelationship(cell[0].getContents(),cell[1].getContents(), 
         cell[2].getContents(),cell[3].getContents(), 
         cell[4].getContents(),cell[5].getContents(),cell[6].getContents(),cell[7].getContents()); 
      } 
     } 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (BiffException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     stopDb(); 
     System.out.println("Done!!"); 
     successfully.... "); 
    } 
    public static void startDb() { 

     graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH); 
    } 
    public static void stopDb() { 
     graphDb.shutdown(); 

    } 
    public static void createNodesAndRelationship(String subject,String subjecttype,String object, 
      String objecttype,String relationship,String headline,String newslink,String date) { 

     Transaction tx = graphDb.beginTx(); 
     try 

     { 

      Result result; 

      result=graphDb.execute("match ("+subjecttype+"{name:\""+subject+"\"}) return "+subjecttype+".name;"); 

      if(result.toString().equals("empty iterator")) { 
       //Query="create (a:"+subjecttype+"{name:\""+subject+"\"}) return a;"; 
       result=graphDb.execute("create (a:"+subjecttype+"{name:\""+subject+"\"}) return a;"); 
       System.out.println(result.toString()); 
      } 
      //Query="match ("+objecttype+"{name:\""+object+"\"}) return "+objecttype+".name;"; 
      result=graphDb.execute("match ("+objecttype+"{name:\""+object+"\"}) return "+objecttype+".name;"); 
      if(result.toString().equals("empty iterator")) {  

       result=graphDb.execute("create (a:"+objecttype+"{name:\""+object+"\"}) return a;"); 
       System.out.println(result.toString()); 
      } 

      result=graphDb.execute("match (a:"+subjecttype+"{name:\""+subject+"\"}) " 
        + "match(b:"+objecttype+"{name:\""+object+"\"}) " 
        + "match (a)-[:"+relationship+"]->" 
         + "(b) return a.name,b.name;"); 
      if(result.toString().equals("empty iterator")&&relations.contains(relationship)) { 

       result=graphDb.execute("match (a:"+subjecttype+"{name:\""+subject+"\"}) " 
         + "match(b:"+objecttype+"{name:\""+object+"\"}) " 
         + "create (a)-[r:"+relationship+"{headlines:\""+ 
          headline+"\",newslink:\""+newslink+ "\",date:\""+date+"\""+ "}]->(b) return r;"); 
       System.out.println(result.toString()); 

      } 

      tx.success(); 

     } 
     finally { 
      tx.close(); 
     } 

    } 
} 

これは、このコードを実行した後のコンソール出力....

relations.xls 南西ベル株式会社会社ワーナー・コミュニケーションズ社が取得しているTIMELINE:タイムワーナーと& Tの合併は、業界の取引の数十年に従うAT http://www.npr.org/sections/thetwo-way/2016/10/22/498996253/timeline-at-ts-merger-with-time-warner-follows-decades-of-industry-deals?utm_medium=RSS&utm_campaign=technology 24/10/16 ベライゾン社ヤフー株式会社は、タイムラインを取得:& ATタイム・ワーナーとTの合併は、産業の数十年に従うhttp://www.npr.org/sections/thetwo-way/2016/10/22/498996253/timeline-at-ts-merger-with-time-warner-follows-decades-of-industry-deals?utm_medium=RSS&utm_campaign=technology 24/10/16 AOLタイム・ワーナー社株式会社当社は、タイムラインを取得し情報:ATタイムワーナーとTの合併は、産業の数十年が紹介従うhttp://www.npr.org/sections/thetwo-way/2016/10/22/498996253/timeline-at-ts-merger-with-time-warner-follows-decades-of-industry-deals?utm_medium=RSS&utm_campaign=technology 24/10/16 Comcastのカンパニー、ウォルト・ディズニー・カンパニー社を買収TIMELINE:&タイム・ワーナーとTの合併は、産業の数十年はhttp://www.npr.org/sections/thetwo-way/2016/10/22/498996253/timeline-at-ts-merger-with-time-warner-follows-decades-of-industry-deals?utm_medium=RSS&utm_campaign=technology 24/10/16 SBC株式会社会社を紹介従うAT南西ベル株式会社当社は、タイムラインを取得:& ATタイム・ワーナーとTの合併は、産業の数十年に従う紹介http://www.npr.org/sections/thetwo-way/2016/10/22/498996253/timeline-at-ts-merger-with-time-warner-follows-decades-of-industry-deals?utm_medium=RSS&utm_campaign=technology 24/10/16 コムキャスト社NBCユニバーサル社は、タイムラインを取得:& ATタイム・ワーナーとTの合併は、産業の数十年に従うhttp://www.npr.org/sections/thetwo-way/2016/10/22/498996253/timeline-at-ts-merger-with-time-warner-follows-decades-of-industry-deals?utm_medium=RSS&utm_campaign=technology 10分の24をチェックします/ 16 sss社sdadasfd社ACQUIRES bndfhfdhedr http://www.npr.org/sections/thetwo-way/2016/10/22/498996253/timeline-at-ts-merger-with-time-warner-follows-decades-of-industry-deals?utm_medium=RSS&utm_campaign=technology 24/10/16

完了!

答えて

1

申し訳ありませんが、このコードは本当に乱雑です!また、データがなく、コードがminimal exampleではないため、結果を再現することはできません。私たちは本当にあなたのためにデバッグすることはできません。それぞれのステップを分離し、何かがあるかどうかなどを確認してください。

ここではヒントとヒントをいくつか紹介します。

テスト欠席結果
if (result.toString().equals("empty iterator")) 

本当に

if (!result.hasNext()) 

変数やラベル:、安定したインタフェースになることはありません文字列変換の代わりにAPIを使用してください(これは任意の契約の一部ではありませんか)?

subjecttypeobjecttypeの値は、変数名またはラベルのノードを表していますか?(それは機能的に同じだ理由をすべきクエリを変更する場合)前者は本当に意味がありませんが、後者は適切に使用されていません。

result=graphDb.execute("match ("+subjecttype+"{name:\""+subject+"\"}) return "+subjecttype+".name;"); 

subjecttypereturn句で変数として使用されますが、ルックスそれは先頭のコロンを欠けている以外、match句のラベルのように:

result=graphDb.execute("match (n:"+subjecttype+"{name:\""+subject+"\"}) return n.name"); 

(最終セミコロンは不要です)

あなたが実際に一致createためにそれを正しく使用しています:

result=graphDb.execute("create (a:"+subjecttype+"{name:\""+subject+"\"}) return a;"); 

クエリはまた

パラメータsubjectに引用符が含まれている場合、クエリは、 "サイファー注入"(SQLインジェクションの相対的)に対して脆弱です。代わりに、クエリパラメータを使用します。

result = graphDb.execute("match (n:" + subjecttype + " {name:{name}}) return n.name", 
     Collections.<String, Object>singletonMap("name", subject)); 

それはそれは解析されていないと、その実行計画は、(一度だけラベルごと)、各ラインのために計算されていないことを意味する、クエリは、一般的な作りの付加的な利点を持っています。

使用MERGE

あなたは、単にMERGE代わりのMATCH + CREATEを使用してロジックを置き換えることができます:

あなたの複数のクエリをCYPHERする

result = graphDb.execute("merge (n:" + subjecttype + " {name:{name}}) return n", 
     Collections.<String, Object>singletonMap("name", subject)); 

パワーは、実際には、単一の1に減らすことができましたただし、relationshipのフィルタは、relationsに含まれています。

あなたはそれを手動で管理するのではなく、試し-と資源を使用する必要がありますを意味し、

Map<String, Object> params = new HashMap<>(); 
params.put("subject", subject); 
params.put("object", object); 
params.put("headline", headline); 
params.put("newslink", newslink); 
params.put("date", date); 
graphDb.execute("MERGE (a:" + subjecttype + " {name: {subject}})", params); 
graphDb.execute("MERGE (b:" + objecttype + " {name: {object}})", params); 
if (relations.contains(relationship)) { 
    graphDb.execute(
      "MATCH (a:" + subjecttype + " {name: {subject}}) " + 
      "MATCH (b:" + objecttype + " {name: {object}}) " + 
      "MERGE (a)-[r:" + relationship + "]->(b) " + 
      "ON CREATE SET r.headlines = {headline}, " + 
      "    r.newslink = {newslink}, " + 
      "    r.date = {date}", 
      params); 
} 

TRY-と資源

TransactionAutoCloseableです:フィルター付き

Map<String, Object> params = new HashMap<>(); 
params.put("subject", subject); 
params.put("object", object); 
params.put("headline", headline); 
params.put("newslink", newslink); 
params.put("date", date); 
graphDb.execute(
     "MERGE (a:" + subjecttype + " {name: {subject}}) " + 
     "MERGE (b:" + objecttype + " {name: {object}}) " + 
     "MERGE (a)-[r:" + relationship + "]->(b) " + 
     "ON CREATE SET r.headlines = {headline}, " + 
     "    r.newslink = {newslink}, " + 
     "    r.date = {date}", 
     params); 

は、それが実際には3つのクエリです。代わりに

Transaction tx = graphDb.beginTx(); 
try { 
    // ... 
} finally { 
    tx.close(); 
} 

の条件がfalseを返している場合は、そのいずれかのノードを作成しない理由だけで

try (Transaction tx = graphDb.beginTx()) { 
    // ... 
} 
+0

を試してみてください。ご返信ありがとうございます... – jiwitesh

1

は実際にすべての時間はthatsのかとrelations.Iはちょうど私の場合の条件と今その作業罰金を変更しました。

は、条件がfalseを返している場合は、そのいずれかのノードを作成していない理由をごresponse.Actuallyためのおかげで、すべての時間がthatsのとrelations.Iはちょうど私の場合の条件と今その作業罰金を変更

 { 

      Result result; 

       result = graphDb.execute("merge (a:" + subjecttype + "{name:\"" + subject + "\"}) return a;"); 


     result = graphDb.execute("merge (a:" + objecttype + "{name:\"" + object + "\"}) return a;"); 


     result = graphDb.execute("merge (a:" + subjecttype + "{name:\"" + subject + "\"}) " + "merge(b:" 
       + objecttype + "{name:\"" + object + "\"}) " + "merge (a)-[r:" + relationship + "{headlines:\"" 
       + headline + "\",newslink:\"" + newslink + "\",date:\"" + date + "\"" + "}]->(b) return r;"); 
      tx.success(); 
     } 

     finally { 
      tx.close(); 
     } 
関連する問題