5.4.5 プロパティ・グラフのサブグラフの属性の追加および削除
Oracle Spatial and Graphは、ユーザーがカスタマイズした操作コールバックを使用した、頂点またはエッジ(あるいはその両方)のサブグラフへの属性(キー/値ペア)の更新をサポートします。操作コールバックは、(特定の属性および値を追加または削除することによって)頂点(またはエッジ)を更新するために、頂点(またはエッジ)が満たす必要のある条件セットを定義します。
ユーザーはVertexOpCallback
およびEdgeOpCallback
APIインタフェースを実装することにより、独自の属性操作を定義できます。更新操作に含まれる頂点(またはエッジ)によって満たされる必要のある条件を定義するneedOp
メソッド、および要素の更新時に使用されるキー名とキー値をそれぞれ返すgetAttributeKeyName
およびgetAttributeKeyValue
メソッドをオーバーライドする必要があります。
次のコード・フラグメントは、Robert Smithの協力者のみに関連付けられたsmithCollaborator
属性を操作するVertexOpCallback
を実装します。このプロパティの値は、協力者の役職に基づいて指定されます。
private static class CollaboratorsVertexOpCallback implements VertexOpCallback { private OracleVertexBase m_smith; private List<Vertex> m_smithCollaborators; public CollaboratorsVertexOpCallback(OraclePropertyGraph opg) { // Get a list of Robert Smith'sCollaborators m_smith = (OracleVertexBase) opg.getVertices("name", "Robert Smith") .iterator().next(); Iterable<Vertex> iter = m_smith.getVertices(Direction.BOTH, "collaborates"); m_smithCollaborators = OraclePropertyGraphUtils.listify(iter); } public static CollaboratorsVertexOpCallback getInstance(OraclePropertyGraph opg) { return new CollaboratorsVertexOpCallback(opg); } /** * Add attribute if and only if the vertex is a collaborator of Robert * Smith */ @Override public boolean needOp(OracleVertexBase v) { return m_smithCollaborators != null && m_smithCollaborators.contains(v); } @Override public String getAttributeKeyName(OracleVertexBase v) { return "smithCollaborator"; } /** * Define the property's value based on the vertex role */ @Override public Object getAttributeKeyValue(OracleVertexBase v) { String role = v.getProperty("role"); role = role.toLowerCase(); if (role.contains("political")) { return "political"; } else if (role.contains("actor") || role.contains("singer") || role.contains("actress") || role.contains("writer") || role.contains("producer") || role.contains("director")) { return "arts"; } else if (role.contains("player")) { return "sports"; } else if (role.contains("journalist")) { return "journalism"; } else if (role.contains("business") || role.contains("economist")) { return "business"; } else if (role.contains("philanthropist")) { return "philanthropy"; } return " "; } }
次のコード・フラグメントは、Robert Smithの敵対者のみに関連付けられたsmithFeud
属性を操作するEdgeOpCallback
を実装します。このプロパティの値は、協力者の役職に基づいて指定されます。
private static class FeudsEdgeOpCallback implements EdgeOpCallback { private OracleVertexBase m_smith; private List<Edge> m_smithFeuds; public FeudsEdgeOpCallback(OraclePropertyGraph opg) { // Get a list of Robert Smith's feuds m_smith = (OracleVertexBase) opg.getVertices("name", "Robert Smith") .iterator().next(); Iterable<Vertex> iter = m_smith.getVertices(Direction.BOTH, "feuds"); m_smithFeuds = OraclePropertyGraphUtils.listify(iter); } public static FeudsEdgeOpCallback getInstance(OraclePropertyGraph opg) { return new FeudsEdgeOpCallback(opg); } /** * Add attribute if and only if the edge is in the list of Robert Smith's * feuds */ @Override public boolean needOp(OracleEdgeBase e) { return m_smithFeuds != null && m_smithFeuds.contains(e); } @Override public String getAttributeKeyName(OracleEdgeBase e) { return "smithFeud"; } /** * Define the property's value based on the in/out vertex role */ @Override public Object getAttributeKeyValue(OracleEdgeBase e) { OracleVertexBase v = (OracleVertexBase) e.getVertex(Direction.IN); if (m_smith.equals(v)) { v = (OracleVertexBase) e.getVertex(Direction.OUT); } String role = v.getProperty("role"); role = role.toLowerCase(); if (role.contains("political")) { return "political"; } else if (role.contains("actor") || role.contains("singer") || role.contains("actress") || role.contains("writer") || role.contains("producer") || role.contains("director")) { return "arts"; } else if (role.contains("journalist")) { return "journalism"; } else if (role.contains("player")) { return "sports"; } else if (role.contains("business") || role.contains("economist")) { return "business"; } else if (role.contains("philanthropist")) { return "philanthropy"; } return " "; } }
前に定義した操作コールバックを使用して、次のコード・フラグメントは、プロパティ・グラフをロードし、操作コールバックのインスタンスを作成し、その後にOraclePropertyGraph
でaddAttributeToAllVertices
およびaddAttributeToAllEdges
メソッドを使用して属性を適切な頂点およびエッジに追加します。
OraclePropertyGraph opg = OraclePropertyGraph.getInstance( args, szGraphName); // Clear existing vertices/edges in the property graph opg.clearRepository(); String szOPVFile = "../../data/connections.opv"; String szOPEFile = "../../data/connections.ope"; // This object will handle parallel data loading OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance(); opgdl.loadData(opg, szOPVFile, szOPEFile, dop); // Create the vertex operation callback CollaboratorsVertexOpCallback cvoc = CollaboratorsVertexOpCallback.getInstance(opg); // Add attribute to all people collaborating with Smith based on their role opg.addAttributeToAllVertices(cvoc, true /** Skip store to Cache */, dop); // Look up for all collaborators of Smith Iterable<Vertex> collaborators = opg.getVertices("smithCollaborator", "political"); System.out.println("Political collaborators of Robert Smith " + getVerticesAsString(collaborators)); collaborators = opg.getVertices("smithCollaborator", "business"); System.out.println("Business collaborators of Robert Smith " + getVerticesAsString(collaborators)); // Add an attribute to all people having a feud with Robert Smith to set // the type of relation they have FeudsEdgeOpCallback feoc = FeudsEdgeOpCallback.getInstance(opg); opg.addAttributeToAllEdges(feoc, true /** Skip store to Cache */, dop); // Look up for all feuds of Smith Iterable<Edge> feuds = opg.getEdges("smithFeud", "political"); System.out.println("\n\nPolitical feuds of Robert Smith " + getEdgesAsString(feuds)); feuds = opg.getEdges("smithFeud", "business"); System.out.println("Business feuds of Robert Smith " + getEdgesAsString(feuds));
次のコード・フラグメントは、属性smithCollaborator
にphilanthropyという値を持つ頂点を削除した後でAPI removeAttributeFromAllVertices
をコールするために使用できるVertexOpCallback
の実装を定義します。また、属性smithFeud
にbusinessという値を持つエッジを削除した後でAPI removeAttributeFromAllEdges
をコールするために使用できるEdgeOpCallback
の実装も定義します。
System.out.println("\n\nRemove 'smithCollaborator' property from all the" + "philanthropy collaborators"); PhilanthropyCollaboratorsVertexOpCallback pvoc = PhilanthropyCollaboratorsVertexOpCallback.getInstance(); opg.removeAttributeFromAllVertices(pvoc); System.out.println("\n\nRemove 'smithFeud' property from all the" + "business feuds"); BusinessFeudsEdgeOpCallback beoc = BusinessFeudsEdgeOpCallback.getInstance(); opg.removeAttributeFromAllEdges(beoc); /** * Implementation of a EdgeOpCallback to remove the "smithCollaborators" * property from all people collaborating with Robert Smith that have a * philanthropy role */ private static class PhilanthropyCollaboratorsVertexOpCallback implements VertexOpCallback { public static PhilanthropyCollaboratorsVertexOpCallback getInstance() { return new PhilanthropyCollaboratorsVertexOpCallback(); } /** * Remove attribute if and only if the property value for * smithCollaborator is Philanthropy */ @Override public boolean needOp(OracleVertexBase v) { String type = v.getProperty("smithCollaborator"); return type != null && type.equals("philanthropy"); } @Override public String getAttributeKeyName(OracleVertexBase v) { return "smithCollaborator"; } /** * Define the property's value. In this case can be empty */ @Override public Object getAttributeKeyValue(OracleVertexBase v) { return " "; } } /** * Implementation of a EdgeOpCallback to remove the "smithFeud" property * from all connections in a feud with Robert Smith that have a business role */ private static class BusinessFeudsEdgeOpCallback implements EdgeOpCallback { public static BusinessFeudsEdgeOpCallback getInstance() { return new BusinessFeudsEdgeOpCallback(); } /** * Remove attribute if and only if the property value for smithFeud is * business */ @Override public boolean needOp(OracleEdgeBase e) { String type = e.getProperty("smithFeud"); return type != null && type.equals("business"); } @Override public String getAttributeKeyName(OracleEdgeBase e) { return "smithFeud"; } /** * Define the property's value. In this case can be empty */ @Override public Object getAttributeKeyValue(OracleEdgeBase e) { return " "; } }
親トピック: プロパティ・グラフ・データに対するJava APIの使用