使用 neo4j 嵌入式 java api 为关系添加权重

Posted

技术标签:

【中文标题】使用 neo4j 嵌入式 java api 为关系添加权重【英文标题】:Add weight to a relationship using neo4j embedded java api 【发布时间】:2015-02-24 16:23:31 【问题描述】:

我想使用 Embedded Neo4j Java API 为关系添加权重。

例如:A 非常了解B,因此他们的关系应该加权5。另一方面,AC 了解的很少,所以他们的关系应该加权1

我该怎么做?

PS:我已经尝试过这里的示例:http://neo4j.com/docs/stable/tutorials-java-embedded-graph-algo.html,但它无法识别函数 createNode( "name", "A", "x", 0d, "y", 0d )createRelationship( nodeA, nodeC, "length", 2d )

这是代码:

package com.neo4j.test.test1;

import org.neo4j.graphalgo.CommonEvaluators;
import org.neo4j.graphalgo.EstimateEvaluator;
import org.neo4j.graphalgo.GraphAlgoFactory;
import org.neo4j.graphalgo.PathFinder;
import org.neo4j.graphalgo.WeightedPath;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.PathExpanders;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;

import com.neo4j.test.labels.NodeLabels;
import com.neo4j.test.labels.TypeRelation;

public class Test1 

    public static void main(String[] args) 

        GraphDatabaseFactory dbFactory = new GraphDatabaseFactory();
        GraphDatabaseService db = dbFactory.newEmbeddedDatabase("C:\\Zakaria\\NeoTests\\Test2");

        try (Transaction tx = db.beginTx()) 

            Node nodeA = createNode( "name", "A", "x", 0d, "y", 0d );
            Node nodeB = createNode( "name", "B", "x", 7d, "y", 0d );
            Node nodeC = createNode( "name", "C", "x", 2d, "y", 1d );
            Relationship relAB = createRelationship( nodeA, nodeC, "length", 2d );
            Relationship relBC = createRelationship( nodeC, nodeB, "length", 3d );
            Relationship relAC = createRelationship( nodeA, nodeB, "length", 10d );

            EstimateEvaluator<Double> estimateEvaluator = new EstimateEvaluator<Double>()
            
                @Override
                public Double getCost( final Node node, final Node goal )
                
                    double dx = (Double) node.getProperty( "x" ) - (Double) goal.getProperty( "x" );
                    double dy = (Double) node.getProperty( "y" ) - (Double) goal.getProperty( "y" );
                    double result = Math.sqrt( Math.pow( dx, 2 ) + Math.pow( dy, 2 ) );
                    return result;
                
            ;
            PathFinder<WeightedPath> astar = GraphAlgoFactory.aStar(
                    PathExpanders.allTypesAndDirections(),
                    CommonEvaluators.doubleCostEvaluator( "length" ), estimateEvaluator );
            WeightedPath path = astar.findSinglePath( nodeA, nodeB );

            tx.success();

        

        System.out.println("Done!");

    


它应该给出这个结果:

它说以下这些功能没有定义:

Node nodeA = createNode( "name", "A", "x", 0d, "y", 0d );
Node nodeB = createNode( "name", "B", "x", 7d, "y", 0d );
Node nodeC = createNode( "name", "C", "x", 2d, "y", 1d );
Relationship relAB = createRelationship( nodeA, nodeC, "length", 2d );
Relationship relBC = createRelationship( nodeC, nodeB, "length", 3d );
Relationship relAC = createRelationship( nodeA, nodeB, "length", 10d );

谢谢!

【问题讨论】:

请发布您尝试过的代码,以及它产生的任何错误消息。 @amphetamachine 请检查更新! 【参考方案1】:

正如 Ryan 所说,Java 编译器不会检测到您使用的方法 createNode()createRelationship()

这是一种创建节点的方法,对我有用:

try (Transaction Tx = gdbs.beginTx()
    Node nodo = gdbs.createNode();
    nodo.addLabel(p);   // if you have Labels
    nodo.setProperty("property1", someValue);
    Tx.success();
    Tx.close();
 catch (Exception e)//do something

对于关系,只展示如何添加属性:

relationship = firstNode.createRelationshipTo(secondNode, RelTypes.KNOWS );
relationship.setProperty( "message", "brave Neo4j " );

根据您的 Neo4j 版本,您应该了解如何创建节点和关系。最后,我让您创建节点和关系,无需提交它们,您就可以创建路径查找器。我建议您在查询图表之前保留节点作为一种好习惯。

【讨论】:

【参考方案2】:

这些方法未定义为类Test1 中的方法,而是定义为GraphDatabaseService 中的方法。所以,你需要做db.createNode()db.createRelationship()。这应该对你有用。

【讨论】:

你能定义它是如何不起作用的吗?具体错误是什么? 正如你所说,These methods aren't defined as methods in class Test1 对不起,我的意思是:当您尝试 db.createNode() 和 db.createRelationship 时会出现什么错误。这些方法在任何实现 GraphDatabaseService 接口的东西中定义:neo4j.com/docs/stable/javadocs/org/neo4j/graphdb/…【参考方案3】:

方法 createNode() 和 createRelationship() 未在 neo4j java API 中定义,因为您正在使用这些方法。

【讨论】:

以上是关于使用 neo4j 嵌入式 java api 为关系添加权重的主要内容,如果未能解决你的问题,请参考以下文章

neo4j简介

neo4j是啥?怎么配置?能单独使用吗?

如何可视化从嵌入式 Neo4j Java 应用程序创建的 Neo4j 图形数据库

如何可视化neo4j图[关闭]

neo4j如何与其它系统集成

播放框架2.1 Neo4j内嵌