在Cypher中,如何修改LOAD CSV命令的有效URL协议
这个问题分为两部分:在Cypher中,如何修改LOAD CSV命令的有效URL协议,csv,url,neo4j,cypher,load-csv,Csv,Url,Neo4j,Cypher,Load Csv,这个问题分为两部分: 默认情况下,哪些URL协议被认为是有效的,用于为Cypher的加载CSV命令指定资源 到目前为止,我已经使用http和文件协议成功地将CSV文件加载到Neo4j中。表示ftp也可以工作,但我没有尝试过,因为我没有用例 配置非标准URI协议需要哪些实用选项?我遇到一个Neo.TransientError.Statement.ExternalResourceFailure:带有“指定的URL无效(未知协议)”。除了深入研究Neo4j源代码外,如果主机能够使用指定的协议解析资
加载CSV
命令指定资源
- 到目前为止,我已经使用http和文件协议成功地将CSV文件加载到Neo4j中。表示ftp也可以工作,但我没有尝试过,因为我没有用例
http、https、ftp、文件、jar
请注意,文件
URL是从服务器的角度解释的,而不是从客户端(一个常见的混淆源)neo4j wrapper.conf
中提供这个系统属性,并将包含处理程序类的jar文件放到plugins
文件夹中应该足够了。(注意:我自己并没有验证这种方法,但我很有信心它会起作用)下面是一个完整的示例,使用实现您自己的
URLStreamHandler
的技术来处理资源
协议。必须将类命名为“Handler”,包名称的最后一段必须是协议名称(在本例中为资源
)
src/main/java/com/example/protocols/resource/Handler.java
:
package com.example.protocols.resource;
导入java.io.FileNotFoundException;
导入java.io.IOException;
导入java.net.URL;
导入java.net.URLConnection;
导入java.net.URLStreamHandler;
公共类处理程序扩展了URLStreamHandler{
私有最终类加载器类加载器;
公共处理程序(){
this.classLoader=getClass().getClassLoader();
}
@凌驾
受保护的URL连接openConnection(URL URL)引发IOException{
URL resource=classLoader.getResource(URL.getPath());
if(资源==null){
抛出新的FileNotFoundException(“未找到资源文件:+url.getPath());
}
返回resource.openConnection();
}
}
从这里开始,我们需要设置系统属性java.protocol.handler.pkgs
以包括基本包com.example.protocols
,以便注册协议。这可以在Neo4j ExtensionFactory中静态完成。由于类是由Neo4j加载的,我们知道静态块将被执行。我们还需要提供自己的URLAccessRule,因为默认情况下Neo4j只允许使用一些select协议。这也可能发生在ExtensionFactory中
src/main/java/com/example/protocol/ProtocolInitializerFactory.java
:
package com.example.protocols;
导入org.neo4j.annotations.service.ServiceProvider;
导入org.neo4j.graphdb.security.urlacessrule;
导入org.neo4j.kernel.extension.ExtensionFactory;
导入org.neo4j.kernel.extension.ExtensionType;
导入org.neo4j.kernel.extension.context.ExtensionContext;
导入org.neo4j.kernel.lifecycle.lifecycle;
导入org.neo4j.kernel.lifecycle.lifecycledapter;
@服务提供者
公共类ProtocolInitializeFactory扩展了ExtensionFactory{
私有静态最终字符串协议\u HANDLER\u PACKAGES=“java.PROTOCOL.HANDLER.pkgs”;
私有静态最终字符串协议_PACKAGE=ProtocolInitializeFactory.class.getPackageName();
静止的{
字符串currentValue=System.getProperty(协议处理程序包“”);
if(currentValue.isEmpty()){
System.setProperty(协议处理程序包、协议包);
}如果(!currentValue.contains(PROTOCOL_PACKAGE)){
System.setProperty(协议处理程序包,currentValue+“|”+协议包);
}
}
公共接口依赖项{
URLAccessRule URLAccessRule();
}
公共协议初始化工厂(){
super(ExtensionType.DATABASE,“ProtocolInitializer”);
}
@凌驾
公共生命周期newInstance(ExtensionContext上下文、依赖项){
URLAccessRule URLAccessRule=依赖项。URLAccessRule();
返回lifecycledapter.onInit(()->{
URLAccessRule自定义规则=(配置,url)->{
如果(“resource”.equals(url.getProtocol()){//请检查协议名称
return url;//或者,您可以在此处验证url,如果该url无效或不允许访问,则引发异常
}
返回urlAccessRule.validate(配置,url);
};
context.dependencyStisfier().satisfydependence(customRule);
});
}
}
设置好后,将这些类打包为Neo4j插件,并将其放到数据库的插件目录中
诚然,需要覆盖默认的URLAccessRule感觉有点可疑。最好是简单地实现URLStreamHandler,并使用另一种CSV加载方法,如。这不需要重写URLAccessRule,但它需要设置java系统属性<代码> java .Pr.Prgs.PKGS< /C> > /P>如果您成功,请考虑编写博客文章: