【问题标题】:How do I changes node labels?如何更改节点标签?
【发布时间】:2015-06-27 00:29:39
【问题描述】:

我有一个小的 Neo 图表:

match (f) optional match (f)-[r]-() delete f, r;
merge (DMSrc:DMSys { Org: 'UNK-1', System: 'UNK' }) merge (DMDst:DMSys { Organization: 'UNK-0', System: 'Peoplesoft' }) merge (f:DMFile { Name: 'BAL'}) merge (DMSrc)-[:Provides]->(f)-[:Receives]->(DMDst);
merge (DMSrc:DMSys { Org: 'UNK-2', System: 'Oracle GL' }) merge (DMDst:DMSys { Organization: 'UNK-0', System: 'Peoplesoft' }) merge (f:DMFile { Name: 'BAL'}) merge (DMSrc)-[:Provides]->(f)-[:Receives]->(DMDst);
merge (DMSrc:DMSys { Org: 'X&X', System: 'Classic' }) merge (DMDst:DMSys { Organization: 'UNK-0', System: 'Peoplesoft' }) merge (f:DMFile { Name: 'BAL'}) merge (DMSrc)-[:Provides]->(f)-[:Receives]->(DMDst);
merge (DMSrc:DMSys { Org: 'UNK-3', System: 'Classic' }) merge (DMDst:DMSys { Organization: 'UNK-0', System: 'Peoplesoft' }) merge (f:DMFile { Name: 'BAL'}) merge (DMSrc)-[:Provides]->(f)-[:Receives]->(DMDst);
merge (DMSrc:DMSys { Org: 'UNK-4', System: 'Sun System' }) merge (DMDst:DMSys { Organization: 'UNK-0', System: 'Peoplesoft' }) merge (f:DMFile { Name: 'BAL'}) merge (DMSrc)-[:Provides]->(f)-[:Receives]->(DMDst);
merge (DMSrc:DMSys { Org: 'UNK-5', System: 'Oracle GL' }) merge (DMDst:DMSys { Organization: 'UNK-0', System: 'Peoplesoft' }) merge (f:DMFile { Name: 'BAL'}) merge (DMSrc)-[:Provides]->(f)-[:Receives]->(DMDst);
merge (DMSrc:DMSys { Org: 'UNK-6', System: 'Oracle GL' }) merge (DMDst:DMSys { Organization: 'UNK-0', System: 'Peoplesoft' }) merge (f:DMFile { Name: 'BAL'}) merge (DMSrc)-[:Provides]->(f)-[:Receives]->(DMDst);
merge (DMSrc:DMSys { Org: 'UNK-7', System: 'Direct (No Interface)' }) merge (DMDst:DMSys { Organization: 'UNK-0', System: 'Peoplesoft' }) merge (f:DMFile { Name: 'BAL'}) merge (DMSrc)-[:Provides]->(f)-[:Receives]->(DMDst);

我正在尝试生成一个图表,其中节点使用数据属性(Neo 中的节点属性)“系统”,但我无法让它工作。这是代码:

var neo = {
    url: 'http://localhost:7474',
    user: 'neo4j',
    password: '***'
};      
sigma.neo4j.cypher(neo,
    'MATCH (n) OPTIONAL MATCH (n)-[r]->(m) RETURN n,r,m LIMIT 100',
    { container: 'graph' },
    function (s) { 
        sigma.plugins.killDesign(s);
        var design = sigma.plugins.design(s);
        design.setStyles({
            nodes: {
                label: { by: 'neo4j_data.System' }
            }   
        });         
        design.apply();
    }       
);

您会注意到,与文档中的示例引用 data.something 不同,我使用 neo4j_data.something,因为我在调试检索到的图形时发现来自 Neo4j,这就是节点属性所在的位置。

显然应该访问这些数据的地方是在sigma.plugins.design.js 中定义的applyStyle 方法中,特别是第534 行,我在下面引用:

if (!(visualVar in self.originalVisualVariable[item.id])) {
  // non-writable property
  Object.defineProperty(self.originalVisualVariable[item.id], visualVar, {
   enumerable: true,
   value: item[visualVar]
  });
}

可以看出标签的值(visualVar 当前设置为“label”)设置为 item[visualVar]... 但是 item 包含:

{
Object
cam0:size: 8
cam0:x: 656.8832126805254
cam0:y: 191.29239469613498
color: "#000000"
id: "0"
label: "0"
neo4j_data: {
    Org: "UNK-1"
    System: "UNK"
}
neo4j_labels: Array[1]
read_cam0:size: 8
read_cam0:x: 61.38321268052541
read_cam0:y: 91.79239469613499
size: 1
x: 0.8536414597183466
y: 0.980357211548835
__proto__: Object
}

从中可以看出,虽然有item.label这个属性,但它真正应该做的是检索item.neo4j_data.System

我是否误解了这一点,或者它应该如何工作?

TIA-e

【问题讨论】:

    标签: neo4j sigma.js linkurious


    【解决方案1】:

    我对提取节点属性的代码有误。后来有这个片段:

    var newVal = o.styles[visualVar](item);
    

    指的是这个(在update方法中):

    case 'label':
      self.idx[key][val].styles.label = function(item) {
        return format(byFn(item, key));
      };
      break;
    

    地点:

    format = that.mappings.label.format || function(item) {
                  return item.label;
                };
    byFn: function(item, key) { return strToObjectRef(item, key); };
    
    function strToObjectRef(obj, str) {
      // http://stackoverflow.com/a/6393943
      return str.split('.').reduce(function(obj, i) { return obj[i] }, obj);
    }
    

    ...查看byFn 的输出,我们发现它不是一个对象,而是一个字符串!所以默认 format 方法中的取消引用失败。

    所以这样声明我的风格可以让它发挥作用:

    design.setStyles({
        nodes: {
            label: {
                by: 'neo4j_data.System',
                format: function(item) { return item; }
            }
        }   
    });
    

    所以这里的教训是使用 Neo4j 时需要 format 方法

    * 更新我 *

    重新定义format 方法的代码补丁可以解决这个问题:

    format = that.mappings.label.format || function(item) {
                  return typeof item === 'string' ? item : item.label;
                };
    

    【讨论】:

      猜你喜欢
      • 2016-07-27
      • 1970-01-01
      • 2012-09-29
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多