模式推断
由于 Neo4j 本质上是无模式的,而 Spark DataFrames 使用固定表格模式,因此 Spark 连接器使用模式推断系统将图数据转换为 DataFrames。
-
如果安装了 APOC,连接器将使用
apoc.meta.nodeTypeProperties
和apoc.meta.relTypeProperties
过程。您可以 调整 两者。 -
如果未安装 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 选项提供的 value。 |
然后从查询结果推断出模式。
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 提供的 value。 |
然后从查询结果推断出模式。
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 提供的 value。 |
然后从查询结果推断出模式。
如果查询没有返回数据,则无法进行抽样。在这种情况下,连接器将从 RETURN
语句创建模式,其中每列都为 String
类型。这不会导致任何问题,因为结果集为空。