2

我有一个 neo4j 图形数据库,并且我正在使用嵌入式 java,如何将此密码查询转换为 java 代码(有可能)?

查询:

START n=node(*)
MATCH p=n-[rels:INCLUDE*]->m 
WHERE ALL (rel IN rels 
  WHERE rel.status='on') 
WITH COLLECT(p) AS paths, MAX(length(p)) AS maxLength 
RETURN FILTER(path IN paths 
  WHERE length(path)= maxLength) AS longestPaths

该查询是关于在与 STATUS="on" 属性有关系的节点之间找到最长的路径,并返回路径。

因为我读到使用 neo4j 数据库,从 java api 比从 java 应用程序运行 cypher 查询要快。

所以请帮助我编写与这个密码查询相同的java代码。

提前致谢。

4

1 回答 1

3

如果您指的是遍历框架,那么这是您最好的选择: http ://docs.neo4j.org/chunked/stable/tutorial-traversal.html

您可能希望自己进行性能测试以确定哪个更快。

请原谅我,因为我的 Java 有点生疏,而且我没有办法为您实际测试它。但是我认为这会得到你想要的。

List<Path> longestPaths = null;
int longestLength = 0;

for ( Path position : Traversal.description()
        .depthFirst()
        .relationships( Rels.INCLUDE )
        .relationships( Rels.LIKES, Direction.OUTGOING )
        .evaluator( new Evaluator {
            public Evaluation evaluate(Path path) {
                Relationship r = path.lastRelationship();
                if(r != null && "on".equals(r.getProperty("status"))) {
                    return Evaluation.INCLUDE_AND_CONTINUE;
                }

                return EXCLUDE_AND_PRUNE;
            }
        } )
        .traverse( node ) )
{
    //Given that node is your start node this would be the (WHERE ALL rels status = on)

    if(longestPaths == null || longestLength < position.length()) {
        longestPaths = new ArrayList<Path>();
        longestPaths.add(position);
        longestLength = position.length();
    }
}

//At this point you should have a collection of the longest paths
于 2013-11-04T21:41:06.377 回答