在neo4j中创建对象的问题

时间:2020-12-20 18:02:50

I am using the django integration for neo4j and I'm getting the following traceback when I'm trying to create a node.
I do have JPype installed and it can be imported.

我正在使用django集成neo4j,当我尝试创建节点时,我得到以下回溯。我安装了JPype,可以导入。

 p = Person.objects.create(first_name='omer', last_name='katz')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 138, in create
    return self.get_query_set().create(**kwargs)
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/model/django_model/__init__.py", line 362, in create
    obj.save(force_insert=True)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 460, in save
    self.save_base(using=using, force_insert=force_insert, force_update=force_update)
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_util.py", line 47, in __get__
    method, graphdb = self.descr_get(obj, cls)
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_util.py", line 41, in descr_get
    graphdb = self.accessor.__get__(obj, cls)
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/model/django_model/__init__.py", line 58, in __get__
    return DjangoNeo.neo
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/model/django_model/__init__.py", line 124, in neo
    return self.__setup_neo()
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/model/django_model/__init__.py", line 136, in __setup_neo
    self.__neo = NeoService(resource_uri, **options)
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/__init__.py", line 522, in __new__
    neo = core.load_neo(resource_uri, params)
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_core.py", line 180, in load_neo
    backend.initialize(**parameters)
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/__init__.py", line 61, in initialize
    raise ImportError("No applicable backend found.")
ImportError: No applicable backend found.

EDIT:
As requested here are my neo4j settings:

编辑:这里要求的是我的neo4j设置:

NEO4J_RESOURCE_URI = '/var/neo4j/neo4django'
# NEO4J_RESOURCE_URI should be the path to where
#    you want to store the Neo4j database.

NEO4J_OPTIONS = {
    # this is optional and can be used to specify
    # extra startup parameters for Neo4j, such as
    # the classpath to load Neo4j from.
}

EDIT:
After following thobe's suggestion I get the following when I try to import my own models:

编辑:按照thobe的建议后,当我尝试导入自己的模型时,我得到以下内容:

    ERROR:root:Importing native backends failed.
    Traceback (most recent call last):
      File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/__init__.py", line 51, in initialize
        embedded, remote = implementation.initialize(classpath, params)
      File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/reflection.py", line 44, in initialize
        jvm = jpype.getDefaultJVMPath()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_core.py", line 96, in getDefaultJVMPath
        return _linux.getDefaultJVMPath()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 36, in getDefaultJVMPath
        jvm = _getJVMFromJavaHome()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 55, in _getJVMFromJavaHome
        if os.path.exists(java_home+"/bin/javac") :
    TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
    ERROR:root:Importing native backends failed.
    Traceback (most recent call last):
      FERROR:root:Importing native backends failed.
    Traceback (most recent call last):
      File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/__init__.py", line 51, in initialize
        embedded, remote = implementation.initialize(classpath, params)
      File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/reflection.py", line 44, in initialize
        jvm = jpype.getDefaultJVMPath()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_core.py", line 96, in getDefaultJVMPath
        return _linux.getDefaultJVMPath()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 36, in getDefaultJVMPath
        jvm = _getJVMFromJavaHome()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 55, in _getJVMFromJavaHome
        if os.path.exists(java_home+"/bin/javac") :
    TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
    ERROR:root:Importing native backends failed.
    Traceback (most recent call last):
      File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/__init__.py", line 51, in initialize
        embedded, remote = implementation.initialize(classpath, params)
      File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/reflection.py", line 44, in initialize
        jvm = jpype.getDefaultJVMPath()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_core.py", line 96, in getDefaultJVMPath
        return _linux.getDefaultJVMPath()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 36, in getDefaultJVMPath
        jvm = _getJVMFromJavaHome()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 55, in _getJVMFromJavaHome
        if os.path.exists(java_home+"/bin/javac") :
    TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
    ERROR:root:Importing native backends failed.
    Traceback (most recent call last):
      File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/__init__.py", line 51, in initialize
        embedded, remote = implementation.initialize(classpath, params)
      File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/reflection.py", line 44, in initialize
        jvm = jpype.getDefaultJVMPath()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_core.py", line 96, in getDefaultJVMPath
        return _linux.getDefaultJVMPath()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 36, in getDefaultJVMPath
        jvm = _getJVMFromJavaHome()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 55, in _getJVMFromJavaHome
        if os.path.exists(java_home+"/bin/javac") :
    TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
    ERROR:root:Importing native backends failed.
    Traceback (most recent call last):
      File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/__init__.py", line 51, in initialize
        embedded, remote = implementation.initialize(classpath, params)
      File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/reflection.py", line 44, in initialize
        jvm = jpype.getDefaultJVMPath()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_core.py", line 96, in getDefaultJVMPath
        return _linux.getDefaultJVMPath()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 36, in getDefaultJVMPath
        jvm = _getJVMFromJavaHome()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 55, in _getJVMFromJavaHome
        if os.path.exists(java_home+"/bin/javac") :
    TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
    ERROR:root:Importing native backends failed.
    Traceback (most recent call last):
      File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/__init__.py", line 51, in initialize
        embedded, remote = implementation.initialize(classpath, params)
      File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/reflection.py", line 44, in initialize
        jvm = jpype.getDefaultJVMPath()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_core.py", line 96, in getDefaultJVMPath
        return _linux.getDefaultJVMPath()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 36, in getDefaultJVMPath
        jvm = _getJVMFromJavaHome()
      File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 55, in _getJVMFromJavaHome
        if os.path.exists(java_home+"/bin/javac") :
    TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

