【问题标题】:JanusGraph: NullPointerException when traversing verticesJanusGraph:遍历顶点时出现 NullPointerException
【发布时间】:2019-08-21 17:55:36
【问题描述】:

我正在使用 JanusGraph 来存储和检索由边连接的顶点对。

插入超过 100k 对顶点后,我发现当我尝试遍历并从中检索顶点时,大约 5% 的顶点对出现NullPointerException 错误。我在下面包含了错误的堆栈跟踪。

对于受影响的顶点对,每次我尝试遍历它时都会出现NullPointerException

我的问题是:这些NullPointerExceptions 可能是什么原因造成的?

其他信息:

  • 我使用 Cassandra 作为后端存储 (cql)
  • 我在顶点上使用 ID 属性作为唯一索引
  • 我正在使用 JanusGraph 0.2.0 版本

编辑:我还想补充一点,每对的两个顶点都存在于图中,我什至可以读取每个顶点的属性。

这是错误堆栈跟踪的相关部分:

Caused by: java.lang.NullPointerException
    at org.janusgraph.graphdb.database.serialize.AttributeUtil.hasGenericDataType(AttributeUtil.java:99)
    at org.janusgraph.graphdb.database.EdgeSerializer.readPropertyValue(EdgeSerializer.java:197)
    at org.janusgraph.graphdb.database.EdgeSerializer.readInline(EdgeSerializer.java:189)
    at org.janusgraph.graphdb.database.EdgeSerializer.parseRelation(EdgeSerializer.java:161)
    at org.janusgraph.graphdb.database.EdgeSerializer.readRelation(EdgeSerializer.java:73)
    at org.janusgraph.graphdb.transaction.RelationConstructor.readRelationCache(RelationConstructor.java:41)
    at org.janusgraph.graphdb.relations.CacheEdge.getPropertyMap(CacheEdge.java:107)
    at org.janusgraph.graphdb.relations.CacheEdge.getValueDirect(CacheEdge.java:114)
    at org.janusgraph.graphdb.relations.AbstractTypedRelation.lambda$properties$1(AbstractTypedRelation.java:157)
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
    at java.util.stream.StreamSpliterators$WrappingSpliterator.lambda$initPartialTraversalState$0(StreamSpliterators.java:294)
    at java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.fillBuffer(StreamSpliterators.java:206)
    at java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.doAdvance(StreamSpliterators.java:161)
    at java.util.stream.StreamSpliterators$WrappingSpliterator.tryAdvance(StreamSpliterators.java:300)
    at java.util.Spliterators$1Adapter.hasNext(Spliterators.java:681)   

以下是我为图遍历实现的相关代码:

g.V()
        .has(indexProperty, vertexId)
        .coalesce(
                __.repeat(__
                        .bothE()
                        .or(
                                __.has(GraphElementProperties.WEIGHT, P.gte
                                        (STRONG_CONNECTION_WEIGHT_THRESHOLD)),
                                __.hasNot(GraphElementProperties.WEIGHT)
                        )
                        .bothV()
                        .dedup())
                        .emit(),
                __.identity()
        )
        .toList()

【问题讨论】:

  • 我们也面临这个问题,你有什么解决办法吗?

标签: java graph-databases gremlin janusgraph graph-traversal


【解决方案1】:

尝试交换您的或遍历中的遍历: 首先检查属性是否不存在,只有存在时才获取值。 我也会考虑将bothV() 更改为otherV()

【讨论】:

  • 感谢您的建议!在这种情况下,这似乎不是我的问题。如果我跟踪堆栈跟踪,它会在以下位置引发异常:Caused by: java.lang.NullPointerException at org.janusgraph.graphdb.database.EdgeSerializer.parseRelation(EdgeSerializer.java:106) at org.janusgraph.graphdb.database.EdgeSerializer.readRelation(EdgeSerializer.java:73),这似乎是一个奇怪的地方,有一个空指针。此时的源码为:if (multiplicity.isConstrained()) {...
  • 也以防万一这可能会给出提示:如果我尝试检索其中一个顶点的 GraphSON 表示,包括两个方向的边,我会得到一个 Nullpointer 错误,其堆栈跟踪与在我上面的评论中提到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多