2017-08-26 273 views
0

我有以下的Cypher查詢:眼下Neo4j的SDN4實體繼承和索引

PROFILE MATCH (childD:Decision) 
WITH childD 
ORDER BY childD.createDate 
DESC SKIP 0 LIMIT 10 
MATCH (childD:Decision)-[ru:CREATED_BY]->(u:User) 
OPTIONAL MATCH (childD:Decision)-[rup:UPDATED_BY]->(up:User) 
RETURN ru, u, rup, up, childD AS decision, [ (childD)-[rdt:BELONGS_TO]->(t:Tag) | t ] AS tags 

在我的Neo4j數據庫(〜23K決策節點)這個查詢的工作〜50毫秒,我不明白,或者使用索引childD.createDate字段。

這是PROFILE輸出:

enter image description here

這是我的SDN 4個實體:

@NodeEntity 
public abstract class BaseEntity implements BaseEntityVisitable { 

    private static final String CREATED_BY = "CREATED_BY"; 
    private static final String UPDATED_BY = "UPDATED_BY"; 

    @GraphId 
    private Long graphId; 

    @Index(unique = false) 
    private Date createDate; 

    @Relationship(type = CREATED_BY, direction = Relationship.OUTGOING) 
    private User createUser; 

    @Index(unique = false) 
    private Date updateDate; 

    @Relationship(type = UPDATED_BY, direction = Relationship.OUTGOING) 
    private User updateUser; 

.... 

} 

@NodeEntity 
public class Decision extends BaseEntity { 

    private static final String BELONGS_TO = "BELONGS_TO"; 
    private static final String CONTAINS = "CONTAINS"; 
    private static final String DEFINED_BY = "DEFINED_BY"; 

    @Index(unique = true) 
    private Long id; 

    @Index(unique = false) 
    private String name; 

.... 

} 

這是:schema輸出:

Indexes 
    ON :BaseEntity(createDate) ONLINE 
    ON :BaseEntity(updateDate) ONLINE 

    ON :Decision(lowerName) ONLINE 
    ON :Decision(name) ONLINE 
    ON :Decision(totalChildDecisions) ONLINE 
    ON :Decision(totalViews) ONLINE 

    ON :Decision(id) ONLINE (for uniqueness constraint) 

請注意,createDate指標被設定在:BaseEntity而不是:Decision

熱,以檢查該指數的作品(或沒有),在查詢這部分:ORDER BY childD.createDate

回答

1

我想你混淆了指數排序訂單。沒有任何理由說這個查詢會使用索引,因爲你沒有給它任何值來搜索索引。這可能是索引實現有順序的日期,但沒有規則說這必須是這樣的(顯然,查詢不使用索引對Decision節點進行排序)。

希望這會有所幫助。

Regards, Tom

+0

感謝您的回答。還有一個關於SDN 4繼承和Neo4j索引的問題 - 例如下面的查詢:MATCH(childD:Decision {name:'Andres'})RETURN childD'它會使用索引來聲明在SDN 4'BaseEntity'處聲明的'name'在'Decision'(其中'Decision extends BaseEntity')直接? – alexanoid

+0

如果您的模式具有該特定標籤的特定索引(就像您發佈的內容一樣),MATCH將使用該索引。我對SDN4並不知情(所以我不確定你是如何創建模式的)......但模式中的內容會覆蓋代碼中的任何內容。 –

+0

100%清除 - 如果我的決定節點有兩個標籤 - 「:BaseEntity」和「:Decision」,所以在這種情況下,如果我有索引':BaseEntity(createDate)',我使用'MATCH(d:Decision )WHERE d.createDate = {createDate}'所以這個索引將被使用? – alexanoid