我有一个图表,其中有一个类别的层次结构(类似于购物网站上的产品类别,例如,服装-->男士-->衬衫-->短袖-->...)。我有几个用例,需要以树的形式检索整个层次结构(在本例中是嵌套的Ruby和/或Java脚本对象)。我能想到的唯一解决方案是使用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中处理此问题的正确方法是什么,而不需要多次返回服务器或像上面的查询那样进行大规模的数据获取?
3条答案
按热度按时间cwtwac6a1#
在Cypher中处理此问题的正确方法是什么,而不需要多次返回服务器或像上面的查询那样进行大规模的数据获取?
如果您有一个大的层次结构,您将有两个基本选择:一次获取层次结构的几个级别(必须返回到服务器以获取下一个块),或者可以像您正在做的那样获取整个内容。我没有看到第三种选择,所以如果没有这两个功能中的任何一个,很可能不可能得到一个大的层次结构。
你所做的似乎还可以,但如果没有进一步的澄清,你的问题似乎是不可能的。你目前正在做的事情有什么问题吗?您如何使用层次结构?为什么您需要一次全部使用它?例如,如果我在亚马逊上,他们有一个巨大的购物层次。通常他们只会先给我看顶级产品(男装、女装、电子产品)。然后,当我点击“电子”,他们会向我展示下一个层次(“电子书阅读器”、“计算机”等)。这是通常的做法,IMHO-多次访问数据库,一次访问层次结构的一个级别。这适合于在网页上使用树视图和AJAX调用。当用户展开树时,您回调服务器并填充子对象。
层次结构中的每个调用可能是:
如果这种增量方法(一次一个级别)不适用于您的用例,那么您将返回到获取全部内容,这将不可避免地是“一次大规模的数据获取”。
rjjhvcjd2#
我用这个查询解决了一个类似的问题:
这里,
s
是由其id标识的根节点。结果是一个表,其中包含每个节点及其id和其父节点的id。根节点的父ID为null
。使用这些信息重建层次结构应该不难。
cetgtptt3#
您可以使用toTree function from the apoc library
这将返回一个包含节点和关系的json。您还可以传递一个额外的配置参数来省略一些属性,但它不适用于我。