Neo4J,如何查询分层数据/ PHP

时间:2015-06-03 20:51:07

标签: php neo4j graph-databases neoxygen nosql

我在图形数据库“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

3 个答案:

答案 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
相关问题