2015-06-03 54 views
1

我在圖形數據庫「neo4j」中創建了一個類別結構。 我有節點和關係,一切都很完美。Neo4J,如何查詢分層數據/ PHP

我正在使用Neoxygen Neoclient for PHP來訪問數據。我如何從根元素中以有效的方式(包括結構)查詢整個類別圖?

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

在PHP我的所需結構是: - 根 --- A類 --------子類別AB --- B類 --- C類 --- -----子類別CA -----------------子類CAA ...

任何想法?

在此先感謝。

mr_g

回答

1

所以,如果你想獲得一個樹狀分層結構的最有效的方法是從根到葉返回所有路徑 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結構是一個關聯數組。

+0

NeoClient利用了圖形結果數據的內容,所以能夠容易地重新映射在PHP對象樹形結構 –

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(); 
} 

$節點擁有現在所有深度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