2016-08-14 79 views
0

所有Neo4j的文檔結構給出的節點像這樣的例子:Neo4j的性能

A -> B -> C (me -> friend -> friend_of_friend) 

然而,我的結構是一樣的東西:

A <- B -> C (product <- sales -> customer) 

凡銷售節點最重要的。但是,當我試圖找到這條路,neo4j需要時間,然後塊。

我可以擁有這樣的結構嗎?我能做些什麼來改善時間嗎?

@EDIT

創建銷售節點:

LOAD CSV WITH HEADERS FROM "file:///Sales" AS r FIELDTERMINATOR ' ' 
CREATE (:Sales {order: r.Order, orderLine: r.OrderLine, quantity: r.Quantity}); 
CREATE INDEX ON :Sales(order); 
CREATE INDEX ON :Sales(orderLine); 

創建產品節點:

LOAD CSV WITH HEADERS FROM "file:///Product" AS r FIELDTERMINATOR ' ' 
CREATE (:Product {productKey: r.ProductKey, color: r.Color}); 
CREATE INDEX ON :Product(productKey); 

創建客戶端節點:

LOAD CSV WITH HEADERS FROM "file:///Customer" AS r FIELDTERMINATOR ' ' 
CREATE (:Customer {customerKey: r.CustomerKey, firstName: r.FirstName}); 
CREATE INDEX ON :Customer(customerKey); 

關係:

LOAD CSV WITH HEADERS FROM "file:///Sales" AS r FIELDTERMINATOR ' ' 
MATCH (sales:Sales {order: r.Order, orderLine: r.OrderLine}) 
MATCH (customer:Customer{customerKey: r.CustomerKey}) 
MERGE (sales)-[:CUSTOMER]->(customer); 


LOAD CSV WITH HEADERS FROM "file:///Sales" AS r FIELDTERMINATOR ' ' 
MATCH (sales:Sales {order: r.Order, orderLine: r.OrderLine}) 
MATCH (product:Product {productKey: r.ProductKey}) 
MERGE (sales)-[:PRODUCT]->(product); 

我試圖做到這一點:

MATCH (p:Product) <- (s:Sales) -> (c:Customer) 
WHERE p.color = 'blue' 
RETURN p.productKey, p.color, s.order, c.customerKey 

PS:說實話,我的結構更加複雜。除了客戶和產品節點之外,我還有「日期」節點和「促銷」節點,所有節點都連接到銷售節點。

+0

您可以粘貼您使用的確切Cypher,並讓我們知道您創建的索引和約束? – InverseFalcon

+0

@InverseFalcon感謝您的回覆。我編輯我的帖子。 – user6712306

回答

0

感謝您添加詳細信息。

其他一些建議... PROFILE關鍵字在這裏非常有用,可以查看您的查詢在做什麼,因此您可以調整它。如果查詢沒有完成,請使用EXPLAIN而不是PROFILE。

我的第一個問題是如果你想在你的查詢中做任何聚合。現在,每條生產線都將具有產品,銷售和客戶的獨特組合:如果客戶是多個:客戶是a:Sale的客戶,則您將有多個相同的行:產品和銷售。同樣如果:產品,如果:產品可能涉及多個銷售。如果您需要進行某種聚合,例如獲取涉及產品銷售的客戶列表,則可能會減少您輸出的行數。

就性能提示而言,我會嘗試首先匹配您要應用約束的節點,然後再匹配其餘模式的匹配。另外,在模式匹配中使用關係類型。

PROFILE MATCH (p:Product) 
WHERE p.color = 'blue' 
WITH p 
MATCH (p)<-[:PRODUCT]-(s:Sales)-[:CUSTOMER]-> (c:Customer) 
RETURN p.productKey, p.color, s.order, c.customerKey 

試一試,如果速度太慢,請將您的PROFILE輸出添加到您的描述中(展開所有節點後)。

它也可能有助於找出返回的數據集的大小,所以你可能想要做RETURN COUNT(*)作爲最後一行。