15.2.3 グラフの公開

他のセッションで参照できるグラフを公開できます。

単一のグラフ・スナップショットの公開

PgxGraph#publish()メソッドを使用して、グラフの現在選択されているスナップショットを公開できます。公開操作により、グラフ名がセッション非公開のネームスペースからパブリック・ネームスペースに移動します。同じ名前を持つグラフがすでに公開されている場合、publish()メソッドは失敗し、例外が発生します。スナップショットとともに公開されたグラフと、公開された単一のスナップショットは同じネームスペースを共有します。

表13-6に、グラフの公開に必要な権限を示します。

引数を指定せずにpublish()メソッドをコールすると、スナップショットは永続プロパティのみとともに公開されます。ただし、特定の一時プロパティを公開する場合は、次のようにpublish()コール内でそれらをリストする必要があります:

opg4j> var prop1 = graph.createVertexProperty(PropertyType.INTEGER, "prop1")
opg4j> prop1.fill(0)
opg4j> var cost = graph.createEdgeProperty(PropertyType.DOUBLE, "cost")
opg4j> cost.fill(0d)
opg4j> graph.publish(List.of(prop1), List.of(cost))
VertexProperty<Integer, Integer> prop1 = graph.createVertexProperty(PropertyType.INTEGER, "prop1");
prop1.fill(0);
EdgeProperty<Double> cost = graph.createEdgeProperty(PropertyType.DOUBLE, "cost");
cost.fill(0d);
List<VertexProperty<Integer, Integer> vertexProps = Arrays.asList(prop);
List<EdgeProperty<Double>> edgeProps = Arrays.asList(cost);
graph.publish(vertexProps, edgeProps);
prop = graph.create_vertex_property("integer", "prop1")
prop1.fill(0)
cost = graph.create_edge_property("double", "cost")
cost.fill(0d)
vertex_props = [prop]
edge_props = [cost]
graph.publish(vertex_props, edge_props)

スナップショットを含むグラフの公開

グラフのすべてのスナップショットを他のセッションから参照できるようにする場合は、publishWithSnapshots()メソッドを使用します。グラフがスナップショットとともに公開されると、各スナップショットのGraphMetaData情報も他のセッションで使用できるようになります。ただし、nullであるグラフ構成は除きます。

publishWithSnapshots()メソッドをコールすると、全スナップショットの永続プロパティがすべて公開され、他のセッションから参照できるようになります。一時プロパティはセッション非公開であるため、明示的に公開する必要があります。公開されると、すべてのプロパティが読取り専用になります。

単一のグラフ・スナップショットを公開する場合と同様に、publishWithSnapshots()メソッドにより、グラフ名はセッション非公開のネームスペースからパブリック・ネームスペースに移動します。同じ名前を持つグラフがすでに公開されている場合、publishWithSnapshots()メソッドは失敗し、例外が発生します。

また、公開済プロパティは、元の一時プロパティと同様に、それらが作成された特定のスナップショットに関連付けられています。そのため、他のスナップショットでは参照できません。

特定の一時プロパティを公開する場合は、次の例のように、publishWithSnapshots()コール内でそれらをリストする必要があります。

opg4j> var prop1 = graph.createVertexProperty(PropertyType.INTEGER, "prop1")
opg4j> prop1.fill(0)
opg4j> var cost = graph.createEdgeProperty(PropertyType.DOUBLE, "cost")
opg4j> cost.fill(0d)
opg4j> graph.publishWithSnapshots(List.of(prop1), List.of(cost))
VertexProperty<Integer, Integer> prop1 = graph.createVertexProperty(PropertyType.INTEGER, "prop1");
prop1.fill(0);
EdgeProperty<Double> cost = graph.createEdgeProperty(PropertyType.DOUBLE, "cost");
cost.fill(0d);
List<VertexProperty<Integer, Integer> vertexProps = Arrays.asList(prop);
List<EdgeProperty<Double>> edgeProps = Arrays.asList(cost);
graph.publishWithSnapshots(vertexProps,edgeProps);
VertexProperty<Integer, Integer> prop1 = graph.createVertexProperty(PropertyType.INTEGER, "prop1")
prop1.fill(0)
EdgeProperty<Double> cost = graph.createEdgeProperty(PropertyType.DOUBLE, "cost")
cost.fill(0d)
List<VertexProperty<Integer, Integer> vertexProps = Arrays.asList(prop)
List<EdgeProperty<Double>> edgeProps = Arrays.asList(cost)
graph.publishWithSnapshots(vertexProps,edgeProps)