ile "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/__init__.py", line 51, in initialize
    embedded, remote = implementation.initialize(classpath, params)
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/reflection.py", line 44, in initialize
    jvm = jpype.getDefaultJVMPath()
  File "/usr/local/lib/python2.7/dist-packages/jpype/_core.py", line 96, in getDefaultJVMPath
    return _linux.getDefaultJVMPath()
  File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 36, in getDefaultJVMPath
    jvm = _getJVMFromJavaHome()
  File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 55, in _getJVMFromJavaHome
    if os.path.exists(java_home+"/bin/javac") :
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
ERROR:root:Importing native backends failed.
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/__init__.py", line 51, in initialize
    embedded, remote = implementation.initialize(classpath, params)
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/reflection.py", line 44, in initialize
    jvm = jpype.getDefaultJVMPath()
  File "/usr/local/lib/python2.7/dist-packages/jpype/_core.py", line 96, in getDefaultJVMPath
    return _linux.getDefaultJVMPath()
  File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 36, in getDefaultJVMPath
    jvm = _getJVMFromJavaHome()
  File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 55, in _getJVMFromJavaHome
    if os.path.exists(java_home+"/bin/javac") :
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
ERROR:root:Importing native backends failed.
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/__init__.py", line 51, in initialize
    embedded, remote = implementation.initialize(classpath, params)
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/reflection.py", line 44, in initialize
    jvm = jpype.getDefaultJVMPath()
  File "/usr/local/lib/python2.7/dist-packages/jpype/_core.py", line 96, in getDefaultJVMPath
    return _linux.getDefaultJVMPath()
  File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 36, in getDefaultJVMPath
    jvm = _getJVMFromJavaHome()
  File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 55, in _getJVMFromJavaHome
    if os.path.exists(java_home+"/bin/javac") :
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
ERROR:root:Importing native backends failed.
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/__init__.py", line 51, in initialize
    embedded, remote = implementation.initialize(classpath, params)
  File "/usr/local/lib/python2.7/dist-packages/Neo4j.py-0.1_SNAPSHOT-py2.7.egg/neo4j/_backend/reflection.py", line 44, in initialize
    jvm = jpype.getDefaultJVMPath()
  File "/usr/local/lib/python2.7/dist-packages/jpype/_core.py", line 96, in getDefaultJVMPath
    return _linux.getDefaultJVMPath()
  File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 36, in getDefaultJVMPath
    jvm = _getJVMFromJavaHome()
  File "/usr/local/lib/python2.7/dist-packages/jpype/_linux.py", line 55, in _getJVMFromJavaHome
    if os.path.exists(java_home+"/bin/javac") :
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'

3 个解决方案

#1


2  

You can get more verbose information about why the backend couldn't be found by adding this to NEO4J_OPTIONS:

通过将此添加到NEO4J_OPTIONS,您可以获得有关无法找到后端的原因的更详细信息:

NEO4J_OPTIONS = {
    log: True,
}

The output from that logging will make it easier to diagnose the actual issue and suggest a fix.

该日志记录的输出将使您更容易诊断实际问题并建议修复。

#2


1  

your settings.py looks ok..

你的settings.py看起来还不错..

Do you have java SDK installed and JAVA_HOME environment variable set to your JDK? (java JRE is not enough)

您是否已安装java SDK并将JAVA_HOME环境变量设置为JDK? (java JRE是不够的)

From Neo4j.py docs:

来自Neo4j.py文档:

In some situations the JPype compilation process might not link with the appropriate JNI headers, resulting in compilation errors. The first thing to note is that JPype needs the JNI headers from a JDK in order to build, it is not enough to only have a JRE installed when building JPype. If the JAVA_HOME environment variable is not set when building JPype the build script (setup.py) of JPype might have problems locating the appropriate JNI headers. If you are building JPype with sudo python setup.py install you might not inherit the JAVA_HOME environment variable into the sudo environment, an easy warkaround is to run python setup.py bdist before install.

