Multiple cardinality property or edge

Multiple cardinality allows a property to stored multiple values within a single key, or multiple edges with the same edge label to connect two vertices.

  • Multiple cardinality property

  • Create schema for a multiple cardinality property item_mult and create two vertices, each of which has two items listed for the defined property:

    schema.propertyKey('item_mult').Text().multiple().ifNotExists().create()
    schema.vertexLabel('fridgeItem_multiple').properties('item_mult').ifNotExists().create()
    graph.addVertex(label,'fridgeItem_multiple','name', 'item1','item_mult', ['cheese', 'cheddar cheese'])
    graph.addVertex(label, 'fridgeItem_multiple','name', 'item2', 'item_mult',['yogurt','Greek yogurt'], 'item_mult', ['key lime yogurt'])
    g.V().hasLabel('fridgeItem_multiple').valueMap()

    Because item_mult is defined with multiple cardinality, any number of key value insertions can be made, even using two lists to insert the values. Note that all values are stored in a single list.

    ==>{item_mult=[cheddar cheese, cheese], name=[item1]}
    ==>{item_mult=[Greek yogurt, key lime yogurt, yogurt], name=[item2]}
  • Explore the inserted data further:

    g.V().has('fridgeItem_multiple', 'name', 'item2').values('item_mult')
    ==>Greek yogurt
    ==>key lime yogurt
    ==>yogurt

    This output makes it clear that each entry in the list is a separately stored value.

  • Check for a single list item, specifying a particular value:

    g.V().hasLabel('fridgeItem_multiple').has('item_mult', 'Greek yogurt').valueMap()
    ==>{item_mult=[Greek yogurt, key lime yogurt, yogurt], name=[item2]}
  • Multiple cardinality edge

  • Create schema for a multiple cardinality edge:

    // SCHEMA
    // PROPERTIES
    schema.propertyKey('author').Text().single().create()
    schema.propertyKey('city').Text().single().create()
    schema.propertyKey('dateStart').Text().single().create()
    schema.propertyKey('dateEnd').Text().single().create()
    // VERTEX LABELS
    schema.vertexLabel('author').properties('author').create()
    schema.vertexLabel('city').properties('city').create()
    // EDGE LABELS
    schema.edgeLabel('livedIn').multiple().connection('author','city').create()
    schema.edgeLabel('livedIn').properties('dateStart', 'dateEnd').add()
    // INDEXES
    schema.vertexLabel('author').index('byAuthor').materialized().by('author').add()
    schema.vertexLabel('city').index('byCity').materialized().by('city').add()
    schema.vertexLabel('author').index('byStartDate').outE('livedIn').by('dateStart').add()

    Note that the edge label livedIn is defined with multi-cardinality. The sample data loaded with graphloader is:

    author|city|dateStart|dateEnd
    Julia Child|Paris|1961-01-01|1967-02-10
    Julia Child|New York|1970-06-06|1971-09-23
    Julia Child|Chicago|1980-04-05|1981-01-01
    Julia Child|Paris|1990-01-01|1991-01-01
    Simone Beck|Paris|1960-01-01|1962-09-23

    This data includes two different periods of time in which Julia Child lived in Paris (fictiously), and edges will be multiple because of the multi-cardinality.

    With this data loaded, the resulting graph shows the multi-cardinal edges exist:

    multiCard1
    multiCard1

Was this helpful?

Give Feedback

How can we improve the documentation?

© 2024 DataStax | Privacy policy | Terms of use

Apache, Apache Cassandra, Cassandra, Apache Tomcat, Tomcat, Apache Lucene, Apache Solr, Apache Hadoop, Hadoop, Apache Pulsar, Pulsar, Apache Spark, Spark, Apache TinkerPop, TinkerPop, Apache Kafka and Kafka are either registered trademarks or trademarks of the Apache Software Foundation or its subsidiaries in Canada, the United States and/or other countries. Kubernetes is the registered trademark of the Linux Foundation.

General Inquiries: +1 (650) 389-6000, info@datastax.com