遍历期间的Neo4j节点属性比较

时间:2015-11-08 17:09:42

标签: graph properties neo4j cypher traversal

我对Neo4j完全陌生。我正在测试图形数据库,我有以下简单的图形测试结构:different labeled nodes with properties, which are connected

所有节点都有一个属性,称为访问。它是一个字符串元素列表,例如:

{access: ['http', 'www']}

我正在寻找一个解决方案,我从一个起始节点获取所有节点,这些节点是连接的(无论哪种类型或方向),以及它们之间存在节点访问属性交集的关系。我将从给定节点开始,并将访问属性与下一个连接节点进行比较。然后,获取第二个节点的属性,并将此访问属性与连接到它们的节点进行比较。等等。目标应该是所有节点及其连接,其中存在访问属性的部分。例如,在图的具体结构上,我们从节点 ENC 2009 开始,并且应该遍历所有连接的节点,直到达到访问属性上没有交集的节点。对于此示例,应达到以下目标:traversed graph

我尝试了以下cypher查询,但它在每个节点上都没有正常工作作为起始节点。

MATCH (n:CONFERENCE_SERIE) WHERE n.full_name =~ 'mex.*'
MATCH p = n-[*]-m WHERE FILTER(x IN n.access WHERE x IN m.access)
RETURN p

是否有一个解决方案,使用java遍历框架或使用cypher来实现目标并获取此类图形的路径?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

java遍历框架在这方面会更有效率,你可以使用RelationshipExpander中当前Path的关系

http://neo4j.com/docs/stable/tutorial-traversal-java-api.html#_pathexpander_relationshipexpander

在密码中,您可以执行以下操作:

MATCH (n:CONFERENCE_SERIE) WHERE n.full_name =~ 'mex.*'
MATCH p = n-[*]-m 
WHERE FILTER(idx IN range(0,length(p)-2) 
      WHERE ANY(access IN (rels(p)[idx]).access 
                WHERE access IN (rels(p)[idx+1]).access))
RETURN p

即。有一个计数器从0到path-len-2 查看路径的每对rel,并检查下一个rel的access-property中是否包含至少一个(ANY)访问代码。

答案 1 :(得分:1)

好的,我找到了一个适合我的解决方案。 @MichaelHunger,谢谢你的提示。我希望我的同事使用图表信息也没问题。我们明天会看到它。

仅供参考:在traversalDescription中,我创建了一个Evaluator。我从路径中获取了最后一个关系,并从起始节点和结束节点获取属性访问权限。现在我可以比较两个属性之间是否存在交集。如果是这样,我将节点包含在结果中并继续。如果不是,请排除节点并停止遍历。 它有效,我希望它是一个有效的解决方案。

源代码如下:

        TraversalDescription traversal = db.traversalDescription().depthFirst().evaluator(new Evaluator() {
        @Override
        public Evaluation evaluate(Path path) {
            // TODO Auto-generated method stub
            if (path.length() != 0) {
                String[] startAccess = (String[]) path.lastRelationship().getStartNode().getProperty("access");
                String[] endAccess = (String[]) path.lastRelationship().getEndNode().getProperty("access");

                if (checkInteresection(startAccess, endAccess)) {
                    return Evaluation.INCLUDE_AND_CONTINUE;
                } else {
                    return Evaluation.EXCLUDE_AND_PRUNE;
                }
            }
            return Evaluation.INCLUDE_AND_CONTINUE;
        }