1

独自の関数を使用して Cypher 内に計算フィールドを作成できるようになる時期を知りたいです。

私が欲しいものの例を挙げましょう:

START a=node(0)
MATCH path=a-[rel*1..3]->b
WITH path,b,extract(r in RELATIONSHIPS(path) : r.property1) as Collection1,extract(r in RELATIONSHIPS(path) : r.property2) as Collection2
RETURN b,Collection1,Collection2

それは私に次のようなものを与えるでしょう:

Collection1 :             | Collection2 :
[property1.1,property1.2] | [property2.1,property2.2]
[property1.1]             | [property2.1]
etc.

property1.1*property2.1+property1.2*property2.2 およびその他の関数 (exp() や ln() など、cypher2.0 にありますよね?) を含むフィールドを追加したいと思います。今日は cypher でそれを行うことは可能ですか? Reduce() 関数があることは知っていますが、同時に 2 つのコレクションを処理するにはどうすればよいですか?

自分の関数を呼び出すことができれば、「myFunction([collection1],[collection2]) as myResult」のようなものです。

前もって感謝します。

4

2 に答える 2

1

ユーザー定義関数のサポートが非常に役立つことに同意します。しかし、多くの場合、目標を達成するための代替手段が存在する可能性があります。あなたのケースに固有のものですが、各関係のプロパティに基づいて計算を行いたいようです。したがって、リレーションシップをパス上のリレーションシップのコレクションとして取得する代わりに、各リレーションシップを個別の行として返し、これらのリレーションシップ行を処理することができます。

たとえば、次のクエリは、関係プロパティ p1 と p2 の乗算の合計を返します。

START a=node(0)
MATCH path=a-[rel*1..3]->b
with last(relationships(path)) as r
With r.p1 * r.p2 as mul
Return sum(mul) 

この特定の問題については、プロパティ p1 と p2 は同じ関係に由来するため、実際には非常に簡単な方法があります。

START a=node(0)
MATCH path=a-[rel*1..3]->b
With b, extract(r IN RELATIONSHIPS(path):r.p1 * r.p2) AS mulCol
Return b, reduce((sum = 0, mul in mulCol: sum + mul)
于 2013-09-06T17:48:39.947 に答える
0

なるほど、分かりました。neo4j コンソールで試してみましょう:

CREATE (a { name:'a' }),(b { name:'b' }),(c { name:'c' }),(d { name:'d' }),(e { name:'e' }),(f { name:'f' }), a-[:RELATION { p1:1,p2:10 }]->b, a-[:RELATION { p1:2,p2:2 }]->d, b-[:RELATION { p1: 3,p2:5 }]->c, c-[:RELATION { p1: 2,p2:5 }]->e,d-[:RELATION { p1: 1,p2:6 }]->e, d-[:RELATION { p1: 4,p2:5 }]->f

私のクエリを試してみましょう:

START a=node:node_auto_index(name='a')
MATCH path = a-[R*1..3]->b 
WITH b,extract(r IN RELATIONSHIPS(path):r.p1) AS collection_p1,extract(r IN RELATIONSHIPS(path):r.p2) AS collection_p2 
RETURN b,collection_p1,collection_p2

私はそれが必要ですが、もう1つのフィールドがあります:パスに2つのリレーションがある場合、結果として(もちろん各行に対して)(collection_p1 [1] * collection_p2 [1] + collection_p1 [2] * collection_p2 [2])が必要です)。

あなたのクエリを試してみると、各ノード b の以前の関係との合計を取得できません。

START a=node:node_auto_index(name='a')
MATCH path = a-[R*1..3]->b
WITH last(relationships(path)) AS r ,b
WITH r.p1 * r.p2 AS mul,b
RETURN sum(mul),b

明らかに、以前の関係の乗算の合計を持つすべてのノード b が必要です。アイデア ?再度、感謝します。

于 2013-09-10T15:26:09.983 に答える