この質問はNeo4jメーリングリストで見ましたが、昨日は回答できませんでした。
サイファーに関しては、私は初心者です。しかし、私はグレムリンでのあなたの問題の解決策を手伝うことができます。私はあなたと同じようなグラフを作成し、その上でグレムリントラバーサルを実行することができました。
私のグラフは次のようになります。
gremlin> g.v(1,2,3,4)_().outE('eats').inV.path{it.name}{it.count}{it.name}
==>[Neo, 5, Meat]
==>[Neo, 1, Cheese]
==>[Neo, 4, Chicken]
==>[Morpheus, 3, Bread]
==>[Morpheus, 3, Cheese]
==>[Morpheus, 2, Chicken]
==>[Trinity, 1, Apple]
==>[Trinity, 2, Bread]
==>[Trinity, 4, Meat]
==>[Trinity, 2, Cheese]
==>[Smith, 3, Apple]
==>[Smith, 4, Ham]
==>[Smith, 5, Pork]
gremlin>
start
残りのIDの配列に対して示される、任意の1つの頂点の類似性インデックスを生成するトラバーサルを作成しました。私の最後のトラバーサルは次のようになります。
simarray=[];start=3;
[1,2,4].each{
p1=start;p2=it;
first=g.v(p1);
second=g.v(p2);
sim=0;
h1=first.out('eats').count().toFloat();
h2=second.out('eats').count().toFloat();
first.outE('eats').as('edges')
.inV.in('eats').has('id',second.id).back('edges')
.each{
n1k = it.count;
n2k = it.inV.inE('eats').outV
.has('id', second.id).back(2).count.next();
sim = sim + (1 - ((n1k/h1)-(n2k/h2)).abs())*(n1k+n2k)/(h1+h2)
};
simarray.add(sim)
};
simarray
出力:
gremlin> simarray=[];start=3;[1,2,4].each{p1=start;p2=it; first=g.v(p1); second=g.v(p2); sim=0; h1=first.out('eats').count().toFloat(); h2=second.out('eats').count().toFloat(); first.outE('eats').as('edges').inV.in('eats').has('id',second.id).back('edges').each{n1k = it.count; n2k = it.inV.inE('eats').outV.has('id', second.id).back(2).count.next(); sim = sim + (1 - ((n1k/h1)-(n2k/h2)).abs())*(n1k+n2k)/(h1+h2)}; simarray.add(sim)};simarray
==>0.7857142857142856
==>0.7142857142857143
==>0.14285714285714285
上記のトラバーサルは、数式/計算に直接変換されます。グラフトラバーサルのパフォーマンスに最適化できます。さらに、Gremlinのドキュメントを読んで、物事を詳細に理解することをお勧めします。
https://github.com/tinkerpop/gremlin/wiki
すでにメンバーになっているNeo4jメーリングリストとは別に、Gremlinメーリングリストでクエリを送信することもできます:https:
//groups.google.com/group/gremlin-users