Neo4j和Gephi Graph Streaming插件:连接被拒绝

时间:2018-04-18 14:11:10

标签: docker neo4j gephi connection-refused neo4j-apoc

我正在尝试使用Gephi的图形Streaming插件和Neo4j的apoc程序连接Gephi(https://gephi.org/)和Neo4j(通过docker),如下所述:https://tbgraph.wordpress.com/2017/04/01/neo4j-to-gephi/。我已经在Gephi中安装了所需的插件和neo4j中的apoc程序,添加了所需的安全配置以便允许apoc程序工作。因此,neo4j.conf包含此行dbms.security.procedures.unrestricted=apoc.\*

但是,当我在控制台中输入以下查询时:

MATCH path = (:Person)-[:KNOWS]->(:Person)
CALL apoc.gephi.add(null,'workspace1',path,'weight') yield nodes
return *

我得到了

Neo.ClientError.Procedure.ProcedureCallFailed: Failed to invoke procedure `apoc.gephi.add`: Caused by: java.net.ConnectException: Connection refused (Connection refused)

我还尝试用https://localhost:8443http://localhost:8080替换第一个null(即服务器url),但我得到了相同的异常。 Gephi Graph Streaming插件服务器正在监听8080和8443。 我不知道如何进一步解决这个问题。

编辑:

关于docker,我正在使用自定义图像,并在基本neo4j图像上添加了apoc:

# Adding APOC

FROM neo4j:3.3

ENV APOC_URI https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/download/3.3.0.1/apoc-3.3.0.1-all.jar

RUN apk add --no-cache --quiet curl

RUN mv plugins /plugins \
    && ln -s plugins /plugins

RUN curl --fail --silent --show-error --location --output apoc-3.3.0.1-all.jar $APOC_URI \
    && mv apoc-3.3.0.1-all.jar /plugins

RUN apk del curl

EXPOSE 7474 7473 7687

CMD ["neo4j"]

我将容器运行为:

docker run \
--publish=7474:7474 --publish=7687:7687 \
--volume=$HOME/neo4j/data:/data \
-e NEO4J_dbms_security_procedures_unrestricted=apoc.\\\* \
neo4j_apoc:3.3

1 个答案:

答案 0 :(得分:2)

将--net =“host”添加到Docker命令;在默认配置中,容器的“localhost”不指向实际的docker主机。

您正在尝试连接到localhost,但由于默认的Docker网络( private void crosscorrButton_Click(object sender, EventArgs e) { // Cropping all 4 sections (RefInit, ExpInit, RefFinal, ExpFinal) and placing them in the center of new Bitmaps with 2^n dimensions Rectangle rExp = new Rectangle(1, 157, 1024, 131); Bitmap ExpInitCrop = new Bitmap(rExp.Width, rExp.Height); Graphics g = Graphics.FromImage(ExpInitCrop); g.DrawImage(BMInit, -rExp.X, -rExp.Y); Bitmap ExpInitLarge = new Bitmap(2048, 512); using (Graphics largeGraphics = Graphics.FromImage(ExpInitLarge)) { largeGraphics.DrawImage(ExpInitCrop, 513, 190); } Rectangle rRef = new Rectangle(1, 484, 1024, 131); Bitmap RefInitCrop = new Bitmap(rRef.Width, rRef.Height); Graphics h = Graphics.FromImage(RefInitCrop); h.DrawImage(BMInit, -rRef.X, -rRef.Y); Bitmap RefInitLarge = new Bitmap(2048, 512); using (Graphics largeGraphics = Graphics.FromImage(RefInitLarge)) { largeGraphics.DrawImage(RefInitCrop, 513, 190); } Bitmap ExpFinalCrop = new Bitmap(rExp.Width, rExp.Height); Graphics i = Graphics.FromImage(ExpFinalCrop); i.DrawImage(BMFinal, -rExp.X, -rExp.Y); Bitmap ExpFinalLarge = new Bitmap(2048, 512); using (Graphics largeGraphics = Graphics.FromImage(ExpFinalLarge)) { largeGraphics.DrawImage(ExpFinalCrop, 513, 190); } Bitmap RefFinalCrop = new Bitmap(rRef.Width, rRef.Height); Graphics j = Graphics.FromImage(RefFinalCrop); j.DrawImage(BMFinal, -rRef.X, -rRef.Y); Bitmap RefFinalLarge = new Bitmap(2048, 512); using (Graphics largeGraphics = Graphics.FromImage(RefFinalLarge)) { largeGraphics.DrawImage(RefFinalCrop, 513, 190); } // Grayscalling the 4 sections to get 8bppIndexed PixelFormat Accord.Imaging.Filters.Grayscale filterGS = new Accord.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721); Bitmap RefFinalLargeGS = filterGS.Apply(RefFinalLarge); Bitmap ExpFinalLargeGS = filterGS.Apply(ExpFinalLarge); Bitmap RefInitLargeGS = filterGS.Apply(RefInitLarge); Bitmap ExpInitLargeGS = filterGS.Apply(ExpInitLarge); // FFT on the 4 sections Accord.Imaging.ComplexImage ExpInitComplex = Accord.Imaging.ComplexImage.FromBitmap(ExpInitLargeGS); ExpInitComplex.ForwardFourierTransform(); Accord.Imaging.ComplexImage RefInitComplex = Accord.Imaging.ComplexImage.FromBitmap(RefInitLargeGS); RefInitComplex.ForwardFourierTransform(); Accord.Imaging.ComplexImage ExpFinalComplex = Accord.Imaging.ComplexImage.FromBitmap(ExpFinalLargeGS); ExpFinalComplex.ForwardFourierTransform(); Accord.Imaging.ComplexImage RefFinalComplex = Accord.Imaging.ComplexImage.FromBitmap(RefFinalLargeGS); RefFinalComplex.ForwardFourierTransform(); //Conjugating the ExpFinal and RefFinal section Complex[,] CompConjExpFinal = new Complex[ExpFinalComplex.Height, ExpFinalComplex.Width]; Complex[,] CompConjRefFinal = new Complex[RefFinalComplex.Height, RefFinalComplex.Width]; for (int l = 0; l < ExpFinalComplex.Height; l++) { for (int m = 0; m < ExpFinalComplex.Width; m++) { CompConjExpFinal[l, m] = System.Numerics.Complex.Conjugate(ExpFinalComplex.Data[l, m]); ExpFinalComplex.Data[l, m] = CompConjExpFinal[l, m]; } } for (int l = 0; l < RefFinalComplex.Height; l++) { for (int m = 0; m < RefFinalComplex.Width; m++) { CompConjRefFinal[l, m] = System.Numerics.Complex.Conjugate(RefFinalComplex.Data[l, m]); RefFinalComplex.Data[l, m] = CompConjRefFinal[l, m]; } } //Element-wise multiplication of the complex arrays two by two Complex[,] ExpMultipliedMatrix = new Complex[ExpFinalComplex.Height, ExpFinalComplex.Width]; Complex[,] RefMultipliedMatrix = new Complex[RefFinalComplex.Height, RefFinalComplex.Width]; for (int l = 0; l < ExpFinalComplex.Height; l++) { for (int m = 0; m < ExpFinalComplex.Width; m++) { ExpMultipliedMatrix[l, m] = System.Numerics.Complex.Multiply(ExpInitComplex.Data[l, m], ExpFinalComplex.Data[l, m]); RefMultipliedMatrix[l, m] = System.Numerics.Complex.Multiply(RefInitComplex.Data[l, m], RefFinalComplex.Data[l, m]); } } //InverseFFT Complex[,] CrossCorrExpMatrix = new Complex[ExpFinalComplex.Height, ExpFinalComplex.Width]; Complex[,] CrossCorrRefMatrix = new Complex[RefFinalComplex.Height, RefFinalComplex.Width]; Accord.Math.FourierTransform.FFT2(ExpMultipliedMatrix, FourierTransform.Direction.Backward); Accord.Math.FourierTransform.FFT2(RefMultipliedMatrix, FourierTransform.Direction.Backward); CrossCorrExpMatrix = ExpMultipliedMatrix; CrossCorrRefMatrix = RefMultipliedMatrix; } 网络)如何工作,127.0.0.1和localhost实际上都没有指向Docker主机,而是指向容器本身。

仍然可以访问Docker主机,但由于Docker网络是动态的(容器启动之间无法保证相同的IP),因此需要检查默认网关的位置,即主机的地址。

更简单的解决方法是通过将bridge传递给Docker的调用来切换网络模式:

--net="host"

这将从docker run \ --publish=7474:7474 --publish=7687:7687 \ --net="host" \ --volume=$HOME/neo4j/data:/data \ -e NEO4J_dbms_security_procedures_unrestricted=apoc.\\\* \ neo4j_apoc:3.3 模式切换到bridge模式,其中容器直接使用主机的网络堆栈。此时,localhost和127.0.0.1都将指向Docker主机(以及容器本身)。

请注意,此模式具有破坏网络“容器化”的效果;在容器中打开的任何端口也将在Docker主机上打开