en primer lugar, hay que preguntarse: ¿el tipo de un vértice/nodo necesidad de ser indexados? Es decir ¿necesita recuperar vértices/nodos por su tipo, digamos, recuperar todos los vértices de 'usuario' del gráfico o necesita responder consultas que comienzan recuperando todos los vértices de un tipo dado y luego filtrar/procesarlos más?
Si la respuesta a esta pregunta es sí, le sugiero que almacene el tipo como una propiedad de cadena que está indexada. O bien, si está desarrollando en un lenguaje basado en jvm, puede definir un tipo de enumeración y usarlo como el tipo de propiedad para más seguridad de tipo y comprobación automática de errores. Titan admite clases/enumeraciones arbitrarias definidas por el usuario como tipos de propiedad y las comprimirá para una huella de memoria baja.
Sin embargo, la desventaja de este enfoque es que no se escalará porque está creando un índice de baja selectividad. Lo que eso significa es que es probable que haya muchos vértices de tipo 'usuario' o 'producto' y todos ellos deben estar asociados con la entrada de índice para 'usuario' o 'producto' respectivamente. Esto hace que mantener y consultar este índice sea muy costoso y difícil de escalar (imagine que Facebook tenía un índice de 'tipo': la entrada de 'foto' tendría miles de millones de vértices). Si todavía no te preocupa el escalado, entonces esto puede funcionar.
Si la respuesta a la pregunta es no, entonces sugiero modelar tipos como vértices/nodos en el gráfico. Es decir. tiene un vértice de "usuario" y un vértice de "producto" y un borde etiquetado como "tipo" de cada usuario al vértice de "usuario", etc.
La ventaja de este enfoque es que utiliza el gráfico para modelar sus datos en lugar de tener valores de cadena fuera de su base de datos representan información de tipo crucial. A medida que crea su aplicación, la base de datos de gráficos se convertirá en su componente central y durará mucho tiempo. A medida que los lenguajes de programación y los desarrolladores van y vienen, no quiere que el modelado de datos y el tipo de información vayan con ellos y se enfrente a la pregunta: "¿Qué significa SPECIAL_USER?" Más bien, tenga un vértice SPECIAL_USER y añádale información de procedencia, es decir, quién creó este tipo, qué representa y una breve descripción: todo en la base de datos.
Un problema con este enfoque es que los vértices de 'usuario' y 'producto' tendrán muchos bordes incidentes en ellos a medida que la aplicación escala. En otras palabras, está creando supernodos que crean problemas de escala. Es por eso que Titan introdujo el concepto de un borde unidireccional. Un borde unidireccional es como un enlace en la web: el vértice inicial apunta a otro vértice, pero ese vértice ignora el borde. Como no desea atravesar el vértice del "usuario" para todos los vértices de usuario, no está perdiendo nada, sino que aumenta la escalabilidad y el rendimiento.
Así que, en resumen, usar una propiedad indexada permite trabajar con todos los nodos de forma más sencilla a expensas de la escalabilidad, mientras que usar nodos índice es una representación más natural (es decir, estructural) a expensas de la escalabilidad . ¿De una forma u otra, se limita sustancialmente la forma en que se puede usar el gráfico? – cdeszaq
No estoy seguro de que te esté siguiendo. En caso de que uno siga su recomendación para usar la segunda solución (por lo tanto, el uso de un borde para especificar el tipo), ¿cómo encuentra la lista de usuarios? ya que no puede atravesar desde el vértice del usuario hasta la lista de usuarios ... –
Gracias por la excelente respuesta Mathias. ¿Pero podría hablar un poco más sobre/not/using edges unidirectional to the 'user' node? ¿Cuáles serían las implicaciones de eso en términos de consultas en cada dirección? (Supongo que no, y gran impacto, a menos que agregue propiedades de índice al borde).Y también con bordes unidireccionales, con Cassandra, te estás limitando a <10 millones de nodos de tipo "usuario", por ejemplo. –