簡體   English   中英

SpringData Neo4j @Query 不填充 @Relationship 節點

[英]SpringData Neo4j @Query does not populate @Relationship Nodes

neo4j @Query 注釋的 Spring 數據不會填充由 @Relationship 注釋標記的任何子/父節點。

在 SpringData 存儲庫 class 中使用標准 @CrudRepository 或 @PagingAndSortingRepository 查詢時,子/父節點類將返回完整填充。

存儲庫接口

@Repository("trackerRepository")
public interface TrackerRepository extends PagingAndSortingRepository<Tracker, String> {

    Tracker findByTrackerId(@NotNull String trackerId);
}

節點 Class

public final class Tracker extends Node {

    @NotNull
    @JsonProperty("trackerId")
    private String trackerId;

    @NotNull
    @Relationship(type = "ASSIGNED_TO")
    @JsonProperty("asset")
    private Asset asset;

    @NotNull
    @Relationship(type = "ISSUED_BY")
    @JsonProperty("organization")
    private Organization organization;
}

使用 findByTrackerId 方法時,Spring 使用方法名稱/簽名生成的查詢完美運行,並返回完全填充的資產和組織節點。

但是,當使用 @Query 注釋而不是從方法簽名生成的 Spring 查詢時,@Relationship 節點不會與查詢響應一起返回。

存儲庫接口

@Repository("trackerRepository")
public interface TrackerRepository extends PagingAndSortingRepository<Tracker, String> {

    @Query("MATCH (tracker:Tracker) WHERE (tracker.trackerId = $trackerId) RETURN tracker")
    Tracker findByTrackerId(@NotNull @Param("trackerId") String trackerId);
}

是否可以配置標記有@Query 的存儲庫方法以加入由@Relationship 注釋定義的父/子節點?

使用 @Query 編寫自定義查詢時,您需要准確指定要返回的內容:

@Relationship(type = "ASSIGNED_TO")
@JsonProperty("asset")
private Asset asset;

@NotNull
@Relationship(type = "ISSUED_BY")
@JsonProperty("organization")
private Organization organization;

或者(我假設這是帶有 Spring 數據的 SDN 6,而不是 SDN 5 和 OGM?)您可以刪除自定義查詢並使用findByTrackerId的開箱即用 SPEL,存儲庫方法將創建一個自動Cypher 查詢由@Repository 方法無縫序列化。

一般來說,當需要編寫比 SDN 糖提供的更高效的查詢時,自定義 @Query 很有用。

但是要更直接地回答您的問題,這應該可行:

@Query("MATCH (tracker:Tracker {trackerId: $trackerId})
WITH tracker
OPTIONAL MATCH (tracker)-[r_issued_by:ISSUED_BY]->(organization:Organization)
WITH tracker, COLLECT(r_issued_by) AS organization_rels, COLLECT(DISTINCT organization) AS organizations 
OPTIONAL MATCH (tracker)-[r_assigned_to:ASSIGNED_TO]->(asset:Asset)
RETURN tracker, organization_rels, organizations, COLLECT(r_assigned_to) AS asset_rels, COLLECT(DISTINCT asset) AS assets;")

查看您的注釋,看起來ISSUED_BYASSIGNED_TO都是來自:Tracker的傳出關系?

收藏是因為:

https://community.neo4j.com/t/sdn-rx-dynamic-relationships-not-being-populated-with-custom-query/24456

@false_memories 說得對,但在這種情況下不需要WITH子句。 如果您只是使用 match 子句中的變量,則不需要WITH 僅當您以某種方式操作變量時才需要WITH

https://neo4j.com/docs/cypher-manual/current/clauses/with/#with-filter-on-aggregate-function-results

此外,您的@NotNull注釋似乎需要您的關系,因此您應該刪除OPTIONAL

所以稍微好一點的查詢是:

@Query("MATCH (tracker:Tracker {trackerId: $trackerId})
MATCH (tracker)-[r_issued_by:ISSUED_BY]->(organization:Organization)
MATCH (tracker)-[r_assigned_to:ASSIGNED_TO]->(asset:Asset)
RETURN tracker,
  COLLECT(r_issued_by), COLLECT(organization) AS organization,
  COLLECT(r_assigned_to), COLLECT(asset) AS asset")

我喜歡將as子句與我的實際關系名稱相匹配,因為它在查看原始結果時看起來更清晰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM