Search code examples
graphgremlingraph-databasestinkerpop3gremlinpython

How to avoid "Multiple properties exist for the provided key, use Vertex.properties(name)"?


How to avoid "Multiple properties exist for the provided key, use Vertex.properties(name)" when the property has multiple values.

Vertex has a property called name and it has multiple values.

How to get anyone value even though it has multiple values

%%gremlin
g.V('d65135a3-8cd3-4edd-bc8d-f7087557e2a9').
  project('s','s1').
    by(values('name')).
    by(outE('owns').inV().hasLabel('xy').elementMap())

Error:

    {
      "detailedMessage": "Multiple properties exist for the provided key, use Vertex.properties(name)",
      "requestId": "71391776-ad7f-454d-8413-3032a9800211",
      "code": "InternalFailureException"
    }

Solution

  • I tried reproducing your issue using this sample graph:

    g.addV('set-test').
      property('mySet','one').
      property(set, 'mySet','two').
      property(id,'set-test1')
    

    but I was able to return properties OK.

    g.V('set-test1').
      project('s').
        by(values('mySet'))
    
    {'s': 'one'}
    

    and to get every member of the set:

    g.V('set-test1').
      project('s','s2').
        by(values('mySet').fold())
    
    {'s': ['one', 'two'], 's2': ['one', 'two']}
    

    However, I was able to reproduce the message by doing this:

    g.V('set-test1').
      project('s1','s2').
        by(values('mySet'))
    
    {
      "detailedMessage": "Multiple properties exist for the provided key, use Vertex.properties(mySet)",
      "requestId": "04e43bad-173c-454b-bf3c-5a59a3867ef6",
      "code": "InternalFailureException"
    }
    

    Please note however, that Neptune is showing the same behavior in this case that you would see from Apache TinkerPop's TinkerGraph, so using fold is probably the way to go here as it will allow the query to complete successfully.

    As a side note, "multi property" values (such as sets) do allocate an ID to each set member. However, this is highly implementation dependent, and I would not rely on these IDs. For example, Neptune does not persist property IDs in the database. They are generated "just in time" and can change. For completeness though, here is an example of using property ID values:

    g.V('set-test1').properties('mySet').id() 
    
    1002125571
    1002283485
    

    We can the use those ID values in a query such as:

    g.V('set-test1').
      project('s1').
        by(properties('mySet').hasId('1002283485').value())
    
    {'s1': 'two'}