別のセッションからの公開済グラフの参照

公開済グラフは、PgxSession#getGraph()メソッドを使用して別のセッションで名前で参照できます。

次の例では、公開済グラフmyGraphを新しいセッション(session2)で参照します。

opg4j> var session2 = instance.createSession("session2")
opg4j> var graph2 = session2.getGraph(Namespace.PUBLIC, "myGraph")
PgxSession session2 = instance.createSession("session2");
PgxGraph graph2 = session2.getGraph(Namespace.PUBLIC, "myGraph");
session2 = pypgx.get_session("session2");
PgxGraph graph2 = session2.get_graph("myGraph")

session2は、公開済スナップショットのみにアクセスできます。グラフがスナップショットなしで公開されている場合、getAvailableSnapshots()メソッドのコールによって空のキューが返されます。

グラフ・スナップショットが公開されている場合は、getGraph()へのコールによって使用可能な最新のスナップショットが返されます。session2では、getAvailableSnapshots()メソッドを使用して、使用可能なすべてのスナップショットを表示できます。その後、PgxSession#setSnapshot()メソッドを使用して特定のスナップショットを設定できます。

ノート:

参照したグラフが不要になった場合は、グラフを解放することが重要です。詳細は、グラフの削除を参照してください。

プロパティの公開

(単一のスナップショットまたは全スナップショットを)公開した後でも、一時プロパティを個々に公開できます。公開済プロパティは、それらが作成された特定のスナップショットに関連付けられているため、そのスナップショットでのみ参照できます。

opg4j> graph.getVertexProperty("prop1").publish()
opg4j> graph.getEdgeProperty("cost").publish()
graph.getVertexProperty("prop1").publish();
graph.getEdgeProperty("cost").publish();
graph.get_vertex_property("prop1").publish()
graph.get_edge_property("cost").publish()

別のセッションでの公開済プロパティの取得

公開済グラフを(スナップショットの有無に関係なく)参照するセッションは、PgxGraph#getVertexPropertyおよびPgxGraph#getEdgePropertyを介して公開済プロパティを参照できます。
opg4j> var session2 = instance.createSession("session2")
opg4j> var graph2 = session2.getGraph(Namespace.PUBLIC, "myGraph")
opg4j> var vertexProperty = graph2.getVertexProperty("prop1")
opg4j> var edgeProperty = graph2.getEdgeProperty("cost")
PgxSession session2 = instance.createSession("session2");
PgxGraph graph2 = session2.getGraph(Namespace.PUBLIC, "myGraph");
VertexProperty<Integer, Integer> vertexProperty = graph2.getVertexProperty("prop1");
EdgeProperty<Double> edgeProperty = graph2.getEdgeProperty("cost");
session2 = pypgx.get_session(session_name ="session2")
graph2 = session2.get_graph("myGraph")
vertex_property = graph2.get_vertex_property("prop1")
edge_property = graph2.get_edge_property("cost")

公開済グラフの固定

公開済グラフは、セッションで使用されない場合でも公開されたままになるように固定できます。

opg4j> graph.pin()
graph.pin();
>>> graph.pin()

公開済グラフの固定解除

以前に固定された公開済グラフの固定を解除できます。これにより、グラフとそのすべてのスナップショット(他のセッションでグラフのスナップショットを使用していない場合)を削除できます。

opg4j> var graph = session.getGraph("bank_graph_analytics")
graph ==> PgxGraph[name=bank_graph_analytics,N=999,E=4993,created=1660217577201]
opg4j> graph.unpin()
PgxGraph graph = session.getGraph("bank_graph_analytics");
graph.unpin();
>>> graph = session.get_graph("bank_graph_analytics")
>>> graph.unpin()

関連トピック