2

私はcypherとneo4jに非常に慣れていません。合計パスコストに基づいて、ポイントAとBの間のすべてのパスを取得して注文したいと考えています。この場合のコストは、整数の関係プロパティです。パスコストは、リレーションシッププロパティの合計になります。

サイファーのORDERBYステートメントの例をいくつか見てきましたが、例では、順序付けされているオブジェクトに既に割り当てられているプロパティで順序付けする必要があるようです。この場合、パスに静的な「コスト」プロパティ。

(これは、パスの長さ/数とは異なります)

このようなことは、サイファーにとってそれほど複雑ではないと確信しています。

4

2 に答える 2

9

私は数日前にこれに非常に似た何かをしようとしましたが失敗しました。問題は、コレクションの合計を取得できず、集計の合計のみを取得できるという事実にあります。

参照: https ://groups.google.com/d/topic/neo4j/_MqwGp1a1Oo/discussion

彼らがCypherでこれにいくつかの機能を追加することを願っていますが、専門家であるMichael Hungerの助けを借りても、それを機能させることができませんでした。

更新私は実際に今日サイファーコードを突いて、まさにこれを行う式を作成しました。1.9で受け入れられるかどうかはわかりませんが、まもなく何らかの形でコミュニティ版に登場する可能性があります。

UPDATE 2それらは私のプルリクエストでreduce1.9-SNAPSHOTにマージされました、以下の構文を更新します。

それは基本的にあなたが求めていることを正確に行います-私のデータの少し古いバージョンはここにあります:http: //console.neo4j.org/r/2rvznu

そして、これがサイファーです(注、現在1.9-SNAPSHOTが必要です):

   START n=node(18) 
   MATCH p=n-[r*]->m 
   WHERE not(m-->()) 
    WITH extract(x in r: x.score) as scores, length(p) as len
  RETURN scores, reduce(res=0, x in scores: res + x) as totalscore, len 
ORDER BY totalscore desc;

与える:

+------------------------------------------+
| scores        | totalscore         | len |
+------------------------------------------+
| [0.9,0.9,3.7] | 5.5                | 3   |
| [0.8,0.79]    | 1.59               | 2   |
| [0.4,0.75]    | 1.15               | 2   |
| [0.4,0.45]    | 0.8500000000000001 | 2   |
+------------------------------------------+
于 2012-09-25T17:23:03.973 に答える
1

この質問をグーグルで検索するすべての人の便宜のために、@eve-freemanの回答をNeo4j3.0に更新しました

START n=node(18) 
   MATCH p=(n)-[r*]->(m) 
   WHERE not((m)-->()) 
    WITH extract(x in r| x.score) as scores, length(p) as len
  RETURN scores, reduce(res=0, x in scores| res + x) as totalscore, len 
ORDER BY totalscore desc;

違いは次のとおりです。パターン内のノードを識別するには括弧が必要です。コロンの代わりに:「リスト内の変数」と関数内の式を区切るために使用されます

于 2016-05-26T21:53:32.107 に答える