2016-12-09 32 views
0

我創建了一個圖形數據庫。有些節點叫做Vertex,它們的屬性有:attr1:<float-value>,attr2:<float-value>等,以及關係,這些屬性被稱爲Padre,並且具有以下屬性attr1:<float-value>,attr2:<float-value>等。現在,我正在編寫一個Java程序,給定兩個Vertex es(兩個匹配節點ID的整數),檢查它們之間是否存在路徑。如果是,則計算路徑的屬性總和。Neo4j&Java - 如何總結屬性的所有值?

我已經試過與此代碼:

public void res(Session session, int x, int y) { 

    float z = 0F; 
    boolean found = false; 

    while (!found) { 
     if (x == y) { 
      StatementResult res = session.run("MATCH (N:Vertex) WHERE N.ID=" + x +" RETURN PROPERTIES(N)"); 
      Record record = res.next(); 

      for (String a: record.get("PROPERTIES(N)").keys()) { 
       if(a.equals("ID") || a.equals("IdAlbero")) { 
        continue; 
       } 

       Value k = record.get("PROPERTIES(N)").get(a); 
       z += k.asFloat(); 
      } 

      found = true; 
     } else { 
      StatementResult res = session.run("MATCH (N:Vertex) WHERE N.ID=" + x +" RETURN PROPERTIES(N)"); 
      Record record = res.next(); 
      for (String a: record.get("PROPERTIES(N)").keys()) { 
       if(a.equals("ID") || a.equals("IdAlbero")) { 
        continue; 
       } 

       Value k = record.get("PROPERTIES(N)").get(a); 
       z += k.asFloat(); 
      } 

      res = session.run("MATCH (N:Vertex),(M:Vertex), (N) - [R:Padre] ->(M) WHERE N.ID = " + x + " RETURN PROPERTIES(R)"); 
      record = res.next(); 

      for (String a: record.get("PROPERTIES(R)").keys()) { 
       if (a.equals("ID") || a.equals("IdAlbero")) { 
        continue; 
       } 

       Value k = record.get("PROPERTIES(R)").get(a); 
       z += k.asFloat(); 
      } 
     } 
    } 

    System.out.println(z); 
} 

現在,我有一個錯誤給z += k.asFloat()聲明。 這是錯誤:

Exception in thread "main" org.neo4j.driver.v1.exceptions.value.Uncoercible: Cannot coerce FLOAT to Java String at org.neo4j.driver.internal.value.ValueAdapter.asString(ValueAdapter.java:84) at Neo4j.res(Neo4j.java:160) at Connessione.connettiti(Connessione.java:27) at Connessione.main(Connessione.java:35).

我該怎麼辦?

+0

確定的屬性被存儲爲花車?看起來至少有一個你試圖轉換爲浮點的屬性存儲爲一個字符串。您可以使用Eclipse/NetBeans/IntelliJ調試器來停止執行異常,並查看它的值。或者,您可以只打印該屬性的名稱('a')並查看哪個屬性導致該異常。 –

回答

0

我不知道太多的Java,但你可以使用filterreduce在一個暗號查詢適合一切:

MATCH (N1:Vertex {id: 1}) 
OPTIONAL MATCH (N1)-[R:Padre]->(N2:Vertex {id:3}) 
WITH N1, FILTER(k in keys(N1) WHERE k<>'id' AND k<>'idAlbero') as kN1, 
    N2, FILTER(k in keys(N2) WHERE k<>'id' AND k<>'idAlbero') as kN2 
WITH N1, kN1, REDUCE(sum1=0.0, k in kN1 | sum1 + toFloat(N1[k])) as sum1, 
    N2, kN2, REDUCE(sum2=0.0, k in kN2 | sum2 + toFloat(N2[k])) as sum2 
WITH N1, kN1, CASE WHEN sum1 IS NULL THEN 0 ELSE sum1 END as sum1, 
    N2, kN2, CASE WHEN sum2 IS NULL THEN 0 ELSE sum2 END as sum2, 
    sum1 + toFloat(sum2) as total 
RETURN N1, kN1, sum1, 
     N2, kN2, sum2, 
     sum1 + sum2 as total