2016-08-20 1 views
0

これ以上の処理を行うために可変長識別子が使用されている場合、すべてのサブパスの代わりに最終的な完全シーケンスを保持または返す方法はありますか最終的なフルシーケンス経路の各々についてのオペレーション。可変長の関係識別子が使用されているときに最終シーケンスのみを返すか保持するためのcypherクエリ

MATCHパス=(S:人) - [当該rels:NEXT *] - >(E:人)...............

例:すべて見つけます指定されたリストに名前があるノードのシーケンス、たとえば['graph'、 'server'、 'db']と同じ 'seqid'プロパティが存在し、それらの間の関係に存在します。

すなわち

(グラフ) - >(サーバー) - 同じSEQIDと(デシベル):1

(グラフ) - >(デシベル) - >同じSEQIDと(サーバー):1 //同じSEQIDを持つ別のマッチング
シーケンスがあることができ

(グラフ) - >(デシベル) - >(サーバー)同じSEQIDを持つ:2

言うのノードのみ、最終的な順序を維持する方法があります'(グラフ) - >(サーバ) - >(db)'の各シーケンスの代わりに>(サーバー)または(サーバー) - - (グラフ)のような大規模なシーケンスのサブパス>(デシベル)

のplsは私がこの問題を解決するのに役立ち.........

(私は)

+0

あなたがいるサイファークエリを共有することができますすべてのシーケンスで一致しますか? – InverseFalcon

+0

また、複数の有効なパスを経由して同じエンドポイントノードに到達できる場合、何をする必要がありますか?また、私はSがいくつかの一意の開始ノードとして扱われているのを見ていません。この種の問合せは、すべての人に適用されることを意図したものですか?単体(またはグループ)の開始ノードからですか? – InverseFalcon

+0

開始ノードに着信:NEXT関係がないようにしたいと思うのは公正でしょうか?もしそうでなければ、シーケンスの開始ノードを決定するためにどのような基準を用いるべきですか? – InverseFalcon

答えて

1

ここで実際に使うことができるのは、あなたがやりたいことを正確に行うlongestSequences()関数です。 bは、パターンが他の一致パターンのサブセットでないように、シーケンス内の開始点と終了点に常に一致します。

私は、まさにこのためのNeo4jの機能要求を作成:https://github.com/neo4j/neo4j/issues/7760

をそして、それが実装されるまで、我々はいくつかの代替的なアプローチで済まさなければならないだろう。私たちがしなければならないことは、aとbを完全なシーケンスのノードの開始と終了に制限するための追加のマッチングを追加することです。

WITH ['graph', 'server' ,'db'] as names 
MATCH p=(a)-[rels:NEXT*]->(b) 
WHERE ALL(n in nodes(p) WHERE n.name in names) 
AND ALL(r in rels WHERE rels[0]['seqid'] = r.seqid) 
WITH names, p, a, rels, b 
// check if b is a subsequence node instead of an end node 
OPTIONAL MATCH (b)-[rel:NEXT]->(c) 
WHERE c.name in names 
AND rel.seqid = rels[0]['seqid'] 
// remove any existing matches where b is a subsequence node 
WITH names, p, a, rels, b, c 
WHERE c IS NULL 
WITH names, p, a, rels, b 
// check if a is a subsequence node instead of a start node 
OPTIONAL MATCH (d)-[rel:NEXT]->(a) 
WHERE d.name in names 
AND rel.seqid = rels[0]['seqid'] 
// remove any existing matches where a is a subsequence node 
WITH p, a, b, d 
WHERE d IS NULL 
RETURN p, a as startNode, b as endNode 
+0

大変ありがとうございました....しかし、plsは助けてくれます...同じseqid..i.eを使って異なる順序で現れるシーケンスをキャプチャしません。 seqid 2と(db) - >(グラフ) - >(サーバ)と同じseqid 2がある場合、(グラフ) - >(サーバ) - >(db)が存在する場合、両方を表示しません。私。 –

+0

あなたのコメントでは、これらの2つのシーケンス(グラフ - >サーバー - > db、db->グラフ - >サーバー)が分離している、またはオーバーラップについて話していますか(実際のシーケンスはdb->グラフ - >サーバー - データベース内の2つの異なるシーケンスに一致する必要がありますか?また、検索するシーケンスに名前のリストが含まれている必要があるかどうかを明確にすることはできますか(つまりserver-> server-> server)または、指定された名前のリストの各名前のうち正確に1つのシーケンスを探している場合は、繰り返しはありません。 – InverseFalcon

+0

(グラフ - >サーバー - > db、db->グラフ - >サーバー)は別です.. –

0

[EDITED]

このクエリは、あなたがやりたいことがあります:

は、ここに私の提案クエリの

MATCH (p1:Person)-[rel:NEXT]->(:Person) 
WHERE NOT (:Person)-[:NEXT {seqid: rel.seqid}]->(p1) 
WITH DISTINCT p1, rel.seqid AS seqid 
MATCH path = (p1)-[:NEXT* {seqid: seqid}]->(p2:Person) 
WHERE NOT (p2)-[:NEXT {seqid: seqid}]->(:Person) 
RETURN path; 

をそれは最初(p1)をすべてPersonのノードを識別して、少なくとも1つの発信側NEXT関係には、着信番号NEXTの関係はありません(同じseqid)。それらの別個の発信側のseqidの値です。そして、すべての「完了」経路(すなわち、開始ノードと終了ノードに、それぞれseqidとの関係がある着信または発信のないパスが見つかる)が、それぞれp1ノードから始まり、すべてが同じseqidを共有する関係を有する。最後に、完全なパスを返します。

あなただけの各パス内のすべてのPersonノードのnameプロパティを取得したい場合は、(異なるRETURN句を使用して)このクエリを試してみてください。

MATCH (p1:Person)-[rel:NEXT]->(:Person) 
WHERE NOT (:Person)-[:NEXT {seqid: rel.seqid}]->(p1) 
WITH DISTINCT p1, rel.seqid AS seqid 
MATCH path = (p1)-[:NEXT* {seqid: seqid}]->(p2:Person) 
WHERE NOT (p2)-[:NEXT {seqid: seqid}]->(:Person) 
RETURN EXTRACT(n IN NODES(path) | n.name); 
+1

開始と終了ノードがないことによって定義されていれば、それはおそらく動作します:ここに、そしてそれが事実ならば、これは間違いなく最良の解決策の始まりです(まだそこに名前制限が必要です)。しかし、開始ノードと終了ノードとの間にNEXT関係がありますが、異なるseqidを持つ場合でも、同じseqidを使用する場合でも、私たちが気にしない名前を持つノードから/まで、名前のついたより強力なクエリが必要になります。 – InverseFalcon

+0

私は@InverseFalconの有効な批判であると考えていることを考慮に入れて私の答えを編集しました。 – cybersam

+0

pls help ...選択された要素のリストのシーケンスが必要です... ['graph'、 'server'、 'db']同じseqidまたは異なる順序で出現する可能性があります –

0
MATCH (S:Person)-[r:NEXT]->(:Person) 
    // Possible starting node 
    WHERE NOT ((:Person)-[:NEXT {seqid: r.seqid}]->(S)) 
WITH S, 
    // Collect all possible values of `seqid` 
    collect (distinct r.seqid) as seqids 
UNWIND seqids as seqid 
// Possible terminal node 
MATCH (:Person)-[r:NEXT {seqid: seqid}]->(E:Person) 
    WHERE NOT ((E)-[:NEXT {seqid: seqid}]->(:Person)) 
WITH S, 
    seqid, 
    collect(distinct E) as ES 
UNWIND ES as E 
    MATCH path = (S)-[rels:NEXT* {seqid: seqid}]->(E) 
RETURN S, 
     seqid, 
     path 
+0

pls help ...私は、選択された要素のリストのシーケンスが必要です... ['graph'、 'server'、 'db']同じseqidまたは異なる順序で出現する可能性があります –

関連する問題