neo4j:用于识别未解析边缘的密码

4ioopgfo  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(99)

我的Edge对象是这样的:

class Edge {
   public long srcNodeId;
   public long destNodeId;
}

给定一个List<Edge>,是否可以使用一个密码查询返回所有的边src或dest或两个节点都不存在?

gzjq41n4

gzjq41n41#

你只需要编造一个Cypher查询,检查列表中每个边的srcNodeId和destNodeId,看看这些家伙是否与数据库中的任何现有节点匹配。
下面是一个可以完成这项工作的查询:

MATCH (n)
WHERE NOT (ID(n) IN $srcNodeIds) OR NOT (ID(n) IN $destNodeIds)
RETURN n

在这个查询中,$srcNodeIds和$destNodeIds是传递到查询中的参数,它们分别表示源节点ID和目的节点ID的列表。查询检查是否存在ID不在这些列表中的任何节点。从该查询返回的任何节点都是未解析的节点,即它们存在于Edge对象中,但不在实际数据库中。
只要记住在运行此查询时将srcNodeIds和destNodeIds作为参数传入即可。例如,在Neo4j Java驱动程序中,它可能看起来像这样:

List<Long> srcNodeIds = edges.stream().map(edge -> edge.srcNodeId).collect(Collectors.toList());
List<Long> destNodeIds = edges.stream().map(edge -> edge.destNodeId).collect(Collectors.toList());

Session session = driver.session();

Map<String , Object> params = new HashMap<>();
params.put("srcNodeIds" , srcNodeIds);
params.put("destNodeIds" , destNodeIds);

statementResult result = session.run(查询,参数);现在,请记住,如果您有一个庞大的图表,则此查询可能需要一段时间,因为它基本上是扫描整个套件和堆。

unftdfkk

unftdfkk2#

假设$edges是一个parameter,有一个边列表:

UNWIND $edges AS e
OPTIONAL MATCH (src) WHERE ID(src) = e.srcNodeId
OPTIONAL MATCH (dest) WHERE ID(dest) = e.destNodeId
RETURN
  e.srcNodeId AS srcNodeId, src IS NOT NULL AS srcExists,
  e.destNodeId AS destNodeId, dest IS NOT NULL AS destExists

相关问题