在某些情况下,JPype编译过程可能无法与相应的JNI头链接,从而导致编译错误。首先要注意的是,JPype需要JDK中的JNI头来构建,在构建JPype时仅仅安装JRE是不够的。如果在构建JPype时未设置JAVA_HOME环境变量,则JPype的构建脚本(setup.py)可能无法找到相应的JNI头。如果你使用sudo python setup.py install构建JPype,你可能不会将JAVA_HOME环境变量继承到sudo环境中,一个简单的方法就是在安装之前运行python setup.py bdist。

#3


1  

I ran into the same problem. No matter what I did (on Debian) Python couldn't find the JAVA_HOME environmental variable. The easiest way to fix it, which I presume you can just add this somewhere in Django, is to add these lines -

我遇到了同样的问题。无论我做什么(在Debian上),Python都找不到JAVA_HOME环境变量。解决它的最简单的方法,我认为你可以在Django中添加它,是添加这些行 -

java_home = os.getenv("JAVA_HOME")
if(java_home == None):
    os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-6-openjdk"

where the path is the location of the JDK you want to use (it should have folder /bin after it with java and javac programs)

其中路径是您要使用的JDK的位置(它应该具有java和javac程序之后的文件夹/ bin)

What I also tried was add the location to /etc/bash.bashrc. Which didn't work for me but might for you.

我也尝试过将位置添加到/etc/bash.bashrc。这对我不起作用,但可能适合你。

JAVA_HOME=/usr/lib/jvm/java-6-openjdk
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
export PATH

Anyway, that should get you started in the right direction. But now I have another related problem I'm stuck on with no answer for a week now :(

无论如何,这应该让你开始朝着正确的方向前进。但现在我有另一个相关的问题,我坚持一个星期没有答案:(

#1


2  

You can get more verbose information about why the backend couldn't be found by adding this to NEO4J_OPTIONS:

通过将此添加到NEO4J_OPTIONS,您可以获得有关无法找到后端的原因的更详细信息:

NEO4J_OPTIONS = {
    log: True,
}

The output from that logging will make it easier to diagnose the actual issue and suggest a fix.

该日志记录的输出将使您更容易诊断实际问题并建议修复。

#2


1  

your settings.py looks ok..

你的settings.py看起来还不错..

Do you have java SDK installed and JAVA_HOME environment variable set to your JDK? (java JRE is not enough)

您是否已安装java SDK并将JAVA_HOME环境变量设置为JDK? (java JRE是不够的)

From Neo4j.py docs:

来自Neo4j.py文档:

In some situations the JPype compilation process might not link with the appropriate JNI headers, resulting in compilation errors. The first thing to note is that JPype needs the JNI headers from a JDK in order to build, it is not enough to only have a JRE installed when building JPype. If the JAVA_HOME environment variable is not set when building JPype the build script (setup.py) of JPype might have problems locating the appropriate JNI headers. If you are building JPype with sudo python setup.py install you might not inherit the JAVA_HOME environment variable into the sudo environment, an easy warkaround is to run python setup.py bdist before install.

在某些情况下,JPype编译过程可能无法与相应的JNI头链接,从而导致编译错误。首先要注意的是,JPype需要JDK中的JNI头来构建,在构建JPype时仅仅安装JRE是不够的。如果在构建JPype时未设置JAVA_HOME环境变量,则JPype的构建脚本(setup.py)可能无法找到相应的JNI头。如果你使用sudo python setup.py install构建JPype,你可能不会将JAVA_HOME环境变量继承到sudo环境中,一个简单的方法就是在安装之前运行python setup.py bdist。

#3


1  

I ran into the same problem. No matter what I did (on Debian) Python couldn't find the JAVA_HOME environmental variable. The easiest way to fix it, which I presume you can just add this somewhere in Django, is to add these lines -

我遇到了同样的问题。无论我做什么(在Debian上),Python都找不到JAVA_HOME环境变量。解决它的最简单的方法,我认为你可以在Django中添加它,是添加这些行 -

java_home = os.getenv("JAVA_HOME")
if(java_home == None):
    os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-6-openjdk"

where the path is the location of the JDK you want to use (it should have folder /bin after it with java and javac programs)

其中路径是您要使用的JDK的位置(它应该具有java和javac程序之后的文件夹/ bin)

What I also tried was add the location to /etc/bash.bashrc. Which didn't work for me but might for you.

我也尝试过将位置添加到/etc/bash.bashrc。这对我不起作用,但可能适合你。

JAVA_HOME=/usr/lib/jvm/java-6-openjdk
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
export PATH

Anyway, that should get you started in the right direction. But now I have another related problem I'm stuck on with no answer for a week now :(

无论如何,这应该让你开始朝着正确的方向前进。但现在我有另一个相关的问题,我坚持一个星期没有答案:(