0

次のようなデータのタプルを含む「フレーバー」と呼ばれるプロパティを持つノードがあります。

node1.flavors = {"cherry":174,"vanilla":105,"chocolate":60}
node2.flavors = {"cherry":17,"vanilla":10,"chocolate":300}

チョコレートに関連付けられた最大の整数を持つノード (node2) を見つけたいと考えています。これどうやってするの?

正規表現を使用して、チョコレートがフレーバー プロパティにあるものを取得する方法を見つけました。

start n=node(*)
WHERE has(n.flavors) AND n.flavors =~ '.*chocolate.*'
RETURN count(n);

次に、「チョコレート」の後に番号を取得する必要があります: _

詳細情報: JSON 文字列です。cypher で処理できない場合は、Ruby で処理し、neo4j でデータ モデルをやり直す必要があります。プロパティに indexOf 関数がないため、部分文字列を使用できないと思いますよね?

2.0.0p247 :002 > r = JSON.parse('{"vanilla":161,"chocolate":21,"cherry":18}')
 => {"vanilla"=>161, "chocolate"=>21, "cherry"=>18} 
2.0.0p247 :004 > r.class
 => Hash 
2.0.0p247 :005 > r.keys
 => ["vanilla", "chocolate", "cherry"] 
2.0.0p247 :006 > r.values
 => [161, 21, 18] 
2.0.0p247 :007 > r["vanilla"]
 => 161
4

1 に答える 1

3

提供するクエリは、グラフ内のすべてのノードをチェックしますが、グラフのサイズが大きくなるにつれて遅くなります。Cypher を使用して文字列操作を実行しようとしていますが、Cypher は何よりもまずグラフをクエリする言語です。間違ったデータストアを使用しているか、グラフに役立つようにモデル化していないように思えます。ノード (レシピ?) とフレーバー エンティティを作成し、フレーバーの量に関するプロパティを持つ関係でそれらを接続してみませんか? その後、それらを簡単かつ効率的にクエリできます。ここでこれをすばやくモデル化しました: http://console.neo4j.org/r/tp355x (Cypher/Neo4j 2.0 を使用)。

したがって、この質問に対する答えは、Cyhper を本来の目的ではないものに使用しようとするのではなく、上記のデモのように Ruby コードでモデルをやり直すことです。

グラフでデータを表現する方法についてインスピレーションが必要な場合は、おそらくいくつかのアイデアを提供するGraph Gistsがあります。

于 2013-11-08T17:05:32.247 に答える