Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Cypher中,如何修改LOAD CSV命令的有效URL协议_Csv_Url_Neo4j_Cypher_Load Csv - Fatal编程技术网

在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源代码外,如果主机能够使用指定的协议解析资

这个问题分为两部分:

  • 默认情况下,哪些URL协议被认为是有效的,用于为Cypher的
    加载CSV
    命令指定资源

    • 到目前为止,我已经使用http和文件协议成功地将CSV文件加载到Neo4j中。表示ftp也可以工作,但我没有尝试过,因为我没有用例
  • 配置非标准URI协议需要哪些实用选项?我遇到一个Neo.TransientError.Statement.ExternalResourceFailure:带有“指定的URL无效(未知协议)”。除了深入研究Neo4j源代码外,如果主机能够使用指定的协议解析资源,是否还可以修改此验证/设置

  • Neo4j依赖于JVM的功能。根据默认协议,这些协议是:

    http、https、ftp、文件、jar

    请注意,
    文件
    URL是从服务器的角度解释的,而不是从客户端(一个常见的混淆源)

  • 要使用自定义URL,您需要了解JVM如何处理这些URL。通过使用系统属性提供自定义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>如果您成功,请考虑编写博客文章: