我的Edge对象是这样的:
class Edge { public long srcNodeId; public long destNodeId; }
给定一个List<Edge>,是否可以使用一个密码查询返回所有的边src或dest或两个节点都不存在?
List<Edge>
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(查询,参数);现在,请记住,如果您有一个庞大的图表,则此查询可能需要一段时间,因为它基本上是扫描整个套件和堆。
unftdfkk2#
假设$edges是一个parameter,有一个边列表:
$edges
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
2条答案
按热度按时间gzjq41n41#
你只需要编造一个Cypher查询,检查列表中每个边的srcNodeId和destNodeId,看看这些家伙是否与数据库中的任何现有节点匹配。
下面是一个可以完成这项工作的查询:
在这个查询中,$srcNodeIds和$destNodeIds是传递到查询中的参数,它们分别表示源节点ID和目的节点ID的列表。查询检查是否存在ID不在这些列表中的任何节点。从该查询返回的任何节点都是未解析的节点,即它们存在于Edge对象中,但不在实际数据库中。
只要记住在运行此查询时将srcNodeIds和destNodeIds作为参数传入即可。例如,在Neo4j Java驱动程序中,它可能看起来像这样:
statementResult result = session.run(查询,参数);现在,请记住,如果您有一个庞大的图表,则此查询可能需要一段时间,因为它基本上是扫描整个套件和堆。
unftdfkk2#
假设
$edges
是一个parameter,有一个边列表: