簡體   English   中英

為什么此查詢的計數超出預期? (密碼/ neo4j)?

[英]Why is this query increasing count by more than expected? (cypher/neo4j)?

我將術語節點連接到內容節點,並執行一個查詢,該查詢意在將內容節點與這些術語節點的連接更新。

首先,我減少了最初附加的每個術語節點的已連接內容節點的數量,然后刪除了關系。

之后,我為所有指定的術語節點創建了一個新關系,嘗試將每個新連接的術語節點的連接內容節點的數量增加一個。

問題是,查詢運行后,連接的內容節點的數量不會增加一個,而是會增加看起來像所連接的新術語節點總數的數量。

似乎我仍然無法准確掌握如何在查詢后處理數據。 我懷疑答案可能像以前卡住時那樣處理連接節點的計數。

這是查詢:

    var query = [
    "MATCH  (contentNode:content {UUID: {contentID} })-[r:TAGGED_WITH]->(oldTermNode:term) ",
    "SET oldTermNode.contentConnections = oldTermNode.contentConnections - 1 ",
    "DELETE r ",
    "WITH contentNode ",
    "MATCH (newTermNode:term) ",
    "WHERE newTermNode.UUID IN {termIDs} ",
    "CREATE UNIQUE contentNode-[:TAGGED_WITH]->newTermNode ",
    "SET newTermNode.contentConnections = newTermNode.contentConnections + 1 ",
].join('\n'); 

作為附帶的問題,在更新術語時,通常許多新術語與舊術語相同(用戶僅添加/刪除一個或兩個術語,其余保持不變)。 如果僅刪除了不會重新連接的關系,然后僅添加了新的術語,這是否更有意義/性能更快?

非常感謝。

我已經修改了您的查詢,使其可以正常工作,因為您已經描述了它應該可以正常工作。 我所做的是將您的術語收集到一個單獨的集合中,並遍歷每個節點以增加和減少其連接計數。 從理論上講,這應該可行,但是我建議您采取其他預防措施,以保持術語節點上關系計數的一致性。

我假設每個術語可能具有無界的連接,並且計算每個術語的開銷,然后計算連接數,然后將其設置為節點的權重,這在計算上是昂貴的。

MATCH  (contentNode:content {UUID: "1234" })-[r:TAGGED_WITH]->(oldTermNode:term)
WITH contentNode, collect(r) as oldRels, collect(DISTINCT oldTermNode) as oldTermNodes
FOREACH (oldTermNode in oldTermNodes | 
    SET oldTermNode.contentConnections = oldTermNode.contentConnections - 1)
FOREACH (r in oldRels | DELETE r)
WITH contentNode
MATCH (newTermNode:term)
WHERE newTermNode.UUID IN ["1112", "1113"]
CREATE UNIQUE (contentNode)-[:TAGGED_WITH]->(newTermNode)
WITH collect(DISTINCT newTermNode) as newTermNodes
FOREACH (newTermNode in newTermNodes |
    SET newTermNode.contentConnections = newTermNode.contentConnections + 1)

您需要重新插入參數,我為實際測試構建了此代碼示例,以確保它能正常工作。

作為附帶的問題,在更新術語時,通常許多新術語與舊術語相同(用戶僅添加/刪除一個或兩個術語,其余保持不變)。 如果僅刪除了不會重新連接的關系,然后僅添加了新的術語,這是否更有意義/性能更快?

您可以通過指定只希望不在newTermNode集合中的oldTermNodes來修改查詢。 因此,是的,為回答您的問題,這將防止不必要的寫入,從而提高性能。 您只需要確保從newTermNodes集合中刪除任何冗余術語,以使腳本最后一行中的這些術語的contentConnections不會增加。

這不會直接回答您的問題,但是我想知道您的條款是否真的需要有一個'contentConnections'屬性。 如果沒有,那么您原來的問題就沒有意義了。

僅基於您問題的信息,看來term.contentConnections值只是對:TAGGED_WITH關系所指向的術語的次數的計數。 如果是這種情況,那么您應該能夠獲得類似以下內容的等效計數:

MATCH ()-[:TAGGED_WITH]->(t:term {UUID:{termId}}) RETURN count(t);

如果您為術語節點的UUID屬性創建一個索引(或者可能更好,一個唯一性約束),那么該查詢將非常快。 如果這對您有用,則可以簡化並加快其他查詢的速度,因為無需維護contentConnections值。

例如,您的原始查詢可以簡化為:

var query = [
    "MATCH  (contentNode:content {UUID: {contentID} })-[r:TAGGED_WITH]->(oldTermNode:term) ",
    "DELETE r ",
    "WITH contentNode ",
    "MATCH (newTermNode:term) ",
    "WHERE newTermNode.UUID IN {termIDs} ",
    "CREATE UNIQUE contentNode-[:TAGGED_WITH]->newTermNode ",
].join('\n');

暫無
暫無

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

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