CYPHER:NEO4JPHP避免双重结果(DB布局问题?)
作为新手,我在查询或DB模型上遇到了一个可能的故障。我想在neo4j数据库中实现我的应用程序的菜单结构,以便从主/子菜单关联中获益 因此,有主选项和子选项,而主选项可以有几个子选项,但不能有 例如: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”在主节点和子节点之间建立关系 因此,我的第一个挑战是再次从
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>";
}
在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