CYPHER:NEO4JPHP避免双重结果(DB布局问题?)

CYPHER:NEO4JPHP避免双重结果(DB布局问题?),neo4j,cypher,neo4jphp,Neo4j,Cypher,Neo4jphp,作为新手,我在查询或DB模型上遇到了一个可能的故障。我想在neo4j数据库中实现我的应用程序的菜单结构,以便从主/子菜单关联中获益 因此,有主选项和子选项,而主选项可以有几个子选项,但不能有 例如: HOME (main) ADMIN (main) - USER (sub) DESK (main) - EDIT (sub) - CREATE (sub) a、 s.o 在创建节点时,我使用“is_parent”在主节点和子节点之间建立关系 因此,我的第一个挑战是再次从

作为新手,我在查询或DB模型上遇到了一个可能的故障。我想在neo4j数据库中实现我的应用程序的菜单结构,以便从主/子菜单关联中获益

因此,有主选项和子选项,而主选项可以有几个子选项,但不能有

例如:

HOME (main)
ADMIN (main) - USER (sub)
DESK (main)  - EDIT (sub)
             - CREATE (sub)
a、 s.o

在创建节点时,我使用“is_parent”在主节点和子节点之间建立关系

因此,我的第一个挑战是再次从数据库中查找并读取结构,然后构建一个相关数组来构造菜单结构

我试着:

# 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>";
}
  • 因此,有些节点不是通过关系连接的,而是通过标签标记的

  • 当我使用下面的查询时,我会得到与子菜单相关的所有菜单选项。如何更改查询以获得所有主菜单选项(支持和主菜单)和子菜单选项,如

    m、 姓名s.name m:MAIN 管理组正确 管理员用户真 博客删除为真 博客创造真实 博客编辑真实 HOME NULL true 支持NULL-true


  • 在SQL中,我使用了类似于左连接的东西,但在Cypher中,我不确定。可选没有帮助,我想还有另一种方法吗?

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

    我可能会用: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
    
    这个函数返回根菜单中的所有路径 使用根菜单名,然后将所有子菜单名作为数组
    按根菜单名和路径上升长度排序

    你好,Michael,非常感谢您的帮助。我已经在我的问题中添加了菜单数据的测试用例(感谢第二个子标签的提示),现在我正在尝试获取所有主菜单选项和相关子选项-任何提示都非常感谢。非常感谢。这取决于您对选项的建模方式,无论是作为菜单项上的数组属性还是作为完整节点,在后一种情况下,您只需使用
    OPTIONAL match(s)-[:OPTIONS]->(o:option)
    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