1

我在图形数据库“neo4j”中创建了一个类别结构。我有节点和关系,一切都很完美。

我正在使用 Neoxygen Neoclient for PHP 来访问数据。如何从我的根元素以有效的方式(包括结构)查询整个类别图?

MATCH (a:`Category`{category_id:0})-[r:HAS_CHILD*]->(b:`Category`)
RETURN b,r

我在 PHP 中想要的结构是: - Root --- Category A -------- Subcategory AB --- Category B --- Category C -------- Subcategory CA ------ ----------- 子类别 CAA ...

有任何想法吗?

提前致谢。

mr_g

4

3 回答 3

3

在 Neoxygen 的 NeoClient 中是完全可行和用户友好的。

首先要确保的是,您激活了响应格式化程序:

$client = ClientBuilder::create()
   ->setAutoFormatResponse(true)
   ->addConnection(xxx...)
   ->build();

其次,关于您的查询,我肯定会设置一个深度限制,以避免根据您的图形连接性的记忆行为:

MATCH (a:`Category`{category_id:0})-[r:HAS_CHILD*..20]->(b:`Category`)
RETURN b,r

然后,您可以将其与客户端一起发送,并受益于客户端将结果重新映射到图形结构中:

$query = 'MATCH (a:`Category`{category_id:{id}})-[r:HAS_CHILD*..20]->(b:`Category`)'
RETURN b,r';
$children = $client->sendCypherQuery($q, ['id'=>0])->getResult()->getNodes();

现在,每个节点都会知道他拥有什么,因为关系和关系都知道它们的开始和结束节点,例如:

$children是第一深度的节点,所以

$rels = $children->getOutboundRelationships();
$nodes = [];
foreach ($rels as $rel) {
  $nodes[] = $rel->getEndNode();
}

$nodes 现在包含深度为 2 的所有节点。

目前,没有方法可以直接从节点对象获取连接的节点,而无需先获取关系,也许我可以添加到客户端。

于 2015-06-03T21:32:31.093 回答
2

Cypher 返回表格数据,因此如果您想获得树层次结构,最有效的方法是返回从根到叶的所有路径。路径是 node-(relationship-node)* 的集合/数组(即它是奇数个对象,总是在每一端包含一个节点,并具有交替的节点和关系)。这是您如何执行此操作的密码:

MATCH path(a:`Category`{category_id:0})-[r:HAS_CHILD*]->(b:`Category`)
WHERE NOT(b-[:HAS_CHILD]->())
RETURN b,r

WHERE子句确保您只返回叶子的所有路径。您可以返回树中的所有类别,这也会为您提供部分路径,但所有这些部分路径都包含在一些较长的路径中,因此您最终会返回比您需要的更多的数据。

一旦你有了路径(我不确定它们在 Neoclient 中显示的形式,因为我不是 PHP 人)你可以根据结果在内存中构建分层数据结构。如果我没记错的话,PHP 中的 map/dictionary-type 结构是一个关联数组。

于 2015-06-03T21:25:39.110 回答
0

架构:

Indexes
  ON :Category(category_id)   ONLINE (for uniqueness constraint) 

Constraints
  ON (category:Category) ASSERT category.category_id IS UNIQUE

询问:

MATCH(c:Category) RETURN c
于 2015-06-07T10:17:14.353 回答