我有一个图表,其中有一个类别的层次结构(类似于购物网站上的产品类别,例如,服装 - >男装 - >衬衫 - >短袖 - > .. )。我有一些用例,我需要将整个层次结构检索为树(在这种情况下嵌套的ruby和/或javascript对象)。我能够提出的唯一解决方案是使用NODES()
检索每个唯一路径,然后将其转换为客户端中的嵌套对象。这显然是一个问题。
MATCH (store:Store),
(store)-[:hasCategory]->(category:Category),
categories=(category)-[:narrower*0..]->(:Category)
WHERE store.name = {name}
RETURN store, NODES(categories) AS categories
这将返回基本上是路径的结果行:
[store, [category1, narrower_category1, narrower_category2, ...]]
在cypher中处理此问题的正确方法是什么,无需多次返回服务器或大量提取数据,如上述查询?
答案 0 :(得分:3)
在没有多次旅行的情况下,在cypher中处理此问题的正确方法是什么 回到服务器或大量提取数据,如上述查询?
如果您有一个很大的层次结构,那么您将有两个基本选项:一次获得层次结构的几个级别(需要返回服务器以获取下一个块)或者您可以获取整个就像你在做的事情。我没有看到第三个选项,所以如果没有这些功能,可能无法获得大的层次结构。
你正在做的事似乎没问题,但如果没有进一步澄清你的问题似乎是不可能的。你目前在做什么有什么问题?你如何使用层次结构,为什么一次需要它?例如。如果我在亚马逊,他们有一个巨大的购物等级。通常他们只会向我展示最高级别(男装,女装,电子产品)。然后,当我点击电子产品时,他们会告诉我下一级(“电子书阅读器”,“电脑”等)。这通常是要走的路,恕我直言 - 多次前往数据库,一次一级层次结构。这有助于在网页上进行树视图和AJAX调用。当用户展开树时,您将AJAX回调到服务器,并填充子项。
层次结构中的每个调用可能都是:
MATCH (category:Category { id: "whatever user picked" })-[:narrower]->(children:Category)
RETURN children
ORDER BY children.name;
如果这种增量方法(一次一个级别)对您的用例不起作用,那么您将重新获取整个事物,这不可避免地将“一次大量提取数据”。
答案 1 :(得分:1)
我通过此查询解决了类似的问题:
MATCH p=((s)-[*0..]->(x))
where id(s)=3
return x,id(x),id(startNode(last(relationships(p))))
这里s
是由其ID标识的根节点。结果是一个包含每个节点,其ID和其父ID的表。根节点的父ID为null
。
使用此信息重建层次结构应该不难。