【问题标题】:NullPointer using apoc.map.fromPairs in Neo4j Cypher Query在 Neo4j 密码查询中使用 apoc.map.fromPairs 的 NullPointer
【发布时间】:2017-03-02 14:02:50
【问题描述】:

我正在使用下面的代码返回来自特定节点 (id(65)) 的 3 个向内边缘的所有节点,并在 apoc.map.fromPairs 过程的帮助下将结果格式化为 JSON 图形。如果没有距离起始节点 3 条边的节点,我会收到错误消息。

当我包含 OPTIONAL 语句时,似乎 apoc.map.fromPairs 过程针对用于模式缺失部分的“null”运行引发了以下错误。

调用函数apoc.map.fromPairs失败:原因: java.lang.NullPointerException

任何我如何克服这个问题的建议。我尝试编写 CASE 语句来检查映射中是否有任何键,但也无法使其正常工作。

*******************************************************************************************
// ** 
// ** Author: MOS
// ** Date: 02/03/2017
// ** Description: Returns all nodes and relationships that are within 3 inward
// ** hops of the requested node. The response is formatted as Graph JSON.
// ** 
// *******************************************************************************************
OPTIONAL MATCH (l0) <-[r1]- (l1) <-[r2]- (l2) <-[r3]- (l3)
WHERE ID(l0) = 65
WITH [
       {
            id: id(l0),
            label: labels(l0),
            type:"",
            metadata: apoc.map.fromPairs([key IN keys(l0) | [key, l0[key]]])  
        },
        {
            id: id(l1),
            label: labels(l1),
            type:"",
            metadata: apoc.map.fromPairs([key IN keys(l1) | [key, l1[key]]])
        },
        {
            id: id(l2),
            label: labels(l2),
            type:"",
            metadata: apoc.map.fromPairs([key IN keys(l2) | [key, l2[key]]])
        },
        {
            id: id(l3),
            label: labels(l3),
            type:"",
            metadata: apoc.map.fromPairs([key IN keys(l3) | [key, l3[key]]])
        }
] as nodes,
[
        { 
            id: id(r1),
            source: ID(startNode(r1)),
            relation: type(r1),
            target: ID(endNode(r1)), 
            directed: "true",
            metadata: apoc.map.fromPairs([key IN keys(r1) | [key, r1[key]]])
        },
        { 
            id: id(r2),
            source: ID(startNode(r2)),
            relation: type(r2),
            target: ID(endNode(r2)), 
            directed: "true",
            metadata: apoc.map.fromPairs([key IN keys(r2) | [key, r2[key]]])
        },
        { 
            id: id(r3),
            source: ID(startNode(r3)),
            relation: type(r3),
            target: ID(endNode(r3)), 
            directed: "true",
            metadata: apoc.map.fromPairs([key IN keys(r3) | [key, r3[key]]])
        }
] as edges
UNWIND nodes as node
UNWIND edges as edge
RETURN
{
 graph: 
    {
      type:"",
      label: "",    
      directed: "true",
      node: collect(distinct node) ,
      edges: collect(distinct edge),
      metadata:{
                  countNodes: count(distinct node),
                  countEdges: count(distinct edge)
               }
  }
}

非常感谢

【问题讨论】:

  • 你不能只用properties(r1) 吗?

标签: neo4j cypher neo4j-apoc


【解决方案1】:

您可以大大简化您的查询,也可以对其进行概括:

OPTIONAL MATCH path = (x)<-[*..3]-() WHERE ID(x) = 65

UNWIND nodes(path) as node
UNWIND rels(path) as rel

WITH collect(distinct node) as nodes,collect(distinct rel) as rels
// WITH apoc.coll.flatten(collect(nodes(path))) as nodes, apoc.coll.flatten(collect(relationships(path))) as rels
WITH apoc.coll.toSet([n in nodes WHERE n is not null 
            | { id: id(n),label: labels(n),type:"",metadata: properties(n)  } ]) as nodes,
     apoc.coll.toSet([r in rels WHERE r is not null 
            | { id: id(r),source: id(startNode(r)),relation: type(r),target: id(endNode(r)), directed: "true"  } ]) as rels

RETURN { graph: { type:"",label: "",directed: "true",nodes: nodes,edges: rels,
         metadata:{ countNodes: size(nodes),countEdges: size(rels) } } } as graph;

【讨论】:

  • 这太棒了-谢谢。如此干净,并且现在也将我想要搜索的级别数作为参数传递。唯一的问题是它每条路径返回多个图形对象。你知道我如何只能使用这个查询返回不同的节点和 rels。
  • 我仍然需要使用 apoc.coll.flatten 发布 apoc
【解决方案2】:

你为什么不直接使用 MATCH 并且不会有缺失值,因为如果没有找到你什么都不做

MATCH (l0) <-[r1]- (l1) <-[r2]- (l2) <-[r3]- (l3)
WHERE ID(l0) = 65

如果你愿意,你可以像这样进行可选的匹配和过滤

OPTIONAL MATCH (l0) <-[r1]- (l1) <-[r2]- (l2) <-[r3]- (l3)
WHERE ID(l0) = 65
WITH * where r3 is not null
Do sth

【讨论】:

  • 如果有节点 1 或 2 边但没有节点 3 边,那么我希望返回 1 或 2 边的节点。这就是我添加 OPTIONAL 的原因,它返回我需要的内容,但随后破坏了我用来格式化数据的 apoc 过程。
  • 这是一个错误,它应该能够处理空值。现在你可以使用 coalesce。
猜你喜欢
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
相关资源
最近更新 更多