2017-04-18 35 views
1

我對orientdb中的查詢有一些疑惑。我有以下情形:OrientDB:Single shot查詢

實施例:

Performs Uses   RunsOn IsConnected 

用戶 - >處理 - >應用 - >服務器 - >網絡

在這裏,用戶/過程/應用/服務器/網絡是頂點名稱
執行/用途/ RunsOn/IsConnected是邊緣名稱/關係名稱 OSTYPE /的applicationName的屬性名稱相關的頂點

現在,我想所有的相關組合 - [R根據輸入結果。如果輸入類似服務器的osType和應用程序的applicationName,那麼我需要所有與這兩個輸入相關的細節,如用戶和進程,以及與此applicationName和osType相關的任何細節。

在orientdb中可以在單個查詢中獲取所有這些細節?

回答

1

如果你想單獨列

MATCH 
    {as:user} -Performs-> {as:process} -Uses-> 
    {class:Application, as:app, where:(applicationName = ?)} -RunsOn-> 
    {class:Server, as:server, where:(osType = ?)} -IsConnected-> {as:network} 
RETURN user.name, process.id, app.name, server.url, server.name, network.name 

如果你只需要所涉及的元素的RID:

MATCH 
    {as:user} -Performs-> {as:process} -Uses-> 
    {class:Application, as:app, where:(applicationName = ?)} -RunsOn-> 
    {class:Server, as:server, where:(osType = ?)} -IsConnected-> {as:network} 
RETURN user, process, app, server, network 

如果你也想在行中的所有細節:

SELECT user.* as user_, process.* as process_, app.* as app_, server.* as server_, network.* as network_ FROM (
    MATCH 
    {as:user} -Performs-> {as:process} -Uses-> 
    {class:Application, as:app, where:(applicationName = ?)} -RunsOn->  
    {class:Server, as:server, where:(osType = ?)} -IsConnected-> {as:network} 
    RETURN user, process, app, server, network 
) 

「as xxx_」將爲屬性添加前綴,這對於避免衝突很有用,例如。如果你有user.name和server.name,這樣你將擁有「user_name」和「server_name」

如果你不需要所有的模式,但你只需要單個記錄是結果的一部分:

MATCH 
    {as:user} -Performs-> {as:process} -Uses-> 
    {class:Application, as:app, where:(applicationName = ?)} -RunsOn-> 
    {class:Server, as:server, where:(osType = ?)} -IsConnected-> {as:network} 
RETURN $elements 

如果有連接到相同的節點的多條路徑,則可以使用逗號分開的圖案,使用別名,例如接合。

MATCH 
{as:user} -Performs-> {as:process} -Uses-> 
{class:Application, as:app, where:(applicationName = ?)} -RunsOn-> 
{class:Server, as:server, where:(osType = ?)} -IsConnected-> {as:network}, 
{as:server} -IsMountedOn-> {as:storage} 
RETURN $elements 

如果一個或多個(終端)連接丟失,您可以將其定義爲可選,例如。如果存儲可能會丟失:

MATCH 
{as:user} -Performs-> {as:process} -Uses-> 
{class:Application, as:app, where:(applicationName = ?)} -RunsOn-> 
{class:Server, as:server, where:(osType = ?)} -IsConnected-> {as:network}, 
{as:server} -IsMountedOn-> {as:storage, optional:true} 
RETURN $elements 

這隻適用於終端節點,即。只有一個連接的節點。

完全參考這裏:http://orientdb.com/docs/2.2.x/SQL-Match.html

+0

感謝您的快速response.Somewhere我尋找相同的結果下來line.One小疑問,如果我們有一個以上的依賴頂點那麼我們將如何把它放到同像服務器IsMountedOn存儲和服務器IsConnectedTo網絡查詢。 –

+0

在原始答案中增加了一個示例 –

+0

但我無法理解如何爲同一個服務器定義另一個3關係,如果正在執行{as:Server} -IsMountedOn - > {as:Storage} -IsConnectedTo - > {as :網絡}但它不起作用,因爲此網絡與服務器直接相關。 –