我对orientdb中的查询有些怀疑。我有以下情况:
示例:
Performs Uses RunsOn IsConnected
用户 - >过程 - >申请 - >服务器 - >网络
此处,用户/进程/应用程序/服务器/网络是顶点名称
执行/使用/ RunsOn / IsConnected是边缘名称/关系名称
osType / applicationName是相关Vertex的属性名称
现在,我希望根据输入获得所有相关的组合结果。如果输入类似于Server的osType和Application的applicationName,那么我想要所有与这两个输入相关的详细信息,例如user和process以及与此applicationName和osType相关的任何内容。
在orientdb中可以在单个查询中获取所有这些细节吗?
答案 0 :(得分: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
这仅适用于终端节点,即。只有一个连接的节点。