2014-10-24 2 views
4

Я делаю операцию с суммой в моем графике DB: я сравниваю пару узлов, вычисляя цифру, чтобы представить, насколько подобны определенные области графика, и если эта фигура достаточно большой, я хочу создать связь между узлами.Neo4j/Cypher: создать взаимосвязь, если выполнено определенное условие

У меня есть запрос, который делает все это, за исключением проверки, достаточно ли фигуры; в настоящее время он также создает отношения подобия, чья оценка сходства равна 0, и я не хочу этого.

Мой полный запрос на шифрование несколько длинный, поэтому я упростил его для этого сообщения. Поэтому, боюсь, я не могу предоставить примерный график db в консоли neo4j. Мой график содержит Center узлов, у которых есть Affinity узлов и Searched узлов вокруг них. Если 2 центральных узла имеют аналогичные узлы Affinity или Searched, узлы центра должны получить отношения.

Вот упрощенное заявление с аннотациями:

MATCH (a:Center), (x:Center) 
WHERE id(a) <> id(x) 
OPTIONAL MATCH a-->(aff1:Affinity), x-->(aff2:Affinity) 
WHERE aff1.affinityReference=aff2.affinityReference  // if the Affinity nodes have the same reference, then their Center nodes are similar 
OPTIONAL MATCH a-->(search1:Search), x-->(search2:Search) 
WHERE search1.searchTerm = search2.searchTerm // if the Search nodes have the same searchTerm, then their Center nodes are similar 
WITH a, x, 
SUM (CASE WHEN aff2.relative_weight IS NULL THEN 0 ELSE (aff2.relative_weight * 5) END) AS AffinityScore, // Affinity nodes have a relative weight, which shall be used in the similarity calculation. 
(count(search2) * 5) AS SearchScore // matching Search nodes shall just be counted and multiplied with 5. 

OPTIONAL MATCH x-[r1:IS_SIMILAR_TO]->() // Delete all similarity relationships for x 
WITH a,x,r1,AffinityScore, SearchScore, (AffinityScore+SearchScore) AS TotalScore 

DELETE r1 // delete relationship if it exists... 
MERGE  // ... and create it anew. 
    x-[:IS_SIMILAR_TO { 
    SimilarityScore:Total, 
    AffinityScore:AffinityScore, 
SearchScore:SearchScore 
}]->a 

RETURN a, x, AffintyScore, SearchScore, TotalScore 
ORDER BY TotalScore DESC 

Я попытался введение саза в разных местах, но по-видимому, никогда в правой. Куда он должен идти?

Благодарим за помощь!

ответ

10

Есть трюк для выполнения операции условного мутирования: используйте оператор CASE, чтобы вернуть список длины 1, когда условие истинно, в противном случае - пустой список. После FORACH перебрать этот массив, чтобы сделать CREATE или MERGE

... 
WITH a, x, AffintyScore, SearchScore, TotalScore, Total, 
    CASE AffinityScore WHEN 0 THEN [] ELSE [1] END as array 
FOREACH (x in array | 
    MERGE 
    x-[:IS_SIMILAR_TO { 
    SimilarityScore:Total, 
    AffinityScore:AffinityScore, 
    SearchScore:SearchScore 
    }]->a 
) 
RETURN a, x, AffintyScore, SearchScore, TotalScore 
ORDER BY TotalScore DESC 
+0

Nifty трюк, я люблю :-) THx Стефану! – rene

+0

То, что мне было нужно –

+0

Почему Cypher не имеет лучшего способа сделать это? – fiatjaf

Смежные вопросы