1

作为新手,我坚持我的查询或数据库模型可能失败。我想在 neo4j 数据库中实现我的应用程序的菜单结构,以便从主/子菜单相关性中受益。

所以有 MAIN 和 SUB 选项,而 MAIN 可以有多个 SUB,但不能。

一个例子:

HOME (main)
ADMIN (main) - USER (sub)
DESK (main)  - EDIT (sub)
             - CREATE (sub)

阿苏

在创建节点时,我使用“is_parent”在 MAIN 和 SUB 节点之间建立关系。

所以我的第一个挑战是再次从数据库中找到读取结构并构建一个相关的数组来构建菜单结构。

我在尝试:

# Identify all Menu-Options of the main Menu
  $queryString = 'MATCH (main:MENU) RETURN main;';

  $query = new Everyman\Neo4j\Cypher\Query($client, $queryString);
  $result = $query->getResultSet();

  foreach ($result as $row) {
  # Echo for debug  
  echo '<hr>'.$row['main']->getProperty('name') . "<br>";
  $query_sub = '
    MATCH (main:MENU {name: "'.$row['main']->getProperty('name').'"})-[:is_parent]->sub:SUBMENU)
    RETURN sub;
    ';

  $query_sub = new Everyman\Neo4j\Cypher\Query($client, $query_sub);
  $result_sub = $query_sub->getResultSet();


  foreach ($result_sub as $row_sub) {
  # echo for debug
  echo 'SUB:'.$row_sub['sub']->getProperty('name') . "<br>";
}

}

但似乎我将每个菜单选项都加倍 - 好像我会遍历每个图表两次,因此我猜

a)要么我没有理解正确的查询(很可能这是我的第二次尝试) b)我的数据库模型不正确,也许我错过了另一个连接所有主菜单节点的父节点(现在它们没有连接,只有 SUB连接到相关的 MAIN)。

我使用 neo4jphp 连接到数据库。

每个提示都非常感谢。

谢谢!

PS:

我为数据制作了这个模式作为示例(顺便说一句。也许有一种方法可以使查询更紧凑?):

    create (home:MENU:MAIN { name: "HOME" })
    create (admin:MENU:MAIN { name: "ADMIN" })
    create (blog:MENU:MAIN { name: "BLOG" })
    create (support:MENU:MAIN { name: "SUPPORT" })

    create (user:MENU:SUB { name: "USER" })
    create (groups:MENU:SUB { name: "GROUPS" })
    create (local:MENU:SUB2 { name: "LOCAL" })
    create (extern:MENU:SUB2 { name: "EXTERN" })
    create (edit:MENU:SUB { name: "EDIT" })
    create (create:MENU:SUB { name: "CREATE" })
    create (delete:MENU:SUB { name: "DELETE" })

    CREATE (admin)-[:IS_PARENT]->(user)
    CREATE (admin)-[:IS_PARENT]->(groups)

    CREATE (groups)-[:IS_PARENT]->(local)
    CREATE (groups)-[:IS_PARENT]->(extern)


    CREATE (blog)-[:IS_PARENT]->(edit)
    CREATE (blog)-[:IS_PARENT]->(create)
    CREATE (blog)-[:IS_PARENT]->(delete)
  1. 所以有些节点不是通过关系连接的,而是用标签标记的。

  2. 当我使用下面的查询时,我会得到与子菜单相关的所有菜单选项。我将如何更改查询以获取所有主菜单选项(所以 SUPPORT 和 HOME 也是如此)以及 sub.menu-options 之类的

    m.name s.name m:MAIN

    ADMIN GROUPS true ADMIN USER true BLOG DELETE true BLOG CREATE true BLOG EDIT true HOME NULL true SUPPORT NULL true

在 SQL 中,我使用了 LEFT JOIN 之类的东西,但在 Cypher 中我不确定。OPTIONAL没有帮助,我猜还有其他方法吗?

4

1 回答 1

1

不确定您的数据是什么样的,您的子菜单是否也有 :MENU 标签?

我可能会用 :Menu 标记所有菜单节点,然后为 :Main 和 :Sub 添加一个附加标签

然后您可以一口气获取所有内容,即使是任意深度:

MATCH (m:Menu)-[:IS_PARENT]->(s:Sub)
RETURN m.name, s.name, m:Main

菜单、子菜单对的名称,如果 m 是主菜单,则为 true,否则为 false

MATCH (m:Main)
MATCH p = (m)-[:IS_PARENT*]->(s:Sub)
RETURN m.name, extract(n in tail(nodes(p)) | n.name) as menus
ORDER BY m.name ASC, length(p) asc

这个返回带有根菜单名称的根菜单中的所有路径,然后将所有子菜单名称作为一个数组,按根菜单名称和路径的升序排列

于 2014-11-01T20:38:02.683 回答