3

Bulbsグラフデータベースとのインターフェースを実験しています。(本番環境では Titan を使用しますが、実験にはローカルでは Neo4j が最適と思われます)。

私はこの概念に頭を包むことができません...

電球は、新しい頂点を作成する方法を示しています...

>>> james = g.vertices.create(name="James")
>>> julie = g.vertices.create(name="Julie")
>>> g.edges.create(james, "knows", julie)

ドキュメントを掘り下げて、それを「取得または作成」に置き換えることもできます:

>>> james = g.vertices.get_or_create('name',"James",{'name':'james')

私が理解できないのは、既存の Edge を取得する方法です。これまでの私の試みは、既存の関係にアクセスして更新するのではなく、何十もの「ジェームズがジュリーを知っている」関係を再作成することで終わりました。

誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

4

エッジのプロパティを追加/更新できますが、グラフ データベースでは、エッジを構成する属性を更新できません。つまり、入力および出力の頂点 ID またはラベルを更新できません。代わりに、エッジを削除して新しいエッジを追加します。

そのプロパティを取得し、縁を切り、更新するさまざまな方法を次に示します。

ID でエッジを取得できます。

>>> from bulbs.rexster import Graph
>>> g = Graph()
>>> james = g.vertices.create(name="James")
>>> julie = g.vertices.create(name="Julie")
>>> edge = g.edges.create(james, "knows", julie)
>>> edge2 = g.edges.get(edge.eid)       # get the edge again
>>> assert edge == edge2
>>> edge2.someprop = "somevalue"
>>> edge2.save()

エッジがあり、インデックスが付けられている場合は、そのプロパティでエッジを検索できます。

# will return an iterator or None edges (may return more than one)
>>> edges = g.edges.index.lookup(someprop="somevalue") 
>>> edge = edges.next()
>>> edge.someprop = "newvalue"
>>> edge.save()

# will return 1 or None edges (or an error if more than 1 edge found)
>>> edge = g.edges.index.get_unique(someprop="somevalue") 
>>> edge.someprop = "newvalue"
>>> edge.save()

Gremlin を使用して頂点をトラバースすることでエッジを取得することもできます。

>>> from bulbs.rexster import Graph
>>> g = Graph()
>>> script = "g.V('name',name1).outE(label).as('e').inV.has('name',name2).back('e')"
>>> params = dict(name1="James", label="knows", name2="Julie")
>>> edges = g.gremlin.query(script, params)
>>> edge = edges.next()
>>> edge.someprop = "newvalue"
>>> edge.save()

Gremlin バックトラック パターンを参照してください...

しかし、エッジの ID がわからない場合にエッジを更新する最も効率的な方法は、エッジを検索する Gremlin スクリプトを介してエッジを更新することです (この方法では、サーバーへのラウンドトリップは 2 回ではなく 1 回だけです)。

>>> from bulbs.rexster import Graph
>>> g = Graph()
>>> script = "g.V('name',name1).outE(label).as('e').inV.has('name',name2).back('e').sideEffect{it.someprop = someprop}"
>>> params = dict(name1="James", label="knows", name2="Julie", someprop="somevalue")
>>> edges = g.gremlin.query(script, params)
>>> edge = edges.next()
>>> edge.someprop
'somevalue'

https://github.com/tinkerpop/gremlin/wiki/Updating-a-Graphを参照してください

また、読みやすくするために、Python REPL で Gremlin のワンライナーを記述するのではなく、次にgremlin.groovy示すように、Gremlin スクリプトをファイルに入れます。

http://bulbflow.com/docs/api/bulbs/groovy/

以下は、Gremlin を使用してエッジを取得または作成する実際の例です。

https://github.com/espeed/lightbulb/blob/master/lightbulb/gremlin.groovy#L88

コードの詳細な説明は次のとおりです。

neo4jの電球フレームワークにコミットするのと同等のものはありますか

于 2013-08-25T02:17:55.810 に答える