我在图形数据库“neo4j”中创建了一个类别结构。 我有节点和关系,一切都很完美。
我正在使用Neoxygen Neoclient for PHP来访问数据。如何从我的根元素中以有效的方式(包括结构)查询整个类别图?
MATCH (a:`Category`{category_id:0})-[r:HAS_CHILD*]->(b:`Category`)
RETURN b,r
我在PHP中的理想结构是: - 根 --- A类 --------子类别AB --- B类 --- C类 --------子类别CA. ----------------- Subsubcategory CAA ...
有什么想法吗?
提前致谢。
mr_g
答案 0 :(得分: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的所有节点。
目前,没有方法可以直接从节点对象获取连接的节点而无需先获得关系,也许我可以添加到客户端。
答案 1 :(得分:2)
Cypher返回表格数据,因此如果您想获得树层次结构,最有效的方法是将所有路径从根返回到树叶。路径是节点 - (关系 - 节点)*的集合/数组(即,它是奇数个对象,在每个端部始终包含具有交替节点和关系的节点)。以下是您将如何做到这一点的密码:
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结构是一个关联数组。
答案 2 :(得分: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