簡體   English   中英

帶有圖像,圖形,sql和ORecordBytes的orientdb

[英]orientdb with image, graph, sql and ORecordBytes

我一直在研究如何將圖像保存在orientdb(作為圖形數據庫)中,並發現了這一點:

http://www.orientechnologies.com/docs/last/orientdb.wiki/Binary-Data.html

注意,我只討論涉及ORecordBytes的技術

但是,幾個問題:

(1)似乎sql命令'CREATE CLUSTER'缺少一個可以通過Java api提供的參數。 默認值是多少? 可能嗎?

http://www.orientechnologies.com/docs/last/orientdb.wiki/SQL-Create-Cluster.html

(2)到目前為止,我一直在使用SQL(腳本)創建我的實體。 為了與ORecordBytes一起使用,我嘗試了類似的方法:

ORecordBytes record = new ORecordBytes("Binary data".getBytes());
record.save();
String cmd = String.format(originalQuery, record.getIdentity().toString());

打印查詢時,它看起來不錯(部分):CREATE VERTEX ... SET my_id = $ some_id_new [0] .value,name =“ Cool name”,image =#3:-2

當然,image屬性是擺脫這種情況的人。 但是,我不認為#3:-2確實存在。 我試圖查詢它,即使我在那里沒有類型,但是也沒有。 另外,使用控制台在頂點上進行查詢時,沒有圖像屬性。

那我該怎么辦呢?

ps我正在使用SQL腳本,因為我需要一個本機不支持的自動遞增字段。 該腳本正在更新計數器表,獲取新值並創建新頂點(包括某些邊)。 這似乎更容易。

編輯(1)

(1)Lvca指出負面的RID是暫時的。 我有些困惑,如果我調用save()為什么會是臨時的。 否則,save()會做什么?

但是,我將嘗試在其后運行commit。

(2)不確定腳本為何如此重要,因為它顯然得到了錯誤的記錄ID RID,但Lvca要求我遵守^^

BEGIN\n\
LET user_id_new = UPDATE CCounter INCREMENT value = 1 RETURN BEFORE $current.value WHERE name='user'
LET cuser = CREATE VERTEX CUser SET user_id=$user_id_new[0].value,\
  name="%s", create_date=%s, rooms=(SELECT FROM CRooms WHERE room_id IN %s),\
  image=%s\n\
COMMIT\n\
RETURN $user_id_new[0].value\n

注意:*最后的換行是因為orientdb sql腳本每行之后都需要它們*每行額外的反斜杠是因為我使用的是屬性文件,該文件要求將其作為單個變量的一部分(第一行實際上是“ my_query = \\”,但它不是腳本的一部分)請注意,在打印時,它看起來不錯(末尾沒有反斜線,並且每一行都是它自己的)*不是返回值只是一個Long(id) 。 並不需要更多。

(3)我不得不說我希望可以在一個事務中同時插入實體的屬性和圖像,我開始覺得這不會發生。 沒有辦法嗎?

(4)另外,與此同時,我嘗試了其他方法,但這也不起作用。 也可以對此發表評論:

  • 首先,我運行上面的腳本,進行了一些修改:

    • 從腳本中刪除了“圖像”字段
    • 返回整個數據評估者,而不是id(返回$ cuser)
  • 其次,我使用以下代碼(java)創建初始實體(無圖像):

    OCommandRequest req = graph.command(new OCommandScript(“ sql”,cmd)); 頂點= req.execute(); graph.commit();

  • 第三,我創建了一個ORecordBytes變量,並將其保存(並提交)。

    ORecordBytes imgRec =新的ORecordBytes(graph.getRawGraph(),imgBytes); imgRec.save(); graph.commit();

  • 第四,將圖像記錄放入先前獲得的頂點的“圖像”屬性中,然后提交

    vertex.setProperty(“ image”,imgRec); vertex.save(); graph.commit();

這是行不通的。 出於某種原因,似乎將“ image”屬性設置為字符串。 控制台上的查詢返回這樣的內容(被控制台截斷):

#3:2[-119, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, -

當打印imgRec.toString()時,字符串非常長(控制台無法全部顯示)。 但是,它似乎包含許多值(至少在末尾也有許多負數)。 它以這種方式結束(沒有換行,不是我所看到的)

, 69, 78, 68, -82, 66, 96, -126] v1

另外,我嘗試用ODocument替換'setProperty'doc = vertex.getRecord(); doc.field(“ image”,imgRec); doc.save();

我嘗試用Vertex替換OrientVertex(也更改了類型,之前未顯示)Vertex vertex = null; ...頂點= req.execute();

我嘗試將屬性設置為getIdentity而不是記錄:vertex.setProperty(“ image”,imgRec.getIdentity());

全部具有相同的結果,即“ image”字段中的字符串,而不是LINK。

同時,我將嘗試回到我的第一次嘗試,並在創建imgRec之后使用commit。 完成后,我將再次編輯。 無論哪種方式,我都認為有很多方法可以實現這一目標,我認為應該可以采用多種方法,並就問題提出建議。 糾正我,如果我錯了,那么我會在orientdb github中打開一個問題。

PS *字段為字符串的問題很好,它嵌入了內容。 而且,我嘗試忽略它並查詢數據的ORecordBytes。 顯然,沒有用。 (無法將String強制轉換為ORecordBytes)*至少在我的數據庫上,群集ID 3是“默認”。

PS 2您從未問過,但是我當前正在使用v2.0-M2版本。

抱歉,很長的帖子,謝謝!

編輯(2):解決方案(?)

所以,終於可以了!

據我所知,問題是:

(1)我嘗試將ORecordBytes變量設置為該字段。 即使我在網上看到了一些地方,也無法正常工作。 您需要插入它的身份(getIdentity())。 如果通過sql,則可以在getIdentity()上使用toString(),但仍然可以。

(2)盡管我更喜歡提前創建屬性,但我不知道其類型,所以這次我不知道。 結果,當嘗試插入ORecordBytes.toString()時,結果是一個奇怪的字符串,而orientdb也會自動為該字段分配字符串類型。 任何進一步的嘗試(很好的嘗試)都只是遵循分配的數據類型。

請注意,“ DELETE PROPERTY CUser.image”無效。 一直說財產不存在。 但是,通過控制台,我鍵入了“信息類CUser”,您可以清楚地看到String數據類型的“ image”屬性。 目前,我只是使用了其他字段(不確定如何解決此問題)。

如果有人感興趣,我確實找到了一種預定義數據類型的方法,但是它有缺點:

CREATE PROPERTY CUser.img LINK

注意我沒有指定鏈接數據類型(例如,鏈接到Room頂點的鏈接)。

最后一個問題:

我仍然不確定如何一次提交。 當前,我正在創建ORecordBytes,調用save()+ commit(),然后使用新的rid運行sql查詢。 無論如何,一次提交就可以做到這一點?

負RID表示RID是臨時的,因此事務正在運行。 事務提交后,OrientDB會小心地更新它們。 您可以發布您的SQL腳本嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM