2017-05-06 40 views
1

我創建了一個Cypher查詢動態構建器。對於複雜的情況下,這種生成器產生相當大的疑問,例如:Neo4j Cypher查詢結構和性能優化

MATCH (parentD)-[:CONTAINS]->(childD:Decision)-[ru:CREATED_BY]->(u:User) 
WHERE id(parentD) = {decisionId} 
MATCH (childD)<-[:SET_FOR]-(filterValue415431:Value)-[:SET_ON]->(filterCharacteristic415431:Characteristic) 
WHERE id(filterCharacteristic415431) = 415431 
WITH filterValue415431, childD, ru, u 
WHERE ({filterValue4154311} IN filterValue415431.value) 
OR ({filterValue4154312} IN filterValue415431.value) 
OR ({filterValue4154313} IN filterValue415431.value) 
OR ({filterValue4154314} IN filterValue415431.value) 
OR ({filterValue4154315} IN filterValue415431.value) 
MATCH (childD)<-[:SET_FOR]-(filterValue415441:Value)-[:SET_ON]->(filterCharacteristic415441:Characteristic) 
WHERE id(filterCharacteristic415441) = 415441 
WITH filterValue415441, childD, ru, u 
WHERE ({filterValue4154416} IN filterValue415441.value) 
OR ({filterValue4154417} IN filterValue415441.value) 
OR ({filterValue4154418} IN filterValue415441.value) 
OR ({filterValue4154419} IN filterValue415441.value) 
OR ({filterValue41544110} IN filterValue415441.value) 
OR ({filterValue41544111} IN filterValue415441.value) 
OR ({filterValue41544112} IN filterValue415441.value) 
OR ({filterValue41544113} IN filterValue415441.value) 
OR ({filterValue41544114} IN filterValue415441.value) 
OR ({filterValue41544115} IN filterValue415441.value) 
OR ({filterValue41544116} IN filterValue415441.value) 
OR ({filterValue41544117} IN filterValue415441.value) 
MATCH (childD)<-[:SET_FOR]-(filterValue416273:Value)-[:SET_ON]->(filterCharacteristic416273:Characteristic) 
WHERE id(filterCharacteristic416273) = 416273 
WITH filterValue416273, childD, ru, u 
WHERE (filterValue416273.value >= {filterValue41627318}) 
AND (filterValue416273.value <= {filterValue41627319}) 
MATCH (childD)<-[:SET_FOR]-(filterValue417410:Value)-[:SET_ON]->(filterCharacteristic417410:Characteristic) 
WHERE id(filterCharacteristic417410) = 417410 
WITH filterValue417410, childD, ru, u 
MATCH (childD)<-[:SET_FOR]-(filterValue416423:Value)-[:SET_ON]->(filterCharacteristic416423:Characteristic) 
WHERE id(filterCharacteristic416423) = 416423 
WITH filterValue416423, childD, ru, u 
WHERE ({filterValue41642320} IN filterValue416423.value) 
OR ({filterValue41642321} IN filterValue416423.value) 
OR ({filterValue41642322} IN filterValue416423.value) 
OR ({filterValue41642323} IN filterValue416423.value) 
MATCH (childD)<-[:SET_FOR]-(filterValue415673:Value)-[:SET_ON]->(filterCharacteristic415673:Characteristic) 
WHERE id(filterCharacteristic415673) = 415673 
WITH filterValue415673, childD, ru, u 
WHERE ({filterValue41567324} IN filterValue415673.value) 
OR ({filterValue41567325} IN filterValue415673.value) 
OR ({filterValue41567326} IN filterValue415673.value) 
OR ({filterValue41567327} IN filterValue415673.value) 
OR ({filterValue41567328} IN filterValue415673.value) 
OR ({filterValue41567329} IN filterValue415673.value) 
OR ({filterValue41567330} IN filterValue415673.value) 
OR ({filterValue41567331} IN filterValue415673.value) 
OR ({filterValue41567332} IN filterValue415673.value) 
OR ({filterValue41567333} IN filterValue415673.value) 
OR ({filterValue41567334} IN filterValue415673.value) 
OR ({filterValue41567335} IN filterValue415673.value) 
OR ({filterValue41567336} IN filterValue415673.value) 
OR ({filterValue41567337} IN filterValue415673.value) 
OR ({filterValue41567338} IN filterValue415673.value) 
OR ({filterValue41567339} IN filterValue415673.value) 
OPTIONAL MATCH (childD)<-[:VOTED_FOR]-(vg:VoteGroup)-[:VOTED_ON]->(c:Criterion) 
WHERE id(c) IN {criteriaIds} 
WITH childD, ru, u, vg.avgVotesWeight as weight, vg.totalVotes as totalVotes 
WITH ru, u, childD , toFloat(sum(weight)) as weight, toInt(sum(totalVotes)) as totalVotes 
ORDER BY weight DESC 
SKIP 0 LIMIT 10 
RETURN ru, u, childD AS decision, weight, totalVotes, 
[ (parentD)<-[:DEFINED_BY]-(entity)<-[:COMMENTED_ON]-(comg:CommentGroup)-[:COMMENTED_FOR]->(childD) | 
    {entityId: id(entity), types: labels(entity), totalComments: toInt(comg.totalComments)} ] AS commentGroups, 
[ (parentD)<-[:DEFINED_BY]-(c1:Criterion)<-[:VOTED_ON]-(vg1:VoteGroup)-[:VOTED_FOR]->(childD) | 
    {criterionId: id(c1), weight: vg1.avgVotesWeight, totalVotes: toInt(vg1.totalVotes)} ] AS weightedCriteria, 
[ (parentD)<-[:DEFINED_BY]-(ch1:Characteristic)<-[:SET_ON]-(v1:Value)-[:SET_FOR]->(childD) | 
    {characteristicId: id(ch1), value: v1.value, valueType: ch1.valueType, visualMode: ch1.visualMode} ] AS valuedCharacteristics 

現在我不是很滿意的性能。例如,對這個查詢的請求需要〜500ms

請你看一看,並告訴是否有機會改善此查詢?

修訂

這是一個幾乎相同的查詢,但使用不同的參數:

MATCH (parentD)-[:CONTAINS]->(childD:Decision)-[ru:CREATED_BY]->(u:User) 
WHERE id(parentD) = 415406 
MATCH (childD)<-[:SET_FOR]-(filterValue416423:Value)-[:SET_ON]->(filterCharacteristic416423:Characteristic) 
WHERE id(filterCharacteristic416423) = 416423 
WITH filterValue416423, childD, ru, u 
WHERE ('Adobe RGB' IN filterValue416423.value) OR ('ECI RGB' IN filterValue416423.value) 
MATCH (childD)<-[:SET_FOR]-(filterValue416273:Value)-[:SET_ON]->(filterCharacteristic416273:Characteristic) 
WHERE id(filterCharacteristic416273) = 416273 WITH filterValue416273, childD, ru, u 
WHERE (filterValue416273.value >= 4) AND (filterValue416273.value <= 53) 
MATCH (childD)<-[:SET_FOR]-(filterValue415431:Value)-[:SET_ON]->(filterCharacteristic415431:Characteristic) 
WHERE id(filterCharacteristic415431) = 415431 WITH filterValue415431, childD, ru, u 
WHERE ('Compact' IN filterValue415431.value) 
    OR ('Compact SLR' IN filterValue415431.value) 
    OR ('Large SLR' IN filterValue415431.value) 
    OR ('Rangefinder-style mirrorless' IN filterValue415431.value) 
    OR ('SLR-like (bridge)' IN filterValue415431.value) 
MATCH (childD)<-[:SET_FOR]-(filterValue415441:Value)-[:SET_ON]->(filterCharacteristic415441:Characteristic) 
WHERE id(filterCharacteristic415441) = 415441 WITH filterValue415441, childD, ru, u 
WHERE ('Brass' IN filterValue415441.value) 
    OR ('Carbon fiber' IN filterValue415441.value) 
    OPTIONAL MATCH (childD)<-[:VOTED_FOR]-(vg:VoteGroup)-[:VOTED_ON]->(c:Criterion) 
WHERE id(c) IN [415414, 415415, 415412, 415426, 415411] 
WITH childD, ru, u, vg.avgVotesWeight as weight, vg.totalVotes as totalVotes 
WITH ru, u, childD , toFloat(sum(weight)) as weight, toInt(sum(totalVotes)) as totalVotes 
ORDER BY weight DESC 
SKIP 0 LIMIT 10 
RETURN ru, u, childD AS decision, weight, totalVotes, 
[ (parentD)<-[:DEFINED_BY]-(entity)<-[:COMMENTED_ON]-(comg:CommentGroup)-[:COMMENTED_FOR]->(childD) | 
    {entityId: id(entity), types: labels(entity), totalComments: toInt(comg.totalComments)} ] AS commentGroups, 
[ (parentD)<-[:DEFINED_BY]-(c1:Criterion)<-[:VOTED_ON]-(vg1:VoteGroup)-[:VOTED_FOR]->(childD) | 
    {criterionId: id(c1), weight: vg1.avgVotesWeight, totalVotes: toInt(vg1.totalVotes)} ] AS weightedCriteria, 
[ (parentD)<-[:DEFINED_BY]-(ch1:Characteristic)<-[:SET_ON]-(v1:Value)-[:SET_FOR]->(childD) | 
    {characteristicId: id(ch1), value: v1.value, valueType: ch1.valueType, visualMode: ch1.visualMode} ] AS valuedCharacteristics 

暗號版本:3.1 CYPHER,規劃師:成本,運行時間:解釋。 646192總分貝命中390毫秒。

enter image description here

修訂

這是:schema

Indexes 
    ON :Characteristic(lowerName) ONLINE 
    ON :CharacteristicGroup(lowerName) ONLINE 
    ON :Criterion(lowerName) ONLINE 
    ON :CriterionGroup(lowerName) ONLINE 
    ON :Decision(lowerName) ONLINE 
    ON :FlagType(name) ONLINE (for uniqueness constraint) 
    ON :HistoryValue(originalValue) ONLINE 
    ON :Permission(code) ONLINE (for uniqueness constraint) 
    ON :Role(name) ONLINE (for uniqueness constraint) 
    ON :User(email) ONLINE (for uniqueness constraint) 
    ON :User(username) ONLINE (for uniqueness constraint) 
    ON :Value(value) ONLINE 

Constraints 
    ON (flagtype:FlagType) ASSERT flagtype.name IS UNIQUE 
    ON (permission:Permission) ASSERT permission.code IS UNIQUE 
    ON (role:Role) ASSERT role.name IS UNIQUE 
    ON (user:User) ASSERT user.email IS UNIQUE 
    ON (user:User) ASSERT user.username IS UNIQUE 

的更新輸出

我已經優化了查詢作爲在下面的答案提示:

MATCH (parentD)-[:CONTAINS]->(childD:Decision) 
WHERE id(parentD) = 415406 
MATCH (childD)<-[:SET_FOR]-(filterValue416423)-[:SET_ON]->(filterCharacteristic416423) 
WHERE id(filterCharacteristic416423) = 416423 
WITH DISTINCT filterValue416423, childD 
WHERE ('Adobe RGB' IN filterValue416423.value) OR ('ECI RGB' IN filterValue416423.value) 
MATCH (childD)<-[:SET_FOR]-(filterValue416273)-[:SET_ON]->(filterCharacteristic416273) 
WHERE id(filterCharacteristic416273) = 416273 
WITH DISTINCT childD, filterValue416273 
WHERE (filterValue416273.value >= 4) AND (filterValue416273.value <= 53) 
MATCH (childD)<-[:SET_FOR]-(filterValue415431)-[:SET_ON]->(filterCharacteristic415431) 
WHERE id(filterCharacteristic415431) = 415431 
WITH DISTINCT childD, filterValue415431 
WHERE ('Compact' IN filterValue415431.value) 
    OR ('Compact SLR' IN filterValue415431.value) 
    OR ('Large SLR' IN filterValue415431.value) 
    OR ('Rangefinder-style mirrorless' IN filterValue415431.value) 
    OR ('SLR-like (bridge)' IN filterValue415431.value) 
MATCH (childD)<-[:SET_FOR]-(filterValue415441)-[:SET_ON]->(filterCharacteristic415441) 
WHERE id(filterCharacteristic415441) = 415441 
WITH DISTINCT childD, filterValue415441 
WHERE ('Brass' IN filterValue415441.value) 
    OR ('Carbon fiber' IN filterValue415441.value) 
    OPTIONAL MATCH (childD)<-[:VOTED_FOR]-(vg:VoteGroup)-[:VOTED_ON]->(c:Criterion) 
WHERE id(c) IN [415414, 415415, 415412, 415426, 415411] 

WITH DISTINCT * MATCH (childD)-[ru:CREATED_BY]->(u:User) 
WITH DISTINCT childD, ru, u, vg.avgVotesWeight as weight, vg.totalVotes as totalVotes 
WITH DISTINCT ru, u, childD , toFloat(sum(weight)) as weight, toInt(sum(totalVotes)) as totalVotes 
ORDER BY weight DESC 
SKIP 0 LIMIT 10 
RETURN ru, u, childD AS decision, weight, totalVotes, 
[ (parentD)<-[:DEFINED_BY]-(entity)<-[:COMMENTED_ON]-(comg:CommentGroup)-[:COMMENTED_FOR]->(childD) | 
    {entityId: id(entity), types: labels(entity), totalComments: toInt(comg.totalComments)} ] AS commentGroups, 
[ (parentD)<-[:DEFINED_BY]-(c1:Criterion)<-[:VOTED_ON]-(vg1:VoteGroup)-[:VOTED_FOR]->(childD) | 
    {criterionId: id(c1), weight: vg1.avgVotesWeight, totalVotes: toInt(vg1.totalVotes)} ] AS weightedCriteria, 
[ (parentD)<-[:DEFINED_BY]-(ch1:Characteristic)<-[:SET_ON]-(v1)-[:SET_FOR]->(childD) | 
    {characteristicId: id(ch1), value: v1.value, valueType: ch1.valueType, visualMode: ch1.visualMode} ] AS valuedCharacteristics 

PROFILE輸出:

enter image description here

隨着DISTINCT childD的查詢工作很慢,沒有要好得多,但還是老樣子如此完美

一個更深遠嘗試

PROFILE MATCH (parentD)-[:CONTAINS]->(childD:Decision) 
WHERE id(parentD) = 415406 
MATCH (childD)<-[:SET_FOR]-(filterValue416423)-[:SET_ON]->(filterCharacteristic416423) 
USING JOIN ON childD 
WHERE id(filterCharacteristic416423) = 416423 
AND ('Adobe RGB' IN filterValue416423.value) OR ('ECI RGB' IN filterValue416423.value) 
WITH DISTINCT childD 
MATCH (childD)<-[:SET_FOR]-(filterValue416273)-[:SET_ON]->(filterCharacteristic416273) 
USING JOIN ON childD 
WHERE id(filterCharacteristic416273) = 416273 AND (filterValue416273.value >= 4) AND (filterValue416273.value <= 53) 
WITH DISTINCT childD 
MATCH (childD)<-[:SET_FOR]-(filterValue415431)-[:SET_ON]->(filterCharacteristic415431) 
USING JOIN ON childD 
WHERE id(filterCharacteristic415431) = 415431 
AND ('Compact' IN filterValue415431.value) 
    OR ('Compact SLR' IN filterValue415431.value) 
    OR ('Large SLR' IN filterValue415431.value) 
    OR ('Rangefinder-style mirrorless' IN filterValue415431.value) 
    OR ('SLR-like (bridge)' IN filterValue415431.value) 
WITH DISTINCT childD 
MATCH (childD)<-[:SET_FOR]-(filterValue415441)-[:SET_ON]->(filterCharacteristic415441) 
USING JOIN ON childD 
WHERE id(filterCharacteristic415441) = 415441 
AND ('Brass' IN filterValue415441.value) 
    OR ('Carbon fiber' IN filterValue415441.value) 

OPTIONAL MATCH (childD)<-[:VOTED_FOR]-(vg:VoteGroup)-[:VOTED_ON]->(c:Criterion) 
WHERE id(c) IN [415414, 415415, 415412, 415426, 415411] 

WITH DISTINCT * MATCH (childD)-[ru:CREATED_BY]->(u:User) 
WITH DISTINCT childD, ru, u, vg.avgVotesWeight as weight, vg.totalVotes as totalVotes 
WITH DISTINCT ru, u, childD , toFloat(sum(weight)) as weight, toInt(sum(totalVotes)) as totalVotes 
ORDER BY weight DESC 
SKIP 0 LIMIT 10 
RETURN childD 

enter image description here

+1

在您上運行配置文件查詢併發布更好回答的響應 –

+0

您可以在瀏覽器中執行時設置查詢參數。有關使用信息,請嘗試':help param'和':help params'。 – InverseFalcon

+0

請花一些時間格式化您的查詢。所有這些在一條線上是不可讀的。 – InverseFalcon

回答

2

您的查詢的主要問題是,您基本上正在執行大量檢查,行數很大。所以這裏有一些技巧來減少你在每個MATCH中產生的行數。

1)除非你需要重複,否則使用WITH DISTINCT而不是WITH。 WITH可以創建重複的行(因爲您只切斷一列),並且您處理的每個重複行都浪費時間和額外的數據庫命中。 (即,您放下的每個過濾器列都會添加重複行)

2):Value.value被重載。它沒有語義意義,價值甚至不保證是任何類型的。這意味着每一個:值檢查必須走出去,並觸及一堆:與您的搜索無關的價值節點。因此,隨着附加數量的增加:價值節點越多,找到合適的節點就越昂貴(如果它可以被索引,那麼它就會更便宜,這樣它就可以找到正確的值:並看看它與什麼連接。如果你不能改變你正在使用的模式,並且模式,我的意思是你的數據/關係是如何設置的,這沒有幫助。

3)只檢查你需要檢查。 (a:A) - [:TO] - >(b:B)似乎更有效,但是如果所有[:TO]都來自:A到:B,Neo4j現在必須驗證第一個節點是答:A和第二個節點是:B。 Cypher並不知道什麼是隱含的,所以它必須執行檢查,但是每一個冗餘檢查都必須出去並且擊中每一行的數據庫。所以最好說(a) - [:TO] - >(b)。

4)限制變量範圍。在這裏,你匹配 - [ru:CREATED_BY] - >(u:用戶)在開始,但不要使用它,直到結束,沒有過濾器。這會使您在每個決策中將您擁有的行數乘以 - [ru:CREATED_BY] - >(u:User)的數量,以確保所有行都必須在進一步匹配中進行檢查。除非 - [ru:CREATED_BY] - >(u:用戶)以某種方式極大地限制了匹配的決策(或者每個決策只能有一個決策),否則在最後匹配這些支持信息。

5)從最強到最弱的順序排列你的過濾器(如果可以的話)。儘可能多地切割儘可能多的行。

6)最小化行數的技巧。每行都拉起來使得查詢中的以下步驟必須更加努力,因此最小化查詢中的行。如果您使用OR來組合不相關但相似的列查詢(例如所有組織條件爲A或組織條件爲B的組織)並且這兩個查詢的工作只是使事務對另一半的成本更高,則最好使用UNION結合更小,更快的查詢的結果(並且UNION可以並行運行直至合併結果)。請注意,像[1,2,3]中的WHERE org.id這樣的簡單查詢仍然比UNION更快,因爲這些工作都可以在一次查找中完成。

除聯合之外,如果您正在收集未過濾的節點,則可以使用collect(column)將「重複項」減少到1行,並且比UNWIND(column)查詢讓你的行回來! (這裏指的是變量名)

7)在1個節點上做了很多過濾器? Cypher有USING暗示!暗示USING JOIN ON column告訴Cypher它可能會更高效地做這個匹配更多的起點和加入他們。因此,在每場比賽中使用USING JOIN ON childD將告訴Cypher並行執行所有過濾器,並使用所有過濾器的重疊行。請注意,USING只是告訴Cypher「相信我,如果我們嘗試這樣做,這應該會更快」,如果你錯了,實際上可能會使查詢變得更糟。 (使用連接應該是有用的,用於製造大型查詢雖然比較平行)

UPDATE:
首先,node.id =「常」與node.value =「不變」的註釋,或node.id = 「constant2」AND node.value =「constant2」vs node.value = map [node.id]。第一個查詢能夠在節點查找上進行節點過濾,而後者必須對已查找的所有節點進行過濾。如果沒有以前的查找過濾功能,這意味着地圖必須拉入所有節點。雖然地圖提供了一些(可論證的)簡單性/靈活性,但它是過濾節點效率最低的方法之一。

二,現在您的查詢存在的大問題是:值超負載,而您沒有通過ID找到它。 :值應該是關係,或者有索引ID字段,以便您不必觸摸全部< - [:SET_FOR] - 和 - [:SET_ON] - >。我認爲使用Join提示至少可以使SET_FOR具有更高的優先級,這看起來更有效率。

這裏是我嘗試更有效地重寫PROFILE查詢。(v1)

MATCH (parentD)-[:CONTAINS]->(childD:Decision) 
WHERE id(parentD) = 415406 
MATCH (childD)<-[:SET_FOR]-(filterValue416423)-[:SET_ON]->(filterCharacteristic416423) 
USING JOIN ON childD 
WHERE id(filterCharacteristic416423) = 416423 
WHERE ('Adobe RGB' IN filterValue416423.value) OR ('ECI RGB' IN filterValue416423.value) 
WITH DISTINCT childD 
MATCH (childD)<-[:SET_FOR]-(filterValue416273)-[:SET_ON]->(filterCharacteristic416273) 
USING JOIN ON childD 
WHERE id(filterCharacteristic416273) = 416273 AND (filterValue416273.value >= 4) AND (filterValue416273.value <= 53) 
WITH DISTINCT childD 
MATCH (childD)<-[:SET_FOR]-(filterValue415431)-[:SET_ON]->(filterCharacteristic415431) 
USING JOIN ON childD 
WHERE id(filterCharacteristic415431) = 415431 
WHERE ('Compact' IN filterValue415431.value) 
    OR ('Compact SLR' IN filterValue415431.value) 
    OR ('Large SLR' IN filterValue415431.value) 
    OR ('Rangefinder-style mirrorless' IN filterValue415431.value) 
    OR ('SLR-like (bridge)' IN filterValue415431.value) 
WITH DISTINCT childD 
MATCH (childD)<-[:SET_FOR]-(filterValue415441)-[:SET_ON]->(filterCharacteristic415441) 
USING JOIN ON childD 
WHERE id(filterCharacteristic415441) = 415441 
WHERE ('Brass' IN filterValue415441.value) 
    OR ('Carbon fiber' IN filterValue415441.value) 

OPTIONAL MATCH (childD)<-[:VOTED_FOR]-(vg:VoteGroup)-[:VOTED_ON]->(c:Criterion) 
WHERE id(c) IN [415414, 415415, 415412, 415426, 415411] 

WITH DISTINCT * MATCH (childD)-[ru:CREATED_BY]->(u:User) 
WITH DISTINCT childD, ru, u, vg.avgVotesWeight as weight, vg.totalVotes as totalVotes 
WITH DISTINCT ru, u, childD , toFloat(sum(weight)) as weight, toInt(sum(totalVotes)) as totalVotes 
ORDER BY weight DESC 
SKIP 0 LIMIT 10 
RETURN ru, u, childD AS decision, weight, totalVotes, 
[ (parentD)<-[:DEFINED_BY]-(entity)<-[:COMMENTED_ON]-(comg:CommentGroup)-[:COMMENTED_FOR]->(childD) | 
    {entityId: id(entity), types: labels(entity), totalComments: toInt(comg.totalComments)} ] AS commentGroups, 
[ (parentD)<-[:DEFINED_BY]-(c1:Criterion)<-[:VOTED_ON]-(vg1:VoteGroup)-[:VOTED_FOR]->(childD) | 
    {criterionId: id(c1), weight: vg1.avgVotesWeight, totalVotes: toInt(vg1.totalVotes)} ] AS weightedCriteria, 
[ (parentD)<-[:DEFINED_BY]-(ch1:Characteristic)<-[:SET_ON]-(v1)-[:SET_FOR]->(childD) | 
    {characteristicId: id(ch1), value: v1.value, valueType: ch1.valueType, visualMode: ch1.visualMode} ] AS valuedCharacteristics 
+0

感謝您的回答。我有更新的問題,並添加重構查詢。請注意,使用「DISTINCT childD」的查詢工作非常緩慢,沒有太多更好但仍然非常完美。有什麼可以改進的嗎?此外,平行我試圖實施基於「地圖」的方法,但現在沒有運氣的解決方案 - http://stackoverflow.com/questions/43908077/neo4j-cypher-filtering-based-on-map-parameters – alexanoid

+0

@alexanoid(1)將所有WITHs更改爲WITH DISTINCT。它足夠便宜,最好是安全而不是抱歉。此外,新的PROFILE圖像將有助於查看哪些部分的查詢現在是瓶頸/時間浪費 – Tezra

+0

我更新了查詢並添加了新的配置文件輸出信息 – alexanoid