2017-04-19 62 views
0

比方說,我的圖模型包含類型爲A的節點,它與同類型的其他節點具有父/子關係。如何用Neo4j OGM類型查詢過濾相關對象?

@NodeEntity(label = "A") 
class A { 
    @Relationship(type = "PARENT") 
    private A parent; 

    // other relations to different types 
    ... 

} 

我用下面的方法會執行復雜查詢(分頁,篩選,可選匹配等)

session.query(A.class, cypher, parameters) 

其中暗號說法是一樣的東西

MATCH (node:A) WHERE ... OPTIONAL MATCH ... RETURN node, ... ORDER BY node.id ASC LIMIT 100 

現在,我也想爲每個結果(也是類型A)獲取父節點。對於這一點,我伸出我的

MATCH (node:A) WHERE ... OPTIONAL MATCH parentRels=(node)-[parentRel:PARENT*1..]->(:A) RETURN node, collect(parentRel) ORDER BY node.id ASC LIMIT 100 

我天真地期望看到的查詢是我相同的對象列表A,其中每個父字段是很好的填充,直到根。 Neo4j返回的結果是正確的,但OGM返回的映射結果是無用的,因爲現在它不僅包含我感興趣的節點(父域正確填充,是),但所有父節點也最終結束在結果列表中!

所以我開始尋找隱藏的OGM特性,我可以指定結果列(上面的例子中的'節點')與感興趣的節點,但這似乎不可能。

唯一的解決方案,我看到的是:

  • 在單獨的查詢:(取父節點
  • 做映射自己:(:(
  • 獲取有關IDS基於一個單獨的查詢和過濾器上。

也許有人看到一個更好的解決方案?

回答

0

這樣做的原因是你的父母也符合你在query方法中通過的類型 - A.class

OGM無法知道您的實際想要的結果是什麼,因此將所有匹配的節點映射到結果 - 一行可能會導致結果列表中有2個或甚至更多的項目。 (請注意,有些人有相反的用例,實際上希望這種情況發生)。

您也可以手動收集結果列結果,只要你返回所有的關係和相關的節點將被正確映射:

Result result = session.query(cypher, parameters) 
for(Map<String, Object> map : result.queryResults()) { 
    (A) map.get("node"); // collect result manually to some collection 
} 

除了你列出你也可以

  • 爲父母提供不同的類型/標籤
  • 讓父母在您的會話中加載並返回唯一的節點和關係,而不是整個路徑 - 類似於RETURN node,parentRel而不是

您可能想在這裏填寫問題https://github.com/neo4j/neo4j-ogm/issues以獲得更好的解決方法。

+0

Thx爲您的答覆。使用不同的標籤是不行的,因爲我們真的在談論相同的節點類型。關於你的第二個選項,如果我只返回關係,那麼我將無法瀏覽我的節點afaik。我會填補一個問題,因爲這似乎並不是一個孤立的用例... – Christian

+0

https://github.com/neo4j/neo4j-ogm/issues/351 – Christian

+0

@Christian只記得還有另一種方式..見編輯回答 –