使用 Cypher 查询读取数据

此页面中的所有示例都假设SparkSession已使用适当的身份验证选项初始化。有关更多详细信息,请参阅快速入门示例

如果您需要更多灵活性,可以使用query选项运行自定义 Cypher® 查询。

查询**必须**包含RETURN子句。对于存储过程,您需要在RETURN之前包含YIELD子句。

query选项示例
val query = """
  MATCH (n:Person)
  WITH n
  LIMIT 2
  RETURN id(n) AS id, n.name AS name
"""

spark.read.format("org.neo4j.spark.DataSource")
  .option("query", query)
  .load()
  .show()
表 1. 结果
id name

0

John Doe

1

Jane Doe

DataFrame 列

结果 DataFrame 的结构由查询本身定义。有关更多详细信息,请参阅模式推断页面。

当您返回单个属性而不是图实体(节点、关系、路径)时,此选项最适合。无论如何,返回图实体不会导致错误。

推荐 不推荐
MATCH (p:Person)
RETURN id(p) AS id, p.name AS name
MATCH (p:Person)
RETURN p

如果您需要返回图实体,请改用labelsrelationship读取选项。

限制结果

连接器在内部使用SKIPLIMIT来支持分区读取;因此,在自定义 Cypher 查询中不允许使用SKIPLIMIT子句。尝试这样做会导致执行错误。

一种可能的解决方法是在RETURN子句之前使用SKIPLIMIT。例如,以下查询失败

MATCH (p:Person)
RETURN p.name AS name
ORDER BY name
LIMIT 10

可以使用RETURN之前的LIMIT重写查询以成功完成

MATCH (p:Person)
WITH p.name AS name
ORDER BY name
LIMIT 10
RETURN p.name

重写查询时,请确保新查询与原始查询等效,以便结果相同。

您还可以使用query.count选项而不是重写查询。有关更多详细信息,请参阅Spark 优化页面。

script选项

script选项允许在执行读取操作之前运行一系列 Cypher 查询。

script的结果可用于后续的query,例如注入查询参数。

scriptquery示例
val script = "RETURN 'foo' AS val"
val query = """
  UNWIND range(1, 2) as id
  RETURN id AS val, scriptResult[0].val AS script
"""

spark.read.format("org.neo4j.spark.DataSource")
  .option("script", script)
  .option("query", query)
  .load()
  .show()
表 2. 结果
val script

1

foo

2

foo