You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tinkerpop.apache.org by "Boxuan Li (Jira)" <ji...@apache.org> on 2022/05/07 01:49:00 UTC

[jira] [Commented] (TINKERPOP-2742) IO read may use wrong cardinality for property

    [ https://issues.apache.org/jira/browse/TINKERPOP-2742?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17533171#comment-17533171 ] 

Boxuan Li commented on TINKERPOP-2742:
--------------------------------------

What I am proposing is as follows.

Add a new method to Graph.java:
{code:java}
VertexProperty.Cardinality getCardinality(final String key, final Object... values){code}
The default implementation simply calls the existing getCardinality method. Graph providers (including TinkerPop) could leverage the `values` argument to decide the cardinality. In the previous example, TinkerGraph could decide it should return the `LIST/SET` cardinality because it sees more than one value.

> IO read may use wrong cardinality for property
> ----------------------------------------------
>
>                 Key: TINKERPOP-2742
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-2742
>             Project: TinkerPop
>          Issue Type: Bug
>          Components: io
>            Reporter: Boxuan Li
>            Priority: Major
>
> g.io(...).read() might lose list/set properties. See the example below:
> {noformat}
> gremlin> graph = TinkerGraph.open()
> ==>tinkergraph[vertices:0 edges:0]
> gremlin> g = graph.traversal()
> ==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
> gremlin> v1 = g.addV().property("feature0", "0.0").property("feature0", "1.1").next()
> ==>v[0]
> gremlin> g.V().valueMap()
> ==>[feature0:[0.0,1.1]]
> gremlin> g.io("graph.json").write().iterate()
> gremlin> g.V().drop()
> gremlin> g.io("graph.json").read().iterate()
> gremlin> g.V().valueMap()
> ==>[feature0:[1.1]]{noformat}
> By verifying "graph.json", I am sure the write() step works fine. The problem is with read() step.
> In [https://github.com/apache/tinkerpop/blob/5fdc7d3b5174f73475ca1a48920d5dec614ffc0e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/Attachable.java#L294-L298,] it relies on the host graph to decide the cardinality for the given property key. In TinkerGraph, `features().vertex().getCardinality(anything)` always returns SINGLE, which means all vertex properties are created with SINGLE cardinality, even if the graph file itself contains multiple values for that property, as shown in the above case.
>  
> I presume TinkerGraph is not the only one who suffers from this problem. For example, for JanusGraph, if the default automatic schema maker is enabled, and a property wasn't defined explicitly, then SINGLE cardinality is returned by default. In this case, the loaded graph will be "wrong" in the sense that it turns LIST/SET values into a SINGLE value.



--
This message was sent by Atlassian Jira
(v8.20.7#820007)