模式推断

由于 Neo4j 本质上是无模式的,而 Spark DataFrames 使用固定的表格模式,因此 Spark 连接器使用模式推断系统将图数据转换为 DataFrames。

  1. 如果已安装 APOC,连接器将使用 apoc.meta.nodeTypePropertiesapoc.meta.relTypeProperties 过程。你可以对两者进行 调优

  2. 如果未安装 APOC,连接器将使用额外 Cypher® 查询的前 n 个结果(由 schema.flatten.limit 选项定义)通过每列的类型推断模式。当使用 query 选项时,模式从查询结果本身推断。

这两种方法都使用采样,这是 schema.strategy 选项的默认值 (sample)。具体的 APOC 过程或 Cypher 查询取决于读取选项。

此策略在 Neo4j 中属性的所有实例具有相同类型时有效。否则,连接器仍会尝试推断模式,但会记录类似以下消息:

The field "age" has different types: [String, Long]
Every value will be casted to string.

在这种情况下,你应该 定义一个模式

labels 选项

如果已安装 APOC,连接器将使用 apoc.meta.nodeTypeProperties 过程。否则,它将执行以下 Cypher 查询:

MATCH (n:<labels>) (1)
RETURN n
ORDER BY rand()
LIMIT <limit> (2)
1 <labels> 是由 labels 选项提供的标签列表。
2 <limit> 是由 schema.flatten.limit 选项提供的值。

然后从查询结果推断模式。

relationships 选项

如果已安装 APOC,连接器将使用 apoc.meta.relTypeProperties 过程。否则,它将执行以下 Cypher 查询:

MATCH (source:<source_labels>)-[rel:<relationship>]->(target:<target_labels>)  (1) (2) (3)
RETURN rel
ORDER BY rand()
LIMIT <limit> (4)
1 <source_labels> 是由 relationship.source.labels 选项提供的标签列表。
2 <target_labels> 是由 relationship.target.labels 选项提供的标签列表。
3 <relationship> 是由 relationship 选项提供的关系类型列表。
4 <limit> 是通过 schema.flatten.limit 提供的值。

然后从查询结果推断模式。

query 选项

使用 query 选项,连接器将使用查询结果的前 n 个结果(由 schema.flatten.limit 选项定义)来推断模式。

例如,如果读取查询是 MATCH (n:Person) WITH n LIMIT 2 RETURN id(n) as id, n.name as name,连接器将首先运行以下查询:

MATCH (n:Person) WITH n LIMIT 2 RETURN id(n) as id, n.age as age (1)
ORDER BY rand()
LIMIT <limit> (2)
1 原始读取查询。
2 <limit> 是通过 schema.flatten.limit 提供的值。

然后从查询结果推断模式。

如果查询没有返回数据,则无法进行采样。在这种情况下,连接器会从 RETURN 语句创建一个模式,其中每列的类型都是 String。由于结果集为空,这不会导致任何问题。

© . All rights reserved.