2016-04-22 21 views
1

neo4jで遊んでいる間にいくつかの質問が発生しました。現在のところ、これらのうち2つがあります。neo4jでの時間/日付ベースの検索

  • ノードXからノードY(RegEx?/ Wildcard?)への特定のパスを検索する際の関係/エッジを制限する方法はありますか。たとえば、すべてのエッジには2つの時間属性「開始」と「終了」があります。朝の午前2時から午前3時の間に発生したノード間の経路を探したいのですが?
  • 時間パスをどのように追跡できますか?車が「A」から「B」に駆け上がったとします。ルートは1時間、すなわち午前5時から午前6時を要した。次のセクションである 'B'から 'C'までは1時間ほどかかりましたが、運転手が1時間の休憩を取ったため、午前7時から午前8時まででした。論理的に有効な(時間)パスのみが許可される方法でneo4jをどのように照会することができますか。例えば、これは有効であるべきである:

(Prague) -[:DISTANCE {begin: '5 am', end: '6 am'}]->(Brno), (Brno) -[:DISTANCE {begin: '7 am', end: '9 am'}]->(Liberec)

これは無効でなければならないのに対し:

所与(Prague) -[:DISTANCE {begin: '5 am', end: '6 am'}]->(Brno), (Brno) -[:DISTANCE {begin: '4 am', end: '6 am'}]->(Liberec)

別の例は、次のグラフである。

CREATE (a:BoxingMachine {title: 'A'}) 
CREATE (b:BoxingMachine {title: 'B'}) 
CREATE (c:BoxingMachine {title: 'C'}) 
CREATE (d:BoxingMachine {title: 'D'}) 
CREATE ((a)-[:FORWARDED {start_time: '9:00 am'}]->(b)) 
CREATE ((a)-[:FORWARDED {start_time: '7:00 am'}]->(c)) 
CREATE ((c)-[:FORWARDED {start_time: '8:00 am'}]->(b)) 
CREATE ((a)-[:FORWARDED {start_time: '11:00 am'}]->(d)) 
CREATE ((d)-[:FORWARDED {start_time: '10:00 am'}]->(b)) 

私はノード 'A'からノード 'B'へのパスを探しています。 2、我々は唯一の制約 "のstart_time" を考える場合には

  • 'A' --> 'B'
  • 'A' --> 'C' --> 'B'
  • 'A' --> 'D' --> 'B'

:制約 "のstart_time" を無視して、私たちは、このグラフでは3つの可能なパスを持っています左パス:

  • 'A' --> 'B'
  • 'A' --> 'C' --> 'B'

パス'A' --> 'D' --> 'B'は無効であるため。この場合、年表は間違っています。 Cooworker 'A'は同僚のDに11時にパッケージを送ったが、同僚はこの特定のパッケージを同僚のBに1時間早く転送した。魔女は不可能です。

PS:ASCIIアートとしてエッジを持つノードを生成するツールはありますか?コンソールのために? :)

答えて

1

まず、文字列の代わりに数値の時間値を使用することをお勧めします。それはサイファーをもっと簡単で効率的にするでしょう。また、実際に言えば、パスは複数の日にまたがる可能性があるため、時刻を入力するだけで間違った結果が生じる可能性があります。たとえば、epoch timeを使用することができます。私の答えでは、時間は数字であると仮定します。

このクエリは、唯一の有効なAからBへのパスを返す必要があります:

MATCH p=(a:BoxingMachine{title: 'A'})-[:FORWARDED*]->(b:BoxingMachine{title: 'B'}) 
WITH p, RELATIONSHIPS(p) AS rels 
WHERE REDUCE(s = true, i IN RANGE(1, SIZE(rels)-1) | 
    CASE WHEN (rels[i]).start_time > (rels[i-1]).start_time 
    THEN s 
    ELSE false END) 
RETURN p; 

REDUCE句が候補パスの開始時間が意味をなすことを確認する責任があります。

あなたは(簡単な数値の時間値ではなく、エポック時間も働くだろう)、このデータを使用して結果を確認できます。

CREATE (a:BoxingMachine {title: 'A'}) 
CREATE (b:BoxingMachine {title: 'B'}) 
CREATE (c:BoxingMachine {title: 'C'}) 
CREATE (d:BoxingMachine {title: 'D'}) 
CREATE ((a)-[:FORWARDED {start_time: 9}]->(b)) 
CREATE ((a)-[:FORWARDED {start_time: 7}]->(c)) 
CREATE ((c)-[:FORWARDED {start_time: 8}]->(b)) 
CREATE ((a)-[:FORWARDED {start_time: 11}]->(d)) 
CREATE ((d)-[:FORWARDED {start_time: 10}]->(b)) 
+0

@EvelKnievel:あなたが知る必要がある何か他のものはありますか? – cybersam

+0

ありがとうございました。あなたの答えはこの特定のケースでグラフをたどる方法を理解するのに十分であった。 「救済」と「救済」は、私が探していた欠けている部分でした –

+0

素晴らしいです。あなたの質問に最も適した回答を[承諾する](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)を覚えておいてください。 – cybersam

関連する問題