All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.tinkerpop.gremlin.structure.Vertex Maven / Gradle / Ivy

There is a newer version: 4.15.102
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.tinkerpop.gremlin.structure;

import org.apache.tinkerpop.gremlin.structure.util.Host;

import java.util.Iterator;

/**
 * A {@link Vertex} maintains pointers to both a set of incoming and outgoing {@link Edge} objects. The outgoing edges
 * are those edges for  which the {@link Vertex} is the tail. The incoming edges are those edges for which the
 * {@link Vertex} is the head.
 * 

* Diagrammatically: *

 * ---inEdges---> vertex ---outEdges--->.
 * 
* * @author Marko A. Rodriguez (http://markorodriguez.com) * @author Stephen Mallette (http://stephen.genoprime.com) */ public interface Vertex extends Element, Host { /** * The default label to use for a vertex. */ public static final String DEFAULT_LABEL = "vertex"; static final Object[] EMPTY_ARGS = new Object[0]; /** * Add an outgoing edge to the vertex with provided label and edge properties as key/value pairs. * These key/values must be provided in an even number where the odd numbered arguments are {@link String} * property keys and the even numbered arguments are the related property values. * * @param label The label of the edge * @param inVertex The vertex to receive an incoming edge from the current vertex * @param keyValues The key/value pairs to turn into edge properties * @return the newly created edge */ public Edge addEdge(final String label, final Vertex inVertex, final Object... keyValues); /** * Get the {@link VertexProperty} for the provided key. If the property does not exist, return * {@link VertexProperty#empty}. If there are more than one vertex properties for the provided * key, then throw {@link Vertex.Exceptions#multiplePropertiesExistForProvidedKey}. * * @param key the key of the vertex property to get * @param the expected type of the vertex property value * @return the retrieved vertex property */ @Override public default VertexProperty property(final String key) { final Iterator> iterator = this.properties(key); if (iterator.hasNext()) { final VertexProperty property = iterator.next(); if (iterator.hasNext()) throw Vertex.Exceptions.multiplePropertiesExistForProvidedKey(key); else return property; } else { return VertexProperty.empty(); } } /** * Set the provided key to the provided value using {@link VertexProperty.Cardinality#single}. * * @param key the key of the vertex property * @param value The value of the vertex property * @param the type of the value of the vertex property * @return the newly created vertex property */ @Override public default VertexProperty property(final String key, final V value) { return this.property(key, value, EMPTY_ARGS); } /** * Set the provided key to the provided value using default {@link VertexProperty.Cardinality} for that key. * The default cardinality can be vendor defined and is usually tied to the graph schema. * The default implementation of this method determines the cardinality * {@code graph().features().vertex().getCardinality(key)}. The provided key/values are the properties of the * newly created {@link VertexProperty}. These key/values must be provided in an even number where the odd * numbered arguments are {@link String}. * * @param key the key of the vertex property * @param value The value of the vertex property * @param keyValues the key/value pairs to turn into vertex property properties * @param the type of the value of the vertex property * @return the newly created vertex property */ public default VertexProperty property(final String key, final V value, final Object... keyValues) { return this.property(graph().features().vertex().getCardinality(key), key, value, keyValues); } /** * Create a new vertex property. If the cardinality is {@link VertexProperty.Cardinality#single}, then set the key * to the value. If the cardinality is {@link VertexProperty.Cardinality#list}, then add a new value to the key. * If the cardinality is {@link VertexProperty.Cardinality#set}, then only add a new value if that value doesn't * already exist for the key. If the value already exists for the key, add the provided key value vertex property * properties to it. * * @param cardinality the desired cardinality of the property key * @param key the key of the vertex property * @param value The value of the vertex property * @param keyValues the key/value pairs to turn into vertex property properties * @param the type of the value of the vertex property * @return the newly created vertex property */ public VertexProperty property(final VertexProperty.Cardinality cardinality, final String key, final V value, final Object... keyValues); /** * Gets an {@link Iterator} of incident edges. * * @param direction The incident direction of the edges to retrieve off this vertex * @param edgeLabels The labels of the edges to retrieve. If no labels are provided, then get all edges. * @return An iterator of edges meeting the provided specification */ public Iterator edges(final Direction direction, final String... edgeLabels); /** * Gets an {@link Iterator} of adjacent vertices. * * @param direction The adjacency direction of the vertices to retrieve off this vertex * @param edgeLabels The labels of the edges associated with the vertices to retrieve. If no labels are provided, * then get all edges. * @return An iterator of vertices meeting the provided specification */ public Iterator vertices(final Direction direction, final String... edgeLabels); /** * {@inheritDoc} */ @Override public Iterator> properties(final String... propertyKeys); /** * Common exceptions to use with a vertex. */ public static class Exceptions { private Exceptions() { } public static UnsupportedOperationException userSuppliedIdsNotSupported() { return new UnsupportedOperationException("Vertex does not support user supplied identifiers"); } public static UnsupportedOperationException userSuppliedIdsOfThisTypeNotSupported() { return new UnsupportedOperationException("Vertex does not support user supplied identifiers of this type"); } public static IllegalStateException vertexRemovalNotSupported() { return new IllegalStateException("Vertex removal are not supported"); } public static IllegalStateException edgeAdditionsNotSupported() { return new IllegalStateException("Edge additions not supported"); } public static IllegalStateException multiplePropertiesExistForProvidedKey(final String propertyKey) { return new IllegalStateException("Multiple properties exist for the provided key, use Vertex.properties(" + propertyKey + ')'); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy